【问题标题】:Match new shapely Point to a series of shapely polygons - fast [duplicate]将新的匀称点匹配到一系列匀称的多边形 - 快速[重复]
【发布时间】:2020-08-06 12:02:56
【问题描述】:

我有一系列不重叠的形状多边形 (>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 循环不能很好地扩展。感谢您的帮助!最好的

【问题讨论】:

    标签: python pandas shapely


    【解决方案1】:

    在这种情况下,for 循环不是问题:多边形测试中的点很慢。优化代码意味着优化多边形测试中的点数,这通常使用空间索引来完成。这个答案:来自 GIS Stack-Exchange 的https://gis.stackexchange.com/a/119935 很好地列出了许多可能的空间索引策略。 for 循环有大约 1000 次重复,无需担心。一个很好的可能性是使用 R-Tree,就像来自这个 Python 包:https://toblerity.org/rtree/。在拟合(多边形的)边界框后,R-Tree 搜索效率很高。之后,您只对在边界框内具有点的多边形(通常为 2-5)执行代价高昂的多边形点测试。

    【讨论】:

    • 这是一个有趣的策略,我需要一些时间来测试......我已经尝试将区域分成小部分,这显着加快了进程,我考虑使用最小欧几里得距离而不是多边形测试作为一种模糊方法......但一切似乎都以庞大的代码结束,这可能会产生我无法预测的边缘情况。非常感谢!
    • 经过激烈的测试,不得不说rtree的计算时间相当昂贵,导致它比初始地图的简单分割方法要慢
    猜你喜欢
    • 2015-08-08
    • 2013-01-05
    • 2013-01-19
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多