Polygonüberlagerung mit Shapely


15

Ich versuche, alle nicht überlappenden Polygone, die unten angezeigt werden, mit Shapely zu erfassen (gegebene Polygone A, B und C). Darüber hinaus hoffe ich, dies ohne Iteration, Prüfung auf Schnittmenge usw. zu tun. Die akzeptierte Antwort auf diese Frage drückt die PostGIS-Methode aus, aber es scheint, dass 'Vereinigung' für verschiedene Menschen verschiedene Dinge bedeutet.

Polygon-Overlay

Antworten:


21

Sie müssen auf einer bestimmten Ebene iterieren. ( Update : Ich habe bearbeitet, um alle "for" -Loops zu entfernen, mit Ausnahme eines Listenverständnisses )

# 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]

Zuerst benötigen Sie die Vereinigung aller Schnittpunkte (verwenden Sie eine kaskadierte Vereinigung ), wobei Sie das Kombinationspaar jeder Form verwenden. Dann entfernen Sie (über difference) die Schnittpunkte aus der Vereinigung aller Formen.

# 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)

So nonoverlapsieht es aus (über JTS Test Builder): nicht überlappend


1

Nach ein paar Jahren scheint es eine bessere Lösung zu geben durch 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))))

Es unterstützt jede Länge der Geometrie, das einzige Problem ist die Berechnungszeit, und es unterstützt kein Polygon mit Löchern.


Warum ist Ihre Lösung aus Neugier besser als die von @MikeT? Ich kann nur über ein Problem in Bezug auf die Berechnungszeiten lesen.
Mi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.