吳建華
(江西師范大學地理與環境學院,江西南昌330022)
基于ArcGIS Engine的GIS軟件開發方法
吳建華
(江西師范大學地理與環境學院,江西南昌330022)
介紹ArcGIS Engine體系結構、類與接口的應用方法,以及ArcGIS Engine界面開發框架與功能定制方法,最后闡述利用ArcGIS Engine組件開發GIS軟件的基本過程與方法,并給出地圖瀏覽與查詢系統開發實例。希望對相關GIS系統的開發者具有較好的指導和借鑒作用。
GIS;ArcGIS Engine;組件技術;軟件開發
由于GIS可以同時提供表征地理位置的圖形信息和空間對象的屬性信息,以及其獨有的空間分析功能,目前已被廣泛應用于測繪、遙感、國土、國防、資源、環境、交通、水利、電力、地質、農業、林業、城市規劃與管理、生活信息服務等領域。GIS已經成為一項服務于信息化建設、生產、生活、科研的技術工具,如何快速、低成本地開發出滿足應用需求的GIS系統已經引起GIS軟件開發商、公司、企業及科研院所的關注。目前許多專業的GIS軟件開發商都推出了自己的二次開發產品,如Esri公司先后推出了MapObject、ArcObjects和ArcGIS Engine;MapInfo公司推出了MapX;國內的SuperMap、MapGIS及GeoStar也都具備二次開發的功能。在二次開發平臺選型中沒有最好的,只有最合適的,各類產品都有自己的優勢與劣勢。但當前主流的二次開發產品還屬于全球GIS行業的領頭羊Esri公司的ArcGIS Engine產品,它具有簡潔、靈活、易用、可移植性強、開發成本低等優點,受到了GIS人員的喜愛。但由于ArcGIS Engine開發方式多樣、類庫龐大、接口眾多等原因,使得開發者很難在短期內掌握好,最終導致開發出的系統結構不合理、性能差、界面不美觀等。為此,本文基于以往多個GIS項目的開發經驗以及對ArcGIS Engine的深入研究,由淺入深地介紹了利用ArcGIS Engine開發GIS軟件的方法。希望給GIS同行們帶來有益的借鑒作用。
ArcGIS Engine是美國Esri公司發布的一款GIS二次開發產品,它是目前GIS業界最為著名的組件式GIS開發產品。它是對ArcGIS Desktop開發包ArcObjects組件集中的大部分接口、類、庫進行封裝后構成的獨立的嵌入式組件,不依賴ArcGIS Desktop桌面平臺。它由兩部分組成:面向開發人員的開發工具包ArcGIS engine developer kit和面向最終用戶的運行時環境ArcGIS engine runtime[1]。ArcGIS Engine可以在不同開發語言環境(COM、.NET、Java、C++)下開發,它提供了一系列可以在ArcGIS Desktop框架之外使用的GIS組件和可視化控件,它包含20多個類庫,比如Geometry、Display、Geodatabase、System、Carto等,用戶通過引用各個類庫中的接口并配合控件的使用,可以方便地實現GIS功能,這使得開發者能夠將精力集中到解決應用程序中的業務邏輯中,而不是從頭開始開發GIS功能。開發人員可以將定制的GIS功能嵌入到已有的應用軟件中或創建自定義應用軟件[2]。
1.類庫體系結構
ArcGIS Engine從功能層次上劃分為以下五個部分:①基礎服務:由GIS核心ArcObjects構成,幾乎所有GIS應用程序都需要;②數據存取:對矢量和柵格數據進行存取;③ 地圖表達:實現地圖的標注、符號化及專題圖的渲染;④地圖分析:提供空間建模與分析功能;⑤ 開發者組件:用于開發應用程序的界面控件,如制圖控件、3D控件、工具條、TOC等。
針對不同方面的功能,ArcGIS Engine提供了相應的組件類庫,類庫體系結構如圖1所示。

