ARCGISENGINE10开发手册word版_第1页
ARCGISENGINE10开发手册word版_第2页
ARCGISENGINE10开发手册word版_第3页
ARCGISENGINE10开发手册word版_第4页
ARCGISENGINE10开发手册word版_第5页
已阅读5页,还剩321页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一 ArcGIS 介绍 ArcGIS 软件架构 ArcGIS 是 ESRI 在全面整合了 GIS 与数据库、软件工程、人工智能、网络技术及其它多方面的计算机主流 技术之后,成功地推出了代表 GIS 最高技术水平的全系列 GIS 产品。ArcGIS 是一个全面的,可伸缩的 GIS 平台,为用户构建一个完善的 GIS 系统提供完整的解决方案。ArcGIS 的基本体系能够让用户在任何需要的 地方部署 GIS 功能和业务逻辑,无论是在桌面、服务器、还是在野外: 桌面 GIS(ArcGIS Desktop)ArcGIS 桌面 GIS 软件产品是用来编辑、设计、共享、管理和发布地理信息 和概念。ArcGI

2、S 桌面可伸缩的产品结构,从 ArcReader,向上扩展到 ArcView、ArcEditor 和 ArcInfo。目 前 ArcInfo 被公认为是功能最强大的 GIS 产品。通过一系列的可选的软件扩展模块,ArcGIS Desktop 产品 的能力还可以进一步得到扩展。 嵌入式 GIS(Embedded GIS)ArcGIS Engine 是一个完整的嵌入式 GIS 组件库和工具包,开发者能用它创 建一个新的、或扩展原有的可定制的桌面应用程序。使用 ArcGIS Engine,开发者能将 GIS 功能嵌入到已 有的应用程序中,如基于工业标准的产品以及一些商业应用,也可以创建自定义的应用程

3、序,为组织机构 中的众多用户提供 GIS 功能。 服务器 GIS(Server GIS)ArcGIS Server、ArcIMS 和 ArcSDE 用于创建和管理基于服务的 GIS 应用程序, 在大型机构和互联网上众多用户之间共享地理信息。ArcGIS Server 是一个中心应用服务器,它包含一个 可共享的 GIS 软件对象库,能在企业和 Web 计算框架中建立服务器端的 GIS 应用。ArcIMS 是通过开放的 I nternet 协议发布地图、数据和元数据的可伸缩的网络地图服务器。ArcSDE 是在各种关系型数据库管理系 统中管理地理信息的高级空间数据服务器。 移动 GIS(Mobile

4、 GIS)ArcPad,支持 GPS 的无线移动设备,越来越多地应用在野外数据采集和信息访 问中。ArcGIS 桌面和 ArcGIS Engine 可以运行在便携式电脑或平板电脑上,用户可以在野外进行数据采集、 分析和乃至制定决策。 ArcGIS Engine 介绍 ArcGIS Engine 是一组完备的并且打包的嵌入式 GIS 组件库和工具库,开发人员可用来创建新的或扩展已 有的桌面应用程序。使用 ArcGIS Engine,开发人员可以将 GIS 功能嵌入到已有的应用软件中,如自定义 行业专用产品;或嵌入到商业生产应用软件中,如 Mirosoftf Word 和 Excel;还可以创建集

5、中式自定义 应用软件,并将其发送给机构内的多个用户。 ArcGIS Engine 由两个产品组成:构建软件所用的开发工具包以及使已完成的应用程序能够运行的可再发 布的 Runtime(运行时环境)。ArcGIS Engine 开发工具包是一个基于组件的软件开发产品,可用于构建 自定义 GIS 和制图应用软件。它并不是一个终端用户产品,而是软件开发人员的工具包,适于为 Windows、 UNIX 或 Linux 用户构建基础制图和综合动态 GIS 应用软件。ArcGIS Engine Runtime 是一个使终端用户 软件能够运行的核心 ArcObjects 组件产品,并且将被安装在每一台运行

6、ArcGISEngine 应用程序的计算机 上。 ArcGIS Engine 是基于 COM 技术的可嵌入的组件库和工具包,ArcGIS Engine 可以帮助我们很轻松的构 建自定义应用程序. 使用 ArcGIS Engine,开发人员可以将 GIS 功能嵌入到已有的应用软件中,如自定义行业专用产品; 或嵌入到商业生产应用软件中,如 Mirosoftf Word 和 Excel;还可以创建集中式自定义应用软件,并 将其发送给机构内的多个用户。 ArcGIS Engine 由两个产品组成: 面向开发人员的软件开发包(ArcGIS Engine Developer kit) 面向最终用户的运行时

