Como dividir um polígono côncavo em polígonos convexos no Arcpy?

20

Estou procurando uma ferramenta ou algoritmo para detectar polígonos côncavos e dividi-los em polígonos convexos. Como explicado na figura, o polígono azul é dividido em polígonos A e B

Estou usando o Arcpy no Arcgis 10.1

polígonos divididos

geogeek
fonte
15
Talvez você possa explicar por que está fazendo isso? Afinal, (a) a detecção é fácil: um polígono côncavo terá menos área que seu casco convexo; e (b) qualquer triangulação de um polígono o divide automaticamente em polígonos convexos, porque todos os triângulos são convexos. Isso mostra que você tem alguma flexibilidade na escolha entre as muitas soluções possíveis.
whuber
2
Este conjunto de ferramentas permite-lhe ver o que Bill está falando sobre resources.arcgis.com/gallery/file/geoprocessing/... converter o polígono para pontos, em seguida, executar o Delaunay opção
1
Há uma resposta para isso no Stack Overflow: stackoverflow.com/a/6686842/1300519 Os algoritmos descritos não devem ser muito difíceis de escrever usando o arcpy.
Snorfalorpagus
1
@ snorf Isso parece responder a uma pergunta um pouco, mas importante, diferente. Aparentemente, a solução envolve uma combinação de "polígonos" e "orifícios" , que não é o que geralmente se entende por "divisão". No mínimo, essa resposta precisa de mais elaboração para ser útil aqui. (BTW, sua resposta foi alterada para um comentário porque as referências cruzadas para outras soluções em outros lugares da Web, sem nenhuma explicação adicional, não são consideradas respostas aqui no SE.)
whuber
2
A julgar pelos comentários aqui e por não haver respostas, minha recomendação seria editar sua pergunta para incorporar esse feedback e considerar oferecer uma recompensa.
PolyGeo

Respostas:

1

Aqui estão algumas etapas para identificar os vértices das partes côncavas:

com parcela: geometria delimitadora mínima (casco) -> parcelHull

com parcela: FeatureVerticesToPoint -> parcelPoints

com parcelHull: FeatureVerticesToPoint -> parcelHullPoints

com parcelPoint e parcelHullPoint: Diff simétrico -> pontos côncavos

com base nesses pontos, você pode desenhar o bissectrice para cortar seu polígono (distância da linha até a linha), selecionar as arestas do triângulo Voronoï que cruzam seu ponto, mas não compartilham um segmento com o limite da sua parcela (selecione por local após dividir o triângulo linhas nos vértices), selecione o vértice no site oposto e faça uma linha (pontos a linha), selecione o ponto mais próximo na aresta oposta e faça uma linha (pontos a linha) ...

No final, use suas linhas preferidas e as parcelas originais com "recurso para polígono" para dividir os polígonos.

radouxju
fonte