圖1 類庫體系結構
圖1中,System類庫是ArcGIS最底層的組件庫,該類庫包含為構成ArcGIS的其他類庫提供服務的組件;SystemUI庫包含用戶界面組件接口定義,這些用戶界面組件可以在ArcGIS Engine中進行擴展,比如ICommand和ITool;Geometry類庫包含了核心幾何對象,如點、線、多邊形等,并且定義和實現坐標系統的空間參考對象;Display類庫包含了支持向輸出設備繪制符號的組件;Server類庫包含允許用戶連接并操作ArcGIS Server的對象;Output類庫用于創建圖形輸出到諸如打印機和繪圖儀等設備,或以文件的方式導出,如導出為柵格圖像格式(JPG、BMP等)。Geodatabase類庫為地理數據庫提供了編程API,支持多種類型對象(如Feature、tables、networks、TINs)的數據訪問;GISClient類庫包含了操作ArcIMS或ArcGIS Server提供的遠程GIS服務的對象;DataSourcesOleDB類庫提供了操作基于OleDB的數據源的工作空間;DataSourcesFile類庫包含用于基于文件數據源的GeoDatabase API實現。這些基于文件的數據源包括 shapefile、coverage、TIN、CAD、SDC、StreetMap和VPF;DataSourcesGDB庫包含了存儲在關系數據庫管理系統中基于地理數據庫模型的矢量和柵格數據格式的工作空間工廠和工作空間;DataSourcesRaster庫包含了適用于基于文件的柵格數據格式的工作空間工廠和工作空間; GeoDatabaseDistributed庫包含了支持分布式地理數據庫的檢出/檢入操作所必需,的對象。Carto類庫包含了用于顯示數據的對象,如PageLayout和Map對象,以及map layers和renders可作用于所有支持的數據類型。Location類庫包含了與位置數據操作相關的對象,位置數據可以是路徑事件或地理編碼位置;NetworkAnalysis類庫支持效用網絡的創建和分析;GeoAnalyst類庫包含了核心空間分析的操作,這些操作可以通過空間分析和三維分析擴展模塊; 3DAnalyst類庫用于數據的三維分析并支持三維數據的顯示;GlobeCore類庫包含用于進行球體數據分析以及支持球體數據顯示的對象;SpatialAnalyst類庫包含了在柵格數據和矢量數據上執行空間分析的對象。Controls類庫包含用于應用開發的各類控件,如MapControl和PageLayoutControl等,也可以通過創建自定義的操作控件的命令和工具來擴展Controls類庫;ArcReader Control類庫支持ArcReader對象模型,用于創建自定義的基于ArcReader的應用。
2.類與接口的使用
在總體了解ArcGIS Engine的類庫體系結構后,需要進一步認識類庫中的類與接口并掌握它們的使用方法。類庫可以簡單理解為實現各種功能的類的集合,類的主要作用是定義與實現功能,解決怎么去做的問題,類有三種不同的類型(如圖2所示):①抽象類(AbstractClass):這種類不能被實例化,即不能用new關鍵字去產生對象,抽象類的成員一般都是部分實現或者根本不實現;②組件類(CoClass):這種類可以通過new關鍵字直接實例化對象;③普通類(Class):不能直接使用new關鍵字創建對象,但它可以作為其他類的一個屬性或者從其他類的對象實例化來創建,比如:ArcGIS Engine中普通類Work-Space不能用new創建,但可以通過IDataset對象的Workspace屬性來創建,或通過IWorkspaceFactory對象的OpenFromFile方法實例化一個對象來創建。

