吳建華
(江西師范大學地理與環(huán)境學院,江西南昌330022)
基于ArcGIS Engine的GIS軟件開發(fā)方法
吳建華
(江西師范大學地理與環(huán)境學院,江西南昌330022)
介紹ArcGIS Engine體系結(jié)構(gòu)、類與接口的應用方法,以及ArcGIS Engine界面開發(fā)框架與功能定制方法,最后闡述利用ArcGIS Engine組件開發(fā)GIS軟件的基本過程與方法,并給出地圖瀏覽與查詢系統(tǒng)開發(fā)實例。希望對相關(guān)GIS系統(tǒng)的開發(fā)者具有較好的指導和借鑒作用。
GIS;ArcGIS Engine;組件技術(shù);軟件開發(fā)
由于GIS可以同時提供表征地理位置的圖形信息和空間對象的屬性信息,以及其獨有的空間分析功能,目前已被廣泛應用于測繪、遙感、國土、國防、資源、環(huán)境、交通、水利、電力、地質(zhì)、農(nóng)業(yè)、林業(yè)、城市規(guī)劃與管理、生活信息服務等領(lǐng)域。GIS已經(jīng)成為一項服務于信息化建設(shè)、生產(chǎn)、生活、科研的技術(shù)工具,如何快速、低成本地開發(fā)出滿足應用需求的GIS系統(tǒng)已經(jīng)引起GIS軟件開發(fā)商、公司、企業(yè)及科研院所的關(guān)注。目前許多專業(yè)的GIS軟件開發(fā)商都推出了自己的二次開發(fā)產(chǎn)品,如Esri公司先后推出了MapObject、ArcObjects和ArcGIS Engine;MapInfo公司推出了MapX;國內(nèi)的SuperMap、MapGIS及GeoStar也都具備二次開發(fā)的功能。在二次開發(fā)平臺選型中沒有最好的,只有最合適的,各類產(chǎn)品都有自己的優(yōu)勢與劣勢。但當前主流的二次開發(fā)產(chǎn)品還屬于全球GIS行業(yè)的領(lǐng)頭羊Esri公司的ArcGIS Engine產(chǎn)品,它具有簡潔、靈活、易用、可移植性強、開發(fā)成本低等優(yōu)點,受到了GIS人員的喜愛。但由于ArcGIS Engine開發(fā)方式多樣、類庫龐大、接口眾多等原因,使得開發(fā)者很難在短期內(nèi)掌握好,最終導致開發(fā)出的系統(tǒng)結(jié)構(gòu)不合理、性能差、界面不美觀等。為此,本文基于以往多個GIS項目的開發(fā)經(jīng)驗以及對ArcGIS Engine的深入研究,由淺入深地介紹了利用ArcGIS Engine開發(fā)GIS軟件的方法。希望給GIS同行們帶來有益的借鑒作用。
ArcGIS Engine是美國Esri公司發(fā)布的一款GIS二次開發(fā)產(chǎn)品,它是目前GIS業(yè)界最為著名的組件式GIS開發(fā)產(chǎn)品。它是對ArcGIS Desktop開發(fā)包ArcObjects組件集中的大部分接口、類、庫進行封裝后構(gòu)成的獨立的嵌入式組件,不依賴ArcGIS Desktop桌面平臺。它由兩部分組成:面向開發(fā)人員的開發(fā)工具包ArcGIS engine developer kit和面向最終用戶的運行時環(huán)境ArcGIS engine runtime[1]。ArcGIS Engine可以在不同開發(fā)語言環(huán)境(COM、.NET、Java、C++)下開發(fā),它提供了一系列可以在ArcGIS Desktop框架之外使用的GIS組件和可視化控件,它包含20多個類庫,比如Geometry、Display、Geodatabase、System、Carto等,用戶通過引用各個類庫中的接口并配合控件的使用,可以方便地實現(xiàn)GIS功能,這使得開發(fā)者能夠?qū)⒕械浇鉀Q應用程序中的業(yè)務邏輯中,而不是從頭開始開發(fā)GIS功能。開發(fā)人員可以將定制的GIS功能嵌入到已有的應用軟件中或創(chuàng)建自定義應用軟件[2]。
1.類庫體系結(jié)構(gòu)
ArcGIS Engine從功能層次上劃分為以下五個部分:①基礎(chǔ)服務:由GIS核心ArcObjects構(gòu)成,幾乎所有GIS應用程序都需要;②數(shù)據(jù)存取:對矢量和柵格數(shù)據(jù)進行存取;③ 地圖表達:實現(xiàn)地圖的標注、符號化及專題圖的渲染;④地圖分析:提供空間建模與分析功能;⑤ 開發(fā)者組件:用于開發(fā)應用程序的界面控件,如制圖控件、3D控件、工具條、TOC等。
針對不同方面的功能,ArcGIS Engine提供了相應的組件類庫,類庫體系結(jié)構(gòu)如圖1所示。
圖1 類庫體系結(jié)構(gòu)
圖1中,System類庫是ArcGIS最底層的組件庫,該類庫包含為構(gòu)成ArcGIS的其他類庫提供服務的組件;SystemUI庫包含用戶界面組件接口定義,這些用戶界面組件可以在ArcGIS Engine中進行擴展,比如ICommand和ITool;Geometry類庫包含了核心幾何對象,如點、線、多邊形等,并且定義和實現(xiàn)坐標系統(tǒng)的空間參考對象;Display類庫包含了支持向輸出設(shè)備繪制符號的組件;Server類庫包含允許用戶連接并操作ArcGIS Server的對象;Output類庫用于創(chuàng)建圖形輸出到諸如打印機和繪圖儀等設(shè)備,或以文件的方式導出,如導出為柵格圖像格式(JPG、BMP等)。Geodatabase類庫為地理數(shù)據(jù)庫提供了編程API,支持多種類型對象(如Feature、tables、networks、TINs)的數(shù)據(jù)訪問;GISClient類庫包含了操作ArcIMS或ArcGIS Server提供的遠程GIS服務的對象;DataSourcesOleDB類庫提供了操作基于OleDB的數(shù)據(jù)源的工作空間;DataSourcesFile類庫包含用于基于文件數(shù)據(jù)源的GeoDatabase API實現(xiàn)。這些基于文件的數(shù)據(jù)源包括 shapefile、coverage、TIN、CAD、SDC、StreetMap和VPF;DataSourcesGDB庫包含了存儲在關(guān)系數(shù)據(jù)庫管理系統(tǒng)中基于地理數(shù)據(jù)庫模型的矢量和柵格數(shù)據(jù)格式的工作空間工廠和工作空間;DataSourcesRaster庫包含了適用于基于文件的柵格數(shù)據(jù)格式的工作空間工廠和工作空間; GeoDatabaseDistributed庫包含了支持分布式地理數(shù)據(jù)庫的檢出/檢入操作所必需,的對象。Carto類庫包含了用于顯示數(shù)據(jù)的對象,如PageLayout和Map對象,以及map layers和renders可作用于所有支持的數(shù)據(jù)類型。Location類庫包含了與位置數(shù)據(jù)操作相關(guān)的對象,位置數(shù)據(jù)可以是路徑事件或地理編碼位置;NetworkAnalysis類庫支持效用網(wǎng)絡(luò)的創(chuàng)建和分析;GeoAnalyst類庫包含了核心空間分析的操作,這些操作可以通過空間分析和三維分析擴展模塊; 3DAnalyst類庫用于數(shù)據(jù)的三維分析并支持三維數(shù)據(jù)的顯示;GlobeCore類庫包含用于進行球體數(shù)據(jù)分析以及支持球體數(shù)據(jù)顯示的對象;SpatialAnalyst類庫包含了在柵格數(shù)據(jù)和矢量數(shù)據(jù)上執(zhí)行空間分析的對象。Controls類庫包含用于應用開發(fā)的各類控件,如MapControl和PageLayoutControl等,也可以通過創(chuàng)建自定義的操作控件的命令和工具來擴展Controls類庫;ArcReader Control類庫支持ArcReader對象模型,用于創(chuàng)建自定義的基于ArcReader的應用。
2.類與接口的使用
在總體了解ArcGIS Engine的類庫體系結(jié)構(gòu)后,需要進一步認識類庫中的類與接口并掌握它們的使用方法。類庫可以簡單理解為實現(xiàn)各種功能的類的集合,類的主要作用是定義與實現(xiàn)功能,解決怎么去做的問題,類有三種不同的類型(如圖2所示):①抽象類(AbstractClass):這種類不能被實例化,即不能用new關(guān)鍵字去產(chǎn)生對象,抽象類的成員一般都是部分實現(xiàn)或者根本不實現(xiàn);②組件類(CoClass):這種類可以通過new關(guān)鍵字直接實例化對象;③普通類(Class):不能直接使用new關(guān)鍵字創(chuàng)建對象,但它可以作為其他類的一個屬性或者從其他類的對象實例化來創(chuàng)建,比如:ArcGIS Engine中普通類Work-Space不能用new創(chuàng)建,但可以通過IDataset對象的Workspace屬性來創(chuàng)建,或通過IWorkspaceFactory對象的OpenFromFile方法實例化一個對象來創(chuàng)建。
圖2 對象模型圖
上述三種類之間的關(guān)系有四種(如圖2所示):①繼承(inheritance):圖中的空心三角箭頭表示繼承關(guān)系;② 組成(composition):圖中的菱形表示組成關(guān)系;③關(guān)聯(lián)(association):圖中的線表示關(guān)聯(lián)關(guān)系;④實例化(instantiation):圖中的虛線箭頭表示實例化關(guān)系。
接口定義了一個對象能做什么,它實現(xiàn)了一組功能的屬性、方法及事件。ArcGIS Engine中,一個接口由一個或多個類來實現(xiàn),而一個類可以實現(xiàn)一個或多個接口。接口的命名都以“I”字母開頭,容易識別,比如IMap。同屬于一個類的接口,通過查詢接口(QueryInterface)可以實現(xiàn)不同接口之間的切換[3],即實現(xiàn)一個接口對另一個接口定義的屬性和方法的調(diào)用,比如IMap與IActiveView同屬于Map類,IMap接口通過查詢接口就可獲得IActiveView接口中定義方法。在工程開發(fā)中,接口使用的基本過程如下:首先在工程中引用相應的類庫,然后在程序函數(shù)或過程定義接口變量并實例化,最后調(diào)用接口的屬性、方法或觸發(fā)接口中的事件,從而實現(xiàn)程序設(shè)計中定義的功能。
1.界面開發(fā)框架
在了解了類庫、類及接口之后,就可以著手搭建GIS軟件的主界面了。通常按照C/S結(jié)構(gòu)開發(fā)的GIS系統(tǒng)主界面應包括圖3所示的七個部分,其中,工具欄、地圖數(shù)據(jù)目錄顯示區(qū)、地圖顯示與操作區(qū)為主要部分,工具欄可由ToolbarControl控件實現(xiàn),地圖數(shù)據(jù)目錄顯示區(qū)可由TOCControl控件實現(xiàn),地圖顯示與操作區(qū)通常由MapControl、PageLayoutControl等地圖控件實現(xiàn)。在主窗體界面上添加各類控件后,還要實現(xiàn)ToolbarControl和TOCControl與地圖控件的綁定,通過設(shè)置 ToolbarControl和TOCControl的Buddy屬性即可。通過控件之間的綁定,確定了ToolbarControl中的命令與工具操作的對象是地圖控件中的地圖數(shù)據(jù),而地圖數(shù)據(jù)目錄顯示區(qū)的內(nèi)容也會隨著地圖控件中的數(shù)據(jù)變化而變化。鷹眼導航圖顯示區(qū)根據(jù)用戶需求決定取舍,它也是通過MapControl控件實現(xiàn)的,其主要作用是將地圖顯示與操作區(qū)的地圖快速導航到用戶感興趣的區(qū)域。
圖3 界面開發(fā)框架
2.GIS功能定制方法
在搭建好系統(tǒng)界面后,就需要進一步實現(xiàn)工具條按鈕或菜單按鈕的功能了。從是否與地圖交互的角度,將功能分為兩類:①命令功能:即鼠標不需要在地圖顯示與操作區(qū)操作(鼠標單擊、移動、釋放等),就可以實現(xiàn)對地圖的訪問與操作;② 工具功能:需要與地圖交互才能實現(xiàn)對地圖的訪問與操作。以上兩種功能可分別通過ICommad和ITool的實現(xiàn)來創(chuàng)建,而通過集成多個命令或工具就可以形成工具條或菜單。為此下面著重介紹ICommad和ITool接口的實現(xiàn)方法,以及工具條和菜單的定制方法。
(1)ICommand接口
首先創(chuàng)建一個ActiveX DLL的工程,然后創(chuàng)建一個類并引用SystemUI類庫,最后在該類中實現(xiàn)ICommand接口:先在類的代碼區(qū)前面書寫“Implements ICommand”語句,然后在代碼區(qū)具體實現(xiàn)ICommand接口的屬性與方法。ICommand提供了Bitmap、Caption、Category、Checked、Enabled、Help-ContextID、HelpFile、Message、Name、Tooltip十個屬性和OnClick、OnCreate兩個方法。
(2)ITool接口實現(xiàn)
與ICommand接口類似,首先也要創(chuàng)建一個ActiveX DLL的工程,然后創(chuàng)建一個類并引用SystemUI類庫,最后在該類中實現(xiàn)ITool接口:先在類的代碼區(qū)前面書寫“Implements ITool”語句,然后在代碼區(qū)具體實現(xiàn)ITool接口的屬性與方法。ICommand提供了Cursor屬性和 Deactivate、OnContextMenu、OnD-blClick、OnKeyDown、OnKeyUp、OnMouseDown、On-MouseMove、OnMouseUp、Refresh九個方法。值得注意的是,要實現(xiàn)工具功能,需要在同一個類中同時實現(xiàn)ICommand和ITool。
(3)IToolbarDef接口與IMenuDef接口
IToobarDef接口用于集成命令和工具功能形成工具條。實現(xiàn) IToobarDef接口也需要在一個 ActiveX DLL的工程的新類中實現(xiàn),它提供了Caption、ItemCount、Name三個屬性和GetItemInfo方法。其中ItemCount表示工具條按鈕的個數(shù),GetItemInfo用于設(shè)置指定索引位置上按鈕的CLSID(實現(xiàn)命令或工具功能的類名稱)。IMenuDef使用類似IToobarDef,結(jié)合使用IToolbarMenu、IToolbarItem等接口可以創(chuàng)建工具條菜單、彈出式菜單、子菜單。最后利用Toolbar-Control控件的 AddToolbarDef、AddItem等方法把上述接口實現(xiàn)的功能集成在ToolbarControl控件上。
1.系統(tǒng)開發(fā)基本過程與方法
通過對上述ArcGIS Engine開發(fā)方法的深入研究,并結(jié)合筆者以往GIS軟件開發(fā)的經(jīng)驗,現(xiàn)將VB 6.0+ArcGIS Engine開發(fā)GIS軟件的基本過程與方法歸納如下:
1)系統(tǒng)主界面設(shè)計。創(chuàng)建一個新的主工程,引用相關(guān)部件和類庫,根據(jù)需要在主窗體上添加地圖控件(MapControl或PageLayoutControl等)、框架控件(TocControl和ToolbarControl)及其他控件。通過屬性設(shè)置進行框架控件與地圖控件的綁定,當然也可以在程序中動態(tài)綁定。
2)產(chǎn)品的許可認證。所有的應用必須在運行時初始化一個產(chǎn)品許可,可以通過提供的License控件設(shè)置完成,也可以利用esriSystem::AoInitialize初始化產(chǎn)品許可。
3)GIS功能模塊實現(xiàn)。比如地圖瀏覽、空間查詢等分別在ActiveX DLL工程中實現(xiàn),模塊中的每一個小功能點通過類實現(xiàn)ICommand或ITool,然后將多個命令和工具集成實現(xiàn) IToolBarDef或IMenuDef接口。
4)功能集成到工具條控件。在主工程中引用上一步中的ActiveX DLL工程,然后通過Toolbar-Control的AddToolbarDef方法建立IToolBarDef實現(xiàn)類的對象與ToolbarControl的關(guān)聯(lián),例如程序語句“tbQuery.AddToolbarDefpQueryToolBar”,其中,tbQuery是 ToolbarControl控件;pQueryToolBar是IToolBarDef實現(xiàn)類的對象。
5)程序打包與發(fā)布。在開發(fā)完所有的功能后,就需要進行系統(tǒng)的打包發(fā)布,打包時需要配置好所需的數(shù)據(jù)和符號庫等,由于ArcGIS Engine Runtime是ArcGIS Engine應用程序的運行環(huán)境,所以需要和應用程序一起打包。
2.GIS軟件開發(fā)實例
本文在以上開發(fā)方法的指導下,基于VB 6.0+ ArcGIS Engine開發(fā)了一個小型的地圖瀏覽與查詢系統(tǒng)。該系統(tǒng)主要包括以下功能:① 地圖瀏覽:包括地圖放大、縮小、固定放大、固定縮小、平移、全屏顯示、地圖量算、地圖書簽;② 空間查詢:選擇空間對象查詢其屬性、一般條件查詢空間對象、綜合條件查詢空間對象;③ 圖層管理:包括顯示、關(guān)閉、移除所有圖層,顯示、關(guān)閉、移除當前圖層,當前圖層可選與不可選等功能;④地圖鷹眼。系統(tǒng)主界面如圖4所示。
圖4 地圖瀏覽與查詢系統(tǒng)界面
由于ArcGIS Engine具有簡潔、靈活、易用、可移植性強、開發(fā)成本低等優(yōu)點,已成為當前GIS軟件二次開發(fā)的主流產(chǎn)品。但由于ArcGIS Engine開發(fā)方式多樣、類庫龐大、接口眾多且關(guān)系復雜,使得許多初學者無所適從,甚至一些有開發(fā)經(jīng)驗的程序員也對其中的概念比較懵懂,短期內(nèi)很難開發(fā)出優(yōu)秀的GIS產(chǎn)品。為此,本文從技術(shù)的角度,對ArcGIS Engine的關(guān)鍵與難點技術(shù)進行了闡述與分析,介紹了利用ArcGIS Engine開發(fā)GIS軟件的基本方法。期盼本文能引領(lǐng)GIS二次開發(fā)人員盡快進入基于ArcGIS Engine的GIS軟件開發(fā)領(lǐng)域,盡快開發(fā)出成果,以支持他們的科研或生產(chǎn)應用。
[1] 朱政.通過ArcGIS Engine構(gòu)建GIS應用[R].北京:2004年第六屆 ArcGIS暨 ERDAS中國用戶大會,2004.
[2] 楊海燕,周榮福,谷雙喜.基于ArcGIS Engine的GIS開發(fā)的系統(tǒng)設(shè)計與實現(xiàn)[J].國土資源信息化,2008(1):16-18.
[3] 史永忠,曹全龍.基于ArcGIS Engine的三維地形可視化系統(tǒng)的研究與開發(fā)[J].現(xiàn)代測繪,2007,30(3):37-41.
Development Methods of GIS Software Based on ArcGIS Engine
WU Jianhua
0494-0911(2010)11-0054-04
P208
B
2009-11-10
江西師范大學博士啟動基金(2644)
吳建華(1981—),男,江西鄱陽人,博士,講師,主要從事GIS應用與開發(fā)、空間數(shù)據(jù)集成與更新研究工作。