Inicio Rápido de pgRouting¶
pgRouting es una extensión que agrega enrutamiento y otras funciones de análisis de red a bases de datos PostGIS/PostgreSQL databases.
Contenidos
Habilitar PgRouting en una base de datos¶
En este ejemplo crearemos una base de datos llamada city_routing y habilitar pgRouting en la base de datos.
Abra una ventana
y ejecute la herramienta de línea de comandos empaquetada con PostgreSQL psql
psql
En el indicador de psql escribir:
CREATE DATABASE city_routing;
\connect city_routing;
CREATE EXTENSION pgrouting CASCADE;
Puede verificar la instalación ejecutando esto:
SELECT * FROM pgr_version();
pgr_version
-------------
3.1.0
(1 row)
Su versión debe ser 3.1.0 o superior
Salir de la base de datos
\q
Carga de datos OSM con osm2pgrouting¶
osm2pgrouting es una herramienta de línea de comandos para cargar archivos .osm en la base de datos con un formato compatible con pgRouting.
Compruebe la versión instalada
osm2pgrouting --version
La salida muestra
This is osm2pgrouting Version 2.3.6
Cargue los datos del archivo osm:
bzcat data/osm/feature_city.osm.bz2 > /tmp/feature_city.osm
osm2pgrouting \
-f /tmp/feature_city.osm \
-h localhost \
-U user \
-d city_routing \
-p 5432 \
-W user \
--conf=/usr/share/osm2pgrouting/mapconfig_for_cars.xml
rm /tmp/feature_city.osm
La salida debe ser algo como:
Execution starts at: Thu Jan 21 16:25:38 2021
***************************************************
COMMAND LINE CONFIGURATION *
***************************************************
Filename = /tmp/feature_city.osm
Configuration file = /usr/share/osm2pgrouting/mapconfig_for_cars.xml
host = localhost
port = 5432
dbname = city_routing
username = user
schema=
prefix =
suffix =
Don't drop tables
Don't create indexes
Don't add OSM nodes
***************************************************
Testing database connection: city_routing
database connection successful: city_routing
Connecting to the database
connection success
Creating tables...
TABLE: ways_vertices_pgr created ... OK.
TABLE: ways created ... OK.
TABLE: pointsofinterest created ... OK.
TABLE: configuration created ... OK.
Opening configuration file: /usr/share/osm2pgrouting/mapconfig_for_cars.xml
Parsing configuration
Exporting configuration ...
- Done
Counting lines ...
- Done
Opening data file: /tmp/feature_city.osm total lines: 844044
Parsing data
End Of file
Finish Parsing data
Adding auxiliary tables to database...
Export Ways ...
Processing 37373 ways:
[**************************| ] (53%) Total processed: 20000 Vertices inserted: 8126 Split ways inserted 10253
[**************************************************|] (100%) Total processed: 37373 Vertices inserted: 1423 Split ways inserted 3385
Creating indexes ...
Processing Points of Interest ...
#########################
size of streets: 37373
Execution started at: Thu Jan 21 16:25:38 2021
Execution ended at: Thu Jan 21 16:25:42 2021
Elapsed time: 4.645 Seconds.
User CPU time: -> 2.36362 seconds
#########################
Compruebe los datos importados¶
Conéctese a la base de datos city_routing
psql city_routing
El comando \d enumerará todas las tablas y secuencias disponibles
List of relations
Schema | Name | Type | Owner
--------+--------------------------+----------+-------
public | configuration | table | user
public | configuration_id_seq | sequence | user
public | geography_columns | view | user
public | geometry_columns | view | user
public | pointsofinterest | table | user
public | pointsofinterest_pid_seq | sequence | user
public | spatial_ref_sys | table | user
public | ways | table | user
public | ways_gid_seq | sequence | user
public | ways_vertices_pgr | table | user
public | ways_vertices_pgr_id_seq | sequence | user
(11 rows)
osm2pgrouting carga los identificadores de OSM osm_id y también genera un identificador único para todos los datos: id en los vértices, gid en los bordes.
SELECT id, osm_id
FROM ways_vertices_pgr
WHERE id IN(100,600);
Los resultados son:
id | osm_id
-----+----------
100 | 81622364
600 | 82708785
(2 rows)
Consulta interna¶
La mayoría de las funciones pgRouting tienen un parámetro que es una instrucción SQL, se llama consulta interna
La instrucción SQL interna siempre debe tener nombres de campo id, source, target y cost que tengan reverse_cost como opción.
Consulta interna que usa gid como identificador de los segmentos
SELECT gid as id,
source, target,
cost, reverse_cost
FROM ways
Consulta interna que utiliza gid como identificador de los segmentos y la longitud como coste sin el reverse_cost opcional
SELECT gid as id,
source, target,
length AS cost
FROM ways
pgr_Dijkstra¶
Ejecute la función de la ruta más corta de Dijkstra en función del tiempo en segundos para atravesar un segmento en un grafo no dirigido, utilizando id como identificador de un vértice
SELECT *
FROM pgr_dijkstra(
'SELECT gid as id,
source, target,
cost_s AS cost, reverse_cost_s AS reverse_cost
FROM ways',
100, 600,
directed => false
);
Los resultados son:
seq | path_seq | node | edge | cost | agg_cost
-----+----------+------+-------+--------------------+--------------------
1 | 1 | 100 | 6199 | 8.994104012024671 | 0
2 | 2 | 4360 | 152 | 2.8524015038110697 | 8.994104012024671
3 | 3 | 101 | 511 | 2.4123361340227754 | 11.84650551583574
4 | 4 | 322 | 707 | 3.63955931676029 | 14.258841649858514
5 | 5 | 448 | 705 | 2.9567136964053367 | 17.898400966618805
6 | 6 | 445 | 662 | 4.185190538775397 | 20.855114663024143
7 | 7 | 415 | 663 | 1.2667248968947813 | 25.04030520179954
8 | 8 | 442 | 699 | 6.371427985640729 | 26.30703009869432
9 | 9 | 593 | 913 | 2.5897354220718807 | 32.67845808433505
10 | 10 | 438 | 693 | 5.5261229396496585 | 35.26819350640693
11 | 11 | 1573 | 2421 | 7.003475952839719 | 40.79431644605659
12 | 12 | 619 | 10389 | 3.8659203494409344 | 47.79779239889631
13 | 13 | 600 | -1 | 0 | 51.66371274833725
(13 rows)
Una consulta que utiliza el identificador OSM se convierte en:
SELECT *
FROM pgr_dijkstra(
'SELECT gid as id,
source_osm AS source, target_osm AS target,
cost_s AS cost, reverse_cost_s AS reverse_cost
FROM ways',
81622364, 82708785,
directed => false
);
Debido a que la consulta usa campos source_osm y target_osm, la consulta les asigna un alias para que tengan los nombres requeridos origen y destino.
La salida es:
seq | path_seq | node | edge | cost | agg_cost
-----+----------+------------+-------+--------------------+--------------------
1 | 1 | 81622364 | 6199 | 8.994104012024671 | 0
2 | 2 | 1177972556 | 152 | 2.8524015038110697 | 8.994104012024671
3 | 3 | 81622365 | 511 | 2.4123361340227754 | 11.84650551583574
4 | 4 | 81917858 | 707 | 3.63955931676029 | 14.258841649858514
5 | 5 | 82582021 | 705 | 2.9567136964053367 | 17.898400966618805
6 | 6 | 82581909 | 662 | 4.185190538775397 | 20.855114663024143
7 | 7 | 82571671 | 663 | 1.2667248968947813 | 25.04030520179954
8 | 8 | 82581612 | 699 | 6.371427985640729 | 26.30703009869432
9 | 9 | 82708510 | 913 | 2.5897354220718807 | 32.67845808433505
10 | 10 | 82580320 | 693 | 5.5261229396496585 | 35.26819350640693
11 | 11 | 97825917 | 2421 | 7.003475952839719 | 40.79431644605659
12 | 12 | 82714784 | 10389 | 3.8659203494409344 | 47.79779239889631
13 | 13 | 82708785 | -1 | 0 | 51.66371274833725
(13 rows)
Los costos son los mismos que en la primera consulta
Una consulta para obtener la geometría de la ruta
Los resultados de pgr_dijkstra deben unirse con las formas de la tabla.
SELECT seq, edge, rpad(b.the_geom::text,60,' ') AS "the_geom (truncated)"
FROM pgr_dijkstra(
'SELECT gid as id,
source, target,
cost_s AS cost, reverse_cost_s AS reverse_cost
FROM ways',
100, 600,
directed => false
) AS a
JOIN ways AS b ON (a.edge = b.gid) ORDER BY seq;
Los resultados, con fines visuales se truncan aquí, las geometrías son mucho más largas de lo que se muestra
seq | edge | the_geom (truncated)
-----+-------+--------------------------------------------------------------
1 | 6199 | 0102000020E6100000050000009F3825C56C3C4DC0D8367B56884A41C011
2 | 152 | 0102000020E610000003000000B586F7C19E3C4DC016A0127C784A41C034
3 | 511 | 0102000020E610000002000000EFF7D566AD3C4DC09C267D6B714A41C04A
4 | 707 | 0102000020E6100000060000004A247612B63C4DC0FA1F05F4674A41C052
5 | 705 | 0102000020E610000003000000964E35C4C23C4DC0D81E076F594A41C095
6 | 662 | 0102000020E610000002000000504FC4C7CC3C4DC00858AB764D4A41C01F
7 | 663 | 0102000020E610000002000000408C6BD7DF3C4DC013ACBBC3374A41C01F
8 | 699 | 0102000020E61000000300000082FD7C00F73C4DC0E44FAFEF1E4A41C017
9 | 913 | 0102000020E610000002000000650D28E5FF3C4DC03D02C985144A41C082
10 | 693 | 0102000020E610000002000000C761D5C5123D4DC060E05E3EFE4941C065
11 | 2421 | 0102000020E610000003000000675F1ED72B3D4DC0A45F11B2E24941C05F
12 | 10389 | 0102000020E6100000020000006CA9CD49393D4DC08E548440D34941C067
(12 rows)
Con ed comando \d salir de la shell de PostgreSQL.
¿Qué sigue?¶
pgRouting Website - Visite el sitio web del proyecto https://pgrouting.org para obtener más información sobre pgRouting.
pgRouting Documentation - Encuentra la documentación más reciente en https://docs.pgrouting.org.
PgRouting Workshop - El taller «Enrutamiento FOSS4G con herramientas pgRouting y datos de carreteras OpenStreetMap» está disponible en: https://workshop.pgrouting.org.
osm2pgRouting loading data - https://github.com/pgRouting/osm2pgrouting/wiki/Documentation-for-osm2pgrouting-v2.3