王雷,李浩
(哈爾濱市勘察測(cè)繪研究院,黑龍江 哈爾濱 150010)
地下管線是城市重要的基礎(chǔ)設(shè)施之一。隨著GIS技術(shù)的應(yīng)用與推廣,城市地下管線管理模式已經(jīng)由基于圖紙的人工管理方式轉(zhuǎn)變?yōu)榛贕IS 的數(shù)字化管理方式。全市域地下管線現(xiàn)狀普查、地下管線空間數(shù)據(jù)生產(chǎn)與入庫(kù)、基于GIS 的地下管線管理系統(tǒng)的建設(shè)等是實(shí)現(xiàn)地下管線數(shù)字化管理模式的一般工作流程。在地下管線空間數(shù)據(jù)生產(chǎn)與入庫(kù)這一流程中,面臨著管線數(shù)據(jù)種類(lèi)多、數(shù)據(jù)更新頻率高、空間拓?fù)潢P(guān)系復(fù)雜、需要輸出的成果數(shù)據(jù)格式多樣等問(wèn)題,采用通用的GIS 基礎(chǔ)平臺(tái)軟件難以滿足地下管線數(shù)據(jù)生產(chǎn)建庫(kù)的復(fù)雜需求。利用GIS 二次開(kāi)發(fā)組件庫(kù),開(kāi)發(fā)可定制的地下管線數(shù)據(jù)生產(chǎn)輔助工具軟件,能夠提高管線數(shù)據(jù)生產(chǎn)效率、落實(shí)地下管線數(shù)據(jù)生產(chǎn)中各種質(zhì)量標(biāo)準(zhǔn)和數(shù)據(jù)填寫(xiě)規(guī)范,特別是在數(shù)據(jù)質(zhì)檢方面,能夠根據(jù)數(shù)據(jù)生產(chǎn)要求,靈活嵌入質(zhì)檢規(guī)則,與采用通用GIS 基礎(chǔ)平臺(tái)軟件相比,具有明顯優(yōu)勢(shì)。
本文面向地下管線數(shù)據(jù)生產(chǎn)中的各種需求,采用.NET的反射技術(shù),構(gòu)建了一個(gè)插件式的地下管線數(shù)據(jù)生產(chǎn)輔助工具集。該工具在滿足數(shù)據(jù)生產(chǎn)實(shí)際需求的前提下,具有較強(qiáng)的可擴(kuò)展性和可定制性,在地下管線數(shù)據(jù)生產(chǎn)管理中起到了重要作用。
插件是一種遵循一定規(guī)范應(yīng)用程序接口的程序模塊,它可以獨(dú)立開(kāi)發(fā),在不修改宿主程序的情況下,動(dòng)態(tài)地插入到宿主程序中,能夠?qū)崿F(xiàn)宿主程序的功能擴(kuò)展。與組件技術(shù)相比,插件技術(shù)是一種粗粒度的軟件復(fù)用技術(shù),能夠降低系統(tǒng)的耦合度、增強(qiáng)系統(tǒng)的可擴(kuò)展性。目前,許多軟件都是采用了插件技術(shù),如微軟的Office 系列軟件,Visual Studio 開(kāi)發(fā)平臺(tái)等。在GIS 領(lǐng)域,如ArcGIS、SuperMap 等大部分主流GIS 平臺(tái)軟件也都采用了此技術(shù)。
一個(gè)典型的基于插件技術(shù)構(gòu)建的軟件系統(tǒng),主要由三部分組成:宿主程序、通信契約以及插件本身。宿主程序通常由一個(gè)可執(zhí)行文件來(lái)構(gòu)成,它是插件運(yùn)行的環(huán)境,負(fù)責(zé)插件的識(shí)別和加載以及插件間的協(xié)同工作等任務(wù)。另外,宿主程序也同時(shí)集成了軟件的通用功能和整個(gè)UI 框架。通信契約是宿主程序和插件事先規(guī)定好的一套規(guī)則和協(xié)議,一般描述了插件的基本屬性和行為,如插件的名稱(chēng)、描述、UI 圖標(biāo)、構(gòu)造方法、執(zhí)行方法等。插件必須按照這一契約來(lái)實(shí)現(xiàn)。而宿主程序必須具有識(shí)別通信契約的能力。在.NET 中,一般采用接口(interface)作為通信契約的實(shí)現(xiàn)方式。插件是按照通信契約編寫(xiě)的具有一定功能特征的應(yīng)用程序模塊。
在.NET 中,實(shí)現(xiàn)插件技術(shù)的方法主要有兩種:反射技術(shù)和管道流技術(shù),本文采用反射技術(shù)來(lái)實(shí)現(xiàn)插件式地下管線數(shù)據(jù)生產(chǎn)輔助工具集。
地下管線數(shù)據(jù)生產(chǎn)輔助工具集是為了順應(yīng)管線數(shù)據(jù)生產(chǎn)的需求而開(kāi)發(fā)的。由一個(gè)個(gè)松散的小工具聚集而成。各工具之間沒(méi)有內(nèi)在的邏輯關(guān)系和相互調(diào)用關(guān)系。隨著管線數(shù)據(jù)生產(chǎn)需求的不斷變化,工具的數(shù)量和具體功能實(shí)現(xiàn)會(huì)不斷擴(kuò)展。但是,工具的執(zhí)行都遵循一定的流程,即工具集啟動(dòng)時(shí),加載各種工具模塊,工具集運(yùn)行后,由用戶(hù)觸發(fā)相應(yīng)的事件啟動(dòng)具體的工具,工具在獲取必要的參數(shù)信息后,由用戶(hù)啟動(dòng)工具的執(zhí)行,工具執(zhí)行完畢后,控制權(quán)交由工具集。為了適應(yīng)工具集的這種松散耦合、需求不斷變更的特性,采用插件式應(yīng)用程序框架來(lái)滿足這種變化的需求。整個(gè)應(yīng)用程序框架由三部分構(gòu)成:宿主程序,通信契約、工具插件。架構(gòu)圖如圖1 所示。
圖1 應(yīng)用程序框架
采用插件技術(shù)構(gòu)建應(yīng)用程序框架,主要原理是在主程序運(yùn)行期間,利用.NET 的反射特性,解析工具插件的配置屬性和內(nèi)部信息,并動(dòng)態(tài)創(chuàng)建插件對(duì)象,加載到主程序中。該插件框架包括三個(gè)部分:
(1)宿主程序
宿主程序也即主應(yīng)用程序,負(fù)責(zé)加載和管理工具插件,并提供工具插件的公共功能,如地圖加載、地圖瀏覽等。宿主程序?yàn)橐粋€(gè)可執(zhí)行應(yīng)用程序,其主窗體為MainForm 類(lèi)(用戶(hù)界面如圖2 所示),實(shí)現(xiàn)了IWorkbench,IDataToolStripManager 兩個(gè)接口。其中IWorkbench 是公布給插件的宿主程序接口,插件可以利用此接口改變宿主程序的狀態(tài)信息。IDataToolStripManager 用來(lái)宿主程序管理信息窗口中的工具。另外,宿主程序中用來(lái)管理工具插件的是類(lèi)PipelineToolBox-Manager。該類(lèi)的主要職責(zé)是遍歷指定路徑下的程序集,識(shí)別程序集中的插件,將其加載到宿主程序中。
圖2 宿主程序界面
(2)通信契約
該部分定義了宿主程序如何識(shí)別插件以及插件如何與宿主進(jìn)行通信。采用定義接口的方式。將插件的行為和狀態(tài)抽象為插件接口IPipelineToolItem,只有實(shí)現(xiàn)了該接口才能被宿主程序識(shí)別為插件并加載到宿主程序中。同時(shí),將宿主程序的相關(guān)屬性以接口IWorkbench 公布給插件,供插件與宿主進(jìn)行通信。
IPipelineToolItem 接口定義如圖3 所示。
圖3 IPipelineToolItem 接口
該部分還定義了宿主程序與插件工具內(nèi)部使用的相關(guān)輔助接口。
(3)工具插件
工具插件是指實(shí)現(xiàn)了IPipelineToolItem 接口的相關(guān)功能模塊,該功能模塊能夠在宿主程序啟動(dòng)過(guò)程中被其識(shí)別并加載和調(diào)用,通過(guò)工具插件創(chuàng)建中傳入的宿主程序平臺(tái)接口IWorkbench,工具插件能夠與宿主進(jìn)行通信。
管線數(shù)據(jù)處理大部分屬于長(zhǎng)事物處理過(guò)程,為了能夠讓程序具有良好的用戶(hù)體驗(yàn),采用多線程技術(shù)進(jìn)行處理,主線程用于程序與用戶(hù)的交互,數(shù)據(jù)處理在另一個(gè)線程,為了規(guī)范開(kāi)發(fā),設(shè)計(jì)了IToolServieBase 接口,用以規(guī)范多線程數(shù)據(jù)處理與服務(wù),該接口定義了開(kāi)始處理數(shù)據(jù)、取消處理數(shù)據(jù)方法以及數(shù)據(jù)處理進(jìn)度事件、取消事件。每個(gè)數(shù)據(jù)處理服務(wù)類(lèi)(工具插件的成員類(lèi)ToolServie)都必須實(shí)現(xiàn)該接口。該接口定義如圖4所示。
圖4 IToolServieBase 接口
地下管線工具集是為輔助管線數(shù)據(jù)生產(chǎn)而開(kāi)發(fā)的一個(gè)工具集合,由屬性賦值、數(shù)據(jù)轉(zhuǎn)換和質(zhì)量檢查、竣工測(cè)量成果整理四大部分組成:
(1)屬性賦值工具集
包括距路中距離賦值、管井編號(hào)賦值、管線端點(diǎn)編號(hào)賦值、從DXF 上獲取附屬設(shè)施標(biāo)高值、管線埋深高程賦值、從斷面信息表上獲取管線標(biāo)高值。
(2)數(shù)據(jù)轉(zhuǎn)換工具集
包括管線數(shù)據(jù)輸出DXF、管井?dāng)?shù)據(jù)輸出DXF、生成斷面信息表和幾何形狀變換工具。
(3)質(zhì)量檢查工具集
包括管線連通性檢測(cè)、管線相交處管井檢測(cè)、管線碰撞檢測(cè)、點(diǎn)線空間捕捉關(guān)系檢測(cè)、管線流向檢測(cè)及附屬設(shè)施管井一致性檢測(cè)。
(4)竣工測(cè)量成果整理工具集
該工具集主要針對(duì)管線竣工測(cè)量成果規(guī)范,創(chuàng)建和輸出滿足成果規(guī)范的mdb 格式的管線表。
整個(gè)插件框架基于.NET 的反射技術(shù)實(shí)現(xiàn),開(kāi)發(fā)平臺(tái)為Visual Studio 2010,開(kāi)發(fā)語(yǔ)言為C#。管線CAD 數(shù)據(jù)和GIS 數(shù)據(jù)的交換格式為DXF 和Shapefile 兩種。其中,DXF 格式的讀寫(xiě)采用開(kāi)源組件netDxf.dll。GIS二次開(kāi)發(fā)組件為ArcGIS Engine 10.0。由于采用了插件式應(yīng)用程序框架,軟件開(kāi)發(fā)工作主要分為兩個(gè)部分:宿主程序開(kāi)發(fā)和工具插件開(kāi)發(fā)。當(dāng)需求變更或擴(kuò)展時(shí),只需要開(kāi)發(fā)相應(yīng)的擴(kuò)展插件即可。
利用插件技術(shù)實(shí)現(xiàn)的軟件系統(tǒng),系統(tǒng)耦合度低、擴(kuò)展性強(qiáng)、可維護(hù)性高,支持并行開(kāi)發(fā),能夠顯著提高開(kāi)發(fā)效率,在GIS 基礎(chǔ)平臺(tái)軟件和行業(yè)應(yīng)用軟件中有著廣泛應(yīng)用。本文利用.NET 反射技術(shù)實(shí)現(xiàn)了一個(gè)插件式地下管線管線數(shù)據(jù)生產(chǎn)輔助工具集,并在地下管線數(shù)據(jù)生產(chǎn)實(shí)踐中得到了應(yīng)用,為管線數(shù)據(jù)生產(chǎn)的快速化、自動(dòng)化以及面向業(yè)務(wù)規(guī)則的數(shù)據(jù)質(zhì)檢提供了可行的解決辦法。在今后的研究中,工具集在以下幾個(gè)方面應(yīng)當(dāng)進(jìn)行持續(xù)改進(jìn):①優(yōu)化插件式應(yīng)用程序框架,支持更多類(lèi)型插件的管理;②繼續(xù)開(kāi)發(fā)各類(lèi)輔助工具,豐富軟件功能,解決管線數(shù)據(jù)生產(chǎn)與管理過(guò)程中的各種問(wèn)題,提高數(shù)據(jù)生產(chǎn)效率和管理水平;③加強(qiáng)工具集中日志功能建設(shè),能夠全面跟蹤和監(jiān)測(cè)插件運(yùn)行狀態(tài)。
[1]許新海.地下管線數(shù)據(jù)處理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].城市勘測(cè),2013(2):62~66.
[2]陳繼山,戴悅.基于知識(shí)與規(guī)則的城市地下管線數(shù)據(jù)監(jiān)理[J].蘇州科技學(xué)院學(xué)報(bào)·自然科學(xué)版,2009,26(2):76~81.
[3]肖聲.基于插件技術(shù)的數(shù)據(jù)挖掘軟件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].北京:中國(guó)科學(xué)院研究生院,2012.
[4]巫細(xì)波,胡偉平.基于.NET 反射技術(shù)的插件式GIS 軟件設(shè)計(jì)原理與實(shí)現(xiàn)[J].地理與地理信息科學(xué),2009,25(6):41~45.
[5]鐘廣銳,林章養(yǎng)..NET 反射技術(shù)的插件式GIS 應(yīng)用框架設(shè)計(jì)[J].地理空間信息,2011,9(4):4~8.
[6]蔣波濤.插件式GIS 應(yīng)用框架的設(shè)計(jì)與實(shí)現(xiàn)——基于C#和ArcGIS Engine 9.2[M].北京:電子工業(yè)出版社,2008.