我试图在它们接触的条件下创建多边形区域。在我的示例中,我有一个包含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
但我认为这里的问题是我没有任何最近的邻居,所以我仍然需要在每个建筑物上迭代两次。
所以我的问题是:最近邻居对于地区的成长至关重要吗?或者有其他方式有效地做到这一点吗?
答案 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