Rutas en PostGIS con la nueva versión de Pgrouting (parte 4/4): Nodificando una red

La nueva capa ejes_noded dispone de 46841 tramos y la original de ejes tenía 10050.

La nueva tabla no incorpora los campos name y oneway que vamos a necesitar, pero sí incorpora un campo llamado old_id que hace referencia al gid de la tabla ejes y por lo tanto podemos relacionar ambas tablas. Para facilitar el análisis vamos a añadir estos dos campos y actualizarlos en la tabla ejes_noded.

routing1=# alter table ejes_noded add column name text;
routing1=# alter table ejes_noded add column oneway integer;
routing1=# update ejes_noded set name = ejes.name, 
                                 oneway = ejes.oneway 
           from ejes where ejes.gid = ejes_noded.old_id;

 

La tabla ejes_noded ya está preparada para utilizer las funciones de pgrouting. Como anteriormente, primero calcularemos los nodos con pgr_createTopology y luego procederemos al cálculo de una ruta.

routing1=# select pgr_createTopology('ejes_noded',0.01,'geom',
                                     'id','source','target');

 

Agregamos los campos de los costes y calculamos los costes en función de la dirección del campo oneway. En este caso los costes van a ser las distancias en metros de los tramos.

routing1=# alter table ejes_noded add column cost double precision;
routing1=# alter table ejes_noded 
             add column reverse_cost double precision;
routing1=# update ejes_noded set 
   cost = case when oneway = -1 then –st_length(geom)
                                else st_length(geom)
               end,
   reverse_cost = case when oneway = 1 then -st_length(geom)
                                       else st_length(geom)
               end;

 

Como estamos en la misma zona del núcleo de valencia, vamos a repetir una de las rutas realizadas anteriormente.

Calcula la longitud y número de tramos atravesados de la ruta más óptima utilizando el algoritmo A-Star, entre el nodo source de la calle ‘Pilota Valenciana’ al nodo target de la calle ‘Ueshiba’:

routing1=# select source from ejes_noded 
         where name like '%Ueshiba%' limit 1;
--------
  11367
routing1=# select source from ejes_noded 
         where name like '%Pilota Valenciana%' limit 1;
--------
  20259
  
routing1=# select sum(cost) as costetotal,count(*) as tramos 
            from pgr_dijkstra ('select id, source, target, cost,
                 reverse_cost from ejes_noded', 11367, 20259, true);
    costetotal    | tramos
------------------+--------
 7008.06063721362 |    187

Como se aprecia la longitud total de la ruta es parecida a los 7267 m. del ejemplo previo.

 

Ver aquí la parte anterior de este taller

Ver aquí la parte primera de este taller.

Para comprender adecuadamente la biblioteca Pgrouting y poder utilzarla junto con la potencia de PostGIS se necesitan conocimientos sobre este último. Se pueden adquirir en el curso online de gran éxito de CartoSiG UPV.