ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

PostGIS/pgRouting管网连通性分析及最优路径规划

2022-09-09 19:03:03  阅读:264  来源: 互联网

标签:连通性 reverse pgRouting 路径 PostGIS edge dijkstra cost pgr


目录

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、生成路径信息和路径通达性

根据costreverse_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_vnode

参考来源

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

标签:连通性,reverse,pgRouting,路径,PostGIS,edge,dijkstra,cost,pgr
来源: https://www.cnblogs.com/xieshier/p/16673734.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有