นี่คือรหัส C # ที่ฉันใช้ในMaperitive :
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
: ขอบเขตของกล่องใน coords ยาว / lat (x = ยาว, y = lat)
paddingFactor
: สามารถใช้เพื่อให้ได้ผล "120%" ThomM หมายถึง ค่า 1.2 คุณจะได้รับ 120%
โปรดทราบว่าในกรณีของฉันzoom
อาจเป็นจำนวนจริง ในกรณีของ Web แผนที่ที่คุณจำเป็นต้องมีค่าจำนวนเต็มซูมดังนั้นคุณควรใช้สิ่งที่ต้องการ(int)Math.Floor(zoom)
จะได้รับมัน
แน่นอนว่ารหัสนี้ใช้กับการประมาณการ Web Mercator เท่านั้น