圖2 對象模型圖
上述三種類之間的關系有四種(如圖2所示):①繼承(inheritance):圖中的空心三角箭頭表示繼承關系;② 組成(composition):圖中的菱形表示組成關系;③關聯(association):圖中的線表示關聯關系;④實例化(instantiation):圖中的虛線箭頭表示實例化關系。
接口定義了一個對象能做什么,它實現了一組功能的屬性、方法及事件。ArcGIS Engine中,一個接口由一個或多個類來實現,而一個類可以實現一個或多個接口。接口的命名都以“I”字母開頭,容易識別,比如IMap。同屬于一個類的接口,通過查詢接口(QueryInterface)可以實現不同接口之間的切換[3],即實現一個接口對另一個接口定義的屬性和方法的調用,比如IMap與IActiveView同屬于Map類,IMap接口通過查詢接口就可獲得IActiveView接口中定義方法。在工程開發中,接口使用的基本過程如下:首先在工程中引用相應的類庫,然后在程序函數或過程定義接口變量并實例化,最后調用接口的屬性、方法或觸發接口中的事件,從而實現程序設計中定義的功能。
1.界面開發框架
在了解了類庫、類及接口之后,就可以著手搭建GIS軟件的主界面了。通常按照C/S結構開發的GIS系統主界面應包括圖3所示的七個部分,其中,工具欄、地圖數據目錄顯示區、地圖顯示與操作區為主要部分,工具欄可由ToolbarControl控件實現,地圖數據目錄顯示區可由TOCControl控件實現,地圖顯示與操作區通常由MapControl、PageLayoutControl等地圖控件實現。在主窗體界面上添加各類控件后,還要實現ToolbarControl和TOCControl與地圖控件的綁定,通過設置 ToolbarControl和TOCControl的Buddy屬性即可。通過控件之間的綁定,確定了ToolbarControl中的命令與工具操作的對象是地圖控件中的地圖數據,而地圖數據目錄顯示區的內容也會隨著地圖控件中的數據變化而變化。鷹眼導航圖顯示區根據用戶需求決定取舍,它也是通過MapControl控件實現的,其主要作用是將地圖顯示與操作區的地圖快速導航到用戶感興趣的區域。

