Answers:
要获得缩放级别,您需要知道地图的像素尺寸。您还需要在球形墨卡托坐标中进行数学运算。
这是我在Maperitive中使用的C#代码:
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
:长/纬度坐标中的边界框(x = long,y = lat)paddingFactor
:可以用来获得ThomM所指的“ 120%”效果。值为1.2将使您获得120%的收益。请注意,在我的情况下zoom
可以是实数。对于Web地图,您需要一个整数缩放值,因此您应该使用类似的方法(int)Math.Floor(zoom)
来获取它。
当然,此代码仅适用于Web Mercator投影。
GeometryUtils
仅在这里用于将度数转换为弧度并返回,这是一个简单的数学公式。Bounds2
基本上只是一个矩形结构。与直接复制可粘贴的内容相比,此代码更多是作为伪代码提供的。
如果您使用的是OpenLayers,Map.getZoomForExtent
则将计算可适合地图上整个范围的最高缩放级别。该extent
需求是在地图的投影。您还可以使用fill_factor
来避免在地图边缘上显示点,并max_zoom
限制可能的缩放比例:
extent = extent.scale(1/fill_ratio);
var zoom = Math.min(map.getZoomForExtent(map_extent), max_zoom);
map.setCenter(extent.getCenterLonLat(), zoom);