15

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

48.1388,-15.3616,55.2057,-3.9359

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

感谢您的任何提示!穆龙

4

3 回答 3

20

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

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

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;
于 2010-11-05T00:24:53.270 回答
8

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

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

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

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

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

于 2010-11-05T00:11:35.653 回答
1

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

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

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

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

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

于 2010-11-05T00:15:23.930 回答