你不能计算每一对城市之间的距离。相反,您需要将您的城市放在一个space-partitioning data structure中,您可以对其进行快速的近邻查询。SciPy附带了一个kd-tree实现,^{},它适合这个应用程序。在
这里有两个困难。首先,^{}使用点之间的欧几里德距离,但是您需要使用沿地球表面的大圆距离。第二,经度环绕,所以最近的邻居的经度可能相差360度。如果采取以下方法,这两个问题都可以解决:将您的位置从geodetic coordinates(纬度,经度)转换为ECEF(以地球为中心,地球固定)坐标(x,y,z)。
将这些ECEF坐标放入^{}。
将您的大圆距离(例如,30公里)转换为欧几里得距离。
呼叫^{}获取范围内的城市。
下面是一些示例代码来说明这种方法。函数geodetic2ecef来自PySatel by David Parunakian,并在GPL下获得许可。在from math import radians, cos, sin, sqrt
# Constants defined by the World Geodetic System 1984 (WGS84)
A = 6378.137
B = 6356.7523142
ESQ = 6.69437999014 * 0.001
def geodetic2ecef(lat, lon, alt=0):
"""Convert geodetic coordinates to ECEF."""
lat, lon = radians(lat), radians(lon)
xi =