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

Python 如何计算两个地理坐标的距离?,python,algorithm,math,geolocation,gps,Python,Algorithm,Math,Geolocation,Gps,我阅读并用Python实现了公认的答案(见下文)。它在原则上是可行的,但结果始终比预期高出30%(捷克共和国)——这是该算法的预期精度吗 为了验证该算法,我使用一个已知对角线距离(建筑物,两个城市)的边界框,并使用输出坐标作为“我的”算法的输入 问题在哪里 我的实现 算法本身 蟒蛇 测试 我的实施: R= 6371 #km dLat = math.radians(lat2-lat1) dLon = math.radians(lon2-lon1) lat1 = math.radians(lat

我阅读并用Python实现了公认的答案(见下文)。它在原则上是可行的,但结果始终比预期高出30%(捷克共和国)——这是该算法的预期精度吗

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

问题在哪里

  • 我的实现
  • 算法本身
  • 蟒蛇
  • 测试
我的实施:

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

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

我不能用你的代码重现你的结果,所以我相信错误在于你的测试

以下是一些十进制度数格式的测试数据:

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

这显然是一个错误。仅指定为一对数字的坐标是不明确的(例如:BoundingBox和上述距离的引用都使用(long,lat),算法使用排序lat,long)。当您遇到一个不熟悉的数据源而没有正式规范的不明确格式时,您只需进行健全性检查。像这样的网站会毫不含糊地告诉你布拉格位于“50°05′N 14°25′E”——也就是说,大致上大约在50度纬度(南北)和14度经度(东西)。不,算法不应该有那么大的误差。该链接指定您可以预期大约0.3%的错误

我不能用你的代码重现你的结果,所以我相信错误在于你的测试

以下是一些十进制度数格式的测试数据:

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

这显然是一个错误。仅指定为一对数字的坐标是不明确的(例如:BoundingBox和上述距离的引用都使用(long,lat),算法使用排序lat,long)。当您遇到一个不熟悉的数据源而没有正式规范的不明确格式时,您只需进行健全性检查。像这样的网站会毫不含糊地告诉你布拉格位于“北纬50°05′N,东经14°25′”——也就是说,非常粗略地说,大约是北纬50度(南北)和经度14度(东西)。

你为什么要提出一个新问题@AshwiniChaudhary这应该是唯一的一个。第一个问题是在还没有写出来的时候被错误地按了一下,你可以随时编辑你的问题,或者像以前那样删除它。你甚至可以在修正早发帖子时删除一个问题,然后取消删除。(至少,我相信你能做到;你肯定能做到。)你为什么要发布一个新问题@AshwiniChaudhary这应该是唯一的一个。第一个问题是在还没有写出来的时候被错误地按了一下,你可以随时编辑你的问题,或者像以前那样删除它。你甚至可以在修正早发帖子时删除一个问题,然后取消删除。(至少,我相信你能做到;你可以这样做,因为答案是肯定的。)事实上,坐标的顺序是混合的。事实上,坐标的顺序是混合的。