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.