草庐IT

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

xieshier 2023-03-28 原文

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是拓扑容差,两个点的距离在这个距离内,就算重合为一点。这个距离使用st_length计算
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

五、应用

官网完整的sql语句创建拓扑

SELECT pgr_createTopology(text edge_table, double precision tolerance,
                       text the_geom:='the_geom', text id:='id',
                       text source:='source',text target:='target',
                       text rows_where:='true', boolean clean:=false)

创建拓扑参数

Column 类型 描述
edge_table text 表名
tolerance float8 误差缓冲值,两个点的距离在这个距离内,就算重合为一点。这个距离使用st_length计算
the_geom text 该表的空间坐标字段
id text 该表的主键
source int 空间起点编号
target int 空间终点编号
rows_where boolean 条件选择子集或行。默认值为true,表示源或目标具有空值的所有行,否则将使用条件。
clean boolean 每次执行都重建拓扑图,默认false

实际使用时的sql

 SELECT
	pgr_createTopology ( 'erqihsl', 0.001,  'shape' , 'objectid', 'start', 'last' ) from erqihsl

创建拓扑成功时,会自动创建出一个(表名包含Vertices)扩展表,新表结构为:

Column 类型 描述(解释来自官网)
id bigint 顶点的标识符。
cnt integer edge_table中引用此顶点的顶点数。See pgr_analyzeGraph.
chk integer 指示顶点可能有问题。See pgr_analyzeGraph.
ein integer edge_table中引用这个顶点的顶点数。See pgr_analyzeOneway.
eout integer edge_table中引用该顶点作为输出的顶点数。See pgr_analyzeOneway.
the_geom geometry Point geometry of the vertex:顶点的点几何。

实际使用时的sql查询

SELECT * FROM pgr_dijkstra(   
 'SELECT objectid as id, start as source, last as target ,length as cost FROM erqihsl',  
  2010002150, 2010002551)

参考来源

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

https://docs.pgrouting.org/latest/en/pgr_createTopology.html

有关PostGIS/pgRouting 最优路径规划 管网连通性分析的更多相关文章

  1. ruby-on-rails - Rails - 使用/自定义 URL : '/dashboard' 指定根路径 - 2

    如何使此根路径转到:“/dashboard”而不仅仅是http://example.com?root:to=>'dashboard#index',:constraints=>lambda{|req|!req.session[:user_id].blank?} 最佳答案 您可以通过以下方式实现:root:to=>redirect('/dashboard')match'/dashboard',:to=>"dashboard#index",:constraints=>lambda{|req|!req.session[:user_id].b

  2. ruby - 如何根据长度将路径数组转换为嵌套数组或散列 - 2

    我需要根据字符串路径的长度将字符串路径数组转换为符号、哈希和数组的数组给定以下数组:array=["info","services","about/company","about/history/part1","about/history/part2"]我想生成以下输出,对不同级别进行分组,根据级别的结构混合使用符号和对象。产生以下输出:[:info,:services,about:[:company,history:[:part1,:part2]]]#altsyntax[:info,:services,{:about=>[:company,{:history=>[:part1,:pa

  3. ruby-on-rails - 如何播种图像的路径? - 2

    Organization和Image具有一对一的关系。Image有一个名为filename的列,它存储文件的路径。我在Assets管道中包含这样一个文件:app/assets/other/image.jpg。播种时如何包含此文件的路径?我已经在我的种子文件中尝试过:@organization=...@organization.image.create!(filename:File.open('app/assets/other/image.jpg'))#Ialsotried:#@organization.image.create!(filename:'app/assets/other/i

  4. Ruby 和指南针路径与 yeoman 项目 - 2

    我安装了ruby​​、yeoman,当我运行我的项目时,出现了这个错误:Warning:Running"compass:dist"(compass)taskWarning:YouneedtohaveRubyandCompassinstalledthistasktowork.Moreinfo:https://github.com/gruUse--forcetocontinue.Use--forcetocontinue.我有进入可变session目标的路径,但它不起作用。谁能帮帮我? 最佳答案 我必须运行这个:geminstallcom

  5. 对象的 Ruby 方法查找路径 - 2

    是否有内置的Ruby方法或众所周知的库可以返回对象的整个方法查找链?Ruby查看一系列令人困惑的类(如thisquestion中所讨论)以查找与消息对应的实例方法,如果没有类响应消息,则调用接收方的method_missing。我将以下代码放在一起,但我确信它遗漏了某些情况或者它是否100%正确。请指出任何缺陷并指导我找到一些更好的代码(如果存在)。defmethod_lookup_chain(obj,result=[obj.singleton_class])ifobj.instance_of?Classreturnadd_modules(result)ifresult.last==B

  6. ruby-on-rails - rails 中的路径解析 - 2

    我正在寻找这样解析路由路径的方法:ActionController::Routing.new("post_path").parse#=>{:controller=>"posts",:action=>"index"}应该和url_for相反更新我发现:Whatistheoppositeofurl_forinRails?Afunctionthattakesapathandgeneratestheinterpretedroute?ActionController::Routing::Routes.recognize_path("/posts")所以现在我需要将posts_path转换为“/p

  7. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

  8. 网站日志分析软件--让网站日志分析工作变得更简单 - 2

    网站的日志分析,是seo优化不可忽视的一门功课,但网站越大,每天产生的日志就越大,大站一天都可以产生几个G的网站日志,如果光靠肉眼去分析,那可能看到猴年马月都看不完,因此借助网站日志分析工具去分析网站日志,那将会使网站日志分析工作变得更简单。下面推荐两款网站日志分析软件。第一款:逆火网站日志分析器逆火网站日志分析器是一款功能全面的网站服务器日志分析软件。通过分析网站的日志文件,不仅能够精准的知道网站的访问量、网站的访问来源,网站的广告点击,访客的地区统计,搜索引擎关键字查询等,还能够一次性分析多个网站的日志文件,让你轻松管理网站。逆火网站日志分析器下载地址:https://pan.baidu.

  9. ABB-IRB-1200运动学分析MATLAB RVC工具分析+Simulink-Adams联合仿真 - 2

    一、机器人介绍        此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接

  10. 关于Qt程序打包后运行库依赖的常见问题分析及解决方法 - 2

    目录一.大致如下常见问题:(1)找不到程序所依赖的Qt库version`Qt_5'notfound(requiredby(2)CouldnotLoadtheQtplatformplugin"xcb"in""eventhoughitwasfound(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentationfault,或者Illegalinstruction(coredumped)非法指令(4)ldd应用程序或者库,查看运行所依赖的库时,直接报段错误二.问题逐个分析,得出解决方法:(1)找不到程序所依赖的Qt库version`Qt_5'

随机推荐