7、(ArcGIS Engine Runtime) ArcGIS Engine 开发工具包是一个基于组件的软件开发产品,可用于构建自定义 GIS 和制图应用软件。它 并不是一个终端用户产品,而是软件开发人员的工具包,支持四种开发环境(C, COM, .NET,以及 Java),适于为 Windows、UNIX 或 Linux 用户构建基础制图和综合动态 GIS 应用软件。 ArcGIS Engine Runtime 是一个使终端用户软件能够运行的核心 ArcObjects 组件产品,并且将被安装在 每一台运行 ArcGIS Engine 应用程序的计算机上。 ArcGIS Engine 的逻辑体系

8、结构 : Base Services 包含了 ArcEngine 中最核心的 ArcObjects 组件,几乎所有的 GIS 组件需要调用它们,如 Ge ometry 和 Display 等。 Data Access 包含了访问矢量或栅格数据的 GeoDatabase 所有的接口和类组件。 Map Presentation 包含了 GIS 应用程序用于数据显示、数据符号化、要素标注和专题图制作等需要的接口和类 组件。 Develper Components 包含了进行快速开发所需要的全部可视化控件,如 MapControl、PageLayoutControl、SceneControl、Glo

9、beControl、TOCControl、ToolbarControl、SymbologyControl 和 LicensenControl 控件等,除了这些, 该库还包括大量可以有 ToolbarControl 调用的内置 commands、tools、Menus,它们可以极大地简化二次 开发工作。 Extensions 在图中我们可看出,ArcEngine 的开发体系是一条纵线,功能丰富,层次清晰。最上层的 Extensions 包含 了许多高级开发功能,如 GeoDatabase Update、空间分析、三维分析、网络分析、Schematics 逻辑示意图 以及数据互操作等。ArcEng

10、ine 标准版并不包含这些 ArcObjects 许可,他们只能作为扩展存在,需要特定 的 License 才能运行。 ArcGIS Engine 中的类库 ArcGIS Engine 开发中,为了更好的管理这些 COM 对象,ESRI 将这些 COM 对象放在不同的组件库中,而他 们被物理的防盗 bin 目录下的 dll 中,而逻辑上被分散到不同的命名空间中 System System 库是ArcGIS 架构中最底层的库。该库包含了暴露组成ArcGIS 的其它库所使用的服务的组件。 System 库中定义了许多接口,它们可以由开发者来实现。AoInitializer 对象在System 中定

11、义;所有开 发者必须使用该对象在使用Engine 功能的应用程序中初始化和uninitialize ArcGIS Engine。开发者不扩 展该库,但可以通过实现其中的接口来扩展ArcGIS系统。 SystemUI SystemUI 库中包含了可在ArcGIS Engine 中扩展的用户界面组件的接口定义,包括ICommand、ITool 和 IToolControl 接口。开发者使用这些接口来扩展UI 组件。该库所包含的对象是utility 对象,开发者可 用于简化某些用户界面的开发。开发者不扩展该库,但可以通过实现其中的接口来扩展ArcGIS 系统。 Geometry Geometry 库

12、处理存储在特征类(feature classes)或其它图形要素(graphical elements)中的特征的 geometry 或shape。大多数用户交互的基本几何对象有Point 、MultiPoint 、Polyline和Polygon 。除了 这些顶层的实体,还有作为Polylines 和Polygons 构建模块的几何体(geometries)。这些是组成几何体的 基元(primitives)。它们是Segments、Paths 和Rings。Polylines和Polygons 由形成一条Path 的依次相 连的Segments 组成。一个Segment 包含两个不同的点,

13、起点和终点,和一个定义从起点到终点的曲线的要素类型。这种segments 有CircularArc、Line、 EllipticArc 和BezierCurve。所有的几何对象都可以有与它们顶点相关的Z、M 和IDs。基本的几何对象都 支持几何操作,如Buffer 和Clip。开发者不可以扩展几何基元。GIS 中的实体是指现实世界中的特征;这 些现实世界中的特征的位置由具有空间参考的几何体来定义。投影和地理坐标系统的空间参考对象都包含 在Geometry 库中。开发者可以通过在空间参考间添加新的空间参考和投影来扩展空间参考系统。 Display Display 库包含了用于GIS 数据显示的对

