一 路徑分析—QGIS+PostgreSQL+PostGIS+pgRouting

前言因業務需求,需要做最短路徑分析 。最近幾天查詢資料 , 并自己動手,實現了簡單的路徑分析 。
下面就介紹具體的實現過程 。
本篇文章最終結果是在 PostgreSQL 數據庫中實現的 , 后續的可視化展示會繼續跟進 。
一、道路數據處理如果你已經有了道路數據 , 那就直接使用 。
由于當前并沒有較好的道路數據 , 這里我自己用 QGIS 造了些數據以供使用 。
為了效果較好 , 在創建道路數據時是疊加了影像圖的 。并且要開啟“捕捉工具”,這樣在后續的拓撲分析中更好 。

一 路徑分析—QGIS+PostgreSQL+PostGIS+pgRouting

文章插圖
在完成道路數據的創建后,我直接進行了后續的工作,但是最終發現有問題,經過分析發現:道路的數據在每個相交的點處要進行打斷,否則無法進行路徑分析 。
線打斷用的工具是—“線相交”,輸入、相交圖層選當前道路圖層:
一 路徑分析—QGIS+PostgreSQL+PostGIS+pgRouting

文章插圖
如下圖:
這三段本是一條道路,但是為了拓撲分析,需要進行在和別的道路相交點進行打斷 。
一 路徑分析—QGIS+PostgreSQL+PostGIS+pgRouting

文章插圖
此處部分要注意:
1、編輯時開啟“捕捉工具”
2、完成道路后進行線的打斷
二、數據入庫數據庫這一塊,因為 PostgreSQL  有強大的空間數據處理擴展插件(PostGIS),并且也有路徑分析的插件(pgRouting),所以選用該數據庫 。
PostgreSQL 數據安裝:
1、windows 下,直接在官網下載安裝包即可,安裝完成數據庫后,會有 stackbuilder 安裝向導,可以安裝對應的一些插件等,比較方便;
2、Ubuntu下(我用的服務器),在 18.04 及以上 , 可以使用 PostgreSQL Apt Repository ,這樣可以安裝需要的版本;
2.1、PostgreSQL Apt Repository 使用
3、安裝及配置參考
PostGIS:
這部分有兩塊,一個是 PostgreSQL 的擴展,一個是 PostGIS的GUI(需要單獨安裝,主要用于導入空間數據) 。
以上這些安裝完成后 , 可以進行數據導入了,
【一 路徑分析—QGIS+PostgreSQL+PostGIS+pgRouting】1、創新新的數據庫,創建完成后需要進行對數據庫添加空間擴展
-- 提供如下空間信息服務功能:空間對象、空間索引、空間操作函數和空間操作符CREATE EXTENSION postgis;-- 用于網絡分析的擴展模塊CREATE EXTENSION pgrouting;-- gis 拓撲CREATE EXTENSION postgis_topology;-- 提供了幾個函數來確定字符串之間的相似性和距離CREATE EXTENSION fuzzystrmatch;CREATE EXTENSION postgis_tiger_geocoder;CREATE EXTENSION address_standardizer;2、使用工具導入空間數據,最新版本在Windows下名字比較長,如下圖:
一 路徑分析—QGIS+PostgreSQL+PostGIS+pgRouting

文章插圖

一 路徑分析—QGIS+PostgreSQL+PostGIS+pgRouting

文章插圖
到這里就完成了空間數據的導入,在這個過程中會遇到一些問題,可以參考:PostgreSQL 與 PostGIS 安裝使用注意坑
三、構建拓撲這一塊主要是在數據庫中使用 SQL 完成,創建對應的 source、target、length、reverse_cost 字段并賦值 。
創建拓撲函數的使用
-- 添加起點idALTER TABLE public.roads ADD COLUMN source integer;-- 添加終點idALTER TABLE public.roads ADD COLUMN target integer;-- 添加道路權重值ALTER TABLE public.roads ADD COLUMN length double precision;-- 創建拓撲結構-- 為roads表創建拓撲布局,即為source和target字段賦值SELECT pgr_createTopology('roads',0.00001, 'geom','id');-- 創建索引-- 為source和target字段創建索引CREATE INDEX source_idx ON roads ("source");CREATE INDEX target_idx ON roads ("target");-- 為length賦值,這里在計算的時候用 ST_Transform 進行了轉換UPDATE roads SET length =st_length(ST_Transform(geom,3857));-- 為 roads 表添加 reverse_cost 字段并用length的值賦值ALTER TABLE roads ADD COLUMN reverse_cost double precision;UPDATE roads SET reverse_cost =length;四、路徑分析pgRouting 提供的最佳路徑算法比較多,具體可以參考:pgRouting 最短路徑算法查詢
這里用 Shortest Path Dijkstra(狄克斯特拉)算法進行計算 。
最新的 pgr_dijkstra 算法,支持多種方式,一對一、一對多、多對一、多對多等 。
用例:
pgr_dijkstra(Edges SQL, start vid, end vid , [directed])pgr_dijkstra(Edges SQL, start vid, end vids , [directed])pgr_dijkstra(Edges SQL, start vids, end vid , [directed])pgr_dijkstra(Edges SQL, start vids, end vids , [directed])pgr_dijkstra(Edges SQL, Combinations SQL , [directed])RETURNS SET OF (seq, path_seq, [start_vid], [end_vid], node, edge, cost, agg_cost)OR EMPTY SET

推薦閱讀