Konvertieren von Shapely MultiPolygon in Polygon: Die Technik funktioniert nicht immer

10

Um die äußeren Koordinaten zu erhalten, muss ich ein formschönes MultiPolygon in ein Polygon konvertieren. So mach ich es:

if poly.geometry.type == 'Polygon':
    x, y = poly.geometry.exterior.xy
elif poly.geometry.type == 'MultiPolygon':
    allparts = [p.buffer(0) for p in poly.geometry]
    poly.geometry = shapely.ops.cascaded_union(allparts)
    x, y = poly.geometry.exterior.xy  # here happens the error

Dies ist sehr oft erfolgreich, aber es gibt auch Fälle, in denen das Polygon offensichtlich ein MultiPolygon bleibt, da der folgende Fehler immer noch auftritt:

AttributeError: 'MultiPolygon' object has no attribute 'exterior'

Ich habe jedoch überprüft, dass jeder Teil des MultiPolygons ein Polygon und nicht selbst ein MultiPolygon ist:

>>>>[p.type for p in poly.geometry]
['Polygon', 'Polygon']

Irgendwelche Ideen, warum dies passiert und wie man es behebt?

Können es die Löcher im Polygon sein? Ich sehe so aus: Geben Sie hier die Bildbeschreibung ein

Landsmann
quelle
Ein MultiPolygon ist eine einfache Liste von Polygonen, daher hat eine Liste nicht "außen", sondern jedes Polygon in der Liste hat "außen". Wenn Sie möchten, dass die Polygone eine for-Schleife verwenden ([p.exterior.xy für p in Multi)]
Gen
Okay, ich verstehe, aber was kann ich dann tun, um die äußeren Koordinaten des MultiPolygons zu erhalten ? In meinem Ansatz versuche ich eine Vereinigung der einzelnen Polygone, aber dies scheint hier nicht zu funktionieren ...
Landsmann
Ist es möglich, dass sich die API von in der Zwischenzeit formschön verändert hat? Ich sehe das Attribut nicht geometryin a Polygon, aber geom_type?
K.-Michael Aye

Antworten:

14

Sie müssen die binären Prädikate von Shapely verstehen:

1) Wenn sich die beiden Polygone schneiden unionoder das Ergebnis von oder unary_union(in rot) ein Polygon ist, können Sie das Äußere berechnen

Geben Sie hier die Bildbeschreibung einGeben Sie hier die Bildbeschreibung ein

2) Wenn die beiden Polygone getrennt werden, ist ein MultiPolygon erforderlich (in rot mit zwei Polygonen).

Geben Sie hier die Bildbeschreibung einGeben Sie hier die Bildbeschreibung ein

Wenn Sie mit Shapefiles ohne Topologie arbeiten, kann dies auftreten

Eine Lösung besteht darin, den konkaven Rumpf zu berechnen, aber es ist nicht wirklich eine Vereinigung.

Geben Sie hier die Bildbeschreibung ein

Gen
quelle
Okay, tatsächlich habe ich herausgefunden, dass dies der Fall ist - und Logik! Vielen Dank!
Landsmann
1
Wie berechnet man den konkaven Rumpf?
Dima Lituiev