14、象。除了负责实际图像输出的主要显示对象,该库中还包含了表 示颜色和符号的对象,这些颜色和符号用于控制显示上所绘制实体的属性。库中也包含了为用户在与显示 交互时提供可视化反馈的对象。开发者大都通过类似于Map 或PageLayout 对象提供的视图与显示交互。该 库的所有部分都可以被扩展,常被扩展的有符号、颜色和显示反馈(display feedbacks)。 Output Output 库被用于创建图形输出到设备,如打印机、绘图仪和硬拷贝格式,如增强型图元文件(enhanced metafiles)和栅格影像格式(JPG、BMP 等)。开发者使用该库和ArcGIS 系统其它部分中的对象来创建图

15、形 输出。通常这些是Display 和Carto 库中的对象。开发者可以扩展output 库用于定制的设备和输出格式 。 GeoDatabase GeoDatabase 库提供了用于geodatabase 的编程API。Geodatabase 是一个构建在标准工业关系和对象数据 库技术基础上的地理数据储存库。库中的对象为ArcGIS 支持的所有数据源提供了统一的编程模型。 GeoDatabase 库定义了许多由架构中较高层次数据源提供者实现的接口。开发者可以扩展geodatabase 来 支持特殊的数据对象(Features、Classes 等)类型。此外,还可以使用PlugInDataSou

16、rce 对象添加自定义 的矢量数据源。geodatabase 支持的native 数据类型不可以被扩展。 DataSourcesFile DataSourcesFile 库包含用于基于文件数据源的GeoDatabase API 的实现。这些基于文件的数据源包括 shapefile、coverage、TIN、CAD、SDC、ArcGIS StreetMap和VPF。开发者不能扩展DataSourcesFile 库。 DataSourcesGDB DataSourcesGDB 库包含了用于数据库数据源的GeoDatabase API 的实现。这些数据源包括Microsoft Access 和SDE

17、甛u-28817?件支持的RDBMSs。开发者不能扩展DataSourcesGDB库。 DataSourceOleDB DataSourcesOleDB 库包含用于Microsoft OLE DB 数据源的GeoDatabase API 的实现。该库只有在 Microsoft Windows 操作系统上才可以使用。这些数据源包括任何OLE DB 支持的数据提供者和文本文件工 作空间。开发者不能扩展DataSourcesOleDB库。 DataSourceRaster DataSourcesRaster 库包含了用于Raster 数据源的GeoDatabase API 的实现。这些数据源包括SD

18、E 软件支 持的RDBMSs,和所有支持的RDO栅格文件格式。当需要支持新的栅格 格式时,开发者不扩展该库,而是扩展RDO。开发者不扩展DataSourcesRaste 库。 GeoDatabaseDistributed GeoDatabaseDistributed 库通过提供数据导入、导出geodatabase 的工具来支持到企业geodatabase 的分 布式访问。开发者不扩展GeoDatabaseDistributed 库。 Carto Carto 库支持地图的创建和显示;这些地图可以包含一幅地图或具有多幅地图和相关旁注的页中的数据。 PageLayout 对象是宿主一幅或多幅地图和相

19、关旁注(指北针、图例、比例尺条等)的容器。Map 对象是图层 的容器。Map 对象有操作地图中所有图层的属性:空间参考、地图比例尺等,还有操作地图图层的方法。 有多种不同类型的图层可以被加载到地图中。不同数据源通常有一个相关图层负责在地图上显示数据;矢 量特征由FeatureLayer 对象处理,栅格数据由RasterLayer 对象处理,TIN 数据由TinLayer 对象处理等。 若需要,图层可以为它们的相关数据处理所有的绘制操作。但更常见的是图层拥有一个相关的Renderer 对 象。Renderer 对象的属性控制数据在地图中怎样显示。Renderers 一般使用Display 库中的

20、symbols 进行 实际绘图;renderer 只是匹配指定的符号与要绘制的实体的属性。一个Map 和一个PageLayout 可以包含 要素(elements)。要素利用几何体来定义它在地图或页面上的位置,以及控制要素显示的行为。有用于基 本形状、文本标注、复杂旁注等的要素。Carto 库也包含对地图注记和动态标注的支持。 Location Location 库包含支持地理编码和与route 事件一起工作的对象。可通过full 控件的finegrained对象访问 地理编码功能,或GeocodeServer 对象提供了一个简化的API。开发者可以创建他们自己的地理编码对象 。 线性参考功能

