Editado:
Eu quero ilustrar minha pergunta. Suponha que você esteja no "Ponto A" e queira ir para o "Ponto B". Esses pontos não estariam na tabela "at_2po_4pgr" porque não são nós de origem / destinos. Depois, procuraria no nó mais próximo os pontos A e B (pontos verdes). Depois disso, eu poderia executar uma chamada shortest_path usando IDs de pontos verdes e obteria o caminho "laranja". Mas, para obter o custo real do caminho (distância), no primeiro caso, eu teria que subtrair "offsetA" e, no segundo caso, adicionar "offset B". Para calcular a distância entre pontos vermelhos e pontos verdes, execute a seguinte consulta:
SELECT * FROM st_distance(
ST_GeomFromText('POINT(-3.6963314 42.3498066)',4326),
ST_GeomFromText('POINT(-3.6954276 42.3479634)',4326))
.
Como eu saberia quando adicionar ou subtrair o deslocamento?
Desculpe pelo meu Inglês!
fonte
Respostas:
Eu não acho que você pode confiar no vértice mais próximo. Imagine que a origem e o destino estejam localizados na mesma aresta, perto do mesmo vértice.
Você prefere considerar três! casos diferentes:
fonte
Você pode encontrar essa função aqui: https://github.com/pgRouting/pgrouting-contrib/blob/master/wrapper/routing_core_smart.sql#L69
Ele procura o link mais próximo da rede, o que geralmente fornece um resultado melhor. Se você usa o Shooting Star, pode começar a rotear de / para este link. Para A * ou Dijkstra, você seleciona o ponto inicial ou final do link ou cria um nó "virtual" dividindo o link em dois.
fonte
Vou explicar a solução que encontrei (talvez não seja a melhor).
De acordo com a imagem post, vamos supor que estamos no ponto A e vamos ir ao Ponto B . Como expliquei acima, esses pontos não são vértices (origem / destinos na tabela gerada com a ferramenta osm2po).
Devido a isso, precisamos saber a direção a pé / direção. Se formos do vértice mais próximo ao ponto A (ponto verde) pelo caminho laranja, teremos que subtrair o deslocamento entre o ponto A e o ponto verde (vértice mais próximo). Mas se tivéssemos que atravessar a rua Calle Almirante Bonifaz , adicionaríamos o deslocamento ao comprimento dessa aresta (do ponto verde à interseção entre a rua Almirante Bonifaz e a Calle San Juan ).
Executo a seguinte consulta para obter o caminho mais curto (você precisa da extensão pgRouting explicada aqui pgRouting - instalação e requisitos aqui instalação e requisitos ):
Isso resulta em um conjunto de arestas que representam a rota completa. Por exemplo, uma saída possível para esta consulta pode ser:
Onde o campo gid ( id na tabela gerada osm2po) representa o identificador de borda. Bem, devemos verificar as compensações no início e no final (pontos A / B).
Se verificar o início offset, é preciso verificar se a primeira borda do conjunto de arestas obtidos na consulta acima é o mesmo para o caminho mais próximo para o Ponto A . Se eles coincidirem, subtrairemos o deslocamento. Se eles não corresponderem, adicionaremos o deslocamento. Para obter o link mais próximo de um ponto, execute a seguinte consulta:
Você deve adaptar esta função para que ela retorne a aresta mais próxima. Primeiro você deve modificar o tipo de link_point (adicione o campo mais próximo_link ):
Você também deve modificar o find_node_by_nearest_link_within_distance . Basta adicionar a última linha (apenas mostro um extrato da função):
Então você precisa saber qual é a distância entre o ponto ( ponto A / ponto B ) e a aresta mais próxima (deslocamento). Para esse fim, eu executo esta consulta:
Onde geom é o the_geom campo no osm2po tabela gerada.
Nesse ponto, teríamos o deslocamento para adicionar ou subtrair.
Finalmente, você precisa conhecer a largura da aresta para aplicar o valor obtido na consulta acima e ajustar o real (se você trabalha com o tipo de geometria, terá que normalizar para metros o valor obtido. Apenas multiplique 111000 pelo comprimento obtido em A pergunta):
Se verificarmos o deslocamento final, teremos que verificar se o último caminho do conjunto de caminhos obtido na consulta acima é o mesmo para o caminho mais próximo ao ponto final ( ponto B ) e adicionamos / subtraímos em da mesma maneira que antes.
Desculpe meu Inglês.
fonte
No pgrouting, pgr_trsp - TRSP (Restrição de caminho mais curto) faz exatamente o que você está procurando.
Em vez de especificar os nós de origem e de destino, você pode especificar as arestas de origem e de destino e a fração ao longo da borda em que sua origem e destino estão localizados.
(Você pode usar ST_Line_Locate_Point para obter essa fração da sua geometria de pontos, assumindo que você conhece a aresta mais próxima.)
Consulte http://docs.pgrouting.org/2.0/en/src/trsp/doc/index.html#trsp
fonte