Cómo configurar una base de datos PostGIS para pgRouting (con vídeo)

pgRouting es una extensión que añade enrutamiento y funcionalidad de análisis de redes a las bases de datos PostGIS/PostgreSQL.

El predecesor de pgRouting es pgDijkstra, creado por Sylvain Pasche y que más tarde fue desarrollado y renombrado por Orkney como pgRouting. Este proyecto es apoyado y mantenido por Georepublic, iMaptools y por una amplia comunidad de usuarios.

pgRouting es un proyecto de OSGeo Labs de la Fundación OSGeo y está incluido en OSGeo Live.

En este tutorial vamos a mostrarte como configurar una base de datos PostGIS para trabajar con pgRouting.

Videotutorial:

Nota: El paquete Bundle de instalación de PostGIS para PostgreSQL incluye la extensión pgRouting.

Puedes seguir el tutorial descargándote los datos pinchando aquí.

Lo primero que debemos hacer es crear una base de datos con pgAdmin pgAdmin y cargar la extensión pgRouting a la misma. Lo correcto es crear una base de datos para cada proyecto.

Puedes crearla con el nombre pgrouting, por ejemplo.

Databases

Dótala de capacidades espaciales con la consulta “CREATE EXTENSION postgis;”

Query_PostGIS

El siguiente paso es activar la extensión pgRouting en la base de datos recién creada, para ello ejecuta la consulta “CREATE EXTENSION pgrouting;”

Query_pgRouting

Nota: Para comprobar que la extensión está activada correctamente puedes ejecutar la consulta SELECT pgr_version();

Una vez que esta se ha creado podemos cargar los datos en los que se basarán los análisis y que has descargado al inicio de este post (calles.shp). Para ello vamos a emplear la herramienta pgShapeLoader, conéctate a la base de datos recién creada a través de la misma.

Username

Abre el explorador de shapefiles asegurándote de que la pestaña Import está seleccionada y haz clic en el botón Add File, navega hasta el shapefile calles.shp e introduce el Sistema de Coordenadas ED50 UTM Zone 30N (EPSG: 23030)-

pgShapeLoader

Por último, pincha sobre Import para iniciar el proceso de importación.

Log_Window

Cuando se haya cargado la capa, haz clic en el botón Refrescar en pgAdmin para actualizar la vista del árbol. Deberías de ver la nueva tabla en Databases > pgrouting > Schemas > Public > Tables.

Cuando se cargan datos en una base de datos PostGIS para su uso con pgRouting no tienen información topológica asociada a ellos. Para crear una topología útil los datos deben de ser “noded”, lo que significa que, donde dos o más caminos formen una intersección, allí ha de existir un nodo.

Lo siguiente que necesitamos es construir la topología de nuestra red. Con ello lo que hacemos es conectar las calles que la componen a través de un conjunto de nodos. De este modo, el final de una calle queda conectado con el inicio de otra a través de un nodo, por ejemplo.

Además, para que nuestra red de calles esté completamente preparada, necesitamos la existencia en su tabla de dos campos (source y target). Estos campos, lo que recogen, es el identificador (id) del nodo inicial y del nodo final para cada tramo (calle) de nuestra red.

¿Por qué es necesario esto?. Cuando hagamos un análisis, por ejemplo, para encontrar el camino más corto entre dos puntos, la herramienta identificará, a través del conjunto de nodos, el nodo inicial o de partida e irá trazando la ruta, pasando de calle en calle, gracias a la conexión que estos crean entre las mismas.

Abre el ejecutor de consultas o Execute Arbitrary SQL queries SQL_Query.

Introduce la siguiente sentencia:

alter table calles add column source integer;
alter table calles add column target integer;
select pgr_createTopology('calles', 0.0001, 'geom', 'id');

El comando alter table nos permite editar la tabla calles, add column es el comando para añadir campos a la tabla y, por último, especificamos el tipo de campo, en este caso integer.

pgr_createTopology construye una topología de red basada en la información de geometría.

