谷歌地图API缩放范围
Posted
技术标签:
【中文标题】谷歌地图API缩放范围【英文标题】:google map API zoom range 【发布时间】:2012-03-10 12:48:20 【问题描述】:我正在使用 google map API version-3,我尝试使用不同的缩放值,我随机完成了一些从 1 到 100 开始的数字,地图会放大以增加数字,但某些级别会给出相同的结果,我的意思是我得到了 30 和 100 的相同缩放。
我想知道,缩放的确切范围是多少?
【问题讨论】:
【参考方案1】:Google 地图基础知识
缩放级别 - 缩放
0 - 19
0 最低缩放(全世界)
19 最高缩放(单个建筑物,如果可用)使用mapObject.getZoom()
检索当前缩放级别
【讨论】:
检查developers.google.com/maps/documentation/javascript/…,最大缩放级别似乎为18。是否有更改或文档不正确?在他的回答中提到的链接@bkaid中也有同样的说明。 @Jay:值 18 不是最大缩放级别。它只是在该示例中使用。请参阅谷歌文档Maximum Zoom Imagery Service:例如,大多数路线图图像的缩放级别为 0 到 18。卫星图像的变化范围更广,因为这些图像不是生成的,而是直接拍摄的。 18 和 19 都不是最高缩放级别。因此,如果您想知道特定点的最大缩放,您必须使用getMaxZoomAtLatLng()
,正如@bkaid 所述。【参考方案2】:
可用的缩放级别
缩放级别 0 是可用的最大缩小缩放级别,缩放级别的每个整数步长都会将视图的 X 和 Y 范围减半,并将线性分辨率加倍。
Google 地图建立在 256x256 像素的平铺系统上,其中缩放级别 0 是整个地球的 256x256 像素图像。缩放级别 1 的 256x256 平铺从缩放级别 0 放大 128x128 像素区域。
正如 bkaid 所说,可用的缩放范围取决于您正在查看的位置以及您使用的地图类型:
路线图 - 似乎到处都可以放大到 22 级 混合地图和卫星地图 - 最大可用缩放级别取决于位置。以下是一些示例: 南极偏远地区:13 戈壁滩:17 美国和欧洲的大部分地区:21 “深度缩放”位置:22-23(见bkaid's link)请注意,这些值适用于 Google Static Maps API,它似乎比 Javascript API 提供了更多的缩放级别。似乎静态地图可用的额外缩放级别只是来自 Javascript API 的最大分辨率图像的上采样版本。
不同缩放级别的地图比例
Google 地图使用墨卡托投影,因此比例随纬度变化很大。根据纬度计算正确比例的公式是:
meters_per_pixel = 156543.03392 * Math.cos(latLng.lat() * Math.PI / 180) / Math.pow(2, zoom)
公式来自Chris Broadfoot's comment。
【讨论】:
Google Static Maps API
?哇。非常感谢您提到这一点!链接到API here...
将整个地球映射到 256x256 瓦片时,使用哪种投影?
感谢 API 链接,@zipzit!我添加了内联链接。
@Dims – Google 静态地图的所有缩放级别都使用墨卡托投影。 WhiteRabbit 对this thread 的评论解释了为什么使用墨卡托投影,尽管它夸大了远离赤道的土地规模。 Anders Kaseorg 对this Quora question 的回复提供了更详细的解释。【参考方案3】:
您正在寻找的是每个缩放级别的比例。使用这些:
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
【讨论】:
比例尺本身是无量纲的。 你知道这些数字是从哪里来的,或者它们是如何计算的吗? 我相信这些来自这里webhelp.esri.com/arcgisserver/9.3/java/… 所以缩放参数实际上是比例的对数【参考方案4】:范围取决于您查看的位置。有些地方只有 15 级左右的缩放级别,而其他地方有 23 级(或可能更多)。 Google 地图有一个 getMaxZoomAtLatLng
API 调用,您可以调用它来检索最大缩放级别。
【讨论】:
【参考方案5】:使用此功能可根据您当前的位置和到该点的距离获得最佳缩放(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);
【讨论】:
以上是关于谷歌地图API缩放范围的主要内容,如果未能解决你的问题,请参考以下文章