GIS在管網資料中的很重要的一個應用方向就是”管網空間分析“,其中包括連通性分析、上下游分析、爆管分析等等。下面是我使用postgis
來實現該“管網連通性分析”的解決方案,分享給大家,以便相互學習。
使用該分析之前確保已新增擴充套件postgis
、pgrouting
CREATE EXTENSION postgis;
CREATE EXTENSION pgrouting;
匯入資料
將資料匯入到postgreSQL
資料庫,我是從ArcGIS
直接匯入的,匯入方式參考https://blog.csdn.net/eternity_xyf/article/details/80168029
建立拓撲
這裡我用的管網資料表名為pipe
建立拓撲,生成pipe_vertices_pgr
,該操作類似於ArcGIS
中建立路網資料。
為pipe
新增管段起始編號pgr_source
、結束編號pgr_target
、管段長度pgr_length
三個欄位,其中管段長度是用於分析的權重值。
--新增起點id
ALTER TABLE postgres.pipe ADD COLUMN IF NOT EXISTS pgr_source integer;
--新增終點id
ALTER TABLE postgres.pipe ADD COLUMN IF NOT EXISTS pgr_target integer;
--新增權重值
ALTER TABLE postgres.pipe ADD COLUMN IF NOT EXISTS pgr_length double precision;
為pgr_source
、pgr_target
建立索引
--為pgr_source欄位建立索引
CREATE INDEX IF NOT EXISTS pgr_source_idx ON postgres.pipe("pgr_source")
--為pgr_target欄位建立索引
CREATE INDEX IF NOT EXISTS pgr_target_idx ON postgres.pipe("pgr_target")
為權重欄位pgr_length
賦值
--為pgr_length賦值,shape為幾何型別的欄位,可能為shape、the_geom,通過ArcGIS匯入的時候欄位為"shape",其他方式匯入時一般為"the_geom"
update postgres.pipe set pgr_length = public.st_length(shape)
呼叫pgr_createTopology
方法,建立拓撲,這個步驟會為pgr_source
和pgr_target
欄位賦值,同時生成節點表pipe_vertices_pgr
--為目標表建立拓撲佈局,即為pgr_source和pgr_target欄位賦值
select public.pgr_createTopology('postgres.pipe',0.000001,'shape','objectid','pgr_source','pgr_target')
計算聯通性
根據起點座標、終點座標從pipe_vertices_pgr
查詢最近的起點、終點標識
呼叫pgr_kdijkstraPath
函式,查詢出起點、終點聯通的線。
通過這裡我們可以看出,該分析的核心是呼叫了pgrouting
擴充套件中的求最短路徑的函式pgr_kdijkstraPath
,該函式用的是是Dijkstra演算法,通過已新增的索引pgr_source
和pgr_target
以及權重值pgr_length
,計算出兩點之間的最短路徑,如果有最短路徑,證明兩點聯通。
該分析可用於計算給水管網、排水管網、輸油管道等管網資料的兩節點的連通性,當然也可用於路網的最短路徑分析。
函式指令碼
上面為整體分析思路,現在將上述思路整理成函式,方便使用
- 建立拓撲函式:analysis_updatetopology()
- 計算連通性函式:analysis_connect()
如何使用
-
呼叫
analysis_updatetopology()
函式,完成拓撲建立-- 傳入表名pipe,建立拓撲 select * from analysis_updatetopology('pipe')
-
從地圖選擇起點、終點,然後呼叫
analysis_connect()
函式,得到分析結果-- 傳入表名、起點座標、終點座標、容差值 select * from analysis_connect('pipe',103.90893393,30.789659886,103.911700936,30.787850094,0.00001)
原文地址:http://gisarmory.xyz/blog/index.html?blog=PostGISConnect
關注《GIS兵器庫》, 第一時間獲得更多高質量GIS文章。
本文章採用 知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議 進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名《GIS兵器庫》(包含連結: http://gisarmory.xyz/blog/),不得用於商業目的,基於本文修改後的作品務必以相同的許可釋出。