Google地图API缩放范围

71

我正在使用谷歌地图API第三版,在尝试不同的缩放值时,我已经随机选择了一些从1到100的数字,地图会随着数字增加而缩小,但有些级别会给出相同的结果,也就是说,对于30和100,我得到了相同的缩放程度。

我想知道,缩放的精确范围是多少?

6个回答

82

Google 地图基础

缩放级别 - 缩放

0 - 19

0 最低缩放级别(全球范围)

19 最高缩放级别(如有可用的话,单独建筑物)使用 mapObject.getZoom() 检索当前缩放级别。


1
查看https://developers.google.com/maps/documentation/javascript/tutorial#MapOptions,最大缩放级别似乎为18。是否有更改或文档不正确?在@bkaid提到的链接中也是如此说明。 - Jayawi Perera
4
@Jay:值为18并不是最大缩放级别,它只是在那个例子中使用的。请参考谷歌文档Maximum Zoom Imagery Service大多数路线图图像可从缩放级别0到18获得,例如。卫星图像变化更广泛,因为这些图像不是生成的,而是直接拍摄的。 18和19都不是最高缩放级别。因此,如果您想要知道特定点的最大缩放级别,您必须使用@bkaid提到的getMaxZoomAtLatLng() - Anto Jurković

69

可用缩放级别

缩放级别0是最小的可用缩放级别,每个整数级别减半X和Y视图范围并提高线性分辨率。

Google Maps是基于256x256像素瓦片系统构建的,其中缩放级别0是一个256x256像素的全球地图图片。 缩放级别1的256x256瓦片将从缩放级别0扩大128x128像素区域。

正如bkaid所述,可用的缩放范围取决于您查看的位置和使用的地图类型:

  • 道路地图-似乎在任何地方都可以达到22级缩放
  • 混合和卫星地图-最大可用缩放级别因位置而异。以下是一些示例:
  • 南极偏远地区:13
  • 戈壁沙漠:17
  • 美国和欧洲大部分地区:21
  • “深度缩放”位置:22-23(请参见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的评论


Google静态地图API?哇,非常感谢您提到它!API链接在此... - zipzit
在将整个地球映射到256x256瓦片时,使用哪种投影? - Dims
感谢提供API链接,@zipzit!我已经将链接嵌入其中。 - JeremyD
1
@Dims - Google静态地图的所有缩放级别都使用墨卡托投影。 WhiteRabbit在此帖子中的评论解释了为什么使用了墨卡托投影,即使它夸大了赤道以外的土地比例。Anders Kaseorg对这个Quora问题的回答提供了更详细的解释。 - JeremyD

32

你需要寻找的是每个缩放级别的比例尺。请使用以下比例尺:

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

2
由于它是比率,因此比例尺本身是无量纲的。 - AndyM
3
你知道这些数字来自哪里,或者它们是如何计算出来的吗? - ChrisW
我相信这些来自这里:http://webhelp.esri.com/arcgisserver/9.3/java/index.htm#designing_overlay_gm_mve.htm。 - Goca
因此,缩放参数实际上是比例的对数双重对数。 - Sam Ginrich

12

范围取决于您查看的位置。一些地方仅具有15左右的缩放级别,而其他地方可能有23(或更多)个。 Google Maps提供了一个getMaxZoomAtLatLng API调用,可用于检索最大缩放级别。


3

使用此函数可以根据您当前的位置和到该点的距离获得最佳缩放级别(使用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);
   

0
补充一下:如果您有一个以米为单位的期望地图大小,并且想要找到缩放级别,您可以使用numpy来使用此方程式找到它:
其中“map_edge_length”是您的输入。
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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接