我目前正在使用谷歌静态地图图像,我希望了解如何计算给定缩放级别的比例。我知道谷歌地图使用墨卡托投影。我正在制作的应用程序从 Google 获取卫星地图图像,用户在其上绘制一个多边形。我需要以现实世界的单位计算这个多边形的面积。有什么建议么???
问问题
3818 次
2 回答
3
如谷歌地图文档所述:
因为基本的墨卡托谷歌地图图块是 256 x 256 像素。
另请注意,每个缩放级别,地图都有 2 n 个图块。
这意味着在 zoomLevel 2 时,地图任意方向的像素 = 256 * 2² = 1024px。
考虑到地球的周长约为 40,000 公里,在缩放 0 时,每个像素 ~= 40,000 km/256 = 156.25 km
在缩放 9 时,像素为 131072:1px = 40,000 km / 131072 = 0.305 km ... 和很快。
如果我们想要 400px = 1km,我们必须选择最接近的近似值,因此:1px = 1km/400 = 0.0025km
我尝试了 zoom = 15 并获得 1px = 0.00478 和 zoom = 16 这给了我 1px = 0.00238km
这意味着您应该使用 zoom = 16,并且在赤道线上每 400 像素将有 0.955 公里,并且仅适用于x 坐标。
当您在纬度上向北或向南移动时,周长每次都会变小,从而改变距离。当然,它也会改变y 轴的相关性,因为球体的投影很棘手。
如果您想用函数计算确切的距离,您应该使用谷歌在他们的文档中提供的:
// Describe the Gall-Peters projection used by these tiles.
gallPetersMapType.projection = {
fromLatLngToPoint: function(latLng) {
var latRadians = latLng.lat() * Math.PI / 180;
return new google.maps.Point(
GALL_PETERS_RANGE_X * (0.5 + latLng.lng() / 360),
GALL_PETERS_RANGE_Y * (0.5 - 0.5 * Math.sin(latRadians)));
},
fromPointToLatLng: function(point, noWrap) {
var x = point.x / GALL_PETERS_RANGE_X;
var y = Math.max(0, Math.min(1, point.y / GALL_PETERS_RANGE_Y));
return new google.maps.LatLng(
Math.asin(1 - 2 * y) * 180 / Math.PI,
-180 + 360 * x,
noWrap);
}
};
于 2016-06-22T14:52:56.913 回答
0
你可以试试这个:
public static int GetWebMercatorZoomLevelFromMapScale(double currentMapScale)
{
var scales = Enumerable.Range(1, 25)
.Select(x => 591657550.500000 / Math.Pow(2, x - 1))
.ToArray();
int zoomLevel = Array.IndexOf(scales, scales.OrderBy(number => Math.Abs(number - currentMapScale)).First());
return zoomLevel;
}
于 2018-10-11T14:47:23.057 回答