1.添加postgres扩展
CREATE EXTENSION PostGIS
CREATE EXTENSION pgRouting
2.导入线数据至pg数据库
将shp数据,通过PostGIS Bundle导入至数据库,shp数据尽量为LineString类型,避免MultiLineString类型(多部件无法进行网络分析),以线的表名称“linetest”为例。
若导入为MultiLineString类型,则可在数据库表中新建geometry类型字段(字段名为“the_geom”,空间参考srid为4490),将MultiLineString类型转换为LineString类型。
(1)LineString类型字段创建方法:
select addgeometrycolumn('linetest', 'the_geom', 4490, 'LINESTRING', 2, FALSE)
(2)MultiLineString类型转换为LineString类型:
update linetest
set the_geom = st_linemerge(geom)
3.创建网络拓扑
根据linetest表,创建网络拓扑,作为分析的基础。shp导入后,linetest表会自动包含gid字段,可作为线段的唯一标识。
(1)创建必要的字段:
source integer类型 ##起点id,空值即可
target integer类型 ##终点id,空值即可
cost double类型 ##线段长度,赋值
创建字段:
ALTER TABLE linetest ADD COLUMN "source" INTEGER default null;
ALTER TABLE linetest ADD COLUMN "target" INTEGER default null;
ALTER TABLE linetest ADD COLUMN "cost" DOUBLE PRECISION default null;
其中:
source、target字段可通过创建拓扑,自动添加线段节点的id。
计算线段长度:
UPDATE roads SET cost =st_length(ST_Transform(the_geom,4551));
其中:
4551为平面坐标系srid,可根据实际情况设置。
(2)创建拓扑
通过pgr_createtopology函数自动创建拓扑关系,其中:
linetest ##线段表名称
0.000001 ##计算容差
the_geom LineString类型 ##线段几何字段
gid integer类型 ##线段唯一id
source integer类型 ##起点id
target integer类型 ##终点id
select pgr_createtopology('linetest',0.000001,the_geom:='the_geom',id:='gid',source:='source',target:='target',rows_where:='true', clean:=false)
执行后,结果为ok,则成功。
(3)拓扑创建结果
执行成功后,自动创建节点表linetest_vertices_pgr,并为linetest表的source、target字段添加对应节点id。
节点表linetest_vertices_pgr:
线段表linetest字段赋值结果:
4.计算最短路径
通过pgr_dijkstra函数,计算最短路径。其中:
1、9为两个节点id,directed为是否考虑方向
select * from pgr_dijkstra('select gid as id,source,target,cost::double precision from linetest',1,9,directed:=true)
查询结果如下:
其中:
1、seq:查询结果排序值
2、path_seq:一个路径下的排序值,新的路径重新从1开始
3、node:路径中各节点的标识(上一个边的 end,下一个边的 start)
4、edge:路径中边的标识
5、cost:当前边的成本(长度)
6、agg_cost:总成本(总长度)