Rutas en PostGIS con la nueva versión de Pgrouting (parte 1/4): Introducción

Topología de red

Pgrouting necesita que la capa lineal utilizada en todos sus algoritmos tenga topología de red. Esto implica las siguientes condiciones:

  1. Los tramos de la red deben tener sus puntos inicial y final numerados de forma que se asegure que dos tramos están conectados si su número de nodo inicial o final es el mismo.
  2. Si hay dos tramos que se cruzan, el punto de intersección no será considerado en el cálculo de la ruta. Por lo tanto, es necesario que si en la realidad el cruce representa una intersección donde la ruta puede bifurcarse éste se debe modelar con un nodo y partir los dos tramos que se cruzan en cuatro tramos con la inserción/actualización de nuevas geometrías en la tabla.

Para que la capa lineal cumpla la primera condición (a) se puede utilizar el comando pgr_createtopology de pgrouting como se va a realizar en un ejemplo a continuación.

Si además la capa lineal presenta casos como (b) entonces será necesario crear nuevos tramos mediante la fragmentación de los existentes. Desde la versión 2.x, pgrouting aporta el comando pgr_nodeNetwork para realizar esta tarea. También podríamos aprovechar algunas de las funciones que se crearon en el apartado E 2.4, pág. 270 para crear los nuevos tramos y cumplir las dos condiciones requeridas.

Carga cartografía y topología

Vamos a resolver un ejemplo de una pequeña red, calculando el camino óptimo mediante diferentes algoritmos. La red de ejemplo de ejes (capa wr) no presenta tramos que se crucen por lo tanto aunque inicialmente la tabla no contiene campos con la numeración inicial y final de los nodos, éstos se puede conseguir fácilmente mediante la función pgr_createtopology de pgrouting.

consola> psql -U postgres -f wr.sql routing1

La tabla creada wr únicamente dispone de un campo gid con la identificación de los tramos y un campo geom con la geometría del tramo. Hay que asegurarse que la tabla posee un índice espacial por la columna de geometría.

Como primera tarea se va a crear topología de red en dicha capa lineal, primero se añaden los campos para almacenar los índices de los nodos:

routing1=# alter table wr add column source integer; 
routing1=# alter table wr add column target integer;

A continuación rellenamos dichos campos con la función de pgr_createtopology de pgrouting. La función requiere el nombre de la tabla, una tolerancia para buscar nodos coincidentes, el nombre del campo de geometría, el nombre del campo que identifica unívocamente a cada tramo (gid), y los campos de source y target donde dicha función almacenará la numeración de los nodos inicial y final de cada tramo.

routing1=# select pgr_createTopology('wr',0.001,'geom','gid','source','target')

Los argumentos ‘source’ y ‘target’ los podríamos haber omitido ya que son los valores por defecto para el nombre de estos campos.