El resultado a la consulta puede ser:

  • OK. Tanto la topología como los campos source y target se han creado correctamente, además se ha creado una nueva tabla con los vértices/nodos en las intersecciones, la red ya está operativa.
  • FAIL. Ha surgido un error que ha impedido la creación de la red topológica.

OK_Topology

Actualiza pgAdmin y podrás comprobar que se ha generado una nueva tabla denominada calles_vertices_pgr que contiene los nodos a los que hemos hecho referencia durante la creación de la red.

Tables

Listo!. Ya tenemos nuestra network lista para realizar análisis de enrutamiento.

Una vez preparada la red, puedes realizar una conexión a la base de datos con QGIS y descargar el plugin pgRoutingLayer para emplear las funciones de pgRouting con él (cálculo de ruta óptima, cálculo de ruta de menor coste, cálculo de múltiples destinos basados en ruta óptima o menor coste, etc….).

Si, por otro lado, se desea realizar el proceso desde el inicio, podemos crear nuestra tabla de red en PostGIS.

Por ejemplo:

CREATE TABLE red_ejemplo (
id serial,
oneway character varying,
source integer,
target integer,
cost double precision,
x1 double precision,
y1 double precision,
x2 double precision,
y2 double precision,
the_geom geometry
);

E introducir los valores para las geometrías manualmente:

INSERT INTO red_ejemplo (oneway,cost,x1,y1,x2,y2) VALUES (FT, 10, 234195, 4142936, 234396, 4142936);
INSERT INTO red_ejemplo (oneway,cost,x1,y1,x2,y2) VALUES (TF, 21, 234410, 4142756, 234480, 4142602);

Una vez creada la tabla que albergará las geometrías de nuestra red podemos comenzar a introducir los valores.

Aprende a utilizar pgrouting inscribiéndote ya en nuestros cursos online de PostGIS o QGIS avanzado.

6 comentarios en «Cómo configurar una base de datos PostGIS para pgRouting (con vídeo)»

  1. Gracias por el articulo, muy interesante y provechoso. Como todos los buenos artículos me aclara muchas dudas y me genera otras. Si quiero hacer mi propia red, ¿puedo empezar de cero desde quantum gis hasta obtener una capa tipo «calles.shp»? ¿Debo cumplir algún requisito básico durante la creación de esa capa?

    Muchas gracias.

    • Hola Pablo,

      Me alegro de que el artículo te haya resultado interesante, gracias por seguir nuestro blog.
      Efectivamente puedes crear desde el inicio un shapefile para después emplearlo con pgRouting, simplemente digitalizando dicho «callejero». Recuerda configurar el snapping para que las calles se encuentren conectadas y no queden nodos colgados, de lo contrario generará error.
      Después has de incluir los campos que recojan la dirección de sentido, velocidad de tramo (opcional), etc…

      Un saludo!

    • Hola David,

      Gracias por tu comentario y por seguir nuestro blog. Nos alegra que el artículo haya sido de tu agrado.

      Un saludo!

  2. Hola, Muy buen artículo. Felicidades. Me ha sido de gran ayuda. Pero tengo una duda: He realizado el proceso tal como explican en el artículo, con éxito, sin embargo, al intentar ejecutar el plugin pgrouting_layer desde Qgis, me da un error de que no encuentra el campo cost. Efectivamente, este campo no se crea en ningún momento, sin embargo es uno de los parámetros para casi todos, sino todos los procesos.
    ¿Cómo se incluye este campo y que valores debe tener?
    Espero que alguien me pueda ayudar. Gracias!

    • Hola Juan Andrés,

      Efectivamente para ejecutar algunas funciones pgRotuingLayer plugin pide que exista en la tabla un campo, que puede denominarse «cost», y que ha de incluir el coste que supone atravesar cada arco de la red.
      Este campo puedes crearlo por ti mismo (desde PostGIS o QGIS) y dotarle de las unidades que deseas conocer, por ejemplo unidades de longitud (metros, kilómetros…..) o unidades de tiempo (horas, minutos, segundos).

      Un saludo!

Los comentarios están cerrados.