【发布时间】:2011-09-16 07:17:42
【问题描述】:
我有数百万个地理点。对于其中的每一个,我想找到所有“相邻点”,即某个半径内的所有其他点,比如几百米。
这个问题有一个简单的 O(N^2) 解决方案——简单地计算所有点对的距离。但是,因为我正在处理适当的距离度量(地理距离),所以应该有更快的方法来做到这一点。
我想在 python 中执行此操作。想到的一种解决方案是使用一些数据库(带有 GIS 扩展的 mySQL,PostGIS),并希望这样的数据库能够使用一些索引有效地执行上述操作。不过,我更喜欢更简单的东西,这不需要我构建和学习这些技术。
几点
- 我将执行数百万次“查找邻居”操作
- 数据将保持静态
- 因为这个问题在某种意义上很简单,我想看看他们解决它的python代码。
就python代码而言,我想要一些类似的东西:
points = [(lat1, long1), (lat2, long2) ... ] # this list contains millions lat/long tuples
points_index = magical_indexer(points)
neighbors = []
for point in points:
point_neighbors = points_index.get_points_within(point, 200) # get all points within 200 meters of point
neighbors.append(point_neighbors)
【问题讨论】:
-
您是否需要多次执行此操作(这样,做一些(艰苦的)工作可能会很有用,每次您需要某个点时进行更简单的计算)?您是否需要为多个点获取邻居,或者每次都是同一点的“中心”?
-
我想执行这个查询数百万次。事实上,我想找到每个点的邻居。
-
地理点在应用程序期间是静态的,还是每次执行查询时都不同?
-
我不明白为什么在 Postgres 中的点上使用 GIST 索引是不可取的。您肯定不想一直重新计算每一个最后一百万点的邻居吗?
-
点将保持不变。正如您所提到的,Postgres 中的 GIS 索引可能会解决问题,但我不知道如何使用 Postgres,并且更喜欢不需要我学习和构建其他技术的更简单的灵魂。
标签: python gis geospatial distance geo