Versiones soportadas: latest (3.8) 3.7 3.6 3.5 3.4 3.3 3.2 3.1 3.0 main dev
Versiones no soportadas:2.6 2.5 2.4 2.3 2.2 2.1 2.0

pgr_createTopology - Obsoleto desde 3.8.0

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

Disponibilidad

  • Versión 3.8.0

    • Función obsoleta.

  • Versión 2.0.0

    • Función oficial.

    • Renombrado desde la versión 1.x

Migración de pgr_createTopology

Comenzando en v3.8.0

Antes de la Depreciación: Se calculó lo siguiente:

  • Se ha creado una tabla con <edges>_vertices_pgr.

Después de la depreciación El usuario es responsable de crear la topología completa.

Construir una topología de ruteo

La información básica para usar la mayoría de las funciones de pgRouting id, source, target, cost, [reverse_cost] es lo que en pgRouting se llama topología de ruteo.

reverse_cost es opcional pero se recomienda encarecidamente tenerlo para reducir el tamaño de la base de datos debido al tamaño de las columnas de geometría. Dicho esto, en esta documentación se utiliza reverse_cost.

Cuando los datos vienen con geometrías y no hay topología de ruteo, entonces este paso es necesario.

Todos los vértices iniciales y finales de las geometrías necesitan un identificador que se almacenará en las columnas source y target de la tabla de los datos. Del mismo modo, cost y reverse_cost necesitan tener el valor de atravesar la arista en ambas direcciones.

Si las columnas no existen, hay que añadirlas a la tabla en cuestión. (véase ALTER TABLE)

La función pgr_extractVertices se utiliza para crear una tabla de vértices basada en el identificador de arista y la geometría de la arista del grafo.

SELECT * INTO vertices
FROM pgr_extractVertices('SELECT id, geom FROM edges ORDER BY id');
SELECT 18

Finalmente, utilizando los datos almacenados en las tablas de vértices, se rellenan los campos source y target.

/* -- set the source information */
UPDATE edges AS e
SET source = v.id, x1 = x, y1 = y
FROM vertices AS v
WHERE ST_StartPoint(e.geom) = v.geom;
UPDATE 24
/* -- set the target information */
UPDATE edges AS e
SET target = v.id, x2 = x, y2 = y
FROM vertices AS v
WHERE ST_EndPoint(e.geom) = v.geom;
UPDATE 24

Descripción

La función devuelve:

  • OK después de que se ha construido la topología de red y la tabla de vértices.

  • FAIL cuando el la red topológica no se no se completó debido a un error.

Adentro Boost Graph Adentro: Boost Graph

Firmas

pgr_createTopology(tabla_borde, tolerancia, [opciones])
opcionales: [the_geom, id, source, target, rows_where, clean]
DEVUELVE VARCHAR

Parámetros

La función de creación de topología requiere los siguientes parámetros:

edge_table:

text La tabla de la red. (puede contener el nombre del esquema)

tolerancia:

float8 ajuste tolerancia de bordes desconectados. (en la unidad de proyección)

the_geom:

