PostGIS拓撲:pgRouting最短路徑分析


前提:在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

  • 默認是 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)可查看返回結果

結果解析

類型

描述

seq

INT

從1開始的序號

path_seq

INT

路徑上的相對位置,從1開始的序號

node

BIGINT

節點id

edge

BIGINT

邊id(上述節點關聯的下一條邊). -1表示最后一個邊不存在.

cost

FLOAT

當前路徑花費

agg_cost

FLOAT

到目前為止路徑花費累加

2)查看圖形結果

 

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

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM