网络分析之Pgrouting(转载)
网上关于Pgrouting的使用介绍太简单了,这里想详细的总结一下Pgrouting的使用,其实主要参照官方文档:http://workshop.pgrouting.org/
第一步:配置环境
关于PostgreSQL 、postgis以及pgrouting可以去官网下载,这里使用Pgrouting2.0
PostgreSQL与postgis安装可以参照网上教程
pgRouting的安装很简单,以Windows为例,下载包以后解压缩,将lib目录下文件复制到PostgreSQL的lib目录下,再在PostgreSQL数据库中执行share/extension目录下的sql脚本,这样就完成了整个环境的配置
第二步:导入数据
这里先介绍一个Pgrouting的函数:pgr_createTopology,这个函数就是将我们的路网(线型)数据形成拓扑导航网络的数据,为下一步的导航路径算法提供支持,详见
http://docs.pgrouting.org/2.0/en/src/common/doc/functions/create_topology.html#pgr-create-topology
这里source和target就是我们数据表中必须的两个字段
source: | text Source column name of the network table. Default value is source. |
target: | text Target column name of the network table. Default value is target. |
理解这个以后我们将导入我们的数据:
原始数据格式shap:
这里我是利用算法生成了室内路网TransitionOpenDoor(红线)
将TransitionOpenDoor导入Postgresql中表中数据:
length:作为成本cost
数据准备完毕后
第三步:执行算法
首先执行pgr_createTopology得到导航网络
SELECT pgr_createTopology('transitioncloseddoor',0.001,source:='source',id:='gid',target:='target',the_geom:='geom')
然后执行
SELECT seq, id1 AS node, id2 AS edge, cost FROM pgr_dijkstra('
SELECT gid AS id,
source::integer,
target::integer,
length::double precision AS cost
FROM transitioncloseddoordijsktrav1',
1, 9, false, false);
查询从1号点到9号点的最短路径
关于 pgr_dijkstra()使用可以参加官网说明
结果将是
其中node代表路径的节点、edge代表边、cost就是length字段的成本
从1号点到9号点的最短路径可视化结果:可见图中与查询结果一致,1-4-6-20-7-21-22-13-9
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
这几天研究了下postgis的拓展插件pgrouting(http://www.pgrouting.org/)。
首先到官网下载pgrouting(注意版本对应,当前支持最高版本的postgis为8.4):
然后把下载的pgrouting下doc lib share三个文件夹里的文件拷到postgresql安装文件夹的相应目录里面。然后打开postgresql 执行pgRouting-1.03_pg-8.4.2\Share\Contrib下的3个sql文件
安装完算法之后我们就可以开始做最优路径分析了:
首先对已有的道路表添加source target length 分别代表 道路的起点id 终点id 和权重值。
ALTERTABLE ch10.load_merge ADDCOLUMN source integer;
ALTERTABLE ch10.load_merge ADDCOLUMN target integer;
ALTERTABLE ch10.load_merge ADDCOLUMN length doubleprecision;
然后就可以执行assign_vertex_id()为表建立拓扑关系:
SELECT assign_vertex_id('load_merge',.001,'the_geom','gid');
在进行分析之前还要设置下权重值,一下sql语句是以道路长度为权重值:
UPDATE twin_cities SET length = ST_Length(the_geom);
最后就可以执行查询(需要注意的是:道路表的the_geom类型应为muitilinestring):
SELECT st_astext(the_geom) FROM dijkstra_sp('load_merge',752,82);
也可以插入一个表中 可以通过QGIS查看结果:
SELECT the_geom INTO dijkstra_result FROM dijkstra_sp('load_merge',4752,82);
在实际项目开发中使用pgrouting是相当方便的:
地图服务:geoserver
数据库:postgresql+postgis+pgrouting