Shapelyを使用したポリゴンオーバーレイ


15

Shapelyを使用して、以下に示すすべての重複しないポリゴン(与えられたポリゴンA、B、C)をキャプチャしようとしています。さらに、反復や交差のテストなどを行わずにそうすることを望んでいます。この質問に対する受け入れられた答えは、PostGISメソッドを表していますが、「ユニオン」は人によって異なることを意味するようです。

ポリゴンオーバーレイ

回答:


21

あるレベルで反復する必要があります。(更新: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経由): 重複しない


1

数年後、より良い解決策があるようです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))))

それは、計算時間に関する唯一の問題であり、穴のあるポリゴンをサポートしない、あらゆる長さのジオメトリをサポートします。


好奇心から、なぜあなたのソリューションは@MikeTのソリューションより優れていると思いますか?問題については、計算時間の観点からしか読むことができません。
mgri
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.