目录
PostGIS/pgRouting管网连通性分析及最优路径规划
一、拓展安装
pgrouting依赖postgis,要先安装postgis
https://github.com/pgRouting/pgrouting/wikites-on-Download%2C-Installation-and-building-pgRouting
云主机
需要已经安装过postgresql与postgis可使用命令:
sudo apt install postgresql-9.3-pgrouting
window系统
安装地址:http://download.osgeo.org/postgis/windows/
二、创建扩展
使用前需要先在pg数据库创建扩展
--pgrouting依赖postgis
CREATE EXTENSION PostGIS
CREATE EXTENSION pgRouting
三、样例:
1、新建数据表edge_table
CREATE TABLE edge_table (
id BIGSERIAL,
dir character varying,
source BIGINT,
target BIGINT,
cost FLOAT,
reverse_cost FLOAT,
capacity BIGINT,
reverse_capacity BIGINT,
category_id INTEGER,
reverse_category_id INTEGER,
x1 FLOAT,
y1 FLOAT,
x2 FLOAT,
y2 FLOAT,
the_geom geometry
);
2、插入数据
INSERT INTO edge_table (
category_id, reverse_category_id,
cost, reverse_cost,
capacity, reverse_capacity,
x1, y1,
x2, y2) VALUES
(3, 1, 1, 1, 80, 130, 2, 0, 2, 1),
(3, 2, -1, 1, -1, 100, 2, 1, 3, 1),
(2, 1, -1, 1, -1, 130, 3, 1, 4, 1),
(2, 4, 1, 1, 100, 50, 2, 1, 2, 2),
(1, 4, 1, -1, 130, -1, 3, 1, 3, 2),
(4, 2, 1, 1, 50, 100, 0, 2, 1, 2),
(4, 1, 1, 1, 50, 130, 1, 2, 2, 2),
(2, 1, 1, 1, 100, 130, 2, 2, 3, 2),
(1, 3, 1, 1, 130, 80, 3, 2, 4, 2),
(1, 4, 1, 1, 130, 50, 2, 2, 2, 3),
(1, 2, 1, -1, 130, -1, 3, 2, 3, 3),
(2, 3, 1, -1, 100, -1, 2, 3, 3, 3),
(2, 4, 1, -1, 100, -1, 3, 3, 4, 3),
(3, 1, 1, 1, 80, 130, 2, 3, 2, 4),
(3, 4, 1, 1, 80, 50, 4, 2, 4, 3),
(3, 3, 1, 1, 80, 80, 4, 1, 4, 2),
(1, 2, 1, 1, 130, 100, 0.5, 3.5, 1.999999999999,3.5),
(4, 1, 1, 1, 50, 130, 3.5, 2.3, 3.5,4);
3、生成路径信息和路径通达性
根据cost
和reverse_cost
两个字段,生成the_geom
(两点间地理信息/路径信息)和dir
两点间路径通达性:
UPDATE edge_table SET the_geom = st_makeline(st_point(x1,y1),st_point(x2,y2)),
dir = CASE WHEN (cost>0 AND reverse_cost>0) THEN 'B' -- 双向通行
WHEN (cost>0 AND reverse_cost<0) THEN 'FT' -- 正向通行
WHEN (cost<0 AND reverse_cost>0) THEN 'TF' -- 反向通行
ELSE '' END; -- 其他情况不操作
4、创建拓扑
--只有构建拓扑之后,才能进行路径规划。0.001是拓扑容差
SELECT pgr_createTopology('edge_table',0.001);
5、尝试进行查询获取最短路径
pgr_dijkstra函数可以获取最短路径
SELECT * FROM pgr_dijkstra(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
4, 8)
6、官方样例中还有更多的使用方式
pointsOfInterest 、restrictions、new_restrictions、customer等
官网提供的完整样例 https://docs.pgrouting.org/3.0/en/sampledata.html
四、pgr_dijkstra使用
pgr_dijkstra(edges_sql, start_vid, end_vid [, directed])--一对一
pgr_dijkstra(edges_sql, start_vid, end_vids [, directed])--一对多
pgr_dijkstra(edges_sql, start_vids, end_vid [, directed])--多对一
pgr_dijkstra(edges_sql, start_vids, end_vids [, directed])--多对多
pgr_dijkstra入参
Parameter | 类型 | 默认值 | 描述 |
---|---|---|---|
edges_sql | TEXT |
内部 SQL 查询。 | |
start_vid | BIGINT |
路径起始顶点的标识符。 | |
start_vids | ARRAY[BIGINT] |
起始顶点的标识符数组。 | |
end_vid | BIGINT |
路径结束顶点的标识符。 | |
end_vids | ARRAY[BIGINT] |
结束顶点的标识符数组。 | |
directed | BOOLEAN |
true |
true 有向 false 无向 |
pgr_dijkstra中的edges_sql
一对一sql
--id标识符、source起始点、target目标点、cost成本(权重)、reverse_cost逆向成本(权重)
SELECT * FROM pgr_dijkstra(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
4, 8)
多对多sql
SELECT * FROM pgr_dijkstra(
'SELECT id, source, target, cost FROM edge_table',
ARRAY[4,2], ARRAY[3,5],
FALSE
);
内部sql
Column | 类型 | 默认值 | 描述 |
---|---|---|---|
id | ANY-INTEGER |
Identifier of the edge. | |
source | ANY-INTEGER |
边的第一个端点顶点的标识符。 | |
target | ANY-INTEGER |
边的第二个端点顶点的标识符。 | |
cost | ANY-NUMERICAL |
node 从使用edge 到路径序列中的下一个节点的遍历成本。 |
|
reverse_cost | ANY-NUMERICAL |
-1 | node 从使用edge 到路径序列中的下一个节点的反向遍历成本。 |
返回参数
Column | 类型 | 描述 |
---|---|---|
seq | INT |
序列值 |
path_id | INT |
路径标识符。路径的第一个值为1。当有多个路径start_vid 可以end_vid 组合时使用。 |
path_seq | INT |
路径中的相对位置。路径开头的值为1。 |
start_vid | BIGINT |
起始顶点的标识符。当查询中有多个起始顶点时返回。 |
end_vid | BIGINT |
结束顶点的标识符。当查询中有多个结束顶点时返回。 |
node | BIGINT |
start_vid 从到路径中节点的标识符end_vid 。 |
edge | BIGINT |
用于从node 路径序列到下一个节点的边的标识符。-1 对于路径的最后一个节点。 |
cost | FLOAT |
node 从使用edge 到路径序列中的下一个节点的遍历成本。 |
agg_cost | FLOAT |
总成本从start_v 到node 。 |
参考来源
https://docs.pgrouting.org/3.0/en/sampledata.html
https://blog.csdn.net/sinat_41310868/article/details/106912152
https://zhuanlan.zhihu.com/p/85905703
https://www.modb.pro/db/190857
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/288492.html