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?
polygon
shapely
multipart
singlepart
Landsmann
quelle
quelle
geometry
in aPolygon
, abergeom_type
?Antworten:
Sie müssen die binären Prädikate von Shapely verstehen:
1) Wenn sich die beiden Polygone schneiden
union
oder das Ergebnis von oderunary_union
(in rot) ein Polygon ist, können Sie das Äußere berechnen2) Wenn die beiden Polygone getrennt werden, ist ein MultiPolygon erforderlich (in rot mit zwei Polygonen).
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.
quelle