Convertir Shapely MultiPolygon a Polygon: la técnica no siempre funciona

10

Para obtener las coordenadas exteriores, necesito convertir un MultiPolygon bien formado en un Polígono. Lo hago así:

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

Esto tiene éxito con mucha frecuencia, pero también hay casos en los que el Polígono obviamente sigue siendo un MultiPolygon ya que aún se genera el siguiente error:

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

Sin embargo, he comprobado que cada parte del MultiPolygon es un polígono y no un MultiPolygon:

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

¿Alguna idea de por qué sucede esto y cómo solucionarlo?

¿Pueden ser los agujeros en el polígono? Me veo así: ingrese la descripción de la imagen aquí

compatriota
fuente
Un MultiPolygon es una lista simple de Polígonos, por lo tanto, una lista no tiene "exterior", pero cada Polígono en la lista tiene "exterior". Si desea que los Polígonos usen un bucle for ([p.exterior.xy for p en Multi)]
gen
Bien, ya veo, pero ¿qué puedo hacer para obtener las coordenadas exteriores del MultiPolygon ? En mi enfoque, estoy intentando una unión de los polígonos individuales, pero parece que no funciona aquí ...
compatriota
¿Es posible que la API de bien proporcionado cambie mientras tanto? No veo el atributo geometryen a Polygon, pero geom_type?
K.-Michael Aye

Respuestas:

14

Debe comprender los predicados binarios Shapely:

1) Si los dos polígonos se cruzan, el resultado de uniono unary_union(en rojo) es un Polígono, por lo tanto, puede calcular el exterior

ingrese la descripción de la imagen aquíingrese la descripción de la imagen aquí

2) Si los dos polígonos están desconectados, el resultado es necesario un MultiPolygon (en rojo con dos polígonos)

ingrese la descripción de la imagen aquíingrese la descripción de la imagen aquí

Y si trabaja con Shapefiles, sin topología, esto puede ocurrir

Una solución es calcular el casco cóncavo pero no es realmente una unión.

ingrese la descripción de la imagen aquí

gene
fuente
Bien, de hecho, descubrí que este es el caso, ¡y la lógica! ¡Muchas gracias!
compatriota
1
¿Cómo se calcula el casco cóncavo?
Dima Lituiev