Como llegar a Platzi con pgRouting
Imaginemos que deseamos visitar los headquarters de Platzi en Ciudad de México. La gente normal usaría Google Maps o Waze, pero teniendo el superpoder de ser programadores, tenemos la otra opción, la de escribir y hacer uso de software para crear una herramienta propia.
Para esto necesitaremos tener instaladas algunas herramientas como:
PostgreSQL:
PostgresSQL es un motor de base de datos de fuente libre. Un motor de los más avanzados y rápidos. Además que cuenta con diversas extensiones bastante útiles.
Si deseas aprender sobre PostgreSQL, en Platzi tiene un curso muy bueno
PostGIS:
Es una extension de PostgreSQL para manejo de objetos espaciales y geográficos.
PgRouting:
pgRouting nos brinda funciones de ruteo y otras más para análisis de redes.
Siendo PostGIS y pgRouting extensiones opcionales, podemos activarlas con la siguiente consulta en postgres:
CREATE EXTENSION postgis;
CREATE EXTENSION pgrouting;
Obteniendo las vías
Teniendo todas las herramientas instaladas y preparadas, es hora de obtener las vías necesarias para empezar a trabajar.
Una de las fuentes más usadas en estos casos es OpenStreetMap, que usaremos en este ejemplo.
(Link directo a la zona para este ejemplo)
https://www.openstreetmap.org/export#map=17/19.42254/-99.16345
OpenStreetMap tiene funcionalidades para exportar los datos en un formato consumible, como el Overpass API, que nos permite descargar un archivo .osm con la descripción de vías, nodos y puntos de interés. (Dependiendo la amplitud de la zona descargada puede variar el tiempo de descarga.)
Para facilitar la cargar de los datos a nuestro sistema, utilizaremos la herramienta osm2pgrouting . La que ejecuta el proceso necesario para cargar las vías, nodos y crea el mapa de interrelación entre cada nodo. En el siguiente enlace encontrarás las instrucciones de instalación:
Modo de uso:
osm2pgrouting — file mapa.osm — dbname rutas — username postgres — clean
En este ejemplo usaremos la configuración por defecto. La herramienta ya crea las topologias necesarias para empezar a trabajar, llenando por ejemplo los campos source, target y cost.
El costo por default lo calcula en base a distancia. Podemos calcular un costo dinámico en base a otras variables, como el tráfico en la zona, limite de velocidad etc… como hacen aplicaciones más sofisticadas como Waze.
Empecemos el viaje!
Después de todo este proceso, podemos ejecutar nuestras consultas de rutas!
SELECT pt.seq, pt.node, pt.edge, pt.cost, b.the_geom
FROM pgr_dijkstra(
‘SELECT osm_id as id, source, target, cost FROM ways’,
(SELECT source FROM ways
ORDER BY ST_Distance(
ST_StartPoint(the_geom),
ST_SetSRID(ST_MakePoint(-99.1696682, 19.4265247), 4326),
true
) ASC
LIMIT 1),
(SELECT source FROM ways
ORDER BY ST_Distance(
ST_StartPoint(the_geom),
ST_SetSRID(ST_MakePoint(-99.1794936,19.4281141), 4326),
true
) ASC
LIMIT 1),
true
) as pt
join ways b on b.source = pt.node
Siendo -99.1696682, 19.4265247 nuestro punto inicial (en este caso un Hotel en la Ciudad de México) y -99.1794936,19.4281141 la ubicación del edificio Platzi. Utilizamos la función pgr_dijkstra para encontrar la ruta más corta, utilizando el algoritmo de Dijkstra.
Podemos utilizar QGIS para ver nuestro resultado:
Siendo el resultado algo bastante parecido a lo que nos recomienda Google Maps:
QGIS cuenta con una extensión bastante útil llamada pgRouting Layer, donde puedes previsualizar diferentes algoritmos de ruteo y comparar resultados.
Conclusión
PgRouting y PostGIS son herramientas bastante poderosas y con muchas utilidades, espero que con este ejemplo haya despertado su interés por explorar un poco más. Abajo dejo el enlace de la documentación de pgRouting para saber más.
https://docs.pgrouting.org/3.0/en/pgRouting-introduction.html