Bu Maperitive kullandığım C # kodu :
public void ZoomToArea (Bounds2 mapArea, float paddingFactor)
{
double ry1 = Math.Log((Math.Sin(GeometryUtils.Deg2Rad(mapArea.MinY)) + 1)
/ Math.Cos(GeometryUtils.Deg2Rad(mapArea.MinY)));
double ry2 = Math.Log((Math.Sin(GeometryUtils.Deg2Rad(mapArea.MaxY)) + 1)
/ Math.Cos(GeometryUtils.Deg2Rad(mapArea.MaxY)));
double ryc = (ry1 + ry2) / 2;
double centerY = GeometryUtils.Rad2Deg(Math.Atan(Math.Sinh(ryc)));
double resolutionHorizontal = mapArea.DeltaX / Viewport.Width;
double vy0 = Math.Log(Math.Tan(Math.PI*(0.25 + centerY/360)));
double vy1 = Math.Log(Math.Tan(Math.PI*(0.25 + mapArea.MaxY/360)));
double viewHeightHalf = Viewport.Height/2.0f;
double zoomFactorPowered = viewHeightHalf
/ (40.7436654315252*(vy1 - vy0));
double resolutionVertical = 360.0 / (zoomFactorPowered * 256);
double resolution = Math.Max(resolutionHorizontal, resolutionVertical)
* paddingFactor;
double zoom = Math.Log(360 / (resolution * 256), 2);
double lon = mapArea.Center.X;
double lat = centerY;
CenterMapOnPoint(new PointD2(lon, lat), zoom);
}
mapArea
: uzun / lat koordinatlarında sınırlayıcı kutu (x = uzun, y = lat)
paddingFactor
: bu ThomM'nin ifade ettiği "% 120" etkisini elde etmek için kullanılabilir. 1.2 değeri size% 120 elde edecektir.
Benim durumumda zoom
gerçek bir sayı olabileceğini unutmayın . Web haritaları söz konusu olduğunda, bir tamsayı yakınlaştırma değerine ihtiyacınız vardır, bu nedenle bunu (int)Math.Floor(zoom)
elde etmek için benzer bir şey kullanmalısınız .
Elbette, bu kod yalnızca Web Mercator projeksiyonu için geçerlidir.