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?
polygon
shapely
multipart
singlepart
compatriota
fuente
fuente
geometry
en aPolygon
, perogeom_type
?Respuestas:
Debe comprender los predicados binarios Shapely:
1) Si los dos polígonos se cruzan, el resultado de
union
ounary_union
(en rojo) es un Polígono, por lo tanto, puede calcular el exterior2) Si los dos polígonos están desconectados, el resultado es necesario un MultiPolygon (en rojo con dos polígonos)
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.
fuente