pgr_extractVertices – Experimental

pgr_extractVertices — Extrae la información de vértices en función del origen y el destino.

Advertencia

Posible bloqueo del servidor

  • Estas funciones pueden crear un bloqueo del servidor

Advertencia

Funciones experimentales

  • No son oficialmente de la versión actual.
  • Es probable que oficialmente no formen parte de la siguiente versión:
    • Las funciones no podrían hacer uso de ANY-INTEGER ni ANY-NUMERICAL
    • El nombre puede cambiar.
    • La firma (declaración de funciones) podría cambiar.
    • La funcionalidad puede cambiar.
    • Las pruebas de pgTap pueden estar ausentes.
    • Posiblemente necesite codificación c/c++.
    • Puede haber carencia de documentación.
    • Hay documentación que, en dado caso, podría ser necesario reescribir.
    • Ejemplos de documentación que puede ser necesario generar automáticamente.
    • Puede ser necesaria más retroalimentación por parte de la comunidad.
    • Puede depender de una función propuesta de pgRouting.
    • Podría depender de una función obsoleta de pgRouting

Disponibilidad

  • Versión 3.0.0
    • Nueva función experimental

Soporte

Descripción

Esta es una función auxiliar para extraer la información de vértices del conjunto de aristas de un grafo.

  • Cuando se proporciona el identificador de arista, también se calcularán las aristas de entrada y salida

Firmas

pgr_extractVertices(Edges SQL [, dryrun])
RETURNS SETOF (id, in_edges, out_edges, x, y, geom)
Ejemplo:Extraer la información del vértice
SELECT  * FROM pgr_extractVertices(
    'SELECT id, the_geom AS geom
    FROM edge_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)

Parámetros

Parámetro Tipo Descripción
Edges SQL TEXT El conjunto de aristas del grafo. Es una Inner Query (Consulta interna) como se describe a continuación.
dryrun TEXT No procese y reciba un AVISO de la consulta resultante.

Consulta interna

Cuando se conoce la geometría de línea

Columna Tipo Descripción
id BIGINT (Opcional) identificador de la arista.
geom LINESTRING Geometría LINESTRING de la arista.

Esta consulta interna tiene prioridad sobre las dos consultas internas siguientes, por lo que se omiten otras columnas cuando aparece la columna “”geom””.

  • Columnas ignoradas:
    • startpoint
    • endpoint
    • source
    • target

Cuando se conoce la geometría de vértices

Para utilizar esta consulta interna, la columna geom no debe formar parte del conjunto de columnas.

Columna Tipo Descripción
id BIGINT (Opcional) identificador de la arista.
startpoint POINT Geometría POINT del vértice inicial.
endpoint POINT Geometría POINT del vértice final.

Esta consulta interna tiene prioridad sobre la siguiente consulta interna, por lo que se omiten otras columnas cuando aparecen las columnas startpoint y endpoint.

  • Columnas ignoradas:
    • source
    • target

Cuando se conocen identificadores de vértices

Para utilizar esta consulta interna, las columnas geom, startpoint y endpoint no deben formar parte del conjunto de columnas.

Columna Tipo Descripción
id BIGINT (Opcional) identificador de la arista.
origen ANY-INTEGER Identificador del primer punto final en el vértice de la arista.
objetivo ANY-INTEGER Identificador del segundo punto final en el vértice de la arista.

Columnas de Resultados

Devuelve un conjunto de (id, in_edges, out_edges, x, y, geom)

Columna Tipo Descripción
id BIGINT Identificador del primer punto final en el vértice de la arista.
in_edges BIGINT[]
Arreglo de identificadores de las aristas que tienen el vértice id como primer punto final.
  • NULL When the id no forma parte de la consulta interna
out_edges BIGINT[]
Arreglo de identificadores de las aristas que tienen el vértice id como segundo punto final.
  • NULL When the id no forma parte de la consulta interna
x FLOAT
Valor X de la geometría POINT
  • NULL Cuando no se proporciona geometría
y FLOAT
Valor Y de la geometría POINT
  • NULL Cuando no se proporciona geometría
geom POINT
Geometría del PUNTO
  • NULL Cuando no se proporciona geometría

Ejemplos Adicionales

Ejemplo 1:Ejecución de Dryrun

Para obtener la consulta generada que se usa para obtener la información de vértices, utilice dryrun := true.

Los resultados se pueden usar como código base para realizar un refinamiento basado en las necesidades de desarrollo de back-end.

SELECT  * FROM pgr_extractVertices(
    'SELECT id, the_geom AS geom FROM edge_table',
    dryrun := true);
NOTICE:
        WITH

        main_sql AS (
          SELECT id, the_geom AS geom FROM edge_table
        ),

        the_out AS (
          SELECT id::BIGINT AS out_edge, ST_StartPoint(geom) AS geom
          FROM main_sql
        ),

        agg_out AS (
          SELECT array_agg(out_edge ORDER BY out_edge) AS out_edges, ST_x(geom) AS x, ST_Y(geom) AS y, geom
          FROM the_out
          GROUP BY geom
        ),

        the_in AS (
          SELECT id::BIGINT AS in_edge, ST_EndPoint(geom) AS geom
          FROM main_sql
        ),

        agg_in AS (
          SELECT array_agg(in_edge ORDER BY in_edge) AS in_edges, ST_x(geom) AS x, ST_Y(geom) AS y, geom
          FROM the_in
          GROUP BY geom
        ),

        the_points AS (
          SELECT in_edges, out_edges, coalesce(agg_out.geom, agg_in.geom) AS geom
          FROM agg_out
          FULL OUTER JOIN agg_in USING (x, y)
        )

        SELECT row_number() over(ORDER BY ST_X(geom), ST_Y(geom)) AS id, in_edges, out_edges, ST_X(geom), ST_Y(geom), geom
        FROM the_points;
 id | in_edges | out_edges | x | y | geom
----+----------+-----------+---+---+------
(0 rows)

Ejemplo 2:Creación de una topología de ruteo
  1. Asegurarse de que la base de datos no tiene el vertices_table

    DROP TABLE IF EXISTS vertices_table;
    NOTICE:  table "vertices_table" does not exist, skipping
    DROP TABLE
    
  2. Limpieza de las columnas de la topología de ruteo que se creará

    UPDATE edge_table
    SET source = NULL, target = NULL,
       x1 = NULL, y1 = NULL,
       x2 = NULL, y2 = NULL;
    UPDATE 18
    
  3. Creación de la tabla de vértices

    SELECT  * INTO vertices_table
    FROM pgr_extractVertices('SELECT id, the_geom AS geom FROM edge_table');
    SELECT 17
    
  4. Inspección de 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)
    
    
  5. Creación de la topología de ruteo en la tabla de aristas

    Actualización 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 edge_table
    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 edge_table
    SET target = vid, x2 = x, y2 = y
    FROM in_coming WHERE id = eid;
    UPDATE 18
    
  6. Inspección de la topología de ruteo

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

Ver también

Índices y tablas