我正在编写一个大量使用 geodjango(在 PostGis 上)和空间查找的应用程序。数据库端的距离查询效果很好,但现在我必须计算应用程序 python 端两点之间的距离(这些点来自使用单独查询获得的模型)。
我可以想出很多方法来计算这个距离,但我想知道以与数据库输出一致的方式来做。
是否有任何神奇的 python 函数可以计算两个点之间的距离,它们是在哪个 SRID 中测量的?如果不是,您还能提出什么其他方法。
您可以使用这个问题的 hasrsine 函数:
>>> from math import radians, cos, sin, asin, sqrt
>>>
>>> def haversine(lon1, lat1, lon2, lat2):
... """
... Calculate the great circle distance between two points
... on the earth (specified in decimal degrees)
... """
... # convert decimal degrees to radians
... lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
... # haversine formula
... dlon = lon2 - lon1
... dlat = lat2 - lat1
... a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
... c = 2 * asin(sqrt(a))
... km = 6367 * c
... return km
...
>>> haversine(-1.7297, 53.3205, -1.6997, 53.3186)
2.0025842109026413
如果您想要与 PostGIS 的方式保持一致,您可能想要使用比 hasrsine 实现更好的东西。我建议您查看GeographicLib的 Python 版本,它可以更准确地进行计算。
使用适当的数据连接来执行您已经在使用的 SQL 函数,然后检索它... 保持一切一致。