回答:
あるレベルで反復する必要があります。(更新:1つのリスト内包を除くすべての「for」ループを削除するように編集しました)
# imports used throughout this example
from shapely.geometry import Point
from shapely.ops import cascaded_union
from itertools import combinations
# Here are your input shapes (circles A, B, C)
A = Point(3, 6).buffer(4)
B = Point(6, 2).buffer(4)
C = Point(1, 2).buffer(4)
# list the shapes so they are iterable
shapes = [A, B, C]
最初に、各形状の組み合わせペアを使用して、すべての交差点の結合が必要です(カスケード結合を使用)。次に、すべての形状の結合から交差を(を介して)削除します。difference
# All intersections
inter = cascaded_union([pair[0].intersection(pair[1]) for pair in combinations(shapes, 2)])
# Remove from union of all shapes
nonoverlap = cascaded_union(shapes).difference(inter)
これはnonoverlap
次のようになります(JTS Test Builder経由):
数年後、より良い解決策があるようですshapely
:
# imports used throughout this example
from shapely.geometry import Point
from shapely.ops import polygonize, unary_union
# Here are your input shapes (circles A, B, C)
A = Point(3, 6).buffer(4)
B = Point(6, 2).buffer(4)
C = Point(1, 2).buffer(4)
...
# list the shapes so they are iterable
shapes = [A, B, C, ...]
# generate the overlay
list(polygonize(unary_union(list(x.exterior for x in shapes))))
それは、計算時間に関する唯一の問題であり、穴のあるポリゴンをサポートしない、あらゆる長さのジオメトリをサポートします。