21、提供了添加事件到线性特征的对象,并使用多种绘制方法渲染这些事件。开发者可以扩展线 性参考功能。 NetworkAnalysis NetworkAnalysis 库提供的对象在网络加载到geodatabase 中时,使用网络数据和对象populating a geodatabase 来分析网络。开发者可以扩展该库来支持定制的网络跟踪。该库是用于utility 网络的 gas lines、electricity supply lines 等。 Controls 开发者使用Controls 库来构建或扩展具有ArcGIS 功能的应用程序。ArcGIS Controls 通过封装 ArcObjects

22、 和提供一个coarser-grained API,简化了开发过程。尽管控件封装了fine grained ArcObjects, 但它们并不限制访问这些ArcObjects。MapControl 和PageLayoutControl分别封装了Carto 库中的Map 和 PageLayout 对象。ReaderControl 封装了Map 和PageLayout对象,并在使用该控件时提供了简化的API。 如果地图出版商拥有授权许可,那么开发者可 以访问Map 和PageLayout 控件的类似方式访问内部对象。该库也包含实现内容列表的TOCControl 和宿主 与一个合适控件一起工作的命令

23、和工具的ToolbarControl GeoAnalyst GeoAnalyst 库包含支持核心空间分析功能的对象。这些功能在ArcGIS Spatial Analyst和ArcGIS 3D Analyst库中使用。开发者可以通过创建一个新的栅格操作类型来扩展该库。要求有ArcGIS Spatial Analyst 或3D Analyst 许可才能使用该库中的对象。 3DAnalyst 3DAnalyst 库包含在三维场景中使用的对象,它们的工作方式类似于Carto 库中包含的对象在二维地图中 工作。Scene 对象是库中的主要对象之一,因为它与Map 对象类似,是数据的容器。Camera 和

24、Target 对 象根据特征相对于观察者的位置,指定场景的视图。一个场景(scene)包含一个或多个图层;这些图层指定 了场景中的数据和数据怎样绘制。 3DAnalyst 库拥有一个开发控件和一组和该控件协同工作的命令和工具。该控件可以与Controls 库中的对 象联合使用。除了创建命令和工具,开发者对该库的扩展较少。使用该库中的对象需要3D Analyst 许可 。 GlobeCore GlobeCore 库包含与globe 数据一起工作的对象,工作方式类似于Carto 库中包含的对象在二维地图中工 作。Globe 对象是库中的主要对象之一,因为它与Map 对象类似,是数据的容器。Glob

25、eCamera 对象根据 globe 相对于观察者的位置,指定了Globe 视图。Globe 可以有一个或多个图层;这些图层指定了Globe 上 的数据和数据怎样绘制。 介绍完这些,让我们有个感性上的认识,在以后找某个对象的时候,知道去哪个 dll 中找。 二和 ArcGIS Engine 开发相关的 C#知识 接口编程 使用 ArcGIS Engine,也就意味着使用里面的接口,那么什么是接口呢?在面向对象的编程中,我们都会 接触到这个玩意儿,我们知道面向对象有三大特性 封装,继承,多态,相信很多人在学习多态的时候, 会接触接口。 接口可以用这样一句话来描述“接口就是包含一系列不被实现的方法

26、.而把这些方法的实现交给继承它的 类.”,这句话看起来很晦涩,没关系,我们通过下面一个例子说明 我定义了一个接口 IPeople using System; using System.Collections.Generic; using System.Text; namespace InterfaceTest interface IPeople void gender(); 这个接口里面有一个性别的方法,这个只对方法进行了定义,而方法内却没有内容,也就是说,通过这个 接口的这个 gender 方法,我们不能知道它到底干什么,但是要知道这个 gender 到底是干什么用的,那么 就要看实现了这个

27、方法的类。同理我定义两个类,分别实现这个接口。 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace InterfaceTest class Boy:IPeople public void gender() Console.WriteLine(Im a boy.);using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace In

28、terfaceTest class Girl:IPeople public void gender() Console.WriteLine(Im a girl.); 通过上面的两个类,我们就很清楚的看到这个方法的作用了,我们也可以看到一个接口可以被多个类实现。 我们运行一下这个,看一下效果 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace InterfaceTest class Program static void Main(string args)

