PostGIS拓扑:pgRouting最短路径分析

摘要:
由于我们没有创建topo所需要的所有字段,有部分是用现有字段替代的,因此,在调用最短路径分析函数时,需在sql中显示指定这些字段。

前提:在PostgreSQL中建立PostGIS数据库,安装pgRouting插件,导入现有的线表shp数据(示例使用的是管线pipesectionmain,其他的线表数据均可)。

1、pgRouting在edge表中添加字段

线表中必须有id,source,target,cost,the_geom 5个字段,其中现有空间数据表中的gid可作为id,shape_leng可作为cost,geom可作为the_geom。还需要额外增加source和target字段

新增souce和target字段并加上索引

alter table waterdataset.pipesectionmain add column source int;

alter table waterdataset.pipesectionmain add column target int;

create index road_source_idx onwaterdataset.pipesectionmain("source");

create index road_target_idx on waterdataset.pipesectionmain("target");

如现有空间表中没有长度字段,可通过以下语句初始化

ALTER TABLE waterdataset.pipesectionmain  ADD COLUMN length double precision; 
update waterdataset.pipesectionmain set length =st_length(geom);

2、建立拓扑

SELECT pgr_createTopology('waterdataset.pipesectionmain',0.001, 'geom', 'gid'); 

执行后会在相应的架构下创建pipesectionmain_vertices_pgr表

注:边表pipesectionmain生成的节点表,路径分析时的起止点编号均来源于此表;

对现有topo进行几何分析,检查现有几何错误(非必要步骤)

SELECT pgr_analyzegraph('waterdataset.pipesectionmain', 0.001,'geom', 'gid');

修正topo并输出修正过的边数据到新表(非必要步骤)

SELECT pgr_nodeNetwork('waterdataset.pipesectionmain', 0.001,'gid','geom');

3、调用pgr_dijkstra进行最短路径分析

pgr_dijkstra函数使用有以下几种方式

//起止点均为单点(一对一)
pgr_dijkstra(edges_sql, start_vid, end_vid)

pgr_dijkstra(edges_sql, start_vid, end_vid, directed:=true)

//起点为单点,终点为多点(一对多)
pgr_dijkstra(edges_sql, start_vid, end_vids, directed:=true)

//起点为多点,终点为单点(多对一)
pgr_dijkstra(edges_sql, start_vids, end_vid, directed:=true)

//起点终点均为多点(多对多)
pgr_dijkstra(edges_sql, start_vids, end_vids, directed:=true)

参数解析

参数

类型

默认

描述

edges_sql

TEXT

边表查询语句,查询结果需包含id,source,target,cost

start_vid

BIGINT

起点id

start_vids

ARRAY[BIGINT]

起点id数组

end_vid

BIGINT

终点id

end_vids

ARRAY[BIGINT]

终点id数组

directed

BOOLEAN

true

  • 默认是 true,设置为有向图
  • false ,设置为无向图

我们下面示例为一对一方式:

从建立拓扑生成的节点表pipesectionmain_vertices_pgr中选择起点4093,终点2350(可在QGIS中加载线表pipesectionmain和点表pipesectionmain_vertices_pgr,方便查看与选择)。

由于我们没有创建topo所需要的所有字段,有部分是用现有字段替代的,因此,在调用最短路径分析函数时,需在sql中显示指定这些字段。

select pgr_dijkstra('SELECT gid AS id,                     

source::integer,                        

target::integer,                       

shape_leng::double precision AS cost 

FROM  waterdataset.pipesectionmain', 4093, 2350,false)

4、查询结果

select * from pgr_dijkstra('SELECT gid AS id,                     

source::integer,                        

target::integer,                       

length::double precision AS cost 

FROM  waterdataset.pipesectionmain', 4093, 2350,false);

1)可查看返回结果

PostGIS拓扑:pgRouting最短路径分析第1张

结果解析

类型

描述

seq

INT

从1开始的序号

path_seq

INT

路径上的相对位置,从1开始的序号

node

BIGINT

节点id

edge

BIGINT

边id(上述节点关联的下一条边).-1表示最后一个边不存在.

cost

FLOAT

当前路径花费

agg_cost

FLOAT

到目前为止路径花费累加

2)查看图形结果

PostGIS拓扑:pgRouting最短路径分析第2张

3)在QGIS中用pgroutinglayer插件查看结果

PostGIS拓扑:pgRouting最短路径分析第3张

免责声明:文章转载自《PostGIS拓扑:pgRouting最短路径分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Zabbix故障处理系列Map的深浅拷贝的探究下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Centos7进不了图形化界面(亲测有效)

进入root用户 systemctl get-default //获取当前的默认target systemctl set-default graphical.target multi-user.target:设置当前的target,可选值有graphical.target,multi-user.target进入图形化界面multi_user.target:...

iOS开发日记16-通知栏扩展 (App Extension)

今天博主有一个App Extension的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步. 总览 扩展 (Extension) 是 iOS 8 和 OSX 10.10 加入的一个非常大的功能点,开发者可以通过系统提供给我们的扩展接入点 (Extension point) 来为系统特定的服务提供某些附加的功能。对于 iOS 来说,可以使用的扩展接入...

Python并发编程 —— 在Python程序中的进程操作

运行中的程序就是一个进程。所有的进程都是通过它的父进程来创建的。因此,运行起来的python程序也是一个进程,那么我们也可以在程序中再创建进程。多个进程可以实现并发效果,也就是说,当我们的程序中存在多个进程的时候,在某些时候,就会让程序的执行速度变快。我们可以借助python中强大的模块。来实现创建进程这个功能。 1、multiprocessing模块 把...

Gyp语法规则参考 & 工具的使用

by Markdown, 8/14/2014 10:17:28 AM 翻译自 https://code.google.com/p/gyp/wiki/GypLanguageSpecification 目的和背景 Google使用过很多处理平台无关的项目构建系统,比如Scons,CMake。在实际使用中这些并不能满足需求。开发复杂的应用程序时,在Mac上Xco...

python 最短路径

贾格尔(Jagger)找到一张地图,该地图指示大量宝藏的位置,并希望找到它们。 该地图将几个位置标记为节点和几个边缘,这表示两个位置直接相连。 总共有n个节点和m个边。 贾格尔(Jagger)位于节点1,宝物位于节点n。 当他运行最短路径算法以找出通往宝藏的最短路径时,他突然发现除了他的起始节点和宝藏的位置以外,每个节点都有一个怪物。 节点u上的怪物具有力...

K最短路问题(单源点最短路径+A*算法)

[cpp]view plaincopyprint? /* *算法引入: *在单源点最短路径问题中,实际运用时还需知道最短路径外,次短路或者第三短路; *即要知道多条最短路,并排出其长度增加的顺序,即为K最短路问题; * *算法思想: *单源点最短路径+高级搜索A*; *A*算法结合了启发式方法和形式化方法; *启发式方法通过充分利用图给出的信息来动...