15 votos

¿Cómo se añaden las compensaciones a la ruta?

Editado:

sample

Quiero ilustrar mi pregunta. Supongamos que estamos en el "Punto A" y queremos ir al "Punto B". Estos puntos no estarían en la tabla "at_2po_4pgr" porque no son nodos origen/destino. Entonces, buscaría el nodo más cercano para los puntos A y B (puntos verdes). Después de esto, podría realizar una llamada a shortest_path usando los ids de los puntos verdes y obtendría la ruta "naranja". Pero para obtener el coste real del camino (distancia) en el primer caso tendría que restar el "offsetA" y en el segundo añadir el "offset B". Para calcular la distancia entre los puntos rojos y los verdes, ejecuto la siguiente consulta:

SELECT * FROM st_distance( ST_GeomFromText('POINT(-3.6963314 42.3498066)',4326), ST_GeomFromText('POINT(-3.6954276 42.3479634)',4326)) .

¿Cómo puedo saber cuándo añadir o restar la compensación?

Perdón por mi inglés.

8voto

Patrick Puntos 116

Puede encontrar dicha función aquí: https://github.com/pgRouting/pgrouting-contrib/blob/master/wrapper/routing_core_smart.sql#L69

Busca la zona más cercana enlace en la red, lo que suele dar un mejor resultado. Si utilizas Shooting Star puedes empezar a enrutar desde/hacia este enlace. En el caso de A* o Dijkstra, puedes seleccionar el punto de inicio o final del enlace, o crear un nodo "virtual" dividiendo el enlace en dos.

2voto

Fh. Puntos 225

No creo que se pueda confiar en el vértice más cercano. Imagina que el origen y el objetivo se encuentran en la misma arista cerca del mismo vértice.

Prefieres considerar tres! casos diferentes:

  1. un vértice es el punto más cercano.
  2. un nodo de forma de la arista es el derecho
  3. la propia línea de borde está más cerca. (ortogonal)

1voto

GNTC Puntos 31

Voy a explicar la solución que he encontrado (quizás no sea la mejor).

Según la imagen del post, supongamos que estamos en Punto A y vamos a ir a Punto B . Como he explicado anteriormente estos puntos no son vértices (fuente / objetivos en la tabla generada con la herramienta osm2po).

Debido a esto, necesitamos saber el sentido de la marcha/conducción. Si vamos desde el vértice más cercano a Punto A (punto verde) a través del camino naranja tendríamos que restar el desplazamiento entre Punto A y el punto verde (vértice más cercano). Pero si tuviéramos que pasar por Calle Almirante Bonifaz calle, entonces debemos añadir el desplazamiento a la longitud de este borde (desde el punto verde hasta la intersección entre Calle Almirante Bonifaz y Calle San Juan ).

Ejecuto la siguiente consulta para obtener el camino más corto (se necesita la extensión pgRouting explicada aquí pgRouting - instalación y requisitos aquí instalación y requisitos ):

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

El resultado es un conjunto de aristas que representa la ruta completa. Por ejemplo, una posible salida para esta consulta podría ser:

possible output

Donde el campo gid ( id en la tabla generada por osm2po) representa el identificador del borde. Pues bien, debemos comprobar los desplazamientos al inicio y al final (Puntos A/B).

Si comprobamos el desplazamiento de inicio, debemos comprobar si la primera arista del conjunto de aristas obtenidas en la consulta anterior coincide con el camino más cercano a Punto A . Si coinciden, entonces restaremos el desplazamiento. Si no coinciden, añadiremos el desplazamiento. Para obtener el enlace más cercano a un punto, ejecuto la siguiente consulta:

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

Debes adaptar esta función para que devuelva la arista más cercana. En primer lugar, debe modificar la función punto_de_enlace tipo (añadir enlace_más_cercano campo):

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

También debe modificar el find_node_by_nearest_link_within_distance . Sólo hay que añadir la última línea (sólo muestro un extracto de la función):

-- 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;

Entonces hay que saber cuál es la distancia entre el punto ( Punto A/Punto B ) y la arista más cercana (offset). Para ello ejecuto esta consulta:

SELECT ST_Line_Locate_Point(geom , point)as offset; 

Dónde geom es el el_geom en la tabla generada por osm2po.

En este punto, tendríamos el desplazamiento para sumar o restar.

Por último, necesitarías saber el legth de la arista para aplicar el valor obtenido en la consulta anterior y ajustar el real (si trabajas con geometría tipo, tendrás que normalizar a metros el valor obtenido. Sólo hay que multiplicar 111000 por la longitud obtenida en la consulta):

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

Si quisiéramos comprobar el desplazamiento final, tendríamos que comprobar si el último camino del conjunto de caminos obtenidos en la consulta anterior es el mismo que el camino más cercano al punto final ( Punto B ) y añadimos/abstraemos de la misma manera que antes.

Disculpe mi inglés.

1voto

amball Puntos 41

En pgrouting, pgr_trsp - Turn Restriction Shortest Path (TRSP) hace exactamente lo que está buscando.

En lugar de especificar los nodos de origen y destino, puede especificar las aristas de origen y destino, y la fracción a lo largo de la arista donde se encuentran el origen y el destino.

(Puedes utilizar ST_Line_Locate_Point para obtener esa fracción a partir de tu geometría de puntos, asumiendo que conoces la arista más cercana).

Ver http://docs.pgrouting.org/2.0/en/src/trsp/doc/index.html#trsp

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X