Eu tenho uma camada vetorial com milhões de polígonos fazendo cobertura contínua. Eu preciso classificá-los de acordo com sua forma. Já sou utilizando vários índices forma de ecologia da paisagem como compacidade ( 4piA / P ^ 2 ), a largura média ( 2A / P ), forma número ( P / sqrt (a) ), também vi essa resposta para Calcular arredondamento / compacidade polígono?
Meu problema é que todas essas métricas estão usando apenas uma proporção de área e perímetro. Até o índice de dimensão fractal usa apenas área e perímetro ( 2ln (0,25P) / ln (A) ). Mas como distinguir dois polígonos com a mesma área e perímetro, mas com formas absolutamente diferentes? Como este polígono ramificado A:
que tentei desenhar com a mesma área e perímetro da tira curva B. Todos os meus índices conhecidos serão os mesmos para eles. Mas para mim é muito importante diferenciar tiras simples (incluindo curvas como a lua nova) de formas ramificadas complexas.
Intencionalmente, mostro o polígono B como uma tira curva e não uma tira reta, porque conheço o índice de circunferência do círculo relacionado, que detecta formas retas alongadas, mas meus polígonos também podem ter os mesmos circuitos. Mesmo que eu construa o casco convexo e calcule uma proporção de áreas Apolygon / Aconvex , pode ser muito semelhante aqui.
Então, como posso distinguir claramente o polígono ramificado A do polígono B nos dados vetoriais automaticamente? (Convertê-los em rasterização exigiria um tamanho de célula extremamente pequeno, enorme conjunto de dados e falta de memória, portanto, não é possível). Existem outros índices de forma que incluem outros parâmetros? Idealmente, o método distinguiria não apenas polígonos claramente ramificados, mas também C e D:
Minha única idéia é construir o casco convexo e depois apagar o polígono do casco convexo e contar o número de (grandes) peças que ele deixa (apagando o polígono por polígono e não a camada inteira). Isso pode mostrar a complexidade da borda.
Congratulo-me com soluções / algoritmos matemáticos, que eu implementaria posteriormente em Python.
Respostas:
Você pode dar uma olhada no seguinte método: esqueletize seus polígonos e trabalhe nos recursos de tipo de linha relacionados ao polígono original com um ID de polígono de origem exclusivo. Acho que há algumas dicas a fazer (por exemplo, quando considerar uma polilinha como uma linha central real: comprimento mínimo para uma polilinha ser qualificada para o status da linha central). Quando o número de linha de centro for maior que 1 para um único polígono de origem, ele será ramificado.
Um polígono ramificado, quando limpo em uma linha central, terá múltiplas linhas, enquanto um polígono reto pode ter apenas uma grande linha no centro (o mesmo que a interpretação humana de fato).
Exemplo:
Mais exemplos dessa lógica:
Não tentei nada, apenas tentei a lógica, mas acho que poderia funcionar.
Consulte: Esqueletizar vetores em QGIS / Python ou http://postgis.net/docs/ST_StraightSkeleton.html
Ou
Fonte: Extração da linha central de um polígono complexo no PostGIS / Python
EDIT: Para os casos C e D, você já deve ter formas B filtradas (não ramificadas).
fonte