29、IPeople Person; / 声明接口变量 Person = new Boy(); / 实例化,接口变量中存放对象的引用 Person.gender(); / 这个调用的是 Boy 中的 gender 方法 Person = new Girl(); / 实例化,接口变量中存放对象的引用 Person.gender(); / 这个调用的是 Gril 中的 gender 方法 Console.ReadLine(); 运行结果如下: C#接口的例子 快速掌握 OMD 我们已经知道使用 ArcGIS Engine 开发,也就意味着我们要和接口打交道,ArcGIS Engine 中提供的接口 和类

30、加起来估计上万,但是用过 ArcGIS Engine 的人,知道这个数字不为过。ArcGIS Engine 为了帮助我 们方便的使用这些,将这些分散在不同的类库中,为了便于我们阅读,ArcGIS Engine 提供了一系列的对 象模型图,也就是 OMD (Object model diagrams) 对象模型图表。 下面图示中,便是贯穿本节的对象模型图的钥匙。 这些符号是基于 UML 画图工具创建的,UML 符号是面向对象分析和设计的工业图样标准。 对象模型图中提供的信息非常多,是对象浏览器中信息的重要补充。Visual Basic,或者其它的开发环境, 都会列出所有的类和成员,但不会指明这些

31、类之间的关系。所以,对象模型图是非常有利于读者对 ArcInfo 组件的理解的! 本书使用 UML 来描述 ArcInfo 组件,即 ArcObjects,并描述你能够创建的数据模型。 以下详细说明。 1. 类和对象 在 UML 图中有三种类型的类:抽象类(abstract class)、组件类(CO class)与普通类(instantiable class)。 抽象类:不能创建或实例化,从来没有一个抽象类的实例用于定义子类的公共接口,创建实例的任务由其 子类完成。子类继承其定义的接口。 OMD 符号为:二维的内部有阴影的矩形。 普通类:不能创建,从别的对象获得实例。 OMD 符号为:3D

32、矩形内部没有阴影。 组件类:可以直接创建实例的类,在 C#中,用 New 关键字。 OMD 符号为:带阴影的 3D 矩形符号。 2. 关联 在抽象类、可创建类和可实例化类之间,有几种存在的关联(或称关系)。 联系(association)便描述了类之间的关联。在两端的类中可以定义多重性( Multiplicity)关联。 在这张图上,一个业主能有拥有一块或多块宗地;同样地,一块宗地可以被一个 或多个业主所共有。 多重性关联就是限制对象类与其它对象关联的数目关系。以下是用于多重性关联 的符号: 1 一个并且只有一个,这种多样性是可选的;如果不标明,则默认为“1” 0.1 零个或一个 M.N 从

33、M 到 N(正整数) *或者 0 * 从零到任意正整数 1 * 从一到任意正整数 多个联系 在这张图上,我们可以得知有不 类继承(type inheritance)定义了专门的类,它们拥有超类的属性和方法,并且同时也有自身的属性和方 法。 上图说明 primary line 和 secondary line 是 line 的一种类型。 实例化(Instantiation)指定一个类的对象有这样的方法,它能够创建另外一个类的对象。 pole 对象有一个方法能够创建 transformer 对象。 聚合(Aggregation)是一种不对称的关联方式,在这种方式下一个类的对象被认为是一个“整体”,

34、而另一 个类的对象被认为是“部件”。 一个 transformer bank 正好有 3 个 transformer 。在这个图中 transformer 能和一个 transformer bank 相关联,但当 transformer bank 移除以后,transformer 依然能够存在。 组成(Composition)是一种更为强壮的聚合方式,此种方式下,“整体”对象控制着“部分”对象的生存时间。 一个 Pole 包含一个或多个 Crossarm。在这个图中当 pole 被移除后,Crossarm 就不能再使用了。因为 Pole 控制着 Crossarm 的生存时间。 在 OMD 图中

35、,我们不仅仅能看到类之间的相互关系,还可以得到属性的一些信息,如下图: 属性和方法: 属性:哑铃状的图标,Read(左侧的实心哑铃)和 write(右侧的实心哑铃) 属性除了我们常说的类型,还有一种属性,这个属性本身就是一个对象,符号,空心的哑铃 方法:指向左侧的箭头。 抽象类(AbstractClass)defines how it is done.79 页 Explroing ArcObjects V9.0)ArcEngline 组件库的每一个组件中定义有不同的类,类下面定义了不同接口,接口中包含不同的属性和方 法。类之间有类型继承(Typelnheritance)关系,接口之间有互相调用

