"ArcGIS Engine組件式開發(fā)及應(yīng)用"是西安科技大學(xué)為地理信息系統(tǒng)本科專業(yè)開設(shè)的一門專業(yè)課。本書在積累作者近年來講授這門課經(jīng)驗的基礎(chǔ)上,結(jié)合具體GIS軟件項目開發(fā)實踐,采用C#語言編寫應(yīng)用實例,并以ArcGIS Engine9.3和10.0為開發(fā)平臺編寫而成,系統(tǒng)講述了ArcGIS Engine組件式開發(fā)的方法和具體應(yīng)用。
全書共11章,內(nèi)容涉及ArcGISEngine基礎(chǔ)、使用AreGISEngine控件編程、幾何形體對象Geometry、地圖組成、空間數(shù)據(jù)符號化、空間數(shù)據(jù)管理、空間分析、空間數(shù)據(jù)編輯、地圖輸出、基于ArcGIS Server的Web GIS開發(fā)和三維可視化及三維分析。對每部分所涉及的接口,實現(xiàn)接口的類,以及對應(yīng)的屬性和方法均進(jìn)行了詳細(xì)介紹。為便于讀者理解和練習(xí),在各部分還結(jié)合實際GIS項目開發(fā)實踐,列舉了大量采用C#語言編程實現(xiàn)的工程實例,突出編程實踐和具體應(yīng)用,以使讀者能有效了解和掌握ArcGlS Engine開發(fā)的實戰(zhàn)技術(shù)。
本書可作為地理信息系統(tǒng)及相關(guān)專業(yè)高年級本科生和研究生的教材,也可供各行業(yè)從事ArcGIS Engine軟件開發(fā)工程技術(shù)人員參考。
前言
第1章 ArcGIS Engine基礎(chǔ)
1.1 ArcGIS Engine概述
1.2 ArcGIS Engine組件庫
1.3 閱讀對象模型圖
1.3.1 ArcGIS Engine中的類與對象
1.3.2 類與類的關(guān)系
1.4 組建對象模型
1.4.1 軟件開發(fā)歷史
1.4.2 組件對象模型
1.5 使用控件構(gòu)建獨立應(yīng)用程序
1.5.1 程序功能描述
1.5.2 程序控件設(shè)計
1.5.3 代碼編寫
1.6 ArcGISlo.0的新增功能
第2章使用AreGIS Engine控件編程
2.1 MapControl控件
2.1.1 主要接口
2.1 2 用MapControl控件加載地理數(shù)據(jù)
2.1.3 鼠標(biāo)與控件的交互
2.1.4 數(shù)據(jù)選擇
2.1.5 實現(xiàn)鷹眼功能
2.2 PageLayoutControl控件
2.2.1 用PageLayoutControl操作Mxd文件
2.2.2 PageLayout與MapControl聯(lián)動
2.3 TOCControl控件
2.3.1 TOCControl控件概述叩
2.3.2 TOCControl控件應(yīng)用開發(fā)實例
2.4 ToolbarControl及相關(guān)對象
2.4.1 概述
2.4.2 ToolbarControl控件
2.4.3 zoolbarltem
第3章 幾何形體對象Geometry
第4章 地圖組成
第5章 空間數(shù)據(jù)符號化
第6章 空間數(shù)據(jù)管理
第7章 空間分析
第8章 空間數(shù)據(jù)編輯
第9章 地圖輸出
第10章 基于ArcGIS Server的Web Gis開發(fā)
第11章 三維可視化及三維分析
第1章 ArcGISEngine基礎(chǔ)
1.1 ArcGISEngine概述
ArcObjects是ESRI公司ArcGIS系列產(chǎn)品的開發(fā)平臺,它是基于MicrosoftCOM技術(shù)構(gòu)
建的一系列COM組件產(chǎn)品,屬于二次開發(fā)軟件。開發(fā)人員利用ArcObjects組件,可以開發(fā)
出功能強(qiáng)大的GIS系統(tǒng)。在ArcGIS9.0以前的版本,ArcObjects還不是一個獨立的應(yīng)用產(chǎn)品,
利用它開發(fā)的GIS軟件,不能脫離ArcGIS平臺獨立運行。出于產(chǎn)品戰(zhàn)略上的考慮,ESRI為
了進(jìn)一步開拓市場,就將ArcObjects中的一些組件單獨打包,并將其命名為ArcGISEngine。
ArcGISEngine是一套用于構(gòu)建應(yīng)用的嵌入式GIS程序的組件庫,利用它開發(fā)軟件,不需要
安裝ArcGIS桌面程序,只需要購買單獨的運行許可(Runtime)就可以運行。這套產(chǎn)品在靈
活性和費用上都很有優(yōu)勢,軟件開發(fā)人員利用ArcGISEngine可快速構(gòu)建針對特定行業(yè)的GIS
系統(tǒng),以降低開發(fā)的難度、成本和費用,為GIS在具體行業(yè)的推廣應(yīng)用奠定了良好的基礎(chǔ)。
1.2 ArcGISEngine組件庫
ArcGISEngine是一套龐大的COM組件集合,為有效管理ArcGISEngine中數(shù)目眾多的
COM對象,ESRI將它們放在不同的組件庫中,在.NET開發(fā)環(huán)境下,它們被組織在了不同的
命名空間內(nèi)。
組件庫是對一個或多個COM組件中所有的組件類、接口、方法和類型的描述,這種描
述是屬于二進(jìn)制級別的。所有這些組件庫的組件都位于\com文件夾中,
但其真正實現(xiàn)卻是在\bin文件夾的眾多DLL文件中。
命名空間將功能相同或相似的COM對象在邏輯上松散組織起來。在ArcGISEngine中,
眾多的組件被放在不同的命名空間內(nèi)。若要進(jìn)行地理數(shù)據(jù)操作,需要引入GeoDatabase等相
關(guān)的命名空間;若要涉及對幾何形體對象的處理,則需要引入Geometry等命名空間。通過這
種方式,軟件開發(fā)人員在尋找具體的COM對象時將更具有目標(biāo)性。
ArcGISEngine有數(shù)目龐大的組件庫,不同的組件庫功能各不相同,軟件開發(fā)人員要熟
悉每個組件庫相對比較困難,但有必要了解一些基本的組件庫,然后在實際軟件開發(fā)過程中,
再逐步學(xué)習(xí)需要掌握的組件庫。學(xué)習(xí)ArcGISEngine開發(fā)的過程就是不斷了解這些組件庫本
身及其庫與庫之間關(guān)系的過程。以下簡要介紹ArcGISEngine的基本組件庫,以便能夠開始
ArcGISEngine軟件開發(fā)。若要詳細(xì)了解每個組件庫,請讀者參閱ArcGISEngineDeveloper
Guide。
1.System類庫
System類庫,即ESRI.ArcGIS.esriSystem命名空間,是ArcGIS體系結(jié)構(gòu)中最底層的類庫。
System類庫包含了為構(gòu)成ArcGIS其他類庫提供服務(wù)的組件,如數(shù)組(Array)、集合(Set)、
Xml對象、Stream對象、分級(Classify)和數(shù)字格式(NumberFormat)對象等。數(shù)組和集
合均是基本的數(shù)據(jù)單元,Xml對象給ArcGISEngine提供了操作Xml類型文件的功能,Stream
對象則可以將數(shù)據(jù)以流的形式保存為任何格式的文件。分級和數(shù)字格式對象與數(shù)值數(shù)據(jù)有關(guān),
前者使用統(tǒng)計函數(shù)將數(shù)值數(shù)據(jù)進(jìn)行不同類型的分級,大多使用在分級著色中;后者可以使輸
出的數(shù)值格式互相轉(zhuǎn)換,如弧度轉(zhuǎn)角度、設(shè)置小數(shù)點等。
System類庫中定義了大量開發(fā)者可以實現(xiàn)的接口。例如,AoInitializer對象就是在System
類庫中定義的,所有的開發(fā)者必須使用這個對象來初始化ArcGISEngine和解除ArcGIS
Engine的初始化。開發(fā)者不能擴(kuò)展這個類庫,但可以通過實現(xiàn)這個類庫中包含的接口來擴(kuò)展
ArcGIS系統(tǒng)。
2.SystemUI類庫
SystemUI類庫,即ESRI.ArcGIS.SystemUI命名空間,包含了用戶界面組件接口的定義,
這些用戶界面組件可以在ArcGISEngine中進(jìn)行擴(kuò)展。包含ICommand、ITool和IToolControl
接口。開發(fā)者用這些接口來擴(kuò)展UI組件,ArcGISEngine開發(fā)人員自己的組件將使用這些UI
組件。這個類庫中包含的對象是一些實用工具對象,開發(fā)人員可以通過使用這些對象簡化用
戶界面的開發(fā)。開發(fā)者不能擴(kuò)展這個類庫,但可以通過實現(xiàn)這個類庫中包含的接口來擴(kuò)展
ArcGIS系統(tǒng)。
3.Geometry類庫
Geometry類庫,即ESRI.ArcGIS.Geometry命名空間。它包含了核心幾何形體對象,如
點、線、面幾何類型和定義等。在ArcGISEngine中的要素和圖形元素的幾何形體都可以在
這個組件庫中找到。這個庫還包含了空間參考對象,包括地理坐標(biāo)系統(tǒng)(Geographic
CoordinateSystem)、投影坐標(biāo)系統(tǒng)(ProjectedCoordinateSystem)和地理變換對象
(GeoTransformations)等。
4.Display類庫
Display類庫,即ESRI.ArcGIS.Display命名空間,包含在輸出設(shè)備上顯示圖形所需的組
件對象,如Display、Color、ColorRamp、DisplayFeedback、RubberBand、Tracker和Symbol
等對象。這個庫中的對象主要負(fù)責(zé)GIS數(shù)據(jù)的顯示,如Color和ColorRamp對象可以產(chǎn)生顏
色,它們配合Symbol對象,就能對地理數(shù)據(jù)進(jìn)行符號化操作,以便產(chǎn)生豐富多彩的地圖。
Symbol對象,用于修飾幾何形體對象,任何幾何形體對象都必須用某種符號才能顯示在地圖
上。DisplayFeedback是ArcGISEngine中可以使用鼠標(biāo)與地理數(shù)據(jù)進(jìn)行交互的對象,可完成
圖形的繪制和移動等高級任務(wù)。RubberBand對象相當(dāng)于"橡皮筋",可用于在Display上繪制
豐富的幾何形體對象,如Circle、Rectangle、Polyline和Polygon等。
5.Server類庫
Server類庫包含了允許用戶連接并操作ArcGISServer的對象。開發(fā)人員用GISServer
Connection對象來訪問ArcGISServer。通過GISServerConnection可以訪問ServerObjects
Mananger對象。用這個對象,開發(fā)人員可以操作ServerContext對象,以處理運行于服務(wù)器
上的ArcObjects。開發(fā)人員還可以用GISClient類庫與ArcGISServer進(jìn)行交互。
6.Output類庫
Output類庫用于創(chuàng)建圖形輸出到諸如打印機(jī)和繪圖儀等設(shè)備及諸如增強(qiáng)型元文件和柵格
圖像格式文件。開發(fā)人員可用這個類庫中的對象及ArcGIS系統(tǒng)的其他部分來創(chuàng)建圖形輸出,
通常是Display和Carto類庫中的對象。開發(fā)者可以為自定義設(shè)備和輸出格式擴(kuò)展Output類庫。
7.GeoDatabase類庫
GeoDatabase類庫,即ESRI.ArcGIS.GeoDatabase命名空間,包含的COM組件對象用于
操作地理數(shù)據(jù)庫。地理數(shù)據(jù)庫是一種在關(guān)系型數(shù)據(jù)庫和面向?qū)ο笮蛿?shù)據(jù)庫基礎(chǔ)上發(fā)展起來的
全新的數(shù)據(jù)庫模型,被稱為"第三代地理數(shù)據(jù)庫"。這個庫中包括工作空間(Workspace)和數(shù)
據(jù)集(DataSet)等核心的地理數(shù)據(jù)對象,也包含了幾何網(wǎng)絡(luò)、拓?fù)洹IN數(shù)據(jù)、版本對象和
數(shù)據(jù)轉(zhuǎn)換等多方面的內(nèi)容。
8.GISClient類庫
GISClient類庫允許開發(fā)者使用Web服務(wù),這些Web服務(wù)可由ArcIMS和ArcGISServer
提供。GISClient類庫中包含了用于連接GIS服務(wù)器以使用Web服務(wù)的對象。該類庫支持
ArcIMS的圖像和要素服務(wù),GISClient類庫提供以無態(tài)方式直接操作或通過Web服務(wù)目錄操
作ArcGISServer對象的通用編程模型。在ArcGISServer上運行的ArcObjects組件不能通過
GISClient接口來訪問。要直接訪問在服務(wù)器上運行的ArcObjects,開發(fā)人員應(yīng)使用Server類
庫中的功能。
9.DataSourcesFile類庫
DataSourcesFile類庫,即ESRI.ArcGIS.DataSourcesFile命名空間。地理數(shù)據(jù)保存在
Coverage、Shapefile或CAD等不同形式的文件中,為了在GIS程序中獲取這些數(shù)據(jù),需要
使用DataSourceFile庫中的工作空間工廠(WorkspaceFactory)對象來打開這些數(shù)據(jù)。
10.DataSourcesGDB類庫
DataSourcesGDB類庫,即ESRI.ArcGIS.DataSourcesGDB命名空間,該庫中的COM對
象用于打開數(shù)據(jù)源為Access的數(shù)據(jù)庫或任何ArcSDE支持的大型關(guān)系型數(shù)據(jù)庫的地理數(shù)據(jù),
庫中的對象不能被開發(fā)人員擴(kuò)展。DataSourcesGDB庫中的主要對象是工作空間工廠,一個工
作空間工廠可以讓用戶在設(shè)置了正確的連接屬性后打開一個工作空間,而一個工作空間就代
表一個數(shù)據(jù)庫,數(shù)據(jù)庫中保存著一個或多個數(shù)據(jù)集對象。數(shù)據(jù)集包括表、要素類和關(guān)系類等。
這個庫的對象主要有AccessWorkspaceFactory,用于打開一個基于Access數(shù)據(jù)庫的Personal
GeoDatabase。ScratchWorkspaceFactory,用于產(chǎn)生一個臨時的工作空間,以存放選擇集對象。
SdeWorkspaceFactory,用于打開SDE數(shù)據(jù)庫。
11.GeoDatabaseDistributed類庫
GeoDatabaseDistributed類庫包含了支持分布式地理數(shù)據(jù)庫的檢出和檢入操作所必需的
對象。
12.DataSourcesOleDB類庫
DataSourcesOleDB類庫,即ESRI.ArcGISDataSourcesOleDB命名空間,該庫中的對象具
有專門的API函數(shù),可用于操作任何一種支持OLEDB的數(shù)據(jù)庫。這個庫還可以使用
TextFileWorkspaceFactory對象打開一個文本文件,這對GIS系統(tǒng)載入某些文本數(shù)據(jù)非常有用。
DataSourcesOleDB庫還提供了一種使用ADO連接已經(jīng)打開的工作空間的方式,這是一種高
效的數(shù)據(jù)獲取方法。
13.DataSourcesRaster類庫
DataSourcesRaster類庫,即ESRI.ArcGIS.DataSourcesRaster命名空間,該庫中的COM對
象用于獲取保存在多種數(shù)據(jù)源中的柵格數(shù)據(jù),這些數(shù)據(jù)源包括文件系統(tǒng)、個人地理數(shù)據(jù)庫和
SDE企業(yè)地理數(shù)據(jù)庫。這個庫還提供了柵格數(shù)據(jù)轉(zhuǎn)換等功能的對象。
14.Carto類庫
Carto類庫,即ESRI.ArcGIS.Carto命名空間,該庫包含了為數(shù)據(jù)顯示服務(wù)的各種組件對
象。例如MapSurrounds是與一個Map對象相關(guān)聯(lián)的用于修飾地圖的對象集,包括指北針、
圖例和比例尺;MapGrids是地圖格網(wǎng);Renderers用于地圖著色與專題圖制作;Labeling、
Annotation和Dimensions為標(biāo)注對象,用于修飾在地圖上產(chǎn)生文字標(biāo)記,以顯示信息;Layers
是圖層對象,用于傳遞地理數(shù)據(jù)到Map或Pagelayout對象中去顯示等。
15.Location類庫
Location類庫包含了支持地理編碼和操作路徑事件的對象。地理編碼功能可通過細(xì)粒度
對象來控制訪問,或通過GeocodeServer對象提供的簡化API來訪問。開發(fā)者可以創(chuàng)建
自己的地理編碼對象。線性參考功能提供的對象用于向線性要素添加事件,用各種繪制方法
來繪制這些事件,開發(fā)者可以擴(kuò)展線性參考功能。
16.NetworkAnalyst類庫
NetworkAnalyst類庫提供了用于在地理數(shù)據(jù)庫中加載網(wǎng)絡(luò)數(shù)據(jù)的對象,并提供了對象用
于分析加載到地理數(shù)據(jù)庫中的網(wǎng)絡(luò)。開發(fā)者可以擴(kuò)展NetworkAnalyst類庫,以便支持自定義
網(wǎng)絡(luò)跟蹤。該類庫目的在于操作諸如供氣管線和電力供應(yīng)線網(wǎng)等公共網(wǎng)絡(luò)。
17.Controls類庫
Controls類庫,即ESRI.ArcGIS.Controls命名空間,包含了在程序開發(fā)中可以使用的可視
化組件對象,如MapControl、PageLayoutControl等。該庫包含以下7個子庫:
(1)MapControl,對應(yīng)ESRI.ArcGIS.MapControl命名空間;
(2)PageLayoutControl,對應(yīng)ESRI.ArcGIS.PageLayoutControl命名空間;
(3)TOCControl,對應(yīng)ESRI.ArcGIS.TOCControl命名空間;
(4)ToolbarControl,對應(yīng)ESRI.ArcGIS.ToolbarControl命名空間;
(5)ControlCommands,對應(yīng)ESRI.ArcGIS.ControlCommands命名空間;
(6)ReaderControl,對應(yīng)ESRI.ArcGIS.ReaderControl命名空間;
(7)LicenseControl,對應(yīng)ESRI.ArcGIS.LicenseControl命名空間。
18.GeoAnalyst類庫
GeoAnalyst類庫包含了支持核心空間分析功能的對象。這些功能用在SpatialAnalyst和
3DAnalyst兩個類庫中。開發(fā)者可通過創(chuàng)建新類型的柵格操作來擴(kuò)展GeoAnalyst類庫。為使
用這個類庫中的對象,需要ArcGISSpatialAnalyst或3DAnalyst擴(kuò)展模塊許可,利用ArcGIS
Engine開發(fā)的軟件運行時,則需要空間分析或3D分析選項許可。
19.3DAnalyst類庫
3DAnalyst類庫包含操作3D場景的對象,其方式與Carto類庫包含操作2D地圖的對象
類似。Scene對象是3DAnalyst類庫中的主要對象之一,該對象與Map對象一樣,是數(shù)據(jù)的
容器。Camera和Target對象規(guī)定在考慮要素位置與觀察者關(guān)系時場景如何瀏覽。一個場景由
一個和多個圖層組成,這些圖層規(guī)定了場景中包含的數(shù)據(jù)及這些數(shù)據(jù)如何顯示。開發(fā)者很少
擴(kuò)展3DAnalyst類庫。為使用這個類庫中的對象,需要ArcGIS3DAnalyst擴(kuò)展模塊許可,在
運行ArcGISEngine開發(fā)的軟件時,需要3D分析選項許可。
20.GlobeCore類庫
GlobeCore類庫包含了操作globe數(shù)據(jù)的對象,其方式與Carto類庫包含了操作2D地圖
的對象類似。Globe對象是GlobeCore類庫中的主要對象之一,該對象與Map對象一樣,是
數(shù)據(jù)的容器。GlobeCamera對象規(guī)定在考慮globe位置與觀察者關(guān)系時globe如何瀏覽。一個
globe有一個和多個圖層,這些圖層規(guī)定了globe中包含的數(shù)據(jù)及這些數(shù)據(jù)如何顯示。
GlobeCore類庫中有一個開發(fā)控件和與其一起使用的命令和工具。該開發(fā)控件可以與Controls
類庫中的對象協(xié)同使用。
21.SpatialAnalyst庫
SpatialAnalyst類庫包含了用于進(jìn)行柵格與矢量數(shù)據(jù)空間分析的對象。操作該庫中的對象
需要一個空間分析授權(quán)。
通過上面對ArcGISEngine組件庫的介紹,軟件開發(fā)人員便可根據(jù)實際開發(fā)需求,選擇
引入不同的命名空間,進(jìn)而可利用該命名空間中的類、接口、屬性和方法,完成相應(yīng)的開發(fā)
任務(wù)。
上述21個類庫之間的依賴關(guān)系如圖1.1和圖1.2所示。
1.3 閱讀對象模型圖
要學(xué)習(xí)ArcGISEngine軟件開發(fā),閱讀和理解對象模型圖(ObjectModelDiagram,OMD)
是關(guān)鍵。OMD以統(tǒng)一建模語言(UnifiedModelingLanguage)為基礎(chǔ),可以幫助軟件開發(fā)人
員有效了解類之間的相互關(guān)系,了解如何從一個類到另一個類,了解如何選擇正確的接口,
了解如何獲取所需的屬性和方法等。通過閱讀ArcGISEngine的對象模型圖,便能夠很快熟
悉ArcGISEngine的結(jié)構(gòu)和不同組件之間的關(guān)系。
ESRI提供了多種方法讓用戶了解ArcGISEngine組件和不同組件之間的關(guān)系,一種方法