我正在使用谷歌地图API第三版,在尝试不同的缩放值时,我已经随机选择了一些从1到100的数字,地图会随着数字增加而缩小,但有些级别会给出相同的结果,也就是说,对于30和100,我得到了相同的缩放程度。
我想知道,缩放的精确范围是多少?
我正在使用谷歌地图API第三版,在尝试不同的缩放值时,我已经随机选择了一些从1到100的数字,地图会随着数字增加而缩小,但有些级别会给出相同的结果,也就是说,对于30和100,我得到了相同的缩放程度。
我想知道,缩放的精确范围是多少?
Google 地图基础
缩放级别 - 缩放
0 - 19
0 最低缩放级别(全球范围)
19 最高缩放级别(如有可用的话,单独建筑物)使用 mapObject.getZoom()
检索当前缩放级别。
缩放级别0是最小的可用缩放级别,每个整数级别减半X和Y视图范围并提高线性分辨率。
Google Maps是基于256x256像素瓦片系统构建的,其中缩放级别0是一个256x256像素的全球地图图片。 缩放级别1的256x256瓦片将从缩放级别0扩大128x128像素区域。
正如bkaid所述,可用的缩放范围取决于您查看的位置和使用的地图类型:
请注意,这些值适用于Google Static Maps API,该API似乎提供了比Javascript API更多的缩放级别。看起来静态地图可用的额外缩放级别只是来自Javascript API的最大分辨率图像的上采样版本。
Google Maps使用Mercator投影,因此比例尺随着纬度的变化而大幅变化。根据纬度计算正确比例尺的公式为:
meters_per_pixel = 156543.03392 * Math.cos(latLng.lat() * Math.PI / 180) / Math.pow(2, zoom)
这个公式来自于Chris Broadfoot的评论。
你需要寻找的是每个缩放级别的比例尺。请使用以下比例尺:
20 : 1128.497220
19 : 2256.994440
18 : 4513.988880
17 : 9027.977761
16 : 18055.955520
15 : 36111.911040
14 : 72223.822090
13 : 144447.644200
12 : 288895.288400
11 : 577790.576700
10 : 1155581.153000
9 : 2311162.307000
8 : 4622324.614000
7 : 9244649.227000
6 : 18489298.450000
5 : 36978596.910000
4 : 73957193.820000
3 : 147914387.600000
2 : 295828775.300000
1 : 591657550.500000
范围取决于您查看的位置。一些地方仅具有15左右的缩放级别,而其他地方可能有23(或更多)个。 Google Maps提供了一个getMaxZoomAtLatLng
API调用,可用于检索最大缩放级别。
使用此函数可以根据您当前的位置和到该点的距离获得最佳缩放级别(使用C#代码在VS2022上测试GMap.net,但对于Google而言,缩放级别和算法是相同的):
/// <summary>
/// Zoom map to fit the desired distance from point
/// </summary>
/// <param name="mapSize">The size of the control (map size in pixels)</param>
/// <param name="coverage">Ratio of the map, normally 70 (70%)</param>
/// <param name="latitude">Latitude where the point to draw is located</param>
/// <param name="distance">Distance to show from this point in meters</param>
/// <param name="minZoomLevel">Min level of zoom (normally 18)</param>
/// <param name="maxZoomLevel">Max level of zoom (normally 1)</param>
/// <returns>Zoom level</returns>
static double CalculateGMapZoom(Size mapSize, int coverage, double latitude, double distance, int minZoomLevel, int maxZoomLevel)
{
int pixels = mapSize.Width >= mapSize.Height ? mapSize.Height : mapSize.Width; //get the shortest dimmension of the map
double k = (double)pixels * 156543.03392 * Math.Cos(latitude * Math.PI / 180);
int zoom = (int)((Math.Round(Math.Log((coverage * k) / (distance * 100)) / 0.6931471805599453)) - 1);
return (zoom > maxZoomLevel ? (double)maxZoomLevel: (zoom < minZoomLevel ? (double)minZoomLevel: (double)zoom));
}
用法:
map.Zoom = CalculateGMapZoom(mapa.Size, 70, latitude, 1000, 1, 18);
zoom_req_float = np.log2((156543.03392 * np.cos(center_lat * np.pi / 180)) / (map_edge_length / 256))
zoom_req = int(np.ceil(zoom_req_float))
getMaxZoomAtLatLng()
。 - Anto Jurković