我有一个带有纬度和经度元组的数据框如下(实际坐标样本):
id latlon
67 79 (39.1791764701497, -96.5772313693982)
68 17 (39.1765194942359, -96.5677757455844)
69 76 (39.1751440428827, -96.5772939901891)
70 58 (39.175359525189, -96.5691986655256)
71 50 (39.1770962912298, -96.5668107589661)
我想在同一个数据框中找到id
和最近latlon
的距离(为了便于说明,我只是在nearest_id
和{{1列}:
nearest_dist
我有一大堆(45K +)坐标,我想在这里执行此操作。
以下是我尝试的解决方案,使用 id latlon nearest_id nearest_dist
67 79 (39.1791764701497, -96.5772313693982) 17 37
68 17 (39.1765194942359, -96.5677757455844) 58 150
69 76 (39.1751440428827, -96.5772939901891) 50 900
70 58 (39.175359525189, -96.5691986655256) 17 12
71 50 (39.1770962912298, -96.5668107589661) 79 4
中的great_circle
:
geopy.distances
如何有效地进行此计算?
答案 0 :(得分:2)
'scipy.spatial'有许多用于空间搜索的有用(且极快)算法。似乎是您的问题的正确工具是'cKDTree'。
tree = cKDTree(data)
数据应该是n * 2形状的numpy数组(它可以计算n维空间中的距离,但在这种情况下我们有两个维度)
然后你可以查询树中最近的k个邻居:
dist, idx = tree.query(x, k=1)
使用索引,获取id应该是微不足道的。我回答了类似的问题here。另请查看有关投影信息的评论。
答案 1 :(得分:1)
你可以有效地使用PostGIS / PostgreSQL,但是你必须将你的数据放到一个可能很难的sql表中。您可以从python发出postgresql命令,但仍然需要设置后端。希望有人能够通过使用python为您提供有关如何使用它的提示。
答案 2 :(得分:1)
空间索引应该有所帮助。
您可以使用数据库实现空间索引(例如Postgres with PosGIS扩展),但您也可以拥有内存中的解决方案。
查看Rtree库。您需要创建索引,将所有点添加到索引,然后使用nearest
方法查询索引。