Afin d'obtenir les coordonnées extérieures, j'ai besoin de convertir un MultiPolygon bien fait en Polygone. Je le fais comme ça:
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
Cela réussit très souvent, mais il y a aussi des cas où le polygone reste évidemment un MultiPolygon car l'erreur suivante est toujours générée:
AttributeError: 'MultiPolygon' object has no attribute 'exterior'
J'ai vérifié, cependant, que chaque partie du MultiPolygon est un polygone et non lui-même un MultiPolygon:
>>>>[p.type for p in poly.geometry]
['Polygon', 'Polygon']
Des idées pourquoi cela se produit et comment y remédier?
Est-ce que ce peuvent être les trous du polygone? Je ressemble à ceci:
polygon
shapely
multipart
singlepart
compatriote
la source
la source
geometry
dans unPolygon
, maisgeom_type
?Réponses:
Vous devez comprendre les prédicats binaires Shapely:
1) Si les deux polygones se croisent, le résultat de
union
ouunary_union
(en rouge) est un polygone, vous pouvez donc calculer l'extérieur2) Si les deux polygones sont déconnectés, le résultat est nécessaire un MultiPolygon (en rouge avec deux polygones)
Et si vous travaillez avec des fichiers de formes, sans topologie, cela peut se produire
Une solution est de calculer la coque concave mais ce n'est pas vraiment une union.
la source