Como adicionar deslocamentos à rota?

13

Editado:

amostra

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!

Iñigo
fonte
1
Bem-vindo ao gis.stackexchange. Este é um site de perguntas e respostas onde cada thread deve conter exatamente uma pergunta e suas respostas. Abra um tópico separado para a pergunta nº 3. A resposta nº 2 é respondida em gis.stackexchange.com/questions/33471/…
underdark
1
Eu tenho o mesmo problema. Você achou alguma solução? Muito obrigado
Robert
1
Poste sua solução na seção de respostas. Então pode ser votado.
Underdark

Respostas:

2

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:

  1. um vértice é o ponto mais próximo.
  2. um nó de formulário da aresta é o correto
  3. a própria linha da aresta está mais próxima. (ortogonal)
Carsten
fonte
Desculpe, mas esta não é a resposta correta. pgr_trsp - O caminho mais curto de restrição de turno (TRSP) foi compensado como mostrado na resposta @amball.
Juan Carlos Oropeza
1

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 ):

SELECT gid, cost, st_astext(the_geom) as the_geom FROM dijkstra_sp_delta('xx_2po_4pgr', source_vertex, target_vertex, 0.1);

Isso resulta em um conjunto de arestas que representam a rota completa. Por exemplo, uma saída possível para esta consulta pode ser:

saída possível

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:

SELECT * FROM find_node_by_nearest_link_within_distance(point, 0.1, 'xx_2po_4pgr') as id;

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 ):

CREATE TYPE link_point AS
   (id integer,
    name character varying,
    nearest_link integer);
ALTER TYPE link_point
  OWNER TO postgres;

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):

-- Searching for a nearest link

    FOR row in EXECUTE 'select id from find_nearest_link_within_distance('''||point||''', '||distance||', '''||tbl||''') as id'
    LOOP
    END LOOP;
    IF row.id is null THEN
        res.id = -1;
        RETURN res;
    END IF;
    link:=row.id;
    res.nearest_link:=link;

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:

SELECT ST_Line_Locate_Point(geom , point)as offset; 

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):

select st_length(the_geom) from (select ST_ASTEXT(the_geom) as the_geom FROM dr_2po_4pgr WHERE id= edge_identifier)t";

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.

Iñigo
fonte
1

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

amball
fonte