找到距离最近的GPS坐标的距离(最近邻搜索)

时间:2017-08-28 23:34:46

标签: python pandas gis geopandas

我有一个带有纬度和经度元组的数据框如下(实际坐标样本):

    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

如何有效地进行此计算?

3 个答案:

答案 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方法查询索引。