36、(Querylnterface)及相互继承 (Interfacelnheritance)关系。 1.1 类与对象在面向对象编程中,类和对象是两个非常重要的概念,可以这么说类就是创建对象的蓝本,而 对象是指具有属性和动作的实体,它封装了一个客观实体的属性与行为。ArcObjcets 中有三类 class,分别是 、组件类(CoClass)和普通类(Class)。抽象类的主要目的是为它的子类定义公共 接口,一个抽象类将把它的部分或全部实现延迟到子类中,因此,一个抽象类不能被实例化。一个组件类 对象可以被直接创建,普通类对象虽然不能直接创建,但它可以可以作为其它类的一个属性或者从其它类 的实例化来创

37、建。 1.2 接口和类接口定义了一组方法和属性,在 ArcObjects 中接口名称都以”I”开始,如 IMap , Ilayer 等。类 实现了接口中的方法。一个类可以有多个接口,如 FeatureLayerClass 类有 IFeatureLayer,IFeatureSelection 等不同接口,而一个接口也可被多个类所拥有,如 CadFeatureLayer 类和 FeatureLayer 类都有 IFeatureLayer 接口。接口定义了能做什么,而定义了该怎么做(The interfacedefines what an object can do, and the class ,

38、在 AO 开发的时候,和对象间的通信是通过接口完 成的,而不是我们在一些其他面向对象语言如(Java)中和对象的通信是通过对象完成的. 1.3 接口查询(QueryInterface) 一个类可以有多个接口,声明了接口变量并且指向一个对象的时候,这个变 量只能使用该接口内的方法和属性,而不能访问其他接口中的方法和属性,如: Dim pMap as IMap Set pMap = New Map pMap.Clear 这里会产生错误此时的 pMap 只能使用 IMap 接口中定义的方法和属性,比如获取 图层的个数,添加图层等,但是不能清空视图上的内容(因为这个方法是在 IActiveView 中

39、定义的) QueryInterface(QI)很方便的让我们在一个类的不同接口间进行切换: Dim pView as IActiveView set pView= pMap QI 现在 mView 就可以使用 IActiveView 中定义的方法了. 1.4 类类型继承类型继承是指类之间的接口类型的继承,而不是继承其实现。继承过来的接口只是名称相 同,具体的实现则不同。比如 ShpfileWorkspaceFactry 和 AccessWorkspaceFactry 都继承 WorkspaceFactry , 而他们的打开(OpenFromFile)方法却不一样,ShpfileWorkspac

40、eFactry 的(OpenFromFile)方法需要一个 文件目录位置作为参数,而 AccessWorkspaceFactry 的(OpenFromFile)方法需要一个数据库(mdb)位置 作为参数。1.5 接口继承如 ImapFrame 接口和 IMapSurroundFrame 接口继承于 IFrameElement 接口,则父类 接口 IFrameElement 所具有的方法和属性对派生接口 ImapFrame 和 IMapSurroundFrame 都有效。 快速理解 QI C#+QI 的例子 COM 中,和我们打交道的是接口,也就是说类对我们是隐形的,那么我们要做开发,要使用这些

41、功能,我 们只能通过接口,通过接口暴露出来的方法,COM 是一种服务器端/客户端架构,服务器端定义了操作的方 法,客户端通过接口调用这些方法。下面的这幅图很能说明 COM 的结构: 言归正传,说这篇博文的主题 QI,还记得上一篇我强调的,一个接口可以被多个类实现,而 QI 要解决的 就是一个类实现多个接口的问题。在 COM 中,接口定义了方法,类实现了接口中定义的方法,而一个接口 只能使用自己内部定义的方法,而不能越界,就好比一个班级一样,这个班级内有班长,有学习委员,有 体育委员,每位干部各司其职,每一位干部负责自己职权范围之内的事情,各位干部相互协作,解决班级 内的事情,这班级内的每一位干

42、部就相当于一个接口,而这个班级就相当于实现了这些接口的类。当这个 班级的一些事情需要班长处理的时候,我们就执行班长这个接口中定义的方法,当需要学习委员处理的话, 我们再将执行权交给学习委员这个接口,这也就是接口之间的互相访问(Query Interface),通过这个我 们大体上对 QI 有了感性上的认识,下面我们通过实例演示一下。 我定义了两个接口 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace QITest interface IFavoriteF

43、ood void Food(); using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace QITest interface IVoice void Voice(); 然后定义了一个Cat的类实现这里面的方法 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace QITest class Cat:IFavoriteFood ,

44、IVoice public void Food() Console.WriteLine(我喜欢的食物是老鼠.);public void Voice() Console.WriteLine(喵,喵,喵.); 这个Cat类的功能就是实现两个接口的方法,猫最喜欢的事物是老鼠,而他的声音是“喵,喵, 喵”。 运行下 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace QITest class Program static void Main(string args

45、) IVoice pVoice = new Cat(); pVoice.Voice();/只能调用IVoice中定义的方法 / pVoice.Food();这个就会报错,因为 IVoice 接口中没有这个方法的定义 IFavoriteFood pFavoriteFood = pVoice as IFavoriteFood; pFavoriteFood.Food();/只能调用IFavoriteFood定义的方法 Console.ReadLine(); 效果如下: 三使用控件创建第一个桌面应用程序 1) 新建一个 Windows 窗体应用程序(文件-新建-项目-Windos 窗体应用程序) 2)

