Eu tenho um conjunto de pontos de GPS que encaixei na rede OSM. Na captura de tela abaixo, os pontos de GPS são vermelhos, os pontos de snap são verdes.
Quero calcular o caminho mais curto que inclui todos esses pontos de passagem verdes. Minha solução é calcular o caminho mais curto entre cada par de pontos e finalmente concatenar os resultados.
Meu problema é que dijkstra_sp não aceita pontos arbitrários na rede OSM. Meus pontos quebrados não estão necessariamente na tabela de formas porque foram calculados usando a seguinte lógica.
- Encontre o caminho mais próximo de um determinado ponto de GPS.
- Usando a interpolação, encontre o ponto mais próximo desse caminho até o ponto GPS.
Os pontos capturados não estão na tabela de formas porque foram derivados por interpolação.
Portanto, minha pergunta é: como calcular o caminho mais curto entre dois pontos na rede OSM que não estão necessariamente na tabela de formas?
fonte
Respostas:
Resolvemos o mesmo problema com arestas e vértices temporários. Ajustamos nossas cordas GPS a uma borda e da v1 à v2 e obtivemos um deslocamento entre 0 e 1:
Com isso, criamos um novo Point () e com isso um novo vértice v_tmp:
Em seguida, dividimos nossa borda e1 em duas novas bordas e_tmp1 da v1 para v_tmp e e_tmp2 de v_tmp para v2. (Você pode precisar dividi-lo em quatro extremidades temporárias ...)
Com nosso objetivo, fizemos o mesmo. Do que começamos a fazer o agrupamento com nossos novos vértices v_tmp_source, v_tmp_dest e é isso.
fonte
Combinei com os nós mais próximos, usei o pgrouting para encontrar a rota entre esses nós. Eu estava atrás da distância total, então adicionei as duas distâncias dos nós dos pontos.
Eu tinha um limite superior de quão perto um nó precisava estar, para ser aceitável.
A matemática seria mais complicada / mais lenta, mas você poderia fazer o mesmo com arestas se estivesse usando um algoritmo de pgrouting que funcionasse em termos de arestas em vez de nós.
fonte
seu problema me lembra de um caso semelhante, que tivemos que resolver alguns anos atrás: alguém está desenhando um caminho (cadeia de linhas) no topo de um mapa raster e tivemos que correspondê-lo à rede de estradas subjacente.
Parece ser semelhante aos seus pontos GPS vermelhos. E mesmo que você tenha assumido que podemos procurar o caminho mais curto entre esses pontos.
Porque isso faz muito tempo, não me lembro mais de detalhes. Mas publicamos as funções em "matching.sql", que já faz parte do pgRouting. Porém, não há documentação. Desculpe por isso. Mas talvez a leitura da fonte SQL dê uma idéia de como ela funciona: https://github.com/pgRouting/pgrouting/blob/master/core/sql/matching.sql
fonte