Estou tentando combinar pequenos segmentos com um segmento maior com o qual eles provavelmente estão mais relacionados: rolamentos relativamente próximos e similares, e de frente um para o outro.
Aqui está um exemplo típico dos dados que tenho:
Aqui eu precisaria corresponder o segmento 652 a 198969, enquanto o 711 e o 707 não correspondiam a nada.
Procurei métodos diferentes, em particular a distância de Hausdorff (com base nas respostas aqui ). Eu o calculei usando o PostGIS, mas estou obtendo resultados ímpares: a menor distância que recebo é entre 707 e 198985, e 652 tem uma distância maior entre 198969 do que 198985, por exemplo (posso adicionar a consulta e os resultados, se necessário).
Hausdorff é realmente o método correto para resolver isso? Existem outras abordagens? Pensei em simplesmente criar um conjunto de verificações nos parâmetros que mencionei (distância, rumo, etc.), mas tenho medo de adicionar um monte de condições para lidar com casos extremos ou coisas como limitar o quanto eles são encarando um ao outro.
Atualização: Encontrei um método que parece ser um compromisso aceitável:
- Encontro pela primeira vez os 10 segmentos pretos mais próximos do azul que estou tentando corresponder (usando o
<->
operador PostGIS ) a menos de 10 metros de distância. - Em seguida, crio um novo segmento localizando os pontos mais próximos às extremidades do segmento azul em cada um dos pretos (usando
ST_ClosestPoint
) e filtro os resultados cujo comprimento é menor que 90% do azul (o que significa que os segmentos não são virado, ou que a diferença de rolamento seja superior a ~ 20 °) - Então, recebo o primeiro resultado classificado por distância e distância de Hausdorff, se houver.
Pode haver algum ajuste fino a ser feito, mas parece fazer um trabalho aceitável por enquanto. Ainda estou procurando outros métodos ou verificações adicionais para executar, caso eu tenha perdido alguns casos extremos.
fonte
Respostas:
Aqui estão algumas funções que escrevi que devem permitir que você faça o que precisa. Verifique e veja se a linha é polilinha ou segmento, se a polilinha explodir, então compare o azimute e o inverso do primeiro e do último ponto nas linhas, defina critérios aceitáveis para o código tomar sua decisão. Estes são métodos arcpy, mas podem ser modificados.
retornar azimute do segmento de linha ESRI @shape
retorno inverso dos pontos ESRI
explodir polilinha no segmento de linha
percorrer sua mesa como esta
essas propriedades devem estar disponíveis no postgis - firstpoint, lastpoint, pointarray Eu assumo as propriedades esri acima porque é o que eu sei melhor, mas o acima pode ser facilmente alterado para funcionar com o postgis.
fonte