text nombre de la columna de la geometría en la tabla de la red. El valor por defecto es the_geom`.

id:

text``Nombre de la columna de la clave principal de la tabla de red. Valor por defecto es ``id”.

source:

id``Nombre de columna de origen de la tabla de red. El valor predeterminado es``source.

target:

text El nombre de la columna del destino del segmento. El valor por defecto es target.

rows_where:

text Condición para SELECCIONAR un subconjunto de filas. El valor predeterminado es true para indicar todas las filas donde source o target tienen un valor nulo, de lo contrario se utiliza la condición.

limpio:

boolean Limpia cualquier topología anterior. El valor por defecto es false.

Advertencia

La edge_table se verán afectados

  • Los valores de la columna``source`` va a cambiar.

  • Cambian los valores de la columna``target``.

    • Un índice será creado, si no existe, para acelerar el proceso para las columnas siguientes:

      • id

      • the_geom

      • source

      • target

La función devuelve:

  • “” OK”” después de que se ha construido la topología de red.

    • Crea una tabla de vértices: <edge_table>_vertices_pgr.

    • Llena las columnas id y the_geom de la tabla de vértices.

    • Llena las columnas los origen y destino de la tabla de borde haciendo referencia al id de la tabla de los vértices.

  • FAIL cuando la topología de red no se construyó debido a un error:

    • Una columna de la tabla de red requerida no se encuentra o no es del tipo apropiado.

    • La condición no está bien formada.

    • Los nombres de origen, destino o id son las mismos.

    • No pudo determinarse el SRID de la geometría.

La tabla de vértices

La estructura de la tabla de los vértices es:

id:

bigint identificador del vértice.

cnt:

integer Número de vértices en edge_table que hacen referencia a este vértice.

chk:

integer Indicador de que el vértice puede tener un problema.

ein:

integer número de vértices en la tabla de aristas que hacen referencia a este vértice como entrante.

eout:

integer número de vértices en la tabla de aristas que hacen referencia a este vértice como saliente.

the_geom:

geometry Valor de la geometría POINT del vértice.

Uso cuando las columnas de la tabla de borde coinciden con los valores por defecto:

La forma más sencilla de utilizar pgr_createTopology es:

SELECT  pgr_createTopology('edges', 0.001, 'geom');
WARNING:  pgr_createtopology(text,double precision,text,text,text,text,text,boolean) deprecated function on v3.8.0
NOTICE:  PROCESSING:
NOTICE:  pgr_createTopology('edges', 0.001, 'geom', 'id', 'source', 'target', rows_where := 'true', clean := f)
NOTICE:  Performing checks, please wait .....
NOTICE:  Creating Topology, Please wait...
NOTICE:  -------------> TOPOLOGY CREATED FOR  18 edges
NOTICE:  Rows with NULL geometry or NULL id: 0
NOTICE:  Vertices table for table public.edges is: public.edges_vertices_pgr
NOTICE:  ----------------------------------------------
 pgr_createtopology
--------------------
 OK
(1 row)

Cuando los argumentos se escriben en el orden descrito en los parámetros:

Se obtiene el mismo resultado que la forma más sencilla de utilizar la función.

SELECT  pgr_createTopology('edges', 0.001,
    'geom', 'id', 'source', 'target');
WARNING:  pgr_createtopology(text,double precision,text,text,text,text,text,boolean) deprecated function on v3.8.0
NOTICE:  PROCESSING:
NOTICE:  pgr_createTopology('edges', 0.001, 'geom', 'id', 'source', 'target', rows_where := 'true', clean := f)
NOTICE:  Performing checks, please wait .....
NOTICE:  Creating Topology, Please wait...
NOTICE:  -------------> TOPOLOGY CREATED FOR  18 edges
NOTICE:  Rows with NULL geometry or NULL id: 0
NOTICE:  Vertices table for table public.edges is: public.edges_vertices_pgr
NOTICE:  ----------------------------------------------
 pgr_createtopology
--------------------
 OK
(1 row)

Advertencia

Un error puede ocurrir cuando los argumentos no se dan en el orden adecuado: en este ejemplo, la columna id de la tabla egde_table se pasa a la función como columna de geometría, y la columna de geometría``the_geom`` se pasa a la función como columna id.

SELECT  pgr_createTopology('edges', 0.001,
    'id', 'geom');
WARNING:  pgr_createtopology(text,double precision,text,text,text,text,text,boolean) deprecated function on v3.8.0
NOTICE:  PROCESSING:
NOTICE:  pgr_createTopology('edges', 0.001, 'id', 'geom', 'source', 'target', rows_where := 'true', clean := f)
NOTICE:  Performing checks, please wait .....
NOTICE:  ----> PGR ERROR in pgr_createTopology: Wrong type of Column id:geom
HINT:    ----> Expected type of geom is integer,smallint or bigint but USER-DEFINED was found
NOTICE:  Unexpected error raise_exception
 pgr_createtopology
--------------------
 FAIL
(1 row)

Cuando se utiliza la notación por nombre

Los parámetros definidos con un valor predeterminado se pueden omitir, siempre que el valor coincida con el valor predeterminado y el orden de los parámetros no importaría.

SELECT  pgr_createTopology('edges', 0.001,
    the_geom:='geom', id:='id', source:='source', target:='target');
WARNING:  pgr_createtopology(text,double precision,text,text,text,text,text,boolean) deprecated function on v3.8.0
 pgr_createtopology
--------------------
 OK
(1 row)

SELECT  pgr_createTopology('edges', 0.001,
    source:='source', id:='id', target:='target', the_geom:='geom');
WARNING:  pgr_createtopology(text,double precision,text,text,text,text,text,boolean) deprecated function on v3.8.0
 pgr_createtopology
--------------------
 OK
(1 row)

SELECT  pgr_createTopology('edges', 0.001, 'geom', source:='source');
WARNING:  pgr_createtopology(text,double precision,text,text,text,text,text,boolean) deprecated function on v3.8.0
 pgr_createtopology
--------------------
 OK
(1 row)

Seleccionar filas utilizando el parámetro rows_where

La selección de filas basadas en el id.

SELECT  pgr_createTopology('edges', 0.001, 'geom', rows_where:='id < 10');
WARNING:  pgr_createtopology(text,double precision,text,text,text,text,text,boolean) deprecated function on v3.8.0
 pgr_createtopology
--------------------
 OK
(1 row)

Selección de las filas en las que la geometría está cerca de la geometría de la fila con id = 5.

SELECT  pgr_createTopology('edges', 0.001, 'geom',
    rows_where:='geom && (SELECT st_buffer(geom, 0.05) FROM edges WHERE id=5)');
WARNING:  pgr_createtopology(text,double precision,text,text,text,text,text,boolean) deprecated function on v3.8.0
 pgr_createtopology
--------------------
 OK
(1 row)

Seleccionar las filas donde la geometría está cerca de la geometría de la fila con``gid`` =100 de la tabla othertable.

CREATE TABLE otherTable AS  (SELECT 100 AS gid,  st_point(2.5, 2.5) AS other_geom);
SELECT 1
SELECT  pgr_createTopology('edges', 0.001, 'geom',
    rows_where:='geom && (SELECT st_buffer(other_geom, 1) FROM otherTable WHERE gid=100)');
WARNING:  pgr_createtopology(text,double precision,text,text,text,text,text,boolean) deprecated function on v3.8.0
 pgr_createtopology
--------------------
 OK
(1 row)

Uso cuando las columnas de la tabla de borde NO COINCIDEN con los valores por defecto:

Para la siguiente tabla

CREATE TABLE mytable AS (SELECT id AS gid,  geom AS mygeom, source AS src , target AS tgt FROM edges) ;
SELECT 18

Usando notación posicional:

Los argumentos deben darse en el orden descrito en los parámetros.

Tenga en cuenta que en este ejemplo se utiliza la bandera clean. Así que recrea toda la tabla de vértices.

SELECT  pgr_createTopology('mytable', 0.001, 'mygeom', 'gid', 'src', 'tgt', clean := TRUE);
WARNING:  pgr_createtopology(text,double precision,text,text,text,text,text,boolean) deprecated function on v3.8.0
 pgr_createtopology
--------------------
 OK
(1 row)

Advertencia

Un error puede ocurrir cuando los argumentos no se dan en el orden adecuado: en este ejemplo, la columna gid de la tabla mytable se pasa a la función como la columna de geometría, y la columna de geometría``mygeom`` se pasa a la función como columna id.

SELECT  pgr_createTopology('mytable', 0.001, 'gid', 'mygeom', 'src', 'tgt');
WARNING:  pgr_createtopology(text,double precision,text,text,text,text,text,boolean) deprecated function on v3.8.0
NOTICE:  PROCESSING:
NOTICE:  pgr_createTopology('mytable', 0.001, 'gid', 'mygeom', 'src', 'tgt', rows_where := 'true', clean := f)
NOTICE:  Performing checks, please wait .....
NOTICE:  ----> PGR ERROR in pgr_createTopology: Wrong type of Column id:mygeom
HINT:    ----> Expected type of mygeom is integer,smallint or bigint but USER-DEFINED was found
NOTICE:  Unexpected error raise_exception
 pgr_createtopology
--------------------
 FAIL
(1 row)

Cuando se utiliza la notación por nombre

En este escenario omitir un parámetro crearía un error porque los valores predeterminados para los nombres de columna no coinciden con los nombres de columna de la tabla. El orden de los parámetros no importa:

SELECT  pgr_createTopology('mytable', 0.001, the_geom:='mygeom', id:='gid', source:='src', target:='tgt');
WARNING:  pgr_createtopology(text,double precision,text,text,text,text,text,boolean) deprecated function on v3.8.0
 pgr_createtopology
--------------------
 OK
(1 row)

SELECT  pgr_createTopology('mytable', 0.001, source:='src', id:='gid', target:='tgt', the_geom:='mygeom');
WARNING:  pgr_createtopology(text,double precision,text,text,text,text,text,boolean) deprecated function on v3.8.0
 pgr_createtopology
--------------------
 OK
(1 row)

Seleccionar filas utilizando el parámetro rows_where

Basado en id:

SELECT  pgr_createTopology('mytable', 0.001, 'mygeom', 'gid', 'src', 'tgt', rows_where:='gid < 10');
WARNING:  pgr_createtopology(text,double precision,text,text,text,text,text,boolean) deprecated function on v3.8.0
 pgr_createtopology
--------------------
 OK
(1 row)

SELECT  pgr_createTopology('mytable', 0.001, source:='src', id:='gid', target:='tgt', the_geom:='mygeom', rows_where:='gid < 10');
WARNING:  pgr_createtopology(text,double precision,text,text,text,text,text,boolean) deprecated function on v3.8.0
 pgr_createtopology
--------------------
 OK
(1 row)

SELECT  pgr_createTopology('mytable', 0.001, 'mygeom', 'gid', 'src', 'tgt',
    rows_where:='mygeom && (SELECT st_buffer(mygeom, 1) FROM mytable WHERE gid=5)');
WARNING:  pgr_createtopology(text,double precision,text,text,text,text,text,boolean) deprecated function on v3.8.0
 pgr_createtopology
--------------------
 OK
(1 row)

SELECT  pgr_createTopology('mytable', 0.001, source:='src', id:='gid', target:='tgt', the_geom:='mygeom',
    rows_where:='mygeom && (SELECT st_buffer(mygeom, 1) FROM mytable WHERE gid=5)');
WARNING:  pgr_createtopology(text,double precision,text,text,text,text,text,boolean) deprecated function on v3.8.0
 pgr_createtopology
--------------------
 OK
(1 row)

Seleccionar las filas donde la geometría está cerca de la geometría de la fila con``gid`` =100 de la tabla othertable.

SELECT  pgr_createTopology('mytable', 0.001, 'mygeom', 'gid', 'src', 'tgt',
    rows_where:='mygeom && (SELECT st_buffer(other_geom, 1) FROM otherTable WHERE gid=100)');
WARNING:  pgr_createtopology(text,double precision,text,text,text,text,text,boolean) deprecated function on v3.8.0
 pgr_createtopology
--------------------
 OK
(1 row)

SELECT  pgr_createTopology('mytable', 0.001, source:='src', id:='gid', target:='tgt', the_geom:='mygeom',
    rows_where:='mygeom && (SELECT st_buffer(other_geom, 1) FROM otherTable WHERE gid=100)');
WARNING:  pgr_createtopology(text,double precision,text,text,text,text,text,boolean) deprecated function on v3.8.0
 pgr_createtopology
--------------------
 OK
(1 row)

Ejemplos Adicionales

Creación de una topología de ruteo

Un método alternativo para crear una topología de ruteo es utilizar pgr_extractVertices

Asegurarse de que la base de datos no tiene vertices_table

DROP TABLE IF EXISTS vertices_table;
NOTICE:  table "vertices_table" does not exist, skipping
DROP TABLE

Limpieza de las columnas de la topología de ruteo que se creará

UPDATE edges
SET source = NULL, target = NULL,
x1 = NULL, y1 = NULL,
x2 = NULL, y2 = NULL;
UPDATE 18

Crear la tabla de vértices

  • Cuando LINESTRING tiene un SRID entonces usa geom::geometry(POINT, <SRID>)

  • Para grandes tablas de aristas que han sido preparadas,

    • Crearlo como UNLOGGED y

    • Después de crear la tabla ALTER TABLE .. SET LOGGED

SELECT  * INTO vertices_table
FROM pgr_extractVertices('SELECT id, geom FROM edges ORDER BY id');
SELECT 17

Inspeccionar la tabla de vértices

SELECT *
FROM vertices_table;
 id | in_edges | out_edges |       x        |  y  |                    geom
----+----------+-----------+----------------+-----+--------------------------------------------
  1 |          | {6}       |              0 |   2 | 010100000000000000000000000000000000000040
  2 |          | {17}      |            0.5 | 3.5 | 0101000000000000000000E03F0000000000000C40
  3 | {6}      | {7}       |              1 |   2 | 0101000000000000000000F03F0000000000000040
  4 | {17}     |           | 1.999999999999 | 3.5 | 010100000068EEFFFFFFFFFF3F0000000000000C40
  5 |          | {1}       |              2 |   0 | 010100000000000000000000400000000000000000
  6 | {1}      | {2,4}     |              2 |   1 | 01010000000000000000000040000000000000F03F
  7 | {4,7}    | {8,10}    |              2 |   2 | 010100000000000000000000400000000000000040
  8 | {10}     | {12,14}   |              2 |   3 | 010100000000000000000000400000000000000840
  9 | {14}     |           |              2 |   4 | 010100000000000000000000400000000000001040
 10 | {2}      | {3,5}     |              3 |   1 | 01010000000000000000000840000000000000F03F
 11 | {5,8}    | {9,11}    |              3 |   2 | 010100000000000000000008400000000000000040
 12 | {11,12}  | {13}      |              3 |   3 | 010100000000000000000008400000000000000840
 13 |          | {18}      |            3.5 | 2.3 | 01010000000000000000000C406666666666660240
 14 | {18}     |           |            3.5 |   4 | 01010000000000000000000C400000000000001040
 15 | {3}      | {16}      |              4 |   1 | 01010000000000000000001040000000000000F03F
 16 | {9,16}   | {15}      |              4 |   2 | 010100000000000000000010400000000000000040
 17 | {13,15}  |           |              4 |   3 | 010100000000000000000010400000000000000840
(17 rows)

Creación de la topología de ruteo en la tabla de aristas

Actualizar de la información de source

WITH
out_going AS (
  SELECT id AS vid, unnest(out_edges) AS eid, x, y
  FROM vertices_table
)
UPDATE edges
SET source = vid, x1 = x, y1 = y
FROM out_going WHERE id = eid;
UPDATE 18

Actualización de la información de target

WITH
in_coming AS (
  SELECT id AS vid, unnest(in_edges) AS eid, x, y
  FROM vertices_table
)
UPDATE edges
SET target = vid, x2 = x, y2 = y
FROM in_coming WHERE id = eid;
UPDATE 18

Inspección de la topología de ruteo

SELECT id, source, target, x1, y1, x2, y2
FROM edges ORDER BY id;
 id | source | target | x1  | y1  |       x2       | y2
----+--------+--------+-----+-----+----------------+-----
  1 |      5 |      6 |   2 |   0 |              2 |   1
  2 |      6 |     10 |   2 |   1 |              3 |   1
  3 |     10 |     15 |   3 |   1 |              4 |   1
  4 |      6 |      7 |   2 |   1 |              2 |   2
  5 |     10 |     11 |   3 |   1 |              3 |   2
  6 |      1 |      3 |   0 |   2 |              1 |   2
  7 |      3 |      7 |   1 |   2 |              2 |   2
  8 |      7 |     11 |   2 |   2 |              3 |   2
  9 |     11 |     16 |   3 |   2 |              4 |   2
 10 |      7 |      8 |   2 |   2 |              2 |   3
 11 |     11 |     12 |   3 |   2 |              3 |   3
 12 |      8 |     12 |   2 |   3 |              3 |   3
 13 |     12 |     17 |   3 |   3 |              4 |   3
 14 |      8 |      9 |   2 |   3 |              2 |   4
 15 |     16 |     17 |   4 |   2 |              4 |   3
 16 |     15 |     16 |   4 |   1 |              4 |   2
 17 |      2 |      4 | 0.5 | 3.5 | 1.999999999999 | 3.5
 18 |     13 |     14 | 3.5 | 2.3 |            3.5 |   4
(18 rows)

_images/Fig1-originalData.png

Topología generada

Con salida completa

En este ejemplo se inicia una topología limpia, con 5 aristas y, a continuación, se incrementa al resto de los bordes.

SELECT pgr_createTopology('edges',  0.001, 'geom', rows_where:='id < 6', clean := true);
WARNING:  pgr_createtopology(text,double precision,text,text,text,text,text,boolean) deprecated function on v3.8.0
NOTICE:  PROCESSING:
NOTICE:  pgr_createTopology('edges', 0.001, 'geom', 'id', 'source', 'target', rows_where := 'id < 6', clean := t)
NOTICE:  Performing checks, please wait .....
NOTICE:  Creating Topology, Please wait...
NOTICE:  -------------> TOPOLOGY CREATED FOR  5 edges
NOTICE:  Rows with NULL geometry or NULL id: 0
NOTICE:  Vertices table for table public.edges is: public.edges_vertices_pgr
NOTICE:  ----------------------------------------------
 pgr_createtopology
--------------------
 OK
(1 row)

SELECT pgr_createTopology('edges',  0.001, 'geom');
WARNING:  pgr_createtopology(text,double precision,text,text,text,text,text,boolean) deprecated function on v3.8.0
NOTICE:  PROCESSING:
NOTICE:  pgr_createTopology('edges', 0.001, 'geom', 'id', 'source', 'target', rows_where := 'true', clean := f)
NOTICE:  Performing checks, please wait .....
NOTICE:  Creating Topology, Please wait...
NOTICE:  -------------> TOPOLOGY CREATED FOR  13 edges
NOTICE:  Rows with NULL geometry or NULL id: 0
NOTICE:  Vertices table for table public.edges is: public.edges_vertices_pgr
NOTICE:  ----------------------------------------------
 pgr_createtopology
--------------------
 OK
(1 row)

Ver también

Índices y tablas