董萬虎
(1.浙江省測繪科學技術研究院,浙江 杭州 310030)
隨著我國科技與經濟的不斷發展,城市人口和規模不斷擴大,人們日常生活和生產所產生的廢水污水也日益增多,同時地下污水管網錯綜復雜,管理稍有不慎,就會給環境帶來巨大的破壞[1]。為了保護自然環境,對城市排水系統進行強化,對城市生活和工業廢水排放進行管理勢在必行[2]。各級政府在地下污水管網建設方面投入了巨大的資金,鋪設地下污水管網,建設綜合地下管線系統,在各主要節點安裝各類管線監測設備,利用信息化手段實時準確的監測城市“大靜脈”的各項指標狀態。
城市管線管理系統應用了包括GIS 地圖、物聯網、云計算、在線監測、工業自動化控制、網絡通信及排水管網模擬在內的復雜系統[3],目的是建立起了一個能夠長期、有效、動態管理排水管網大量空間數據和屬性數據的基礎平臺,并融合排水管網智慧化管理過程中所需的各種業務數據、監測數據和分析數據,為政府城市管理和規劃提供決策支持[4]。本文主要是針對排水管網綜合管理系統的溯源分析功能方面進行研究,通過設計后臺高性能并進行算法,實現快速分析出當前管點可能來源區域,有助于下管網管理人員能夠快速排查和定位異常指標位置,并進行異常處理,從而提高城市污水管網的管理效率和水平[5]。
針對溯源分析功能設計要求,主要從后臺分析算法和前端渲染算法輸出進行逐一闡述,已達到溯源分析和展示要求。本文主要整體技術思路如圖1 所示。
管網數據一般在關系數據庫中進行存儲和管理,考慮到管網數據變更周期較長,為了提高分析管網數據存取效率,將管網需要分析的管網數據緩存到Redis高速緩存中,方便后臺分析運算單元進行存取[6]。后臺分析運算單元采用.NetCore3.1 進行編寫,主要任務是響應Web 服務器的運算請求。服務根據管網點號,計算所有可能源頭的管網數據,并進行合并優化處理后返回給Web 服務器。本文采用IIS 7.0 作為Web 服務器,用于響應客戶端Web 請求,前端瀏覽器管網顯示采用Leaflet.js 組件進行渲染,已達到動態顯示效果。

圖1 整體技術思路圖
管網數據一般來源于日常的管線探測和測量成果數據。主要數據結構應該兼容管線探測數據結構標準[3],由于主要內容是研究管線的溯源分析算法,故只選取部分涉及計算的字段,主要管線數據表結構如表1 所示。

表1 管線數據結構(WS-LINE)
根據上文的表結構很明確地標記了各個管網的首尾連換編號,根據分析點的管點編號,并利用SQL Server 自帶的遞歸SQL 存儲算法可以便捷地查找出對應的所有相連點編號。關鍵存儲過程代碼如下:

以上代碼雖然簡單,但執行效率普遍較低,當管線數據線段在3 000 條以下時,采用該算法進行溯源管點查詢比較方便。但當數據量大于10 000,或者查詢溯源結果集大于2 000 個節點以上時,只想效率較低。實際測試結果表明,當源節點在2 000 個節點以上時,查詢時間高達200 多秒,這個查詢延遲時間,是遠遠不能滿足我們日常業務使用需求的,所以必須采用更加高效的算法進行查詢和計算。
分析以上利用SQL 存儲過程算法機制,不難發現性能瓶頸:其一是數據庫的頻繁打開和關閉連換損耗了部分的性能;其二是存儲過程的SQL 語句內部的計算方法是一種遞歸算法,也是導致我們運算慢的主要原因。當管線數據量不斷增加時運算時間大幅度增加。為了避免以上兩個性能瓶頸,本文主要采用了“數據緩存+后臺運算”的方式進行解決,利用Redis高性能緩存(以下簡稱緩存)中間件用來存儲數據庫里的管線數據,以減少數據庫頻繁打開和關閉的性能損耗,提高讀取效率。后臺運算思路是利用循環算法,對管點緩存數據進行遍歷查詢,主要算法設計步驟如下:
1)定義一個結果列表集合對象(Dictionary
2)首先根據管點編號在緩存列表中取出第一個管點的起點編號(SPoint),并將管點對象存儲到以“0”為關鍵字的隊列中,“0”隊列將作為主干管線進行存儲,其他1,…,n關鍵字作為分支隊列進行管理,同一隊列中的管點首尾相連且管徑大小一致。結果集存儲結構如圖2 所示。
3)根據起點編號(SPoint)到緩存列表中查找對應的終點編號(EPoint)和SPoint 相等的所有管點集合(以下稱nextPoints)。
4)換下來循環處理nextPoints 內的所有管點數據。首先刪除緩存中的nextPoints 管點數據,主要是為了減少后一節點的運算壓力。其次,在結果集中查找每一個隊列最后一個節點是否與當前節點相連換。如果相連換且管徑一致,那么將該節點加入該隊列中;如果不一致那么將該管點作為新的管點隊列存入到結果集中。
5)分別取出結果集最后一個節點的編號,根據以上步驟循環啟動不同線程進行并行運算,直到找不到下一個節點為止。
在整個算法運算過程中,也充分利用.NetCore 并行計算Parallel 類的特性,最大限度的利用CPU 多核心并行計算優勢,以最快的速度找出所有關聯的管點數據,大大提高了運算效率。當后端完成所有管點的運算后,將計算結果以JSON 格式返回到前端進行渲染顯示。

圖2 運算結果集存儲結構
前端采用Leaflet.js 作為地圖展示框架,并通過L.polyline.antPath 插件進行動態展示。同時,根據后臺運算結果按照管徑大小進行分批次不同樣式進行展示,主要渲染原則是:不同管徑以不同顏色和不同線條寬度進行渲染展示,管徑越大渲染線條越粗。
為了前端地圖渲染插件的展示要求,數據必須處理成標準的JSON 格式,具體JSON 格式要求如下:

最終前端JS 頁面渲染效果如圖3 所示。

圖3 前端JS 渲染圖
以管線地理空間數據為基礎,利用Redis 高速緩存和.NetCore 的并行運算功能,實現了高效的管線溯源分析算法,分析運算性能得到了顯著提升。根據實際管網數據(10 萬條記錄)進行對比測試,采用傳統算法統計分析了所有管點的溯源分析平均時間在115 s 左右,而采用本文的算法分析了所有管點溯源分析平均時間在0.9 s 左右,分析運算性能提升了100 多倍。在當前城市人口和規模不斷擴大,城市管網錯綜復雜,維護管理成本日益增加的背景下[7],本文的研究成果算法在綜合管線管理、污染源查詢和市政管網管理等方面具有一定的應用價值。