使用Google地图坐标计算欧几里德距离

时间:2015-03-11 18:12:52

标签: java google-maps gis 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)。其实 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)

然后应用欧几里德距离的公式。我的问题是这是一个正确的方法,有没有其他方法可以做到这一点?

2 个答案:

答案 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公式。