KDTree为经度/纬度

时间:2012-05-11 10:08:56

标签: python data-structures latitude-longitude kdtree

Python中是否有任何包允许人们对球体表面的经度/纬度进行类似kdtree的操作? (这需要适当考虑球面距离,以及经度环绕)。

2 个答案:

答案 0 :(得分:6)

二叉搜索树无法通过设计处理极坐标表示的环绕。您可能需要将坐标转换为3D笛卡尔空间,然后应用您最喜欢的搜索算法,例如kD-Tree,Octree等。

或者,如果您可以将坐标的输入范围限制为曲面上的小区域,则可以将适当的地图投影应用于此区域,即不会过度扭曲区域形状的区域,并应用这些无环绕的笛卡尔地图坐标上的标准二分搜索树。

答案 1 :(得分:1)

我相信scikit-learn中的BallTree和Haversine度量标准可以为您解决问题。

例如:

from sklearn.neigbors import BallTree
import numpy as np
import pandas as pd

cities = pd.DataFrame(data={
    'name': [...],
    'lat': [...],
    'lon': [...]
})

query_lats = [...]
query_lons = [...]

bt = BallTree(np.deg2rad(cities[['lat', 'lon']].values), metric='haversine')
distances, indices = bt.query(np.deg2rad(np.c_[query_lats, query_lons]))

nearest_cities = cities['name'].iloc[indices]

请注意,此方法返回的距离假设球体的半径为1-将地球上的距离乘以半径= 6371km

请参阅: