我在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)。其实 beggiinning是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)
然后应用欧几里德距离的公式。我的问题是这是一个正确的方法,有没有其他方法可以做到这一点?
答案 0 :(得分:2)
你需要使用Haversine公式来计算两点之间的great-circle distance - 即地球表面上的最短距离 - 请参阅此处的描述http://www.movable-type.co.uk/scripts/latlong.html
或者(引自here)如果你需要使用欧几里德距离
如果这两个点彼此靠近,例如在同一个城市, 用直线估算大圆 纬度 - 经度空间将产生最小的误差,并且很多 更快地计算。一个小的并发症是长度的事实 一定程度的经度取决于纬度:一定程度 赤道上的经度为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)
并且为了进一步提高速度,您可以使用多项式近似来近似 cos 计算。
答案 1 :(得分:0)
由于二维曲面中的“曲率”概念,您的度量标准不起作用。
欧几里德度量标准仅对计算地球表面上的“短”距离有效,但是对于非常大的距离(如您的示例中的距离),需要考虑曲率效应,因此您必须使用符合标准的度量球形表面的几何形状:Haversine公式。