陳紅華,李滿春,李飛雪
(1.南京林業(yè)大學土木工程學院,江蘇南京 210037;2.南京大學地理與海洋科學學院,江蘇南京 210093)
插件式GIS應用框架的設計與實現(xiàn)
陳紅華1,李滿春2,李飛雪2
(1.南京林業(yè)大學土木工程學院,江蘇南京 210037;2.南京大學地理與海洋科學學院,江蘇南京 210093)
應用框架已經(jīng)成為軟件開發(fā)中一種非常實用的編程規(guī)范和設計架構(gòu)。采用了C#插件式應用開發(fā),并利用ArcGIS Engine提供的一套完備的嵌入式GIS組件庫和工具庫,完成了插件式GIS應用框架的核心即框架宿主程序及各功能插件的設計與實現(xiàn),以及插件式GIS應用框架平臺的設計與實現(xiàn);采用了動態(tài)插件加載配置的開發(fā)技術優(yōu)勢,通過可視化的構(gòu)件協(xié)同建模,快速構(gòu)建GIS應用,實現(xiàn)了GIS應用集成,開發(fā)的平臺適用于任何與GIS應用(ESRI平臺)有關的應用集成和作為GIS應用開發(fā)的基礎開發(fā)平臺。
插件式技術;ArcGISEngine;GIS應用框架
經(jīng)歷30多年的發(fā)展,GIS正在形成完整的技術系統(tǒng)并建立其理論體系,形成了多層次和不同尺度的應用格局。跟隨計算機等日趨成熟的主流技術,越來越多的軟件產(chǎn)品開始采用應用框架思想進行軟件結(jié)構(gòu)設計。應用框架已經(jīng)是一個被廣泛使用的術語,它成為軟件開發(fā)中一種非常實用且常用的編程規(guī)范和設計架構(gòu)。在商業(yè)的GIS應用項目開發(fā)中,GIS應用框架的使用也是非常普遍的,為了提高工作效率和產(chǎn)品的可靠性、降低項目開發(fā)成本,許多GIS二次開發(fā)商都會組織其核心程序員開發(fā)一個GIS應用框架,將一些通用的核心功能進行封裝,這些框架使用的技術和策略可能各不相同,但其目的都是一樣的:降低重復編碼的工作量,提高編程效率,給項目人員的開發(fā)工作提供一個良好的平臺和工作流程。擁有一個可擴展的GIS應用框架,意味著應用項目開發(fā)人員接到一個新項目任務后不必從頭開始搭建一個系統(tǒng),他們只需要按照一種工作模式對其GIS應用框架進行繼承和擴展開發(fā),并盡量利用以前開發(fā)的成果,就可以在短時間內(nèi)構(gòu)建出一個無論在UI層,還是在邏輯層都一致的功能組件平臺,而這些平臺的組件還具有天然的可重用性。
1.1 插件式開發(fā)技術概述
插件技術是在軟件的設計和開發(fā)過程中,將整個應用程序劃分為宿主程序和插件對象兩部分,宿主程序能夠調(diào)用插件對象,插件對象能夠在宿主程序上實現(xiàn)自己的邏輯,而兩者的交互基于一種公共的通信契約。宿主程序可以獨立于插件對象存在,即使沒有任何插件對象,宿主程序的運行也不受影響,因此,我們可以在避免改變宿主程序的情況下通過增減插件或修改插件的方式來增加或調(diào)整功能。
對于許多專業(yè)軟件而言,使用插件式框架機制開發(fā)應用軟件是一種必然的選擇。任何一款專業(yè)軟件,無論項目研發(fā)人員在開發(fā)之前做過多么詳細的用戶調(diào)查和需求分析,都不可能滿足使用該軟件的每個行業(yè)、每個用戶的全部需求。為了延長軟件產(chǎn)品的生命周期,在避免修改軟件程序主體的情況下,如果能通過一種具有良好擴展性的方式讓軟件根據(jù)用戶實際需求實現(xiàn)“生長”,無疑具有極大的誘惑力。以GIS行業(yè)為例,由于不同部門管理和使用的GIS數(shù)據(jù)類型千差萬別,業(yè)務流程也復雜多變,都必須根據(jù)實際情況開發(fā)自己專門的GIS軟件,這也是GIS二次開發(fā)大行其道的主要原因,如果每個新應用項目都必須讓開發(fā)人員從頭構(gòu)建,無疑是一種智力與經(jīng)驗的浪費,同時浪費的還有寶貴的開發(fā)時間,而使用插件式GIS應用框架完全解決這些問題[1]。
1.2 ArcEngine的插件式技術
ArcGIS Engine是ESRI在ArcGIS 9版本才開始推出的新產(chǎn)品,它是一套完備的嵌入式GIS組件庫和工具庫,使用ArcGISEngine開發(fā)的GIS應用程序可以脫離ArcGISDesktop而運行,它是一個用于開發(fā)新的GIS應用程序的二次開發(fā)功能組件包,它完全支持插件式技術[2]。
ArcGISEngine組件庫中的組件在邏輯上可以分成5個部分:BaseServices、DataAccess、Map Presentation、DeveloperComponents和Extensions。BaseServices包含了ArcGISEngine中最核心的ArcObjects組件。DataAccess包含了訪問包含矢量或柵格數(shù)據(jù)的GeoDatabase所有的接口和類組件。Map Presentation包含了GIS應用程序用于數(shù)據(jù)顯示、數(shù)據(jù)符號化等組件[3]。Developer Components包含了進行快速開發(fā)所需要的全部可視化控件,如SymbologyControl、GlobeControl、MapControl、SceneControl、TOCControl、ToolbarControl等。Extensions包含了許多高級功能,如空間分析、網(wǎng)絡分析和數(shù)據(jù)互操作等。
ArcGISEngine9.3與Visual Studio.NET 2005緊密結(jié)合,它提供了多個 IDE插件與 Visual Studio.NET 2005緊密結(jié)合,它使開發(fā)人員基于VisualStudio.NET 2005編寫ArcGISEngine程序變得更加容易。
2.1 插件式框架宿主程序的設計
本平臺是插件化的易于擴展的系統(tǒng)。系統(tǒng)之所以插件化,主要依靠一些核心對象保證系統(tǒng)與插件間正常通信,本系統(tǒng)設計的類關系如圖1所示。
圖1 系統(tǒng)設計的框架核心類關系圖
框架FrameworkClass、應用程序類ApplicationClass、菜單管理類BarManagerClass中包含了彼此的接口,即通過一個對象實例,可以方便地獲取或設置另一個對象實例。這三組核心的接口與類,構(gòu)成了平臺的核心。
2.2 框架插件的設計
插件式框架的另一重要組成部分是插件對象,插件也是應用框架的主角和功能擴展的執(zhí)行者,對用戶而言,這才是他們最關心的部分。插件式平臺包含的每一個功能--菜單欄、工具欄、右鍵菜單、命令行、快捷鍵,都是以插件的方式被平臺管理的。平臺本身是只是一個軀殼,而強大的GIS應用的真正提供者是插件。
2.2.1 插件的設計規(guī)范
在插件式應用框架中,宿主程序在編譯時并不知道它將要處理哪些插件對象,更沒有辦法靜態(tài)地將插件類型通過using關鍵字引入,這些都是只在運行時才能獲得的信息,在這種新情況下,我們無法使用靜態(tài)方法和new關鍵字來產(chǎn)生一個類型的對象,而是需要使用其他方法在運行時動態(tài)加載程序集并獲得程序集中的相關類型信息,這就要求我們的插件必須遵守統(tǒng)一的規(guī)范,即接口規(guī)范、代碼規(guī)范和配置規(guī)范。
接口規(guī)范:提供給插件的接口都在組件中Desktop. Framework中,所有插件都必須實現(xiàn)接口ICommand或ITool,通常情況下,插件都派生自ESRI提供的Base-Command和BaseTool,按鈕類型的插件必須實現(xiàn)接口IBarButtonItem,編輯框類型的插件必須實現(xiàn)接口IBarEditItem,靜態(tài)文本類型的插件必須實現(xiàn)接口IBarStaticItem,支持地圖右鍵菜單的插件必須實現(xiàn)接口 IToolContextMenu,支持TOC右鍵菜單的插件必須實現(xiàn)接口IControlContextMenu,支持快捷鍵的插件必須實現(xiàn)接口IShortCut。
代碼規(guī)范:將IHookHelper類型改為IHookHelperEx類型,將HookHelperClass類型改為HookHelperExClass類型,其屬性Hook事實上保存的是當前應用程序?qū)ο驣Application的引用;設置m_caption字段或覆寫Caption屬性,可以改變插件顯示在界面上的標題;設置 m_ toolTip字段或覆寫ToolTip屬性,可以改變插件在界面上的提示信息;覆寫Enabled屬性,根據(jù)當前hookHelper對象的狀態(tài)來設定功能的可用性,直接導致功能相對應的按鈕在界面上是否可用。
配置規(guī)范:在平臺中,插件是基于XML配置文件的。每個桌面主程序都有一個插件配置文件:MapUI.xm l--Map的插件配置文件;LayoutUI.xm l--Layout的插件配置文件;CatalogUI.xm l--Catalog的插件配置文件。這些配置文件都遵循相同的配置規(guī)范,如圖2所示。
圖2 插件配置文件的配置規(guī)范
在根節(jié)點“界面元素”的子節(jié)點中,有“菜單欄”節(jié)點和若干“工具欄”節(jié)點?!安藛螜凇惫?jié)點配置的是應用程序主菜單上的插件,幾個“工具欄”節(jié)點配置的是應用程序的各個工具欄上的插件?!安藛螜凇焙汀肮ぞ邫凇惫?jié)點下包含“工具”子節(jié)點,這些“工具”節(jié)點下又包含了其他“工具”子節(jié)點,這是一個遞歸的樹形結(jié)構(gòu)。
2.2.2 插件的動態(tài)加載和對象生成
在設計完成所有必要的插件接口和插件容器之后,我們利用.NET Framework中Assembly提供的信息實現(xiàn)插件的動態(tài)加載,即反射機制。在插件式應用框架啟動后,插件引擎將遍歷插件文件中的每個程序集,然后使用Assembly類加載每個程序集并分析程序集中包含的類型,只有識別了某個類型的確為合法的插件后,插件引擎才會根據(jù)類型信息產(chǎn)生一個實例對象并放置到插件容器中備用。
插件分為命令型插件和工具型插件。命令型插件:即開發(fā)的插件不存在與地圖控件交互,該插件必須實現(xiàn)ESRI.ArcGIS.SystemUI.ICommand接口,或者從BaseCommand類派生;工具型插件:即開發(fā)的插件存在與地圖控件交互,該插件必須實現(xiàn) ESRI.ArcGIS. SystemUI.ICommand接口和ESRI.ArcGIS.SystemUI. ITool接口,或者從BaseTool類派生。
本框架可以動態(tài)加載的插件包含 2種類型:一種是.net插件;另一種是com組件。因此可以使用多種開發(fā)工具開發(fā)插件,如C#、VB.NET、vb、vc等。開發(fā)的.net插件和com組件形式開發(fā)的命令類需要實現(xiàn)ICommand接口,而需要實現(xiàn)和地圖控件交互操作的工具則需要同時實現(xiàn)ICommand接口和ITool接口。
2.3 插件式應用框架平臺的功能實現(xiàn)
插件式應用框架平臺包括基礎框架、基礎工具和擴展工具3部分,主要功能有數(shù)據(jù)瀏覽、數(shù)據(jù)編輯、數(shù)據(jù)管理、版本管理、拓撲、查詢統(tǒng)計、空間分析、符號化符號編輯、專題圖、目錄樹、捕捉、構(gòu)造點工具、Element工具、地圖工具等。插件式應用框架平臺的主界面如圖3所示。
軟件框架是為復用而設計的,在以框架為基礎的軟件開發(fā)過程中,應用軟件的開發(fā)實際上是對軟件框架的擴展和實例化[4]。全插件 GIS應用框架的目標是通過全插件體系結(jié)構(gòu),以及標準化的GIS接口,實現(xiàn)不同平臺GIS系統(tǒng)的統(tǒng)一開發(fā)模式以及模塊級的復用,簡化開發(fā)過程,提高開發(fā)效率[5]。本文介紹的插件式應用框架平臺就是在選擇ArcGISEngine組件庫進行二次開發(fā)的基礎上,采用插件式GIS應用框架,與具體業(yè)務流程沒有相關聯(lián)的,只是一個純粹的GIS數(shù)據(jù)顯示與功能支撐框架,一個瀏覽和編輯地理數(shù)據(jù)的軟件平臺,它是通過.NET 2.0Framework和ArcGISEngine9.2組件庫構(gòu)建的一個插件式GIS應用框架。平臺采用可視化拖放構(gòu)件進行組裝、采用動態(tài)插件加載配置的方式來完成GIS應用集成,從而大大簡化了應用集成的復雜性,大幅降低了企業(yè)GIS應用集成的開發(fā)門檻,有效提高了GIS應用系統(tǒng)的易用性和可操作性。盡管這種新型開發(fā)平臺的出現(xiàn)在一定程度上推動了我國 GIS軟件產(chǎn)業(yè)和應用事業(yè)的發(fā)展,然而要促進GIS真正的發(fā)展還需要長時間的努力,把原來過于專業(yè)化的開發(fā)方式變?yōu)樽尭嗟拈_發(fā)人員掌握的開發(fā)工具,使其成為一個比較大眾化的應用領域。
[1] 蔣波濤.插件式GIS應用框架的設計與實現(xiàn)[M].北京:電子工業(yè)出版社,2008
[2] 韓鵬,王泉,王鵬,等.地理信息系統(tǒng)開發(fā)--ArcEngine方法[M].武漢:武漢大學出版社,2008
[3] 張俊,吳建平.插件技術在ArcGIS Engine開發(fā)中的應用[J].測繪與空間地理信息,2009(3):128-130
[4] 王宇,李增智,薛文革,等.一種多框架軟件集成策略模型[J].小型微型計算機系統(tǒng),2004(05):843-846
[5] 董涌江.全插件GIS應用框架的設計與實現(xiàn)[J].北京測繪,2009(1):18-21
Design and Realization of Plug-in GIS Application Framework
by CHEN Honghua
Application framework has been a kind of very practical programming specification and design framework on the development of software.Through comparing the advantages and disadvantages of existing three kinds of plug-in exploitation methods,this article used the plug-in application development based on C#,utilized Arc GIS Engine to provide a set of complete embedded GIS component library and tool library,and completed the design and realization of the core of plug-in GIS frame,various functions and platform.The paper implemented GIS integration by utilizing the development advantages of dynamic plug-in loading configuration and the visualization component coordination modeling to construct GIS application fast.The platform is suitable for any GIS application integration and basic development platform related to GIS application(ESRI).
plug-in,ArcGIS Engine,GIS application framework (Page:26)
P208
B
1672-4623(2011)02-0026-03
2010-08-24
項目來源:國家自然科學基金資助項目(40901184);江西省數(shù)字國土重點實驗室開放基金資助項目(DLLJ200905)。
陳紅華,博士,主要從事GIS原理與應用、數(shù)據(jù)共享研究等。