将新的匀称点匹配到一系列匀称的多边形-快速

时间:2020-08-06 12:02:56

标签: python pandas shapely

我有一系列不规则重叠的多边形(> 1000)。我想介绍一个新的匀称点,并且想快速了解该点在哪个多边形中。我为此有一个for循环,但我正在寻找一种更快的方法。

from shapely.geometry import Point
from shapely.geometry.polygon import Polygon

test_points  = pd.Series([[(0,1), (1,1), (1,0)], [(0,0), (0,1), (1,0)]])

# a Dataframe containing my polygons and an id
polygonized_points = pd.DataFrame({"polygons" : test_points.map(lambda x : Polygon(x)), "id" : range(0, len(test_points), 1)})

# a new point
new_point = Point(0.4, 0.3)

# allocation of point to hexes (which I want to be faster)
for idx, row in polygonized_points.iterrows() :
    if row.polygons.contains(new_point) :
        new_point_in_id = row.id # imagine this would be a df with an empty column for the id variable

我非常确定我错过了一些东西来加快b / c的速度,我认为for循环扩展性不好。感谢您的帮助!最好的

1 个答案:

答案 0 :(得分:0)

在这种情况下,for循环不是问题:多边形测试中的点很慢。优化代码意味着优化多边形测试中的点数,这通常是使用空间索引来完成的。答案:https://gis.stackexchange.com/a/119935来自GIS Stack-Exchange,在列出许多可能的空间索引策略方面做得很好。 for循环有大约1000个无关紧要的重复。很有可能使用R-Tree,例如来自以下Python包的https://toblerity.org/rtree/。在装配(您的多边形的)边界框之后,R-Tree可以有效地搜索。之后,仅对边界框内具有该点的多边形(通常为2-5)执行多边形测试中的昂贵点。

相关问题