pgr_createTopology¶
pgr_createTopology
— 根据几何信息构建网络拓扑。
可用性
版本2.0.0
从版本1.X重命名
官方 函数
描述¶
函数返回:
OK
在网络拓扑建立完成并且顶点表创建后。FAIL
当由于错误原因未能构建网络拓扑时。
签名¶
[the_geom, id, source, target, rows_where, clean]
VARCHAR
参数¶
拓扑创建函数接受以下参数:
- edge_table:
text
网络表的名称(可能包含模式名称)- tolerance:
float8
断开边的捕捉容差。 (以投影单位表示)- the_geom:
text``网络表的几何列名称。 默认值为``the_geom
。- id:
text
网络表的主键列名称。 默认值为``id``。- source:
text``网络表的Source列名称。 默认值为``source
。- target:
text``网络表的Target列名称。 默认值为 ``target
。- rows_where:
text
用于选择行的条件。默认值为``true`` ,表示选择所有具有空值的source``或``target
的行,否则将使用指定的条件。- clean:
boolean
清除先前的拓扑。默认值为false
。
Warning
edge_table
将受到影响
source
列的值将发生改变。target
列的值将发生改变。如果索引不存在,则会创建一个索引,以加快以下列的处理速度:
id
the_geom
source
target
函数返回:
OK
在网络拓扑建立完成后。创建一个顶点表:<edge_table>_vertices_pgr。
填充顶点表的
id
和the_geom
列。引用顶点表的
id
填充边表的 source列和target列。
FAIL
当由于错误原因未能构建网络拓扑时:未找到网络表所需的列或该列的类型不正确。
条件尚未形成。
source 、 target 或 id 的名称相同。
无法确定几何图形的 SRID。
顶点表
顶点表是 pgr_analyzeGraph 和 pgr_analyzeOneWay 函数的必需条件。
顶点表的结构为:
- id:
bigint
顶点的标识符。- cnt:
integer
edge_table 中引用该顶点的顶点数。 参见 pgr_analyzeGraph。- chk:
integer
指示顶点可能有问题。 请参阅 pgr_analyzeGraph。- ein:
integer
边表中引用此顶点作为入边的顶点数量。请参考 pgr_analyzeOneWay。- eout:
integer
边表中引用此顶点作为出边的顶点数量。请参考 pgr_analyzeOneWay。- the_geom:
geometry
顶点的点几何。
当边表的列与默认值匹配时的用法:¶
使用 pgr_createTopology 最简单的方法是:
SELECT pgr_createTopology('edges', 0.001, 'geom');
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)
当参数按照参数中描述的顺序给出时:
我们得到的结果与使用该函数的最简单方法相同。
SELECT pgr_createTopology('edges', 0.001,
'geom', 'id', 'source', 'target');
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)
Warning
当参数未按适当顺序给出时会导致错误:在此示例中,表 ege_table
的列``id``被错误地传递给函数作为几何列,而几何列 the_geom
被错误地传递给函数作为 id 列。
SELECT pgr_createTopology('edges', 0.001,
'id', 'geom');
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)
当使用命名符号时
带有默认值的参数可以省略,只要其值与默认值一致即可。
SELECT pgr_createTopology('edges', 0.001,
the_geom:='geom', id:='id', source:='source', target:='target');
pgr_createtopology
--------------------
OK
(1 row)
SELECT pgr_createTopology('edges', 0.001,
source:='source', id:='id', target:='target', the_geom:='geom');
pgr_createtopology
--------------------
OK
(1 row)
SELECT pgr_createTopology('edges', 0.001, 'geom', source:='source');
pgr_createtopology
--------------------
OK
(1 row)
使用 rows_where 参数选择行
根据 id 选择行。
SELECT pgr_createTopology('edges', 0.001, 'geom', rows_where:='id < 10');
pgr_createtopology
--------------------
OK
(1 row)
选择与具有 id = 5
的行的几何图形接近的行。
SELECT pgr_createTopology('edges', 0.001, 'geom',
rows_where:='geom && (SELECT st_buffer(geom, 0.05) FROM edges WHERE id=5)');
pgr_createtopology
--------------------
OK
(1 row)
选择几何形状接近表 othertable
的``gid`` = 100 的行的几何形状的行。
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)');
pgr_createtopology
--------------------
OK
(1 row)
当边表的列与默认值不匹配时的用法:¶
对于下表
CREATE TABLE mytable AS (SELECT id AS gid, geom AS mygeom, source AS src , target AS tgt FROM edges) ;
SELECT 18
使用位置符号:
参数需要按照参数中描述的顺序给出。
请注意,此示例使用 clean 标志。 所以它重新创建了整个顶点表。
SELECT pgr_createTopology('mytable', 0.001, 'mygeom', 'gid', 'src', 'tgt', clean := TRUE);
pgr_createtopology
--------------------
OK
(1 row)
Warning
当参数未按适当的顺序给出时,会导致错误。在这个示例中,表 mytable
的列 gid
被错误地传递给函数作为几何列,而几何列``mygeom`` 被错误地传递给函数作为 id 列。
SELECT pgr_createTopology('mytable', 0.001, 'gid', 'mygeom', 'src', 'tgt'); 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)
当使用命名符号时
在这种情况下,省略参数会产生错误,因为列名的默认值与表中的列名不一致。参数的顺序并不重要:
SELECT pgr_createTopology('mytable', 0.001, the_geom:='mygeom', id:='gid', source:='src', target:='tgt');
pgr_createtopology
--------------------
OK
(1 row)
SELECT pgr_createTopology('mytable', 0.001, source:='src', id:='gid', target:='tgt', the_geom:='mygeom');
pgr_createtopology
--------------------
OK
(1 row)
使用 rows_where 参数选择行
根据 id:
SELECT pgr_createTopology('mytable', 0.001, 'mygeom', 'gid', 'src', 'tgt', rows_where:='gid < 10');
pgr_createtopology
--------------------
OK
(1 row)
SELECT pgr_createTopology('mytable', 0.001, source:='src', id:='gid', target:='tgt', the_geom:='mygeom', rows_where:='gid < 10');
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)');
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)');
pgr_createtopology
--------------------
OK
(1 row)
选择几何形状接近表 othertable
的``gid`` = 100 的行的几何形状的行。
SELECT pgr_createTopology('mytable', 0.001, 'mygeom', 'gid', 'src', 'tgt',
rows_where:='mygeom && (SELECT st_buffer(other_geom, 1) FROM otherTable WHERE gid=100)');
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)');
pgr_createtopology
--------------------
OK
(1 row)
其他示例¶
创建路由拓扑¶
使用 pgr_extractVertices -- 拟议 创建路由拓扑的替代方法
确保数据库没有 vertices_table
¶
DROP TABLE IF EXISTS vertices_table;
NOTICE: table "vertices_table" does not exist, skipping
DROP TABLE
清理要创建的路由拓扑的列¶
UPDATE edges
SET source = NULL, target = NULL,
x1 = NULL, y1 = NULL,
x2 = NULL, y2 = NULL;
UPDATE 18
创建顶点表¶
当
LINESTRING``具有 SRID 时,请使用 ``geom::geometry(POINT, <SRID>)
对于已经准备好的大型边表,
将其创建为
UNLOGGED
并创建表后,执行
ALTER TABLE .. SET LOGGED
操作
SELECT * INTO vertices_table
FROM pgr_extractVertices('SELECT id, geom FROM edges ORDER BY id');
SELECT 17
检查顶点表¶
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)
在边表上创建路由拓扑¶
更新 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
更新 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
检查路由拓扑¶
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)
带有完整输出¶
该示例以 5 条边的简洁拓扑结构为起点,然后递增到其余的边。
SELECT pgr_createTopology('edges', 0.001, 'geom', rows_where:='id < 6', clean := true);
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');
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)
本例使用 示例数据 网络。
另请参阅¶
索引和表格