2 votos

Encontrar la ruta más cercana desde un único origen a varios destinos diferentes en PostgreSQL

He hecho nodos de red en PostgreSQL SQL basado en Osm2po. Puedo encontrar el camino más cercano entre dos puntos basado en el algoritmo pgr_dikstra pero quiero encontrar la ruta más cercana entre un único punto de origen y varios puntos de destino sólo en una consulta y elija el más cercano . ¿Cómo puedo realizar esta consulta? Por ejemplo, supongamos que quiero encontrar el vehículo más cercano a mí cuando hay muchos vehículos disponibles

Este es mi código

SELECT * FROM pgr_dijkstra(
        'SELECT gid as id, source, target, length_m AS cost FROM ' || $1,
        -- source
        (SELECT id FROM ways_vertices_pgr
            ORDER BY the_geom <-> ST_SetSRID(ST_Point(x1,y1),4326) LIMIT 1),
        -- target
        (SELECT id FROM ways_vertices_pgr
            ORDER BY the_geom <-> ST_SetSRID(ST_Point(x2,y2),4326) LIMIT 1),
        false) 

pero este código funciona sólo para dos puntos

1voto

mathieu Puntos 53

Leer el docs con cuidado: pgr_Dijkstra tiene varias firmas, y una de ellas ejecuta el uno-a-muchos el enrutamiento que está buscando.

Basta con pasar todos los nodos de destino como ARRAY :

SELECT *
FROM   pgr_Dijkstra(
         'SELECT gid as id, source, target, length_m AS cost FROM ' || $1,
         <src_id>,
         ARRAY[<tgt_id>, <tgt_id>, ...],
         FALSE
       )
;

ACTUALIZACIÓN:

Y debería leer su pregunta con atención; para conseguir realmente sólo las filas que pertenecen al camino más corto , corre

WITH
    paths AS (
        SELECT *
        FROM   pgr_Dijkstra(
                 'SELECT gid as id, source, target, length_m AS cost FROM ' || $1,
                 <src_id>,
                 ARRAY[<tgt_id>, <tgt_id>, ...],
                 FALSE
               )
    )

SELECT  *
FROM    paths
WHERE   end_vid = (
    SELECT  end_vid
    FROM    paths
    GROUP BY
            end_vid
    ORDER BY
            MAX(agg_cost)
    LIMIT   1
);

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