如何计算两个地理坐标的距离?

时间:2013-06-16 14:53:16

标签: python algorithm math geolocation gps

我阅读this question并在Python中实现了接受的答案(见下文)。它原则上有效,但结果始终比预期高出约30%(捷克共和国) - 这个算法的预期准确度是多少?

为了验证算法,我使用BoundingBox来获得具有已知对角线距离(建筑物,两个城市)的边界框,并使用输出坐标作为“我的”算法的输入。

问题出在哪里?

  • 我的实施?
  • 算法本身?
  • 的Python?
  • 测试?

我的实施:

R= 6371 #km
dLat = math.radians(lat2-lat1)
dLon = math.radians(lon2-lon1)
lat1 = math.radians(lat1)
lat2 = math.radians(lat2)

a= math.sin(dLat/2)*math.sin(dLat/2) + math.sin(dLon/2) * math.sin(dLon/2) * math.cos(lat1) * math.cos(lat2)
c= 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
d = R * c;
return d

1 个答案:

答案 0 :(得分:3)

不,算法不应该有这么大的错误。该链接指定您可以预期大约0.3%的错误。

我无法使用您的代码重现您的结果,因此我认为错误与您的测试有关。

以下是site with the distance between and coordinates of Prague and Brno十进制度格式的一些测试数据:

lat_prague, long_prague = 50.0833, 14.4667
lat_brno, long_brno = 49.2000, 16.6333
expected_km = 184.21

以下是测试结果:

>>> def calc(lat1,lon1, lat2,lon2):
# ... your code ...

>>> calc(lat_prague,long_prague,lat_brno,long_brno)
184.34019283649852
>>> calc(lat_prague,long_prague,lat_brno,long_brno) / expected_km
1.0007067631317437

一个疯狂的猜测:对于捷克共和国的地点,你得到的错误似乎是正确的数量级,因为它混合了纬度和经度:

>>> calc(long_prague,lat_prague,long_brno,lat_brno)
258.8286271447481
>>> calc(long_prague,lat_prague,long_brno,lat_brno) / expected_km
1.405073704710646

这显然是known confusion。仅指定为一对数字的坐标是不明确的(例如:BoundingBox和上面使用距离的参考(long,lat),算法使用排序lat,long)。当您在没有正式规范的情况下使用不熟悉的数据源遇到模糊格式时,您只需要进行完整性检查。像Wikipedia这样的网站会毫不含糊地告诉你布拉格位于“50°05'N 14°25'E” - 即非常粗略地说,大约在50度左右(南北)和14度经度(东边) -West)。