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_table
DROP 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
source
informationWITH 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
target
informationWITH 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