如何将距离从度数转换为米?

16

我正在使用普通的Mercator地图和OpenLayers,并尝试通过在经纬度中找到点网格来对边界框进行取样。Bbox以经纬度表示,例如:

48.1388,-15.3616,55.2057,-3.9359

我可以定义一个以度为单位的距离(例如 x: 2.5,y: 2.4),然后从那里计算出点。 但我想将这个距离用米来表达(例如50000),以便将其与用户的思维联系起来(人们理解米,而不是度)。 我该如何转换这个距离?我知道如何重新投影一个点,但不知道如何投影距离。

谢谢任何提示! Mulone

3个回答

23

使用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;

1
Haversine 可以适用于不同的纬度,但与 OP 所请求的相反。OP 希望将线性(米)距离映射到纬度和经度度数。 - winwaed

11

不考虑地球略微非球形的形状,

一纬度(由南向北或由北向南)= 1海里 = 6075英尺 因此,一度 = 60分钟 = 60 * 6075英尺 1米等于3.28英尺,所以 一度 = 60 * 6075 / 3.28米 = 111,128米

另外,一分纬度 = 1,852米 因此,一度 = 60 * 1852米 = 111,120米

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

对于一度经度,做同样的事情,但乘以余弦(纬度),因为经线会收敛(越来越靠近)随着你向北移动。

注:如果您使用计算器或计算机,请确保使用该设备所需或设置使用的纬度单位(度或弧度)。


这个答案似乎与 https://dev59.com/0nM_5IYBdhLWcg3wvFvI#1253545 相矛盾。我想我可能理解错了。这两个答案之间有什么区别? - Evorlor
两个答案仅相差 (111.128 - 110.574) / 111.128 = 0.498%。 - Charles Bretana
1
你没有理解重点。在现实世界中,没有任何数字测量答案是或可以100%准确的。你不是在“计数”东西!你正在“测量”真实的东西。你所做的任何测量都将有一定程度的不准确性。问题是测量的精度是多少(什么级别的准确性)?如果你需要的精度大于+-0.498%,那么简化公式将无法满足地球上每个点或一对点的要求。如果你要求完美的准确性,那么就用卷尺去测量吧。而且那也会随时变化! - Charles Bretana
1
没有任何测量工具可以百分之百准确。即使是卷尺!卷尺有多准确?它会随着温度变化、你拉扯它、稍微弯曲等等而收缩和膨胀。当然,这些变化很小,但这正是关键所在!它们比计算波长的激光测量要大得多。而激光波长会根据重力场的强度而改变。真正的问题是:对于你需要进行的测量目的来说,什么样的误差或不确定性是显著的? - Charles Bretana
1
在木工行业曾经有一个有点玩笑的说法:“用千分尺测量,用铅笔标记,用斧头切割。” - Charles Bretana
显示剩余2条评论

1

度和米之间的转换在地球表面上是不同的。

假设地球是一个球体,纬度的度数 = 距离 * 360 / (2*PI * 6400000)

请注意,经度将根据纬度而变化:

经度的度数 = 距离 *360 * / (2*PI* cos(纬度) )

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


而对于在JavaScript中使用不同地图投影的更一般情况,可以使用开源Proj4js库。该库也被OpenLayers所使用。 - winwaed
经度的度量单位毫无意义。一边是度数,另一边是米乘以度数。您需要除以地球半径,如 longitude = distance *360 * / (2*PI* cos(latitude) * 6400000) 吗? - SeF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接