Editado:
Quiero ilustrar mi pregunta. Suponga que está en el "Punto A" y quiere ir al "Punto B". Estos puntos no estarían en la tabla "at_2po_4pgr" porque no son nodos de origen / destino. Luego, buscaría el nodo más cercano para los puntos A y B (puntos verdes). Después de esto, podría realizar una llamada shortest_path usando puntos verdes ids y obtendría la ruta "naranja". Pero para obtener el costo real de la ruta (distancia) en el primer caso, tendría que restar "offsetA" y en el segundo caso agregar de "offset B". Para calcular la distancia entre los puntos rojos y los puntos 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 sabría cuándo sumar o restar el desplazamiento?
¡Lo siento por mi ingles!
Respuestas:
No creo que pueda confiar en el vértice más cercano. Imagine que la fuente y el destino se encuentran en el mismo borde cerca del mismo vértice.
¡Prefieres considerar tres! diferentes casos:
fuente
Puede encontrar dicha función aquí: https://github.com/pgRouting/pgrouting-contrib/blob/master/wrapper/routing_core_smart.sql#L69
Busca el enlace más cercano en la red, que generalmente da un mejor resultado. Si usa Shooting Star, puede comenzar a enrutar desde / hacia este enlace. Para A * o Dijkstra, puede seleccionar el punto inicial o final del enlace, o puede crear un nodo "virtual" dividiendo el enlace en dos.
fuente
Voy a explicar la solución que he encontrado (quizás no sea la mejor).
De acuerdo con la imagen posterior, supongamos que estamos en el punto A y que va a ir al punto B . Como expliqué anteriormente, estos puntos no son vértices (fuente / objetivos en la tabla generada con la herramienta osm2po).
Debido a esto, necesitamos saber la dirección para caminar / conducir. Si pasamos del vértice más cercano al Punto A (punto verde) a través del camino naranja, tendríamos que restar el desplazamiento entre el Punto A y el punto verde (vértice más cercano). Pero si tuviéramos que pasar por la calle Almirante Bonifaz , entonces deberíamos agregar el desplazamiento a la longitud de este borde (desde el punto verde hasta la intersección entre la calle Almirante Bonifaz y la calle San Juan ).
Ejecuto la siguiente consulta para obtener la ruta más corta (necesita la extensión pgRouting explicada aquí pgRouting - instalación y requisitos aquí instalación y requisitos ):
Esto da como resultado un conjunto de aristas que representa la ruta completa. Por ejemplo, una salida posible para esta consulta podría ser:
Donde el gid de campo ( id en la tabla generada osm2po) representa el identificador de borde. Bueno, debemos verificar las compensaciones al principio y al final (Puntos A / B).
Si comprobamos el desplazamiento inicial, hay que comprobar si el primer borde del conjunto de aristas obtenidos en la consulta anterior es igual a la trayectoria más cercana a Punto A . Si coinciden, restaremos el desplazamiento. Si no coinciden, agregaremos el desplazamiento. Para obtener el enlace más cercano a un punto, ejecuto la siguiente consulta:
Debe adaptar esta función para que devuelva el borde más cercano. Primero debe modificar el tipo de punto de enlace (agregar el campo de enlace más cercano ):
También debe modificar find_node_by_nearest_link_within_distance . Simplemente agregue la última línea (solo muestro un extracto de la función):
Luego, necesita saber cuál es la distancia entre el punto ( Punto A / Punto B ) y el borde más cercano (desplazamiento). Para este propósito ejecuto esta consulta:
Donde geom es la the_geom campo en osm2po tabla generada.
En este punto, tendríamos el desplazamiento para sumar o restar.
Finalmente, necesitaría conocer la longitud del borde para aplicar el valor obtenido en la consulta anterior y ajustar el real (si trabaja con el tipo de geometría, tendrá que normalizar a metros el valor obtenido. Simplemente multiplique 111000 por la longitud obtenida en la consulta):
Si verificamos el desplazamiento final, entonces tendríamos que verificar si la última ruta del conjunto de rutas obtenidas en la consulta anterior es la misma que la ruta más cercana al punto final ( Punto B ) y sumaríamos / restaríamos en de la misma manera que antes.
Disculpa mi inglés.
fuente
En pgrouting, pgr_trsp: la ruta más corta de restricción de giro (TRSP) hace exactamente lo que está buscando.
En lugar de especificar los nodos de origen y destino, puede especificar los bordes de origen y destino, y la fracción a lo largo del borde donde se encuentran su origen y destino.
(Puede usar ST_Line_Locate_Point para obtener esa fracción de su geometría de puntos, suponiendo que conoce el borde más cercano).
Ver http://docs.pgrouting.org/2.0/en/src/trsp/doc/index.html#trsp
fuente