如何计算两个地理坐标的距离?
Posted
技术标签:
【中文标题】如何计算两个地理坐标的距离?【英文标题】:How to compute distance of two geographical coordinates? 【发布时间】:2013-06-16 14:53:16 【问题描述】:我阅读了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
【问题讨论】:
你为什么发布一个新问题? ***.com/questions/17134437/… @AshwiniChaudhary 这应该是唯一的一个。第一个是在尚未写入时被某个错误按下的键发布的。 您可以随时编辑您的问题 - 或按照您的方式将其删除。您甚至可以在修复过早发布时删除问题,然后取消删除。 (至少,我相信你可以;你肯定可以这样做。) 【参考方案1】:不,算法不应该有那么大的误差。该链接指定您可以预期大约 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 度经度(东西)。
【讨论】:
确实坐标的顺序是混合的。以上是关于如何计算两个地理坐标的距离?的主要内容,如果未能解决你的问题,请参考以下文章
LBS高德地图百度地图的经纬度科普|MySQL和编程语言是如何计算两个坐标之间的距离?