Đây là mã C # tôi sử dụng trong 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
: hộp giới hạn trong các hợp âm dài / lat (x = long, y = lat)
paddingFactor
: điều này có thể được sử dụng để có được hiệu ứng "120%" mà ThomM đề cập đến. Giá trị 1,2 sẽ giúp bạn có được 120%.
Lưu ý rằng trong trường hợp của tôi zoom
có thể là một số thực. Trong trường hợp bản đồ Web, bạn cần một giá trị thu phóng nguyên, vì vậy bạn nên sử dụng một cái gì đó như (int)Math.Floor(zoom)
để có được nó.
Tất nhiên, mã này chỉ áp dụng cho phép chiếu Web Mercator.