圖3 界面開發框架
2.GIS功能定制方法
在搭建好系統界面后,就需要進一步實現工具條按鈕或菜單按鈕的功能了。從是否與地圖交互的角度,將功能分為兩類:①命令功能:即鼠標不需要在地圖顯示與操作區操作(鼠標單擊、移動、釋放等),就可以實現對地圖的訪問與操作;② 工具功能:需要與地圖交互才能實現對地圖的訪問與操作。以上兩種功能可分別通過ICommad和ITool的實現來創建,而通過集成多個命令或工具就可以形成工具條或菜單。為此下面著重介紹ICommad和ITool接口的實現方法,以及工具條和菜單的定制方法。
(1)ICommand接口
首先創建一個ActiveX DLL的工程,然后創建一個類并引用SystemUI類庫,最后在該類中實現ICommand接口:先在類的代碼區前面書寫“Implements ICommand”語句,然后在代碼區具體實現ICommand接口的屬性與方法。ICommand提供了Bitmap、Caption、Category、Checked、Enabled、Help-ContextID、HelpFile、Message、Name、Tooltip十個屬性和OnClick、OnCreate兩個方法。
(2)ITool接口實現
與ICommand接口類似,首先也要創建一個ActiveX DLL的工程,然后創建一個類并引用SystemUI類庫,最后在該類中實現ITool接口:先在類的代碼區前面書寫“Implements ITool”語句,然后在代碼區具體實現ITool接口的屬性與方法。ICommand提供了Cursor屬性和 Deactivate、OnContextMenu、OnD-blClick、OnKeyDown、OnKeyUp、OnMouseDown、On-MouseMove、OnMouseUp、Refresh九個方法。值得注意的是,要實現工具功能,需要在同一個類中同時實現ICommand和ITool。
(3)IToolbarDef接口與IMenuDef接口
IToobarDef接口用于集成命令和工具功能形成工具條。實現 IToobarDef接口也需要在一個 ActiveX DLL的工程的新類中實現,它提供了Caption、ItemCount、Name三個屬性和GetItemInfo方法。其中ItemCount表示工具條按鈕的個數,GetItemInfo用于設置指定索引位置上按鈕的CLSID(實現命令或工具功能的類名稱)。IMenuDef使用類似IToobarDef,結合使用IToolbarMenu、IToolbarItem等接口可以創建工具條菜單、彈出式菜單、子菜單。最后利用Toolbar-Control控件的 AddToolbarDef、AddItem等方法把上述接口實現的功能集成在ToolbarControl控件上。
1.系統開發基本過程與方法
通過對上述ArcGIS Engine開發方法的深入研究,并結合筆者以往GIS軟件開發的經驗,現將VB 6.0+ArcGIS Engine開發GIS軟件的基本過程與方法歸納如下:
1)系統主界面設計。創建一個新的主工程,引用相關部件和類庫,根據需要在主窗體上添加地圖控件(MapControl或PageLayoutControl等)、框架控件(TocControl和ToolbarControl)及其他控件。通過屬性設置進行框架控件與地圖控件的綁定,當然也可以在程序中動態綁定。
2)產品的許可認證。所有的應用必須在運行時初始化一個產品許可,可以通過提供的License控件設置完成,也可以利用esriSystem::AoInitialize初始化產品許可。
3)GIS功能模塊實現。比如地圖瀏覽、空間查詢等分別在ActiveX DLL工程中實現,模塊中的每一個小功能點通過類實現ICommand或ITool,然后將多個命令和工具集成實現 IToolBarDef或IMenuDef接口。
4)功能集成到工具條控件。在主工程中引用上一步中的ActiveX DLL工程,然后通過Toolbar-Control的AddToolbarDef方法建立IToolBarDef實現類的對象與ToolbarControl的關聯,例如程序語句“tbQuery.AddToolbarDefpQueryToolBar”,其中,tbQuery是 ToolbarControl控件;pQueryToolBar是IToolBarDef實現類的對象。
5)程序打包與發布。在開發完所有的功能后,就需要進行系統的打包發布,打包時需要配置好所需的數據和符號庫等,由于ArcGIS Engine Runtime是ArcGIS Engine應用程序的運行環境,所以需要和應用程序一起打包。
2.GIS軟件開發實例
本文在以上開發方法的指導下,基于VB 6.0+ ArcGIS Engine開發了一個小型的地圖瀏覽與查詢系統。該系統主要包括以下功能:① 地圖瀏覽:包括地圖放大、縮小、固定放大、固定縮小、平移、全屏顯示、地圖量算、地圖書簽;② 空間查詢:選擇空間對象查詢其屬性、一般條件查詢空間對象、綜合條件查詢空間對象;③ 圖層管理:包括顯示、關閉、移除所有圖層,顯示、關閉、移除當前圖層,當前圖層可選與不可選等功能;④地圖鷹眼。系統主界面如圖4所示。

圖4 地圖瀏覽與查詢系統界面
由于ArcGIS Engine具有簡潔、靈活、易用、可移植性強、開發成本低等優點,已成為當前GIS軟件二次開發的主流產品。但由于ArcGIS Engine開發方式多樣、類庫龐大、接口眾多且關系復雜,使得許多初學者無所適從,甚至一些有開發經驗的程序員也對其中的概念比較懵懂,短期內很難開發出優秀的GIS產品。為此,本文從技術的角度,對ArcGIS Engine的關鍵與難點技術進行了闡述與分析,介紹了利用ArcGIS Engine開發GIS軟件的基本方法。期盼本文能引領GIS二次開發人員盡快進入基于ArcGIS Engine的GIS軟件開發領域,盡快開發出成果,以支持他們的科研或生產應用。
[1] 朱政.通過ArcGIS Engine構建GIS應用[R].北京:2004年第六屆 ArcGIS暨 ERDAS中國用戶大會,2004.
[2] 楊海燕,周榮福,谷雙喜.基于ArcGIS Engine的GIS開發的系統設計與實現[J].國土資源信息化,2008(1):16-18.
[3] 史永忠,曹全龍.基于ArcGIS Engine的三維地形可視化系統的研究與開發[J].現代測繪,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應用與開發、空間數據集成與更新研究工作。