Detectando a forma de polígono ramificado?

13

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:

polígono ramificado vs tira curvada

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:

insira a descrição da imagem aqui

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.

nadya
fonte
1
Você não precisa de muito Python. Experimentar ! forma!. casco convexo (). symmetricDifference (! shape!) Na calculadora de campo. Tente primeiro uma cópia pequena do subconjunto. Consulte a ajuda da geometria do arco-íris para obter a sintaxe correta.
FelixIP
Essa pode ser uma ótima pergunta, mas no momento você está fazendo várias perguntas, sem especificar se está perguntando sobre o QGIS ou o ArcGIS Desktop e, em seguida, também lançando no Python. Depois de especificar com precisão o que você tentou, é mais fácil para os respondentes em potencial ajudarem onde está preso. Eu sugiro focar no QGIS para evitar encalhar sua primeira resposta.
PolyGeo
1
Eu tenho dados no geodatabase da Esri porque um shapefile já estava excedendo 2 GB. Eu poderia fazer algo sobre isso se houver uma solução funcional no QGIS ou em algum outro lugar. Mas não estou perguntando dentro de um software específico. Estou perguntando sobre uma métrica, um método para detectar matematicamente uma forma com borda complexa (ramificada). 1 pergunta. Artigo científico com uma fórmula também seria bom, vou pensar em como implementá-lo sozinho.
nadya 7/09/17
1
Meu primeiro pensamento foi o mesmo que o seu, observando as diferenças entre o número e o tamanho dos polígonos deixados após a subtração do original de seu casco convexo (ou côncavo) (veja também formas alfa).
user2856
1
Se apenas o esqueleto fosse rápido o suficiente para calcular, eu usaria para calcular 4A / PL, área, perímetro e comprimento entre os nós agrícolas do esqueleto para compactação. O mesmo se aplica ao maior círculo inscrito.
FelixIP

Respostas:

11

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:

  • quando você desenha uma letra Y, usa pelo menos 2 traços contínuos (= 2 polilinhas) ,, portanto, é ramificada porque o número mínimo de traços é> 1.
  • Quando você desenha uma letra L, usa pelo menos 1 toque contínuo. Não é ramificado.

Mais exemplos dessa lógica:

  • Quando você desenha um A: 2 golpes = é ramificado
  • Quando você inicia um movimento B: 3 = é ramificado
  • quando você desenha um golpe C: 1 = não é ramificado
  • etc

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

Exemplo

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).

  • Verifique se um ID exclusivo vincula a linha central e o polígono de origem.
  • Transforme seus polígonos em polilinhas
  • Densifique a polilinha da linha central e a polilinha da borda com pontos regulares (não muito para evitar problemas de memória posteriormente, mas o suficiente para "capturar" os bits irregulares.
  • Crie uma matriz de distância entre os pontos da linha central e os pontos da borda
  • Mantenha nas linhas da matriz apenas aquelas em que ID_centerline = ID_borderline
  • Crie estatísticas para ter um valor de desvio padrão
  • Defina um valor limite para indicar para valores altos de SD que é um contorno não regular e crie o indicador necessário para cada ID exclusivo
  • Volte o indicador ao polígono original juntando o campo na base do ID exclusivo.
gisnside
fonte
Obrigado pela idéia, vou tentar criar linhas de centro
Nadya
Assim, o problema de distinguir minha polígonos C e D permanecerá
Nadya
Você pode precisar de métodos diferentes para casos diferentes e dividir o trabalho. Depois de ter polígonos não ramificados (B), você pode refinar B para tentar encontrar C e D. O problema é que não vejo qual lógica você usa para distinguir C de D. provavelmente terá que defini-la claramente com critérios.
gisnside
1
A diferença entre C e D parece ser que em C, os lados do polígono estão aproximadamente a uma distância uniforme da linha central, enquanto em D os lados estão a uma distância não uniforme da linha central.
Csp #
1
@csk eu vejo isso. Eu acho que traduzir isso em código seria calcular estatísticas sobre a distância entre a linha central e a linha de fronteira. Ao densificar a polilinha da borda com mais pontos, em seguida, convertê-la em pontos + distanciar-se do trabalho equivalente na linha central daria estatísticas sobre esse comportamento. Se o desvio padrão for alto, provavelmente a forma será irregular. Difícil ver como fazer isso em tousands de polígonos embora ... bom desafio lá
gisnside