46、在点了确定之后,在 VS 的工具箱中找到到和 ArcEngine 相关的控件 其中,AxMapControl 就是 Map 地图控件,AxPageLayouControl 是布局地图控件, AxTOCControl 是目录控件,AxToolbarControl 是 GIS 工具栏控件, AxSceneControl 是 Scene 三维场景控件,axGlobeControl 是 Globe 控件, AxLicenseControl 是许可控件,AxSymbologyControl 是符号选择器控件, AxArcReaderControl 是 ArcReader 控件,AxArcReaderGl

47、obeControl 是 ArcReaderGlobe 控件。AxLicenseControl 是许可控件,一般 GIS 系统中都必须 添加,否则无法使用。将刚才的窗体的名称改为 Engine 3)然后添加 Toc, Map, Toolbar 控件。许可控件是首选的,否则无法使用 添加完这几个控件后,VS 会自动为我们添加一些引用 4)添加地图文档(Map 控件-右键-属性) 5)Toolbar 控件和 Toc 控件与 Map 控件的关联(设置 Buddy 属性) 6)在 Toolbar 中进行设置(Toolbar 控件-右键-属性-Itmes 选项) 7)添加工具命令 在 Toolbar c

48、ontrol 上右键属性在 items 选项卡中添加几个工具命令 8)运行我们的应用程序,发现下面的错误 出现这个问题的原因是因为 ArcGIS 10 发生了变化,将下面的语句添加到使用 AO 对象的前面: ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Engine); 如我放在 Main 函数中 利用刚才添加的打开文档的命令打开一个新的文档 也可利用上面的放大,缩小工具进行简单的操作了。 在上面,当我们将这些空间拖到窗体中的时候,会自动加载一些 dll,我们知道 ArcGIS Engine 编程,也就意味着和 COM 对象接触

49、。 代码加载 Mxd 文档 用代码添加 Mxd 文档,用到 AxMapControl.LoadMxFile(sFilePath),我们只要将 Mxd 文档的路 径传给这个方法即可。我们添加一个按钮: 在这个按钮的单击事件中填写如下代码: OpenFileDialog OpenMXD = new OpenFileDialog(); OpenMXD.Title = 打开地图; OpenMXD.InitialDirectory = E:; OpenMXD.Filter =Map Documents (*.mxd)|*.mxd; if (OpenMXD.ShowDialog() = DialogRes

50、ult.OK) string MxdPath = OpenMXD.FileName; axMapControl1.LoadMxFile(MxdPath);控件的 LoadMxFile 是用来加载地图文档的 我们将刚才写的代码封装成一个函数 public string OpenMxd() string MxdPath = ; OpenFileDialog OpenMXD = new OpenFileDialog(); OpenMXD.Title = 打开地图; OpenMXD.InitialDirectory = E:; OpenMXD.Filter = Map Documents (*.mxd

51、)|*.mxd; if (OpenMXD.ShowDialog() = DialogResult.OK) MxdPath = OpenMXD.FileName;return MxdPath;添加 Shape 文件 AxMapControl 还包含下面三个方法用来添加不同类型的数据 这些方法的使用和上面的相似,方法中的参数可能不同,对于 AddShapeFile 来说,它需要两个参数,第一 个参数是 shp 文件名所在的目录,第二个是文件名,因为打开 shp 文件要两个参数,所以构造一个数组, 用来返回相应的参数 代码如下: public string OpenShapeFile() strin

