董萬虎
(1.浙江省測繪科學技術(shù)研究院,浙江 杭州 310030)
隨著我國科技與經(jīng)濟的不斷發(fā)展,城市人口和規(guī)模不斷擴大,人們?nèi)粘I詈蜕a(chǎn)所產(chǎn)生的廢水污水也日益增多,同時地下污水管網(wǎng)錯綜復雜,管理稍有不慎,就會給環(huán)境帶來巨大的破壞[1]。為了保護自然環(huán)境,對城市排水系統(tǒng)進行強化,對城市生活和工業(yè)廢水排放進行管理勢在必行[2]。各級政府在地下污水管網(wǎng)建設方面投入了巨大的資金,鋪設地下污水管網(wǎng),建設綜合地下管線系統(tǒng),在各主要節(jié)點安裝各類管線監(jiān)測設備,利用信息化手段實時準確的監(jiān)測城市“大靜脈”的各項指標狀態(tài)。
城市管線管理系統(tǒng)應用了包括GIS 地圖、物聯(lián)網(wǎng)、云計算、在線監(jiān)測、工業(yè)自動化控制、網(wǎng)絡通信及排水管網(wǎng)模擬在內(nèi)的復雜系統(tǒng)[3],目的是建立起了一個能夠長期、有效、動態(tài)管理排水管網(wǎng)大量空間數(shù)據(jù)和屬性數(shù)據(jù)的基礎平臺,并融合排水管網(wǎng)智慧化管理過程中所需的各種業(yè)務數(shù)據(jù)、監(jiān)測數(shù)據(jù)和分析數(shù)據(jù),為政府城市管理和規(guī)劃提供決策支持[4]。本文主要是針對排水管網(wǎng)綜合管理系統(tǒng)的溯源分析功能方面進行研究,通過設計后臺高性能并進行算法,實現(xiàn)快速分析出當前管點可能來源區(qū)域,有助于下管網(wǎng)管理人員能夠快速排查和定位異常指標位置,并進行異常處理,從而提高城市污水管網(wǎng)的管理效率和水平[5]。
針對溯源分析功能設計要求,主要從后臺分析算法和前端渲染算法輸出進行逐一闡述,已達到溯源分析和展示要求。本文主要整體技術(shù)思路如圖1 所示。
管網(wǎng)數(shù)據(jù)一般在關(guān)系數(shù)據(jù)庫中進行存儲和管理,考慮到管網(wǎng)數(shù)據(jù)變更周期較長,為了提高分析管網(wǎng)數(shù)據(jù)存取效率,將管網(wǎng)需要分析的管網(wǎng)數(shù)據(jù)緩存到Redis高速緩存中,方便后臺分析運算單元進行存取[6]。后臺分析運算單元采用.NetCore3.1 進行編寫,主要任務是響應Web 服務器的運算請求。服務根據(jù)管網(wǎng)點號,計算所有可能源頭的管網(wǎng)數(shù)據(jù),并進行合并優(yōu)化處理后返回給Web 服務器。本文采用IIS 7.0 作為Web 服務器,用于響應客戶端Web 請求,前端瀏覽器管網(wǎng)顯示采用Leaflet.js 組件進行渲染,已達到動態(tài)顯示效果。
圖1 整體技術(shù)思路圖
管網(wǎng)數(shù)據(jù)一般來源于日常的管線探測和測量成果數(shù)據(jù)。主要數(shù)據(jù)結(jié)構(gòu)應該兼容管線探測數(shù)據(jù)結(jié)構(gòu)標準[3],由于主要內(nèi)容是研究管線的溯源分析算法,故只選取部分涉及計算的字段,主要管線數(shù)據(jù)表結(jié)構(gòu)如表1 所示。
表1 管線數(shù)據(jù)結(jié)構(gòu)(WS-LINE)
根據(jù)上文的表結(jié)構(gòu)很明確地標記了各個管網(wǎng)的首尾連換編號,根據(jù)分析點的管點編號,并利用SQL Server 自帶的遞歸SQL 存儲算法可以便捷地查找出對應的所有相連點編號。關(guān)鍵存儲過程代碼如下:
以上代碼雖然簡單,但執(zhí)行效率普遍較低,當管線數(shù)據(jù)線段在3 000 條以下時,采用該算法進行溯源管點查詢比較方便。但當數(shù)據(jù)量大于10 000,或者查詢溯源結(jié)果集大于2 000 個節(jié)點以上時,只想效率較低。實際測試結(jié)果表明,當源節(jié)點在2 000 個節(jié)點以上時,查詢時間高達200 多秒,這個查詢延遲時間,是遠遠不能滿足我們?nèi)粘I(yè)務使用需求的,所以必須采用更加高效的算法進行查詢和計算。
分析以上利用SQL 存儲過程算法機制,不難發(fā)現(xiàn)性能瓶頸:其一是數(shù)據(jù)庫的頻繁打開和關(guān)閉連換損耗了部分的性能;其二是存儲過程的SQL 語句內(nèi)部的計算方法是一種遞歸算法,也是導致我們運算慢的主要原因。當管線數(shù)據(jù)量不斷增加時運算時間大幅度增加。為了避免以上兩個性能瓶頸,本文主要采用了“數(shù)據(jù)緩存+后臺運算”的方式進行解決,利用Redis高性能緩存(以下簡稱緩存)中間件用來存儲數(shù)據(jù)庫里的管線數(shù)據(jù),以減少數(shù)據(jù)庫頻繁打開和關(guān)閉的性能損耗,提高讀取效率。后臺運算思路是利用循環(huán)算法,對管點緩存數(shù)據(jù)進行遍歷查詢,主要算法設計步驟如下:
1)定義一個結(jié)果列表集合對象(Dictionary
2)首先根據(jù)管點編號在緩存列表中取出第一個管點的起點編號(SPoint),并將管點對象存儲到以“0”為關(guān)鍵字的隊列中,“0”隊列將作為主干管線進行存儲,其他1,…,n關(guān)鍵字作為分支隊列進行管理,同一隊列中的管點首尾相連且管徑大小一致。結(jié)果集存儲結(jié)構(gòu)如圖2 所示。
3)根據(jù)起點編號(SPoint)到緩存列表中查找對應的終點編號(EPoint)和SPoint 相等的所有管點集合(以下稱nextPoints)。
4)換下來循環(huán)處理nextPoints 內(nèi)的所有管點數(shù)據(jù)。首先刪除緩存中的nextPoints 管點數(shù)據(jù),主要是為了減少后一節(jié)點的運算壓力。其次,在結(jié)果集中查找每一個隊列最后一個節(jié)點是否與當前節(jié)點相連換。如果相連換且管徑一致,那么將該節(jié)點加入該隊列中;如果不一致那么將該管點作為新的管點隊列存入到結(jié)果集中。
5)分別取出結(jié)果集最后一個節(jié)點的編號,根據(jù)以上步驟循環(huán)啟動不同線程進行并行運算,直到找不到下一個節(jié)點為止。
在整個算法運算過程中,也充分利用.NetCore 并行計算Parallel 類的特性,最大限度的利用CPU 多核心并行計算優(yōu)勢,以最快的速度找出所有關(guān)聯(lián)的管點數(shù)據(jù),大大提高了運算效率。當后端完成所有管點的運算后,將計算結(jié)果以JSON 格式返回到前端進行渲染顯示。
圖2 運算結(jié)果集存儲結(jié)構(gòu)
前端采用Leaflet.js 作為地圖展示框架,并通過L.polyline.antPath 插件進行動態(tài)展示。同時,根據(jù)后臺運算結(jié)果按照管徑大小進行分批次不同樣式進行展示,主要渲染原則是:不同管徑以不同顏色和不同線條寬度進行渲染展示,管徑越大渲染線條越粗。
為了前端地圖渲染插件的展示要求,數(shù)據(jù)必須處理成標準的JSON 格式,具體JSON 格式要求如下:
最終前端JS 頁面渲染效果如圖3 所示。
圖3 前端JS 渲染圖
以管線地理空間數(shù)據(jù)為基礎,利用Redis 高速緩存和.NetCore 的并行運算功能,實現(xiàn)了高效的管線溯源分析算法,分析運算性能得到了顯著提升。根據(jù)實際管網(wǎng)數(shù)據(jù)(10 萬條記錄)進行對比測試,采用傳統(tǒng)算法統(tǒng)計分析了所有管點的溯源分析平均時間在115 s 左右,而采用本文的算法分析了所有管點溯源分析平均時間在0.9 s 左右,分析運算性能提升了100 多倍。在當前城市人口和規(guī)模不斷擴大,城市管網(wǎng)錯綜復雜,維護管理成本日益增加的背景下[7],本文的研究成果算法在綜合管線管理、污染源查詢和市政管網(wǎng)管理等方面具有一定的應用價值。