使用特定条件给出列表元素的组

时间:2018-03-26 08:48:29

标签: python

我有一个包含5个多边形的列表,如下所示:

from itertools import compress
from shapely.geometry import Polygon

  polys = [<shapely.geometry.polygon.Polygon object at 0x000002D634217668>
     <shapely.geometry.polygon.Polygon object at 0x000002D634217780>
     <shapely.geometry.polygon.Polygon object at 0x000002D6341F9080>
     <shapely.geometry.polygon.Polygon object at 0x000002D634217FD0>
     <shapely.geometry.polygon.Polygon object at 0x000002D634217F60>]

我必须将它们分组为相交的多边形:

results = []
for poly in polys:
    indices = [poly.intersects(p) for p in polys]
    intersect_polys = list(compress(polys, indices))
    results.append(intersect_polys)   

注意:poly.intersects如果相交则返回true,否则返回false。这只是在这里使用的形状。

编辑: 基于评论@Aran-Fey:

如果是3个多边形,例如https://i.imgur.com/ekTokK9.png [a,b,c],即使bboth a and ca相交也是可能的}和c不相交。

结果将是:

[[b,c], [b,a]]

我必须找到所有这些团体。 由于多边形的顺序并不重要,因此还应删除重复的组(包含相同的多边形)

1 个答案:

答案 0 :(得分:1)

我唯一能想到的是迭代所有多边形,然后遍历所有其他多边形以找到交叉点。 (这意味着该算法具有二次运行时复杂度。)效率低下,但它可以完成工作。

result = []
for i, shape in enumerate(polys):
    intersected_shapes = [poly for poly in polys[i+1:] if shape.intersects(poly)]
    if intersected_shapes:
        intersected_shapes.append(shape)
        result.append(intersected_shapes)

使用问题(this one)中的输入[a, b, c],这会产生输出:

[[b, a], [c, b]]