【问题标题】:How to transform a distance from degrees to metres?如何将距离从度转换为米?
【发布时间】:2011-05-05 09:21:00
【问题描述】:

我正在使用带有普通墨卡托地图的 OpenLayers,我试图通过在 latlong 中查找点网格来对边界框进行采样。 bbox用latlon表示,例如

48.1388,-15.3616,55.2057,-3.9359

我可以以 为单位定义距离(例如 x:2.5,y:2.4)并从那里计算出点。 但我想用 (例如 50000)来表示这个距离,以便将它与用户的心态联系起来(人们理解米,而不是度数)。 我怎样才能转换这个距离?我知道如何重新投影一个点,但不是一个距离。

感谢您的任何提示! 木龙

【问题讨论】:

    标签: transform openlayers proj4js haversine map-projections


    【解决方案1】:

    在不考虑地球略微非球形的情况下,

    南北纬一分钟 = 1 海里 = 6075 英尺 所以 1 度 = 60 分钟 = 60 * 6075 英尺 一米有3.28英尺,所以 1 度 = 60 * 6075 / 3.28 米 = 111,128 米

    或者,一分钟的纬度 = 1,852 米 所以 1 度 = 60 * 1852 米 = 111,120 米

    我不确定哪个更准确...

    对于一度经度,做同样的事情,但乘以余弦(纬度),因为当您向北移动时,经度线越来越靠近。

    【讨论】:

      【解决方案2】:

      使用haversine formula 获取经纬度两点之间的距离。这假设地球是一个球体(在大多数情况下,“足够好”)。

      它的 Javascript 实现(无耻地从 here 窃取)如下所示:

      var R = 6371; // km
      var dLat = (lat2-lat1).toRad();
      var dLon = (lon2-lon1).toRad(); 
      var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
              Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) * 
              Math.sin(dLon/2) * Math.sin(dLon/2); 
      var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
      var d = R * c;
      

      【讨论】:

      • Haversine 适用于不同的纬度,但与 OP 的要求相反。 OP想要将线性(米)距离映射到纬度和经度。
      【解决方案3】:

      度数和米之间的转换在地球表面各不相同。

      假设地球为球形,纬度 = 距离 * 360 / (2*PI * 6400000)

      注意,经度会因纬度而异:

      度经度 = 距离 *360 * / (2*PI* cos(latitude) )

      以上是地球表面,不使用墨卡托投影。如果您希望使用投影线性距离,则需要使用墨卡托投影。

      【讨论】:

      • 对于在 javascript 中处理不同地图投影的更一般情况,请使用开源 Proj4js 库。 - OpenLayers 也使用它。
      • 经度的测量单位没有意义。一侧有度数,另一侧有米乘以度数。您是否必须将地球半径除以`经度 = 距离 360 * / (2*PI cos(latitude) * 6400000)`?
      猜你喜欢
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      • 2010-10-12
      相关资源
      最近更新 更多