mya*_*mar 1 java gis google-maps latitude-longitude coordinate-transformation
我在我的 java 项目中使用 Google Maps API v3。我需要找到两点之间的欧几里得距离。但是当我使用普通公式计算欧几里得距离时,结果在某种程度上是错误的:
例如:
假设我有两个点纽约 (43.2994285, -74.2179326)和 斯德哥尔摩 (59.3293235, 18.0685808),我想计算这两个点的欧几里得距离:
双倍距离 = Math.sqrt(Math.pow(43.2994285 - 59.3293235, 2) + Math.pow(-74.2179326 - 18.0685808, 2)); 距离 = 93.66834091217483
结果显然是错误的。
然后我意识到开始坐标不是笛卡尔坐标系中的 (0,0)。实际上开始是 51° 28' 38" N, 0° 00' 00" W (WGS 84)。参考点是格林威治 (51.4825766, -0.0076589)。
所以计算新坐标的过程是这样的:
纽约 (|51.4825766 - 43.2994285|, |-0.0076589- (-74.2179326)|) = 纽约 (8.1831481, 74.2102737)
斯德哥尔摩 (|51.4825766 - 59.3293235|, |-0.0076589 - 18.0685808|) = 斯德哥尔摩 (7.8467469, 18.0762397)
然后应用欧几里得距离的公式。我的问题是这是一种正确的方法,还有其他方法可以做到这一点吗?
您需要使用 Haversine 公式来计算两点之间的大圆距离- 即地球表面上的最短距离 - 请参阅此处的说明http://www.movable-type.co.uk/scripts/ latlong.html
或者(从这里引用)如果您需要使用欧几里德距离
如果两个点相距很近,例如在同一个城市,在经纬度空间用直线估计大圆会产生最小的误差,并且计算速度会快很多。一个小问题是经度的长度取决于纬度:一个经度在赤道上跨度为 111 公里,但在北纬 60° 跨度的一半。对此进行调整很容易:将经度乘以纬度的余弦。然后你可以只取两点之间的欧几里得距离,然后乘以度数的长度:
distance(lat, lng, lat0, lng0):
deglen := 110.25
x := lat - lat0
y := (lng - lng0)*cos(lat0)
return deglen*sqrt(x*x + y*y)
Run Code Online (Sandbox Code Playgroud)
为了进一步加快速度,您可以使用多项式近似来近似cos计算。