前提:在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 on waterdataset.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 |
|
我們下面示例為一對一方式:
從建立拓撲生成的節點表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)可查看返回結果
結果解析
列 |
類型 |
描述 |
seq |
INT |
從1開始的序號 |
path_seq |
INT |
路徑上的相對位置,從1開始的序號 |
node |
BIGINT |
節點id |
edge |
BIGINT |
邊id(上述節點關聯的下一條邊). -1表示最后一個邊不存在. |
cost |
FLOAT |
當前路徑花費 |
agg_cost |
FLOAT |
到目前為止路徑花費累加 |
2)查看圖形結果
3)在QGIS中用pgroutinglayer插件查看結果