Para obter as coordenadas externas, preciso converter um MultiPolygon bem torneado em um polígono. Eu faço assim:
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
Isso é bem-sucedido com muita frequência, mas também há casos em que o polígono obviamente permanece um MultiPolygon, pois o seguinte erro ainda é gerado:
AttributeError: 'MultiPolygon' object has no attribute 'exterior'
Eu verifiquei, no entanto, que cada parte do MultiPolygon é um polígono e não um MultiPolygon:
>>>>[p.type for p in poly.geometry]
['Polygon', 'Polygon']
Alguma idéia de por que isso acontece e como corrigi-lo?
Podem ser os buracos no polígono? Eu tenho a seguinte aparência:
polygon
shapely
multipart
singlepart
compatriota
fonte
fonte
geometry
em aPolygon
, masgeom_type
?Respostas:
Você precisa entender os predicados binários Shapely:
1) Se os dois polígonos cruzarem o resultado de
union
ouunary_union
(em vermelho) for um polígono, você poderá calcular o exterior2) Se os dois polígonos estiverem desconectados, o resultado será necessário um MultiPolygon (em vermelho com dois polígonos)
E se você trabalha com Shapefiles, sem topologia, isso pode ocorrer
Uma solução é calcular o casco côncavo, mas não é realmente uma união.
fonte