Convertendo MultiPolygon Shapely em Polygon: a técnica nem sempre funciona

10

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: insira a descrição da imagem aqui

compatriota
fonte
Um MultiPolygon é uma lista simples de polígonos; portanto, uma lista não possui "exterior", mas todos os polígonos da lista têm "exterior". Se você deseja que os polígonos usem um loop for ([p.exterior.xy para p no Multi)]
gene
Ok, entendo, mas o que posso fazer para obter as coordenadas exteriores do MultiPolygon ? Na minha abordagem que eu estou tentando uma união dos únicos polígonos, mas isso parece não estar funcionando aqui ....
conterrâneo
É possível que a API do shapely tenha mudado nesse meio tempo? Não vejo o atributo geometryem a Polygon, mas geom_type?
K.-Michael Aye

Respostas:

14

Você precisa entender os predicados binários Shapely:

1) Se os dois polígonos cruzarem o resultado de unionou unary_union(em vermelho) for um polígono, você poderá calcular o exterior

insira a descrição da imagem aquiinsira a descrição da imagem aqui

2) Se os dois polígonos estiverem desconectados, o resultado será necessário um MultiPolygon (em vermelho com dois polígonos)

insira a descrição da imagem aquiinsira a descrição da imagem aqui

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.

insira a descrição da imagem aqui

gene
fonte
Ok, de fato, descobri que esse é o caso - e lógica! Muito obrigado!
compatriota
1
como você calcula o casco côncavo?
Dima Lituiev