1. Crear una topología de red¶
osm2pgrouting es una herramienta conveniente y su enfoque es trabajar con datos de OpenStreetMap. Hay varios casos en los que osm2pgrouting no se puede utilizar. Algunos datos de red ya vienen con una topología de red que se puede usar con pgRouting out-of-the-box. A menudo, los datos de red se almacenan en formato de archivo Shape (.shp
) y podemos usar el convertidor de PostGIS” shp2pgsql
para importar los datos a una base de datos PostgreSQL.
¿Pero qué hacer entonces?
En este capítulo aprenderá a crear una Topología de Red de Ruteo básica a partir de datos de red que no tiene una Topología de ruteo crear los atributos mínimos necesarios para la Topología de Red de Ruteo.
1.1. Cargar los datos de la red¶
Al principio cargaremos datos de muestra de OpenStreetMap con osm2pgsql.
CITY="DS_TZ"
cd ~/Desktop/workshop
cp ~/data/osm/$CITY.osm.bz2 .
createdb -U user osm_data
psql -U user -d osm_data -c "CREATE EXTENSION postgis;"
psql -U user -d osm_data -c "CREATE EXTENSION pgrouting;"
osm2pgsql -U user -c -d osm_data --latlong --cache 5 --cache-strategy sparse $CITY.osm.bz2
Veamos qué tablas se han creado:
Ejecutar: psql -U user -d osm_data -c "\d"
La tabla que contiene los datos de la red de carreteras tiene el nombre planet_osm_roads
. Consta de una gran cantidad de atributos.
Ejecutar: psql -U user -d osm_data -c "\d planet_osm_roads"
Es común que datos de la red carretera proporcionen al menos la siguiente información:
ID del Camino (gid)
Clase de camino (class_id)
Longitud del camino (length)
Nombre del camino (name)
Geometría del camino (the_geom)
Esto permite para visualizar la red de carreteras como una capa PostGIS en software GIS, por ejemplo en QGIS. Aunque no es suficiente para el enrutamiento, porque no contiene información de la topología de red.
Los pasos siguientes utilizarán la herramienta de línea de comandos PostgreSQL.
psql -U user osm_data
1.2. Crear una Topología de Red de Ruteo¶
Tener los datos importados en una base de datos PostgreSQL puede requerir un paso más para pgRouting.
Asegurarse de que los datos proporcionan una correcta Red Topológica de ruteo que consta de información sobre los identificadores de origen y destino para cada vínculo de carretera. Los resultados anteriores muestran que la topología de red no tiene ninguna información de origen y destino.
Es necesaria la creación de la Topología de Red de Ruteo.
Advertencia
La topología postGIS no es adecuada para ruteo.
pgRouting proporciona una forma general de crear la Topología de Red de Ruteo con la función pgr_createTopology
.
Esta función:
Asigna identificadores de
source
ytarget
a cada enlace de carreteraPuede «ajustar» lógicamente los vértices cercanos dentro de una cierta tolerancia asignando el mismo identificador.
Crea una tabla de vértices relacionada con ella.
Crea los índices básicos.
pgr_createTopology('<table>', <tolerance>, '<geometry column>', '<gid>')
Para obtener más información, consultar pgr_createTopology.
Primero, agregar la columna de origen y destino y, a continuación, ejecutar la función pgr_createTopology
… esperar.
Dependiendo del tamaño de la red, este proceso puede tardar de minutos a horas.
Indicador de progreso se puede leer con PostgreSQL NOTICE
También requerirá suficiente memoria (partición RAM o SWAP) para almacenar datos temporales.
La dimensión del parámetro de tolerancia depende de la proyección de datos. Por lo general, son «grados» o «metros». En nuestro ejemplo, la proyección de datos de geometría para determinar la tolerancia:
SELECT find_srid('public','planet_osm_roads','way');
find_srid
-----------
4326
(1 row)
En base a este resultado, la tolerancia será 0.00001
-- Add "source" and "target" column
ALTER TABLE planet_osm_roads ADD COLUMN "source" integer;
ALTER TABLE planet_osm_roads ADD COLUMN "target" integer;
-- Run topology function
SELECT pgr_createTopology('planet_osm_roads', 0.00001, 'way', 'osm_id');
1.3. Verifique la Topología de Red de Ruteo¶
Para verificar que hay una Topología de Red de Ruteo básica:
\d planet_osm_roads
También se creó una nueva tabla que contiene la información de vértices:
\d planet_osm_roads_vertices_pgr
id
es el identificador de vérticethe_geom
es la geometría considerada para ese identificador de vértice en particular.source
ytarget
delplanet_osm_roads
corresponden a unid
en la tablaplanet_osm_roads_vertices_pgr
Las columnas adicionales son para analizar la topología.
Ahora estamos listos para nuestra primera consulta de enrutamiento con pgr_dijkstra
1.4. Analizar y ajustar la Topología de Red de Ruteo¶
Analizando la topología con pgr_analyzeGraph:
SELECT pgr_analyzeGraph('planet_osm_roads', 0.000001, the_geom := 'way', id := 'osm_id');
Ajustar la topología no es una tarea fácil:
¿Es un segmento aislado un error en los datos?
¿Es un segmento aislado porque está en el borde del cuadro delimitador?
¿Las brechas potenciales encontradas cerca de los sin salida porque la tolerancia era demasiado pequeña?
¿Las intersecciones son verdaderas intersecciones y necesitan ser admitidas?
¿Las intersecciones son puentes o túneles y no necesitan ser admitidos?
Dependiendo de la aplicación es necesario realizar algunos ajustes.
algunas funciones de topology manipulation ayudan a detectar y reparar algunos errores topológicos en los datos.