52、g ShpFile = new string2; OpenFileDialog OpenShpFile = new OpenFileDialog(); OpenShpFile.Title = 打开Shape文件; OpenShpFile.InitialDirectory = E:; OpenShpFile.Filter = Shape文件(*.shp)|*.shp; if (OpenShpFile.ShowDialog() = DialogResult.OK) string ShapPath = OpenShpFile.FileName; /利用将文件路径分成两部分 int Position

53、= ShapPath.LastIndexOf(); string FilePath = ShapPath.Substring(0,Position); string ShpName = ShapPath.Substring(Position+1); ShpFile0 = FilePath; ShpFile1 = ShpName;return ShpFile;庖丁解牛识控件 ArcGIS Engine 中提供了很多的控件,这些控件和 ArcMap 中的一些东西有对应关系的: ArcGIS Engine 中的 MapControl 控件和 PageLayoutControl 控件分别对应于 Arc

54、Map 中的数据 视图和布局视图,MapControl 控件主要用于空间数据的显示和分析,它封装了地图对象, 而 PageLayoutControl 控件是用于地图的修饰和整理,可以用来生成专题图等,它封装了 PageLayout 对象。 TOCControl 控件和 ToolbarControl 控件分别对应 ArcMap 中的 Table of Contents 控件和工具条 控件,这两个控件都有一个 buddy 属性,这两个控件需要和一个伙伴空间协同工作,伙伴 控件可以是 MapControl,PageLayoutContro,SceneControl 或者 globeControl 控

55、件。 IMapDocument pMapDocument = new MapDocumentClass(); if (pMapDocument.get_IsMapDocument(path) pMapDocument.Open(path, null); IMap pMap; for (int i = 0; i 0) axMapControl2.Map = new MapClass(); for (int i = 0; i 0) if (e.button = 1) IPoint pPoint = new PointClass(); pPoint.PutCoords(e.mapX, e.mapY)

56、; axMapControl1.CenterAt(pPoint); axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); else if (e.button = 2) IEnvelope pEnv = axMapControl2.TrackRectangle(); axMapControl1.Extent = pEnv; axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography

57、, null, null); 运行后的效果如下: TOCContro 控件 TOCControl 控件使用的是用伙伴控件中的数据地图,它控制图层是否在伙伴控件空显示以及 和伙伴控件在符号上保持一致,TOCControl 为用户提供了一个交互式的环境,如果 TOCControl 控件的伙伴控件是 MapControl 控件,当我们将 TOCControl 控件中图层删掉是, MapControl 控件中相应的图层也会被删掉。 显示属性表的信息 我们知道 ArcMap 中的 Table of Contents 有很多功能,如下图: 而 ArcGIS Engine 提供的 TOCControl 控件

58、几乎没有提供,那么这些都是需要自己开发的,在 这里我做一个显示属性表的功能。 分析:要显示某一个图层的属性表,首先要将这个图层选中,然后在另外一个 Form 中将选 中的这个图层的属性信息进行显示。 添加一个上下文菜单,添加一个新的 Form 窗体,在这个新的窗体上添加 GridView 控件,并 在 TOCControl 控件的 OnMouseDown 事件下添加如下代码(pGlobalFeatureLayer 是我定义的一个全局变量): private void axTOCControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IT

59、OCControlEvents_OnMouseDownEvent e) if (axMapControl1.LayerCount 0) esriTOCControlItem pItem = new esriTOCControlItem(); pGlobalFeatureLayer = new FeatureLayerClass(); IBasicMap pBasicMap = new MapClass(); object pOther = new object(); object pIndex = new object(); axTOCControl1.HitTest(e.x, e.y, re

60、f pItem, ref pBasicMap, ref pGlobalFeatureLayer, ref pOther, ref pIndex); if (e.button = 2) context.Show(axTOCControl1, e.x, e.y); 在上下文菜单的打开属性表的 Click 事件中添加如下代码: private void 打开属性表ToolStripMenuItem_Click(object sender, EventArgs e) FormTable Ft = new FormTable(pGlobalFeatureLayer as IFeatureLayer);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论