pgr_extractVertices - Experimental - pgRouting Manual (3.2)
pgr_extractVertices - Experimental
   
    
     pgr_extractVertices
    
   
   - Extracts the vertices information based on the source and target.
  
Warning
Possible server crash
- 
     
These functions might create a server crash
 
Warning
Experimental functions
- 
     
They are not officially of the current release.
 - 
     
They likely will not be officially be part of the next release:
- 
       
The functions might not make use of ANY-INTEGER and ANY-NUMERICAL
 - 
       
Name might change.
 - 
       
Signature might change.
 - 
       
Functionality might change.
 - 
       
pgTap tests might be missing.
 - 
       
Might need c/c++ coding.
 - 
       
May lack documentation.
 - 
       
Documentation if any might need to be rewritten.
 - 
       
Documentation examples might need to be automatically generated.
 - 
       
Might need a lot of feedback from the comunity.
 - 
       
Might depend on a proposed function of pgRouting
 - 
       
Might depend on a deprecated function of pgRouting
 
 - 
       
 
Availability
- 
    
Version 3.0.0
- 
      
New experimental function
 
 - 
      
 
Description
This is an auxiliary function for extracting the vertex information of the set of edges of a graph.
- 
     
When the edge identifier is given, then it will also calculate the in and out edges
 
Signatures
pgr_extractVertices(Edges SQL [, dryrun])
RETURNS SETOF (id, in_edges, out_edges, x, y, geom)
    - Example :
 - 
     
Extracting the vertex information
 
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)
    Parameters
| 
        Parameter  | 
      
        Type  | 
      
        Description  | 
     
|---|---|---|
| 
        Edges SQL  | 
      
        
          | 
      
        The set of edges of the graph. It is an Inner Query as described below.  | 
     
| 
        dryrun  | 
      
        
          | 
      
        Don’t process and get in a NOTICE the resulting query.  | 
     
Inner Query
When line geometry is known
| 
        Column  | 
      
        Type  | 
      
        Description  | 
     
|---|---|---|
| 
        id  | 
      
        
          | 
      
        (Optional) identifier of the edge.  | 
     
| 
        geom  | 
      
        
          | 
      
        LINESTRING geometry of the edge.  | 
     
    This inner query takes precedence over the next two inner query, therefore other columns are ignored when
    
     
      geom
     
    
    column appears.
   
- 
     
Ignored columns:
- 
       
startpoint - 
       
endpoint - 
       
source - 
       
target 
 - 
       
 
When vertex geometry is known
    To use this inner query the column
    
     
      geom
     
    
    should not be part of the set of columns.
   
| 
        Column  | 
      
        Type  | 
      
        Description  | 
     
|---|---|---|
| 
        id  | 
      
        
          | 
      
        (Optional) identifier of the edge.  | 
     
| 
        startpoint  | 
      
        
          | 
      
        POINT geometry of the starting vertex.  | 
     
| 
        endpoint  | 
      
        
          | 
      
        POINT geometry of the ending vertex.  | 
     
    This inner query takes precedence over the next inner query,
therefore other columns are ignored when
    
     
      startpoint
     
    
    and
    
     
      endpoint
     
    
    columns appears.
   
- 
     
Ignored columns:
- 
       
source - 
       
target 
 - 
       
 
When identifiers of vertices are known
    To use this inner query the columns
    
     
      geom
     
    
    ,
    
     
      startpoint
     
    
    and
    
     
      endpoint
     
    
    should not be part of the set of columns.
   
| 
        Column  | 
      
        Type  | 
      
        Description  | 
     
|---|---|---|
| 
        id  | 
      
        
          | 
      
        (Optional) identifier of the edge.  | 
     
| 
        source  | 
      
        
          | 
      
        Identifier of the first end point vertex of the edge.  | 
     
| 
        target  | 
      
        
          | 
      
        Identifier of the second end point vertex of the edge.  | 
     
Result Columns
Rreturns set of (id, in_edges, out_edges, x, y, geom)
| 
        Column  | 
      
        Type  | 
      
        Description  | 
     
|---|---|---|
| 
        id  | 
      
        
          | 
      
        Identifier of the first end point vertex of the edge.  | 
     
| 
        in_edges  | 
      
        
          | 
      
       
  | 
     
| 
        out_edges  | 
      
        
          | 
      
       
  | 
     
| 
        x  | 
      
        
          | 
      
       
  | 
     
| 
        y  | 
      
        
          | 
      
       
  | 
     
| 
        geom  | 
      
        
          | 
      
       
  | 
     
Additional Examples
- Example 1 :
 - 
     
Dryrun execution
 
    To get the query generated used to get the vertex information, use
    
     
      dryrun
     
     
      :=
     
     
      true
     
    
    .
   
The results can be used as base code to make a refinement based on the backend development needs.
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)
    - Example 2 :
 - 
     
Creating a routing topology
 
- 
     
Making sure the database does not have the
vertices_tableDROP TABLE IF EXISTS vertices_table; NOTICE: table "vertices_table" does not exist, skipping DROP TABLE
 - 
     
Cleaning up the columns of the rotuing topology to be created
UPDATE edge_table SET source = NULL, target = NULL, x1 = NULL, y1 = NULL, x2 = NULL, y2 = NULL; UPDATE 18
 - 
     
Creating the vertices table
SELECT * INTO vertices_table FROM pgr_extractVertices('SELECT id, the_geom AS geom FROM edge_table'); SELECT 17
 - 
     
Inspection of the vertices table
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)
 - 
     
Creating the routing topology on the edge table
Updating the
sourceinformationWITH 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
Updating the
targetinformationWITH 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
 - 
     
Inspection of the routing topology
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)
 
See Also
- 
     
Topology - Family of Functions for an overview of a topology for routing algorithms.
 - 
     
pgr_createVerticesTable to create a topology based on the geometry.
 
Indices and tables