"ArcGIS Engine组件式开发及应用"是西安科技大学为地理信息系统本科专业开设的一门专业课。本书在积累作者近年来讲授这门课经验的基础上,结合具体GIS软件项目开发实践,采用C#语言编写应用实例,并以ArcGIS Engine9.3和10.0为开发平台编写而成,系统讲述了ArcGIS Engine组件式开发的方法和具体应用。
全书共11章,内容涉及ArcGISEngine基础、使用AreGISEngine控件编程、几何形体对象Geometry、地图组成、空间数据符号化、空间数据管理、空间分析、空间数据编辑、地图输出、基于ArcGIS Server的Web GIS开发和三维可视化及三维分析。对每部分所涉及的接口,实现接口的类,以及对应的属性和方法均进行了详细介绍。为便于读者理解和练习,在各部分还结合实际GIS项目开发实践,列举了大量采用C#语言编程实现的工程实例,突出编程实践和具体应用,以使读者能有效了解和掌握ArcGlS Engine开发的实战技术。
本书可作为地理信息系统及相关专业高年级本科生和研究生的教材,也可供各行业从事ArcGIS Engine软件开发工程技术人员参考。
前言
第1章 ArcGIS Engine基础
1.1 ArcGIS Engine概述
1.2 ArcGIS Engine组件库
1.3 阅读对象模型图
1.3.1 ArcGIS Engine中的类与对象
1.3.2 类与类的关系
1.4 组建对象模型
1.4.1 软件开发历史
1.4.2 组件对象模型
1.5 使用控件构建独立应用程序
1.5.1 程序功能描述
1.5.2 程序控件设计
1.5.3 代码编写
1.6 ArcGISlo.0的新增功能
第2章使用AreGIS Engine控件编程
2.1 MapControl控件
2.1.1 主要接口
2.1 2 用MapControl控件加载地理数据
2.1.3 鼠标与控件的交互
2.1.4 数据选择
2.1.5 实现鹰眼功能
2.2 PageLayoutControl控件
2.2.1 用PageLayoutControl操作Mxd文件
2.2.2 PageLayout与MapControl联动
2.3 TOCControl控件
2.3.1 TOCControl控件概述叩
2.3.2 TOCControl控件应用开发实例
2.4 ToolbarControl及相关对象
2.4.1 概述
2.4.2 ToolbarControl控件
2.4.3 zoolbarltem
第3章 几何形体对象Geometry
第4章 地图组成
第5章 空间数据符号化
第6章 空间数据管理
第7章 空间分析
第8章 空间数据编辑
第9章 地图输出
第10章 基于ArcGIS Server的Web Gis开发
第11章 三维可视化及三维分析
第1章 ArcGISEngine基础
1.1 ArcGISEngine概述
ArcObjects是ESRI公司ArcGIS系列产品的开发平台,它是基于MicrosoftCOM技术构
建的一系列COM组件产品,属于二次开发软件。开发人员利用ArcObjects组件,可以开发
出功能强大的GIS系统。在ArcGIS9.0以前的版本,ArcObjects还不是一个独立的应用产品,
利用它开发的GIS软件,不能脱离ArcGIS平台独立运行。出于产品战略上的考虑,ESRI为
了进一步开拓市场,就将ArcObjects中的一些组件单独打包,并将其命名为ArcGISEngine。
ArcGISEngine是一套用于构建应用的嵌入式GIS程序的组件库,利用它开发软件,不需要
安装ArcGIS桌面程序,只需要购买单独的运行许可(Runtime)就可以运行。这套产品在灵
活性和费用上都很有优势,软件开发人员利用ArcGISEngine可快速构建针对特定行业的GIS
系统,以降低开发的难度、成本和费用,为GIS在具体行业的推广应用奠定了良好的基础。
1.2 ArcGISEngine组件库
ArcGISEngine是一套庞大的COM组件集合,为有效管理ArcGISEngine中数目众多的
COM对象,ESRI将它们放在不同的组件库中,在.NET开发环境下,它们被组织在了不同的
命名空间内。
组件库是对一个或多个COM组件中所有的组件类、接口、方法和类型的描述,这种描
述是属于二进制级别的。所有这些组件库的组件都位于\com文件夹中,
但其真正实现却是在\bin文件夹的众多DLL文件中。
命名空间将功能相同或相似的COM对象在逻辑上松散组织起来。在ArcGISEngine中,
众多的组件被放在不同的命名空间内。若要进行地理数据操作,需要引入GeoDatabase等相
关的命名空间;若要涉及对几何形体对象的处理,则需要引入Geometry等命名空间。通过这
种方式,软件开发人员在寻找具体的COM对象时将更具有目标性。
ArcGISEngine有数目庞大的组件库,不同的组件库功能各不相同,软件开发人员要熟
悉每个组件库相对比较困难,但有必要了解一些基本的组件库,然后在实际软件开发过程中,
再逐步学习需要掌握的组件库。学习ArcGISEngine开发的过程就是不断了解这些组件库本
身及其库与库之间关系的过程。以下简要介绍ArcGISEngine的基本组件库,以便能够开始
ArcGISEngine软件开发。若要详细了解每个组件库,请读者参阅ArcGISEngineDeveloper
Guide。
1.System类库
System类库,即ESRI.ArcGIS.esriSystem命名空间,是ArcGIS体系结构中最底层的类库。
System类库包含了为构成ArcGIS其他类库提供服务的组件,如数组(Array)、集合(Set)、
Xml对象、Stream对象、分级(Classify)和数字格式(NumberFormat)对象等。数组和集
合均是基本的数据单元,Xml对象给ArcGISEngine提供了操作Xml类型文件的功能,Stream
对象则可以将数据以流的形式保存为任何格式的文件。分级和数字格式对象与数值数据有关,
前者使用统计函数将数值数据进行不同类型的分级,大多使用在分级着色中;后者可以使输
出的数值格式互相转换,如弧度转角度、设置小数点等。
System类库中定义了大量开发者可以实现的接口。例如,AoInitializer对象就是在System
类库中定义的,所有的开发者必须使用这个对象来初始化ArcGISEngine和解除ArcGIS
Engine的初始化。开发者不能扩展这个类库,但可以通过实现这个类库中包含的接口来扩展
ArcGIS系统。
2.SystemUI类库
SystemUI类库,即ESRI.ArcGIS.SystemUI命名空间,包含了用户界面组件接口的定义,
这些用户界面组件可以在ArcGISEngine中进行扩展。包含ICommand、ITool和IToolControl
接口。开发者用这些接口来扩展UI组件,ArcGISEngine开发人员自己的组件将使用这些UI
组件。这个类库中包含的对象是一些实用工具对象,开发人员可以通过使用这些对象简化用
户界面的开发。开发者不能扩展这个类库,但可以通过实现这个类库中包含的接口来扩展
ArcGIS系统。
3.Geometry类库
Geometry类库,即ESRI.ArcGIS.Geometry命名空间。它包含了核心几何形体对象,如
点、线、面几何类型和定义等。在ArcGISEngine中的要素和图形元素的几何形体都可以在
这个组件库中找到。这个库还包含了空间参考对象,包括地理坐标系统(Geographic
CoordinateSystem)、投影坐标系统(ProjectedCoordinateSystem)和地理变换对象
(GeoTransformations)等。
4.Display类库
Display类库,即ESRI.ArcGIS.Display命名空间,包含在输出设备上显示图形所需的组
件对象,如Display、Color、ColorRamp、DisplayFeedback、RubberBand、Tracker和Symbol
等对象。这个库中的对象主要负责GIS数据的显示,如Color和ColorRamp对象可以产生颜
色,它们配合Symbol对象,就能对地理数据进行符号化操作,以便产生丰富多彩的地图。
Symbol对象,用于修饰几何形体对象,任何几何形体对象都必须用某种符号才能显示在地图
上。DisplayFeedback是ArcGISEngine中可以使用鼠标与地理数据进行交互的对象,可完成
图形的绘制和移动等高级任务。RubberBand对象相当于"橡皮筋",可用于在Display上绘制
丰富的几何形体对象,如Circle、Rectangle、Polyline和Polygon等。
5.Server类库
Server类库包含了允许用户连接并操作ArcGISServer的对象。开发人员用GISServer
Connection对象来访问ArcGISServer。通过GISServerConnection可以访问ServerObjects
Mananger对象。用这个对象,开发人员可以操作ServerContext对象,以处理运行于服务器
上的ArcObjects。开发人员还可以用GISClient类库与ArcGISServer进行交互。
6.Output类库
Output类库用于创建图形输出到诸如打印机和绘图仪等设备及诸如增强型元文件和栅格
图像格式文件。开发人员可用这个类库中的对象及ArcGIS系统的其他部分来创建图形输出,
通常是Display和Carto类库中的对象。开发者可以为自定义设备和输出格式扩展Output类库。
7.GeoDatabase类库
GeoDatabase类库,即ESRI.ArcGIS.GeoDatabase命名空间,包含的COM组件对象用于
操作地理数据库。地理数据库是一种在关系型数据库和面向对象型数据库基础上发展起来的
全新的数据库模型,被称为"第三代地理数据库"。这个库中包括工作空间(Workspace)和数
据集(DataSet)等核心的地理数据对象,也包含了几何网络、拓扑、TIN数据、版本对象和
数据转换等多方面的内容。
8.GISClient类库
GISClient类库允许开发者使用Web服务,这些Web服务可由ArcIMS和ArcGISServer
提供。GISClient类库中包含了用于连接GIS服务器以使用Web服务的对象。该类库支持
ArcIMS的图像和要素服务,GISClient类库提供以无态方式直接操作或通过Web服务目录操
作ArcGISServer对象的通用编程模型。在ArcGISServer上运行的ArcObjects组件不能通过
GISClient接口来访问。要直接访问在服务器上运行的ArcObjects,开发人员应使用Server类
库中的功能。
9.DataSourcesFile类库
DataSourcesFile类库,即ESRI.ArcGIS.DataSourcesFile命名空间。地理数据保存在
Coverage、Shapefile或CAD等不同形式的文件中,为了在GIS程序中获取这些数据,需要
使用DataSourceFile库中的工作空间工厂(WorkspaceFactory)对象来打开这些数据。
10.DataSourcesGDB类库
DataSourcesGDB类库,即ESRI.ArcGIS.DataSourcesGDB命名空间,该库中的COM对
象用于打开数据源为Access的数据库或任何ArcSDE支持的大型关系型数据库的地理数据,
库中的对象不能被开发人员扩展。DataSourcesGDB库中的主要对象是工作空间工厂,一个工
作空间工厂可以让用户在设置了正确的连接属性后打开一个工作空间,而一个工作空间就代
表一个数据库,数据库中保存着一个或多个数据集对象。数据集包括表、要素类和关系类等。
这个库的对象主要有AccessWorkspaceFactory,用于打开一个基于Access数据库的Personal
GeoDatabase。ScratchWorkspaceFactory,用于产生一个临时的工作空间,以存放选择集对象。
SdeWorkspaceFactory,用于打开SDE数据库。
11.GeoDatabaseDistributed类库
GeoDatabaseDistributed类库包含了支持分布式地理数据库的检出和检入操作所必需的
对象。
12.DataSourcesOleDB类库
DataSourcesOleDB类库,即ESRI.ArcGISDataSourcesOleDB命名空间,该库中的对象具
有专门的API函数,可用于操作任何一种支持OLEDB的数据库。这个库还可以使用
TextFileWorkspaceFactory对象打开一个文本文件,这对GIS系统载入某些文本数据非常有用。
DataSourcesOleDB库还提供了一种使用ADO连接已经打开的工作空间的方式,这是一种高
效的数据获取方法。
13.DataSourcesRaster类库
DataSourcesRaster类库,即ESRI.ArcGIS.DataSourcesRaster命名空间,该库中的COM对
象用于获取保存在多种数据源中的栅格数据,这些数据源包括文件系统、个人地理数据库和
SDE企业地理数据库。这个库还提供了栅格数据转换等功能的对象。
14.Carto类库
Carto类库,即ESRI.ArcGIS.Carto命名空间,该库包含了为数据显示服务的各种组件对
象。例如MapSurrounds是与一个Map对象相关联的用于修饰地图的对象集,包括指北针、
图例和比例尺;MapGrids是地图格网;Renderers用于地图着色与专题图制作;Labeling、
Annotation和Dimensions为标注对象,用于修饰在地图上产生文字标记,以显示信息;Layers
是图层对象,用于传递地理数据到Map或Pagelayout对象中去显示等。
15.Location类库
Location类库包含了支持地理编码和操作路径事件的对象。地理编码功能可通过细粒度
对象来控制访问,或通过GeocodeServer对象提供的简化API来访问。开发者可以创建
自己的地理编码对象。线性参考功能提供的对象用于向线性要素添加事件,用各种绘制方法
来绘制这些事件,开发者可以扩展线性参考功能。
16.NetworkAnalyst类库
NetworkAnalyst类库提供了用于在地理数据库中加载网络数据的对象,并提供了对象用
于分析加载到地理数据库中的网络。开发者可以扩展NetworkAnalyst类库,以便支持自定义
网络跟踪。该类库目的在于操作诸如供气管线和电力供应线网等公共网络。
17.Controls类库
Controls类库,即ESRI.ArcGIS.Controls命名空间,包含了在程序开发中可以使用的可视
化组件对象,如MapControl、PageLayoutControl等。该库包含以下7个子库:
(1)MapControl,对应ESRI.ArcGIS.MapControl命名空间;
(2)PageLayoutControl,对应ESRI.ArcGIS.PageLayoutControl命名空间;
(3)TOCControl,对应ESRI.ArcGIS.TOCControl命名空间;
(4)ToolbarControl,对应ESRI.ArcGIS.ToolbarControl命名空间;
(5)ControlCommands,对应ESRI.ArcGIS.ControlCommands命名空间;
(6)ReaderControl,对应ESRI.ArcGIS.ReaderControl命名空间;
(7)LicenseControl,对应ESRI.ArcGIS.LicenseControl命名空间。
18.GeoAnalyst类库
GeoAnalyst类库包含了支持核心空间分析功能的对象。这些功能用在SpatialAnalyst和
3DAnalyst两个类库中。开发者可通过创建新类型的栅格操作来扩展GeoAnalyst类库。为使
用这个类库中的对象,需要ArcGISSpatialAnalyst或3DAnalyst扩展模块许可,利用ArcGIS
Engine开发的软件运行时,则需要空间分析或3D分析选项许可。
19.3DAnalyst类库
3DAnalyst类库包含操作3D场景的对象,其方式与Carto类库包含操作2D地图的对象
类似。Scene对象是3DAnalyst类库中的主要对象之一,该对象与Map对象一样,是数据的
容器。Camera和Target对象规定在考虑要素位置与观察者关系时场景如何浏览。一个场景由
一个和多个图层组成,这些图层规定了场景中包含的数据及这些数据如何显示。开发者很少
扩展3DAnalyst类库。为使用这个类库中的对象,需要ArcGIS3DAnalyst扩展模块许可,在
运行ArcGISEngine开发的软件时,需要3D分析选项许可。
20.GlobeCore类库
GlobeCore类库包含了操作globe数据的对象,其方式与Carto类库包含了操作2D地图
的对象类似。Globe对象是GlobeCore类库中的主要对象之一,该对象与Map对象一样,是
数据的容器。GlobeCamera对象规定在考虑globe位置与观察者关系时globe如何浏览。一个
globe有一个和多个图层,这些图层规定了globe中包含的数据及这些数据如何显示。
GlobeCore类库中有一个开发控件和与其一起使用的命令和工具。该开发控件可以与Controls
类库中的对象协同使用。
21.SpatialAnalyst库
SpatialAnalyst类库包含了用于进行栅格与矢量数据空间分析的对象。操作该库中的对象
需要一个空间分析授权。
通过上面对ArcGISEngine组件库的介绍,软件开发人员便可根据实际开发需求,选择
引入不同的命名空间,进而可利用该命名空间中的类、接口、属性和方法,完成相应的开发
任务。
上述21个类库之间的依赖关系如图1.1和图1.2所示。
1.3 阅读对象模型图
要学习ArcGISEngine软件开发,阅读和理解对象模型图(ObjectModelDiagram,OMD)
是关键。OMD以统一建模语言(UnifiedModelingLanguage)为基础,可以帮助软件开发人
员有效了解类之间的相互关系,了解如何从一个类到另一个类,了解如何选择正确的接口,
了解如何获取所需的属性和方法等。通过阅读ArcGISEngine的对象模型图,便能够很快熟
悉ArcGISEngine的结构和不同组件之间的关系。
ESRI提供了多种方法让用户了解ArcGISEngine组件和不同组件之间的关系,一种方法