python区域以多边形性能增长

时间:2017-02-18 10:03:25

标签: python polygon region shapely

我试图在它们接触的条件下创建多边形区域。在我的示例中,我有一个包含382个多边形的示例数据集,需要将它们组合在一起(但完整数据集包含6355个多边形)。 (我会展示一张照片,但我没有足够的声誉来做这件事......)

我虽然做了这种蛮力,但当然这需要很长时间而且不是很理想。

def groupBuildings(blds):
    # blds is a list with shapely polygons
    groups = []
    for bld in blds:
        group = []
        group.append(bld)
        for other in blds:
            for any in group:
                if any != other and any.intersects(other):
                    group.append(other)
        groups.append(group)
    return groups

我了解到区域的增长,并认为这将是一个可能的解决方案,但性能仍然很糟糕。我已通过以下方式实现了这一点:

def groupBuildings(blds):
    # blds is a list with shapely polygons
    others = blds
    groups = []
    while blds != []:
        done = []
        group = []
        first = blds.pop(0)
        done.append(first)
        group.append(first)
        for other in others:
            if (other in blds) and first.touches(other):
                group.append(other)
                blds.remove(other)

return groups

但我认为这里的问题是我没有任何最近的邻居,所以我仍然需要在每个建筑物上迭代两次。

所以我的问题是:最近邻居对于地区的成长至关重要吗?或者有其他方式有效地做到这一点吗?

1 个答案:

答案 0 :(得分:1)

您最好使用shapely.ops.cascaded_union()docs here)。

from shapely.geometry import Point, Polygon, MultiPolygon
from shapely.ops import cascaded_union
import numpy as np
polygons = [Point(200*x,200*y).buffer(b) for x,y,b in np.random.random((6000,3))]
multi = MultiPolygon(polygons)
unioned = cascaded_union(multi)

%%timeit
unioned = cascaded_union(multi) 
# 2.8 seconds for me