【发布时间】:2012-05-19 22:25:58
【问题描述】:
Python 中是否有任何软件包允许对球体表面的经度/纬度进行类似 kdtree 的操作? (这需要适当考虑球面距离以及经度环绕)。
【问题讨论】:
标签: python data-structures latitude-longitude kdtree
Python 中是否有任何软件包允许对球体表面的经度/纬度进行类似 kdtree 的操作? (这需要适当考虑球面距离以及经度环绕)。
【问题讨论】:
标签: python data-structures latitude-longitude kdtree
二叉搜索树无法通过设计处理极性表示的环绕。您可能需要将坐标转换为 3D 笛卡尔空间,然后应用您喜欢的搜索算法,例如 kD-Tree、Octree 等。
或者,如果您可以将坐标的输入范围限制在表面上的一个小区域,您可以对该区域应用适当的地图投影,即不会过度扭曲您所在区域的形状,然后应用这些无环绕笛卡尔地图坐标上的标准二叉搜索树。
【讨论】:
我相信来自 scikit-learn 的 BallTree 与 Haversine 指标应该可以为您解决问题。
举个例子:
from sklearn.neighbors 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
见:
【讨论】: