Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何计算谷歌静态地图图像的缩放比例_Java_Zooming_Google Static Maps - Fatal编程技术网

Java 如何计算谷歌静态地图图像的缩放比例

Java 如何计算谷歌静态地图图像的缩放比例,java,zooming,google-static-maps,Java,Zooming,Google Static Maps,我目前正在使用Google静态地图图像,我希望了解如何计算给定缩放级别的比例。我知道谷歌地图使用墨卡托投影。我正在制作的应用程序从谷歌获取卫星地图图像,用户在上面画一个多边形。我需要用真实世界的单位来计算这个多边形的面积。有什么建议吗?如所述: 因为基本墨卡托谷歌地图分幅是256 x 256像素。 还请注意,每个缩放级别,贴图都有2个n分幅 这意味着在zoomLevel 2,地图任何方向上的像素都是=256*2²=1024px 考虑到地球周长约为40000公里,在缩放0时,每个像素~=40000

我目前正在使用Google静态地图图像,我希望了解如何计算给定缩放级别的比例。我知道谷歌地图使用墨卡托投影。我正在制作的应用程序从谷歌获取卫星地图图像,用户在上面画一个多边形。我需要用真实世界的单位来计算这个多边形的面积。有什么建议吗?

如所述:

因为基本墨卡托谷歌地图分幅是256 x 256像素。
还请注意,每个缩放级别,贴图都有2个n分幅

这意味着在zoomLevel 2,地图任何方向上的像素都是=256*2²=1024px

考虑到地球周长约为40000公里,在缩放0时,每个像素~=40000公里/256=156.25公里
在缩放9时,像素为131072:1px=40000公里/131072=0.305公里。。。等等

如果我们想要400px=1km,我们必须选择最接近的近似值,因此:1px=1km/400=0.0025km

我尝试了zoom=15,得到了1px=0.00478和zoom=16,得到了1px=0.00238公里

这意味着您应该使用zoom=16,在赤道线上每400px将有0.955km的距离,并且仅适用于x坐标

当你在纬度上向北或向南移动时,周长每次都会变小,从而改变距离。当然,它也会改变y轴的相关性,因为球体的投影很复杂。
如果要使用函数计算精确距离,应使用Google提供的函数:

//描述这些瓷砖使用的Gall-Peters投影。
GallMapType.projection={
fromLatLngToPoint:函数(latLng){
var latRadians=latLng.lat()*Math.PI/180;
返回新的google.maps.Point(
GALL_PETERS_RANGE_X*(0.5+latLng.lng()/360),
GALL_-PETERS_RANGE_Y*(0.5-0.5*数学sin(拉特弧度));
},
fromPointToLatLng:函数(点,noWrap){
var x=点x/GALL_-PETERS_范围_x;
var y=Math.max(0,Math.min(1,point.y/GALL_-PETERS_-RANGE_-y));
返回新的google.maps.LatLng(
Math.asin(1-2*y)*180/Math.PI,
-180+360*x,
noWrap);
}
};
您可以尝试以下方法:

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;
}