Algoritmo: move uma polilinha de origem para uma polilinha de referência (completamente ou talvez parcialmente)


10

Em nosso sistema, existem os requisitos que queremos mover algumas linhas de origem (com baixa precisão) para linhas de referência (com alta precisão). As figuras a seguir apresentam os casos de uso normais. O vermelho é uma linha de origem e o azul é uma linha de referência.

O vermelho é a linha de origem e o azul é a linha de referência

Nesse caso, a linha de origem seria movida parcialmente e o resultado seria o que a linha verde mostra:

Mover resultado 1

Há situações em que a linha de origem precisa ser movida completamente.

Exemplo 2

Resultado:

Mover resultado 2

Atualmente, nossa solução é projetar o ponto inicial / final da linha de origem na linha de referência e vice-versa e, em seguida, encontrar pontos projetados na linha de origem e referência. Com esses pontos projetados, podemos extrair a parte necessária da fonte e da linha de referência e depois combiná-las em uma nova.

Isso funciona na maioria dos casos, mas há casos em que esse método não funciona. Especificamente, quando qualquer uma das linhas tem a forma de um "C" ou o ponto da cabeça está muito próximo do ponto final. As próximas duas fotos mostram o cenário.

C como linha de forma

Aplicando meu algoritmo, obtemos o resultado:

Resultados

De certa forma, é compreensível porque o algoritmo atual apenas encontra pontos projetados e extrai linhas.

O que esperávamos é algo assim:

resultados esperados

Então, o que eu preciso de um algoritmo mais robusto para fazer isso, para que ele também possa lidar com casos especiais como o anterior. Eu tentei projetar todos os pontos de uma linha para outra e encontrar os dois pontos projetados que mais se aproximarem do ponto inicial / final da linha projetada, mas não houve sorte. Ainda posso encontrar casos que dão resultados inesperados.

Alguém já se deparou com problemas semelhantes antes? Seria ótimo também se houver um software ou biblioteca fazer um trabalho semelhante. Qualquer resposta será apreciada.


1
Talvez o ajude quando você observar como a Topologia no ArcGIS verifica se os objetos são coincidentes: help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//… paragraph "Processamento de cluster".
Jens

Obrigado pela sua resposta, @Jens. Mas receio que não seja isso que eu quero.
Mfdev 7/03

Essas linhas representam uma rede? Existem relações topológicas entre eles?
julien

Não precisa ser uma rede e, possivelmente, nenhuma relação topológica.
Mfdev 14/03/2013

Respostas:


4

Minha estimativa é que os casos finais geralmente serão exceções que não são programáveis ​​por máquina. Eu trabalhei com problemas semelhantes e eles sempre exigiam uma certa quantidade de edição manual. O que você precisa ajustar são as exceções que estão sendo produzidas pelo caso e as servem em um sistema de gerenciamento de trabalho para um usuário final.


Um exemplo um pouco semelhante a isso pode ser visto aqui: vividsolutions.com/jcs O JCS ajuda bastante a automatizar a conflação da geometria, mas também inclui o controle de qualidade manual para geometrias que não podem ser completamente mescladas. vividsolutions.com/… É construído a partir dele e permite controle de qualidade e adiciona rastreamento de problemas para geometrias difíceis.
DPierce

1
Todas as soluções topológicas não podem ser automatizadas pela programação e, em grandes empresas, essas soluções são desenvolvidas de maneira semelhante ao exemplo, pois a queda da inflação pode ser grande e de natureza cíclica, com geometrias de transporte complexas e com alta taxa de variação.
precisa

2

Você precisará de uma tolerância de snap e de tolerância a esse algoritmo (presumo que você já tenha uma tolerância de snap).

Projete o ponto principal da linha de origem para a linha de referência. Quebre a linha de referência neste ponto projetado.

Atravesse a linha de origem do ponto principal até o primeiro vértice para obter a direção da viagem ao longo da linha de origem. Percorra cada uma das suas duas linhas de referência do ponto de origem projetado até o próximo vértice. Se a direção da viagem estiver dentro da tolerância de curva da direção da viagem a partir do ponto principal na linha de origem, aplique seu algoritmo normalmente, mas apenas usando essa seção da linha de referência. Se o algoritmo chegar ao fim da linha de origem, você estará pronto. Caso contrário, quebre a linha de origem entre a peça transformada e a peça não transformada (que incluirá o ponto final).

Agora pegue a peça não transformada e projete o ponto final na linha de referência original. Execute o mesmo procedimento de antes ... atravesse a fonte do ponto final até o primeiro vértice para encontrar a direção do percurso. Quebre a linha de referência no ponto final do projeto e percorra cada uma delas para descobrir se a direção do percurso a partir do ponto final projetado está dentro da tolerância à curva. Nesse caso, use essa parte da linha de referência para aplicar o algoritmo normalmente.

Lembre-se de que, neste ponto, você está usando apenas a peça não transformada, para não se sobrepor à transformação do ponto principal.

Por fim, mescle as duas peças de linha resultantes, se necessário: a peça transformada do ponto de cabeçote da ponta projetada para o ponto de interrupção não transformado e, em seguida, no ponto final peça transformada do ponto de interrupção não transformado para o ponto final projetado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.