Conversion d'un multi-polygone en forme de polygone: la technique ne fonctionne pas toujours

10

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: entrez la description de l'image ici

compatriote
la source
Un MultiPolygon est une simple liste de polygones, donc une liste n'a pas "d'extérieur", mais chaque polygone de la liste a "d'extérieur". Si vous voulez que les polygones utilisent une boucle for ([p.exterior.xy for p in Multi)]
gène
D'accord, je vois, mais que puis-je faire pour obtenir les coordonnées extérieures du MultiPolygon ? Dans mon approche, j'essaie une union des polygones simples, mais cela ne semble pas fonctionner ici ....
compatriote
Est-il possible que l'API de galbe ait changé entre-temps? Je ne vois pas l'attribut geometrydans un Polygon, mais geom_type?
K.-Michael Aye

Réponses:

14

Vous devez comprendre les prédicats binaires Shapely:

1) Si les deux polygones se croisent, le résultat de unionou unary_union(en rouge) est un polygone, vous pouvez donc calculer l'extérieur

entrez la description de l'image icientrez la description de l'image ici

2) Si les deux polygones sont déconnectés, le résultat est nécessaire un MultiPolygon (en rouge avec deux polygones)

entrez la description de l'image icientrez la description de l'image ici

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.

entrez la description de l'image ici

gène
la source
D'accord, en effet, j'ai découvert que c'est le cas - et la logique! Merci beaucoup!
compatriote
1
comment calculez-vous la coque concave?
Dima Lituiev