我在我的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公式来计算两点之间的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计算。
由于二维曲面中-曲率-的概念,您的度量标准不起作用。