【问题标题】:How to Calculate Scale to Zoom ratio for Google Static map Images如何计算 Google 静态地图图像的缩放比例
【发布时间】:2011-09-13 18:28:33
【问题描述】:

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

【问题讨论】:

    标签: java zooming google-static-maps


    【解决方案1】:

    Google Maps Documentation所述:

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

    意味着在缩放级别 2 时,地图任意方向的像素 = 256 * 2² = 1024px。

    考虑到地球的周长约为 40,000 公里,在缩放 0 时,每个像素 ~= 40,000 公里/256 = 156.25 公里
    放大 9 倍时,像素为 131072:1px = 40,000 公里 / 131072 = 0.305 公里……以此类推。

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

    我尝试缩放 = 15 并获得 1px = 0.00478 和缩放 = 16 给我 1px = 0.00238km

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

    随着您在纬度上向北或向南移动,周长每次都会变小,从而改变距离。当然,它也会改变 y 轴 上的相关性,因为球体的投影很棘手。
    如果你想用函数计算准确的距离,你应该使用谷歌在their documentation提供的函数:

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

    【讨论】:

      【解决方案2】:

      你可以试试这个:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-24
        • 1970-01-01
        • 1970-01-01
        • 2017-11-30
        • 1970-01-01
        相关资源
        最近更新 更多