田林鋼,魏暄云,王素云
(1.華北水利水電大學(xué) 水利學(xué)院, 河南 鄭州 450000;2.河南省豫北水利勘測設(shè)計院有限公司 駐鄭州辦事處, 河南 鄭州 450000)
近年來,極端天氣的產(chǎn)生愈加頻繁,大暴雨造成洪災(zāi)的事件也不斷出現(xiàn)。對人民生命安全、社會經(jīng)濟(jì)發(fā)展等方面造成了巨大影響。要想降低洪災(zāi)帶來的影響就需要研究洪水的過程機(jī)理,提前預(yù)測洪水。目前國內(nèi)外學(xué)者們在對洪水爆發(fā)過程模擬研究時都是使用MIKE,HEC-RAS等專業(yè)的模型計算軟件,但軟件的輸出結(jié)果往往是表格和數(shù)據(jù)的形式,難以直觀的表現(xiàn)出來[1-2]。因此,如何直觀的預(yù)報洪水,對洪災(zāi)淹沒范圍等模擬分析顯示,在防洪減災(zāi),減少洪災(zāi)對周邊地區(qū)造成的經(jīng)濟(jì)損失預(yù)估等方面具有重大意義。而三維動態(tài)可視化技術(shù)能直觀的觀察洪水淹沒的過程情況,可從多方面多角度觀察,詳細(xì)分析洪水不同時刻的情況,為防洪減災(zāi)工作提供參考。
隨著計算機(jī)軟硬件的不斷發(fā)展突破,地理科學(xué)與計算機(jī)科學(xué)、遙感科學(xué)等多學(xué)科交叉延伸形成的地理信息系統(tǒng)技術(shù)也不斷發(fā)展,其強(qiáng)大的采集、存儲、管理、分析和表達(dá)空間數(shù)據(jù)的能力為洪災(zāi)過程分析提供了有效直觀的輔助工具,成為了目前國內(nèi)外學(xué)者的研究熱點(diǎn)[3-4]。如張飛[5]運(yùn)用GIS技術(shù)可以建立一維與二維水利學(xué)洪水演進(jìn)模型,通過洪水影響分析繪制洪水風(fēng)險圖,可以有效評估洪水可能造成的風(fēng)險和危害。王森等[6]利用30 m分辨率DEM數(shù)據(jù)的HEC-GeoRAS模擬結(jié)果與實(shí)測地形資料計算的結(jié)果對比分析,在一定條件下誤差在可接受范圍內(nèi)。吳勇拓等[7]提出基于AE與IDL的洪水淹沒范圍估測與模擬系統(tǒng)設(shè)計,簡化了軟件操作過程,為集遙感影像數(shù)據(jù)處理和GIS應(yīng)用分析及制圖為一體的專業(yè)軟件系統(tǒng)提供了一種解決方案。使用GIS能有效解決數(shù)據(jù)不直觀的問題,但單純使用GIS軟件成本較高,許多功能用不到造成資源浪費(fèi)又缺少針對性強(qiáng)的功能。二次開發(fā)能解決資源浪費(fèi)的問題,還能開發(fā)更多功能滿足使用需要。目前使用二次開發(fā)設(shè)計的分析系統(tǒng)大多功能不完善,且多是使用國外的ArcGIS軟件,沒有自主產(chǎn)權(quán)且成本昂貴。國內(nèi)的Supermap、MapGIS等近年來也發(fā)展良好,Supermap更是立足于三維建設(shè),在這方面較之國外軟件也毫不遜色。本文以XX市河道為例,基于Supermap設(shè)計三維洪水動態(tài)可視化系統(tǒng),為洪災(zāi)淹沒模擬等提供參考。
Supermap是國內(nèi)北京超圖公司所研發(fā)的軟件,北京超圖軟件股份有限公司是亞洲領(lǐng)先的地理信息系統(tǒng)平臺軟件企業(yè),其產(chǎn)品更契合國人的使用習(xí)慣。現(xiàn)在許多學(xué)者使用GIS軟件時,大多都是基于國外的ArcGIS等軟件研究洪水災(zāi)害爆發(fā)過程,少有用到國內(nèi)的GIS平臺的案例。國內(nèi)的GIS經(jīng)過多年的發(fā)展,也有著很大的突破,相較于發(fā)展多年ArcGIS在二維方面有著明顯優(yōu)勢,Supermap更是立足于三維建設(shè),有機(jī)整合了強(qiáng)大的GIS功能和絢麗的三維可視化效果,突破了單純?nèi)S軟件的應(yīng)用瓶頸,提供了三維空間數(shù)據(jù)管理與查詢、三維符號體系、二三維空間分析等實(shí)用GIS功能。GIS軟件目前廣泛運(yùn)用于各個領(lǐng)域,每個領(lǐng)域使用需求和方式也都各不相同,往往需要針對性的進(jìn)行二次開發(fā)。相比于獨(dú)立開發(fā)難度太大,單純二次開發(fā)受GIS工具提供的編程語言的限制,開發(fā)結(jié)果往往達(dá)預(yù)期效果。結(jié)合GIS提供的組件式開發(fā)既能夠達(dá)到預(yù)期效果,又便捷易懂,成為當(dāng)前GIS應(yīng)用開發(fā)的主流[8]。超圖則推出了iObjects組件供用戶進(jìn)行二次開發(fā),其分為iObjects.Java和iObjects.Net的支持使用Java,C#,C++,VB等開發(fā)語言的,為用戶提供一個可伸縮的,全面的GIS平臺。
Visual Studio是由微軟公司推出的集成性開發(fā)工具。擁有功能完備的IDE(Integrated Drive Electronics,IDE)技術(shù)支持,可用于編碼、調(diào)試、測試和部署到任意平臺,軟件環(huán)境支持的廣泛性與功能都不弱于其它系統(tǒng)。開發(fā)效率高且通用性、兼容性強(qiáng);Visual Studio 2017相較于之前的版本有著明顯的優(yōu)勢,更加細(xì)致人性化的界面,能自主搭配的功能安裝界面,在語言編譯方面更側(cè)重于代碼的修復(fù)和重構(gòu),促進(jìn)編譯者的代碼正確性和可讀性。相較于目前最新的2019版本,在穩(wěn)定性方面又更有保障。本文使用的是C#語言,是專門為.NET[9]應(yīng)用而開發(fā)出的語言,根本上保證了C#與.NET框架的完美結(jié)合。C#避免了C++語言的冗余問題,又具有面對對象語言的一切特性,對比Java語言有更短的開發(fā)周期。由此選用了C#語言進(jìn)行開發(fā)設(shè)計。
經(jīng)過初步的研究洪水演進(jìn)可視化的步驟、使用需要和目前存在的一些問題后,搭建了洪水演進(jìn)三維動態(tài)可視化系統(tǒng)的總體框架,如圖1所示。
圖1 系統(tǒng)架構(gòu)圖
系統(tǒng)采用B/S架構(gòu),結(jié)合Supermap iObjects.Net組件和Visual Studio 2017的Forms可視化編程。整個系統(tǒng)主要分為數(shù)據(jù)中心、業(yè)務(wù)組件和用戶服務(wù)三大部分。
數(shù)據(jù)中心是系統(tǒng)的基礎(chǔ)支撐。數(shù)據(jù)中心又分為空間數(shù)據(jù)和屬性數(shù)據(jù)[10]??臻g數(shù)據(jù)包括影像資料,空間點(diǎn)、線、面數(shù)據(jù)等。屬性數(shù)據(jù)則是用于對空間數(shù)據(jù)進(jìn)行解釋說明的描述性數(shù)據(jù)。空間數(shù)據(jù)方面采用Supermap iObjects.Net提供的Workspace控件來訪問存儲在工作空間中的空間數(shù)據(jù);屬性數(shù)據(jù)方面則采用ADO.NET訪問存儲在數(shù)據(jù)庫中的屬性數(shù)據(jù),結(jié)合C#進(jìn)行讀取。
業(yè)務(wù)組件是系統(tǒng)的核心,是連接數(shù)據(jù)中心和用戶服務(wù)的中轉(zhuǎn)站,也是進(jìn)行程序命令編譯的部分。本系統(tǒng)設(shè)計時,主要編寫了四個模塊,數(shù)據(jù)處理模塊、信息查詢模塊、動態(tài)可視化模塊、分析輸出模塊。
(1) 數(shù)據(jù)處理模塊。現(xiàn)在很多專業(yè)計算軟件難以直觀高效的表達(dá)計算結(jié)果,國內(nèi)外學(xué)者借助GIS軟件對數(shù)據(jù)強(qiáng)大的采集處理能力來進(jìn)行充分的說明表達(dá)[11]。而往往計算軟件又由于輸出文件格式等限制,需要從多方面進(jìn)行格式轉(zhuǎn)化再導(dǎo)入GIS軟件中,再轉(zhuǎn)換的過程中往往容易造成數(shù)據(jù)丟失且轉(zhuǎn)換步驟繁瑣等問題。因此本系統(tǒng)設(shè)置了數(shù)據(jù)處理模塊,只需選擇初始數(shù)據(jù)類型,程序可自動轉(zhuǎn)換數(shù)據(jù)并進(jìn)行導(dǎo)入,一定程度上簡化工作步驟,提高了工作效率。
(2) 信息查詢模塊。系統(tǒng)在觀察時,不僅可以查看宏觀的洪水演進(jìn)情況整體判斷,也可以根據(jù)需要篩選某一類型數(shù)據(jù)以便更清晰的表達(dá),或者針對某一點(diǎn)的數(shù)據(jù)信息進(jìn)行查詢顯示。
(3) 動態(tài)可視化模塊。這一模塊是借助GIS對數(shù)據(jù)強(qiáng)大的處理分析能力實(shí)現(xiàn)可視化,把表格等數(shù)據(jù)表現(xiàn)為可全方位多角度觀察的三維數(shù)據(jù);人體視覺暫留原理[12],即光象一旦在視網(wǎng)膜上形成,視覺將會對這個光象的感覺維持一個有限的時間的現(xiàn)象。人眼的視覺暫留延續(xù)的時間一般為0.1 s~0.4 s,只要控制好按一定規(guī)律和順序排列變化圖像的時間間隔,看上去就會是平滑連續(xù)的視覺效果,也就實(shí)現(xiàn)了動態(tài)化。
(4) 分析輸出模塊。分析輸出模塊是對數(shù)據(jù)中心部分?jǐn)?shù)據(jù)經(jīng)過計算分析,用顏色或圖表等方式加以展示輸出,能更直觀的反應(yīng)數(shù)據(jù)之間的聯(lián)系。同時還支持?jǐn)?shù)據(jù)集[13]的導(dǎo)出。
用戶服務(wù)是用戶的操作界面,由Supermap iObjects.Net提供的SceneControl控件、和LayerControl控件以及菜單欄、按鈕等組成的界面,便于用戶使用。
2.2.1 動態(tài)可視化
動態(tài)可視化無疑是系統(tǒng)的核心。動態(tài)可視化的程序設(shè)計思路是使用Supermap對數(shù)據(jù)強(qiáng)大的處理能力,在數(shù)據(jù)轉(zhuǎn)換模塊中把空間數(shù)據(jù)轉(zhuǎn)換成圖層[14]集合,控制圖層集合中每個圖層的顯示切換時間,達(dá)到視覺暫留的時間要求,本次試驗(yàn)中默認(rèn)使用的是0.1 s。先定義一個LayerCount 變量,使用layersControl控件查詢當(dāng)前工作空間圖層集合的總數(shù),循環(huán)查詢圖層名稱并存放到NamesCount名稱數(shù)組中。隨后檢測程序是否做初始化判斷,初始化判斷由layernum 1和layernum 2中存放的參數(shù)決定。layernum 1存放的是當(dāng)前圖層序號,默認(rèn)為1,layernum 2存放是最后播放圖層序號,默認(rèn)為圖層集合總數(shù)。在動態(tài)播放前與動態(tài)播放后都要進(jìn)行初始化,即判斷其中參數(shù)是否為默認(rèn)值,便可判斷是否進(jìn)行初始化。初始化后對Scene三維場景頁面進(jìn)行刷新并暫停0.1 s。在點(diǎn)擊播放按鈕后,讀取要播放的圖層序號,根據(jù)初末圖層序號設(shè)置好進(jìn)度條,再通過循環(huán)語句播放選定的圖層。每個圖層播放時需要進(jìn)行刷新,圖層播放的時間間隔由延時程序delay()控制,圖2是動態(tài)化播放流程圖。
圖2 動態(tài)化播放流程圖
動態(tài)可視化部分代碼如下:
Int LayersCount=layersControl1.Scene.Layers.Count;//圖層集合數(shù)
string[] NamesCount=new string[LayersCount];//名稱數(shù)組
for (int i=0;i {NamesCount[s]=layersControl1.Scene.Layers[s].Caption;}//進(jìn)行初始化 for(int i=(int)layernum1.Value-1;i<(int)layernum2.Value;i++){ sceneControl1.Scene.Layers[NamesCount[i]].IsVisible=false;} sceneControl1.Scene.Refresh();//刷新 delay(Time);//暫停時間,0.1 s //播放進(jìn)度條設(shè)置 int TrackValue=(int)layernum2.Value-(int)layernum1.Value +2;//進(jìn)度條長度 trackBar1.Maximum=TrackValue; //動態(tài)播放從layernum1到layernum2的圖層 for(int i=(int)layernum2.Value-1;i>=(int)layernum1.Value-1;i--){ sceneControl1.Scene.Layers[layernames[i]].IsVisible=true; sceneControl1.Scene.Refresh();//刷新界面 delay(Time);//Time時間間隔,默認(rèn)為視覺暫留時間,本次試驗(yàn)使用的是0.1 s} 2.2.2 延時程序 延時程序也是一個關(guān)鍵,用于控制圖層播放的時間間隔,默認(rèn)情況下是以視覺暫留時間0.1 s的間隔進(jìn)行播放,但可通過設(shè)置Time這個參數(shù)選擇或自定義需要的時間間隔,實(shí)現(xiàn)快進(jìn)、慢放等功能。此外,在初始化完畢刷新時使用延時程序有助于程序的穩(wěn)定,否則可能會出現(xiàn)界面播放速度難以與程序運(yùn)行速度匹配的問題。下面是延時程序的代碼: public void delay(doublex){ vart=DateTime.Now.AddMilliseconds(x); //x為時間間隔,t為x毫秒后的時間 while (DateTime.Now Application.DoEvents();}//緩解界面刷新,防止界面假死} 2.2.3 防閃屏程序 在使用過程中,由于圖層信息刷新速度十分快速,而數(shù)據(jù)又比較龐大,刷新切換過程中往往對出現(xiàn)窗體閃爍的現(xiàn)象,對此查閱資料后重寫了CreateParams函數(shù),將窗體的所有子窗體使用雙緩沖[15],結(jié)果證明能有效防止閃屏事件的發(fā)生。 protected override CreateParams CreateParams{ get{CreateParams cp=base.CreateParams; cp.ExStyle |=0x02000000; return cp;}} 2.2.4 其他程序 此外還有如漫游、放大、縮小、自由縮放、全幅顯示等基本操作程序,這些程序同樣是三維可視化的一個關(guān)鍵,這些功能實(shí)現(xiàn)了多方位多角度的觀察XX市河道的情況。 本文以XX市某河道為例,對程序進(jìn)行測試,看能否實(shí)現(xiàn)最初設(shè)計的功能,達(dá)到預(yù)期效果。主界面主要由工作空間資源管理器,圖層管理以及場景組成,根據(jù)使用需要對Supermap的工具欄和菜單欄有針對性的進(jìn)行了簡化,把常用功能大致歸納為文件、工具、視圖、動態(tài)播放、幫助五個選項卡,如圖3所示。文件有打開關(guān)閉新建另存為等選項。工具中有放大、縮小、調(diào)整播放速度、查詢點(diǎn)面信息等實(shí)用工具。視圖中可控制三維場景、圖層欄、工作空間資源管理器、消息輸出等顯示隱藏。動態(tài)播放下有播放、暫停、繼續(xù)、停止等功能。幫助中有幫助和關(guān)于兩個選項,幫助對主要功能提供說明便于使用查閱。 圖3 系統(tǒng)主界面 以下是對實(shí)現(xiàn)的幾個主要功能的介紹。 (1) 數(shù)據(jù)轉(zhuǎn)換。數(shù)據(jù)轉(zhuǎn)換功能可以快速添加傾斜模型[16]和MIKE計算結(jié)果等數(shù)據(jù)到項目中,避免了Supermap中數(shù)據(jù)轉(zhuǎn)化步驟繁瑣的問題。從圖4所示的數(shù)據(jù)導(dǎo)入窗口界面可知,添加數(shù)據(jù)時只需要選擇文件或文件夾路徑和轉(zhuǎn)換后的數(shù)據(jù)類型即可。對傾斜模型的快速導(dǎo)入還需輸入模型參考點(diǎn)(模型中心點(diǎn)坐標(biāo))用以將模型放在正確的位置上。 圖4 數(shù)據(jù)導(dǎo)入窗口 (2) 動態(tài)播放及實(shí)時監(jiān)測。從圖5對水面渲染模擬水面流動和深色化的對比下可發(fā)現(xiàn),在傾斜影像背景影響下,進(jìn)行渲染難以觀察洪水淹沒的具體情況,選用單一深色更便于觀察。點(diǎn)擊動態(tài)播放,將彈出動態(tài)播放管理器,該窗口可控制圖層的播放、暫停等并同步顯示播放的當(dāng)前圖層序號、圖層總數(shù),還可對洪水演進(jìn)時間以及淹沒情況可實(shí)時監(jiān)測。如圖6所示。 圖5 難以清晰觀察洪水與可清晰觀察洪水(右下)對比 圖6 動態(tài)播放窗口 (3) 點(diǎn)數(shù)據(jù)查詢。工具選項卡和動態(tài)播放管理器中均設(shè)有點(diǎn)數(shù)據(jù)查詢,在任意位置點(diǎn)擊鼠標(biāo)左鍵,則以該點(diǎn)為圓心,出現(xiàn)一個黑色圓圈,同時彈出點(diǎn)查詢窗口,窗口則顯示為圓心點(diǎn)的信息。圖7是使用點(diǎn)數(shù)據(jù)查詢功能點(diǎn)后顯示的數(shù)據(jù)信息。 圖7 點(diǎn)數(shù)據(jù)查詢 此外還有放大縮小,各視圖窗口的顯隱性設(shè)置,讀取數(shù)據(jù)庫中沿河建筑物信息并顯示等功能。 本文通過Supermap iObjects組件和Visual Studio 2017并結(jié)合實(shí)際案例針對目前GIS軟件難以滿足本地需求的問題,開發(fā)設(shè)計了洪水演進(jìn)動態(tài)可視化系統(tǒng),實(shí)驗(yàn)結(jié)果表明能實(shí)現(xiàn)動態(tài)可視化,實(shí)時監(jiān)測查詢點(diǎn)面信息等預(yù)期功能;簡化了界面和轉(zhuǎn)換數(shù)據(jù)的步驟,能達(dá)到提高使用者工作效率的問題;支持從數(shù)據(jù)源導(dǎo)出數(shù)據(jù),且可批量導(dǎo)出。但是在開發(fā)中還存在很多問題,數(shù)據(jù)處理方面,目前對一些誤點(diǎn)還需要手動修改,沒有實(shí)現(xiàn)自動檢測刪除;程序設(shè)計方面,程序的性能和響應(yīng)速度方面沒有達(dá)到最優(yōu),部分語句如Application.DoEvents()等可利用多線程的方法提高相應(yīng)速度,也避免多次使用該語句導(dǎo)致程序崩潰;導(dǎo)出數(shù)據(jù)目前只支持導(dǎo)出為shp格式,需要對此進(jìn)行拓展補(bǔ)充;本系統(tǒng)目前只能在電腦端本地運(yùn)行,不能在網(wǎng)頁或移動端上使用,使用不夠便捷,這一點(diǎn)也是后期需要改善的。3 試驗(yàn)結(jié)果與功能介紹
4 結(jié)論與展望