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