Estou tentando descobrir os pontos de inflexão, ou seja, os pontos em que as curvas de uma linha começam e terminam. Se você olhar para a imagem, a linha verde pode ser uma estrada ou um riacho, e os pontos pretos são os pontos onde as curvas começam e terminam.
Quais seriam as etapas de alto nível para automatizar a geração desses pontos? Eu tenho o ArcGIS desktop e sou bastante útil com o ArcObjects.
arcobjects
algorithm
Devdatta Tengshe
fonte
fonte
Respostas:
Quando a curva é composta por segmentos de linha, todos os pontos internos desses segmentos são pontos de inflexão, o que não é interessante. Em vez disso, a curva deve ser pensada como sendo aproximada pelos vértices desses segmentos. Ao dividir uma curva que pode ser diferenciada por duas vezes nesses segmentos, podemos calcular a curvatura. Um ponto de inflexão, a rigor, é então um lugar onde a curvatura é zero.
No exemplo, existem trechos longos, onde a curvatura é quase zero. Isso sugere que os pontos indicados devem aproximar as extremidades de tais trechos de regiões de baixa curvatura.
Um algoritmo eficaz, portanto, divide os vértices, calcula a curvatura ao longo de um conjunto denso de pontos intermediários, identifica faixas de curvatura quase zero (usando alguma estimativa razoável do que significa estar "próximo") e marca os pontos finais dessas faixas .
Aqui está o
R
código de trabalho para ilustrar essas idéias. Vamos começar com uma sequência de linhas expressa como uma sequência de coordenadas:Divine as coordenadas x e y separadamente para obter uma parametrização da curva. (O parâmetro será chamado
time
.)Interpole os splines para plotagem e computação:
Precisamos de uma função para calcular a curvatura de uma curva parametrizada. Ele precisa estimar a primeira e a segunda derivada do spline. Com muitos splines (como splines cúbicos), esse é um cálculo algébrico fácil.
R
fornece os três primeiros derivados automaticamente. (Em outros ambientes, pode-se querer calcular os derivados numericamente.)Proponho estimar um limiar para a curvatura zero em termos da extensão da curva. Este pelo menos é um bom ponto de partida; deve ser ajustado de acordo com a tortuosidade da curva (ou seja, aumentada para curvas mais longas). Mais tarde, isso será usado para colorir as plotagens de acordo com a curvatura.
Agora que os vértices foram estriados e a curvatura calculada, resta apenas encontrar os pontos de inflexão . Para mostrá-los, podemos plotar os vértices, plotar o spline e marcar os pontos de inflexão nele.
Os pontos em aberto são os vértices originais
xy
e os pontos pretos são os pontos de inflexão identificados automaticamente com esse algoritmo. Como a curvatura não pode ser calculada com segurança nos pontos finais da curva, esses pontos não são especialmente marcados.fonte
Você pode usar a ferramenta Densify . Nesse caso, você escolhe densificar por ângulo. Em seguida, escolha o ângulo máximo aceito em uma linha reta. Em seguida, aplique à linha de resultado na ferramenta Dividir linha nos vértices . Por fim, exclua as linhas com comprimento_forma menor ao comprimento mínimo da estrada.
Nesta foto, vemos três etapas:
1- Densifique a linha usando o ângulo. Eu usei 10 graus como parâmetro e usamos splitline. Na figura, a linha curva está em sua fase inicial.
2- Selecione os segmentos nos quais o comprimento da forma não é redundante. Como podemos ver na tabela, não selecionei esses comprimentos redundantes. Depois, seleciono-os em uma nova classe de recurso.
3- Extraímos os vértices localizados nas bordas das linhas, que são pontos de inflexão.
fonte
Você pode usar a ferramenta Generalizar , que possui o deslocamento máximo da linha original como parâmetro, para poder escolher o deslocamento adequado ao seu caso.
Se nomearmos a linha original "line_cur" e a generalizada "line_gen", poderíamos recortar "line_cur" por "line_gen". O resultado será o segmento direto de "line_cur". Em seguida, poderíamos limpar um segmento muito curto, excluindo-o com uma consulta sql que seleciona o Comprimento da forma maior que o comprimento mínimo da estrada.
fonte