基于C#语言的ArcGIS Engine开发基础与技巧(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-26 18:27:35

点击下载

作者:芮小平,于雪涛

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

基于C#语言的ArcGIS Engine开发基础与技巧

基于C#语言的ArcGIS Engine开发基础与技巧试读:

前言

ArcGISEngine是Esri公司推出的用于构建定制GIS应用程序的组件库,目前已经成为GIS二次开发的主流工具。本书作者结合多年ArcGISEngine项目开发的经验,将GIS理论知识和实际应用相结合,在Visual Studio 2010.NET开发环境下,以C#作为开发语言,结合大量实例,介绍了利用ArcGISEngine10.0自行设计GIS应用程序的技巧和方法,详细介绍了利用ArcGISEngine进行GIS二次开发的方法、过程和技巧。

本书围绕GIS系统中常见功能的程序实现展开,对每部分所涉及的ArcGISEngine接口、实现接口的类,以及对应的属性和方法进行了详细介绍,在此基础上进一步介绍如何使用ArcGISEngine实现这些功能,并给出了具体的实现过程。

全书共12章,第1章为ArcGISEngine概述;第2章为ArcGISEngine基础;第3章介绍地图数据加载;第4章介绍地图符号化;第5章介绍地图整饰与输出;第6章介绍几何对象和空间参考;第7章介绍地图编辑;第8章介绍空间查询;第9章介绍专题地图制作;第10章介绍矢量数据空间分析;第11章介绍栅格数据空间分析;第12章介绍ArcGIS Engine程序的发布。

为便于读者理解和练习,本书还将相关源代码上传到华信数育资源网上(网址:www.hxedu.com.cn),内附与本书相关的工程实例,突出编程实践和具体应用,以使读者能有效了解和掌握ArcGlS Engine开发的实战技术。由于本书目标是让读者能够真正应用ArcGlS Engine来进行项目研发,因此实例中代码的量较大,在书中只是展示了实现某种功能最主要的代码,而实际开发过程中可能更多涉及的是与界面及事件相关的代码,读者可以根据本书提供的实例进行代码细读。

本书主要由芮小平、于雪涛编著,其中芮小平负责本书第2章至第10章内容的编写,于雪涛负责本书第1章、第11章和第12章内容的编写。全书由芮小平统稿。

本书是作者多年使用ArcGISEngine进行项目研发经验的总结,可作为地理信息系统专业或计算机相关专业的教学辅导用书,也可作为从事地理信息系统工作的教师、学生、技术人员和开发人员的参考资料。

感谢研究生盛宣玮、姚峰峰、李浩明和撖志恒同学对本书实例在ArcGISEngine 9.3版本中进行了实现;感谢研究生曲小康同学对本书实例在ArcGISEngine 10.0版本中进行了实现。

由于作者水平有限,以及编写时间仓促,书中错漏之处在所难免,敬请读者批评指正。编著者2015年1月第1章ArcGIS Engine概述1.1 ArcGISEngine介绍

ArcGISEngine是一组完整的嵌入式GIS组件,开发人员可用来创建新的应用程序。应用ArcGISEngine可以将GIS功能嵌入到已有的应用系统中或建立集中式自定义应用程序,将高级的GIS功能分发给大量用户使用。

ArcGISEngine是Esri公司ArcGIS产品体系中的一员,因此在使用ArcGISEngine开发之前,首先来了解一下ArcGIS的产品体系,如图1-1所示。图1-1 ArcGIS的产品体系

由图1-1可知,ArcGIS产品主要包括ArcGIS Desktop、ArcGISEngine、ArcGIS Server、ArcIMS、ArcGIS Mobile、ArcSDE等,可以发现:ArcGIS的主要产品是基于一个可共享的GIS组件——ArcObjects的组件库来构建的。本书所介绍的ArcGISEngine是ArcObjects的一个子集,Esri公司之所以发布ArcGISEngine开发包,是想提供ArcGIS Desktop框架之外使用的一套GIS组件,因为在ArcGISEngine发布之前,基于ArcObjects的开发只能在庞大的ArcGIS Desktop框架下进行。ArcObjects是由平台独立的COM对象组成,ArcGISEngine在核心ArcObjects组件上又做了一次封装,故开发人员可以轻松地用来构建自定义GIS和制图应用程序。

ArcGIS作为一个可伸缩的平台,无论是通过桌面、服务器、移动终端还是Web应用,都可以为个人用户或群体用户提供GIS的功能。它包含了4个主要部署GIS的框架。

1.桌面GIS——ArcGIS Desktop

桌面GIS是一套完整的、可升级的软件系统。在这套软件系统中,功能最弱的是ArcReader,它是一个免费分发的、用于查看地图的软件。比它功能强大的依次是ArcView、ArcEditor和ArcInfo。ArcView、ArcEditor和ArcInfo并不是一个软件的名称,它是桌面GIS的一种版本代码,这3种版本的软件系统都是由ArcMap、ArcCatalog、ArcScene等单个软件组成的,但是它们包含的GIS功能不一样。在这3种版本中,ArcView功能最弱,ArcInfo的功能最强,它包含了ArcGIS全部的GIS功能。

2.嵌入式GIS——ArcGISEngine

ArcGISEngine是一个用于创建客户化GIS桌面应用程序的开发产品。ArcGISEngine是基于ArcObjects之上的,ArcObjects是ArcGIS产品构建的一套核心组件。

1)使用ArcGISEngine定制的典型案例(1)在现有的应用程序上添加动态的地图和GIS功能,或者开发出全新的定制化地图及GIS解决方案。(2)在字处理文档和电子表格中嵌入GIS功能,如在Excel添加地图控制功能。(3)为了支持平板电脑而开发的高级编辑功能,注重于GIS字段编辑的应用程序(定制的轻量级ArcEditor应用)。

2)ArcGISEngine产品组成

ArcGISEngine主要由两个产品组成:构建软件所用的开发工具包以及使已完成的应用程序能够运行的可再发布的Runtime(运行时环境)。(1)ArcGISEngine开发工具包。

ArcGISEngine开发工具包是一个基于组件的软件开发产品,可用于构建自定义GIS和制图应用软件。它并不是一个终端用户产品,而是软件开发人员的工具包。ArcGIS Engine将这些可视化的控件以.NET控件、JavaBeans组件和ActiveX控件的形式提供给用户使用,开发者工具包支持Windows、Linux和Solaris等操作系统。ArcGISEngine将控件、工具、工具条和类库等自动添加到开发环境中,方便程序员进行嵌入式GIS应用的开发。采用ArcGISEngine进行应用程序开发一般都要从ArcGIS Desktop开始,利用桌面产品的制图、数据编辑和空间处理模型等功能。ArcGISEngine提供对C++、.NET和Java的支持,这样开发者可以选择自己熟悉的开发框架和计算机操作系统来进行开发工作。

(2)ArcGISEngine Runtime.

ArcGISEngine Runtime也包含了ArcObjects的核心组件,能够运行一个定制的ArcGIS Engine应用程序,同时也必须随着定制程序一起安装。

ArcGISEngine运行时具有许多种扩展能力,可以用来进行额外应用功能的开发。它所支持的扩展功能与ArcGIS桌面产品的扩展是一样的。另外,当这些扩展被使用时,都需要相对应的ArcGISEngine运行时的授权。

3.服务器GIS——ArcIMS、ArcGIS Server和ArcSDE

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

4.移动GIS——ArcPad以及ArcGIS Mobile

移动GIS提供了移动领域内的GIS应用方案。ArcPad提供了从地理信息创建到访问的功能,并且支持GPS的无线移动设备,目前已经越来越多地应用在野外数据采集和信息访问中。ArcGIS Desktop和ArcGISEngine可以运行在便携式电脑或平板电脑上,用户可以在野外进行数据采集、分析及制定决策。1.2 ArcGISEngine的主要特点

ArcGISEngine是一个用于建立自定义独立地理信息系统(GIS)应用程序的平台,支持多种应用程序接口(Application Program Interfaces,APIs),拥有许多高级GIS功能,而且构建在工业标准基础之上。

ArcGISEngine是开发人员用于建立自定义应用程序的嵌入式GIS组件的一个完整类库。开发人员可以使用ArcGISEngine将GIS功能嵌入到现有的应用程序中。ArcGISEngine的功能非常强大,用其开发可以实现以下功能:(1)地图交互:地图漫游、缩放、识别、书签等。(2)地图创建:地图显示、投影、符号化、分类、标注、打印等。(3)地图分析:地图选择、计算、缓冲区分析,切割等。(4)数据创建:数据创建、编辑,地理编码,读/写MXD文件。(5)应用程序的开发。(6)控件开发等。1.3 ArcGISEngine与其他组件的区别与联系

国际上较为常见的GIS组件主要有Esri公司的MapObjects、ArcGISEngine,MapInfo公司的MapX;国内的主要产品有SuperMap Objects、MapGIS等。组件式GIS已经广泛地应用于我国的各个行业及部门,开发的产品也很多,功能也由于应用方向不同而有所不同。

首先讨论美国环境系统研究所公司(EnvironmentalSystemsResearchInstituteInc.,Esri公司)的两个产品MapObjects和ArcGISEngine。ArcGIS Engine的基础是ArcObjects(简称AO),AO是Esri公司ArcGIS家族中应用程序的开发平台,是基于Microsoft COM技术所构建的一系列COM组件集。AO不是一个独立的应用产品,是依附在ArcGIS Desktop产品中的软件开发包。MapObjects是Esri公司推出的一个轻量级可嵌入的制图与地理信息系统组件集合,它包括一个OLE控件(OCX)并提供了40个OLE对象,可以插入到VisualBasic、VisualC++等支持工业标准的Windows开发环境中调用。ArcGISEngine是开发人员用于建立自定义应用程序的嵌入式GIS组件的完整类库。ArcGISEngine包括核心ArcObjects的功能,是对AO中的大部分接口、类等进行封装所构成的嵌入式组件,组件接口、方法、属性与AO是相同的。

AO、ArcGISEngine和MapObjects三者的联系与区别是:AO最为完善,包括了所有的类库,其中,有ArcMap、ArcMapUI、ArcCatalog、ArcCatalogUI等组件库,而ArcGIS Engine为它的一个缩减;AO提供的控件只有MapControl和PageLayoutControl两个,而ArcGIS Engine的控件就丰富很多;所有使用ArcGISEngine开发的软件,在AO环境中使用没有问题,但是使用AO开发的程序,如果使用的组件库不被包含在ArcGIS Engine中,则无法使用。MapObjects功能最简单,主要面向小型的地理信息系统开发,如地图浏览和查询系统等。在开发环境的要求方面也有不同,基于AO的开发需要安装ArcGIS Desktop全套软件,而ArcGISEngine、MapObjects是独立的嵌入式开发平台,无须ArcGIS Desktop支持。

MapX、SuperMap Objects、MapGIS等相比于Esri公司的MapObjects、ArcGISEngine,首先在采用的数据格式上存在差异,不同公司的GIS组件产品都采用各自GIS平台的数据格式。在功能方面,不同的GIS组件产品也有各自的侧重点。所以在选择GIS组件产品时,应根据开发项目的具体情况,分析比较各个GIS组件产品对于该项目的适用程度,选择合适的GIS组件产品,将会给项目的成功起到至关重要的作用。1.4 ArcGISEngine 10.0的安装

ArcGISEngine10.0需要.NET Framework4.0的支持,所以需要首先安装.NET Framework4.0,其安装说明这里就不再赘述,只详细介绍ArcGISEngine 10.0的安装步骤及说明。

第一步:单击ArcGISEngine的安装包,出现如图1-2所示的选择其相应的支持平台界面,选择“ArcObjects SDK for the Microsoft.NET Framework”选项,然后单击“Setup”按钮,进入下一步。

第二步:出现欢迎安装ArcGISEngine的界面,如图1-3所示,单击“Next”按钮进入下一步。

第三步:出现许可协议界面,如图1-4所示,选择“I accept the license agreement”选项,然后单击“Next”按钮继续。

第四步:出现选择安装内容和安装目录的界面,如图1-5所示,选择好需要安装的内容和安装目录后,单击“Next”按钮,进入下一步。图1-2 选择ArcGISEngine相应的支持平台界面图1-3 欢迎安装ArcGISEngine的界面图1-4 许可协议界面图1-5 选择安装内容和安装目录的界面

第五步:进入准备安装界面,如图1-6所示,单击“Next”按钮,完成安装配置。图1-6 准备安装界面

出现程序安装进度界面,如图1-7所示。图1-7 程序安装进度界面

第六步:ArcGISEngine 10.0的许可。

ArcGISEngine 10.0开始已经从Ecp方式转换成Desktop的方式,在没有安装ArcGISEngine的情况下,ArcGIS Administrator程序并不能设置ArcGISEngine的功能(如授权)。可以单击ArcGIS用户程序下面的“ArcGIS Administrator”,出现“ArcGIS管理器”对话框,选择“ArcGIS Engine运行时(浮动使用)”选项,如图1-8所示。图1-8 “ArcGIS管理器”对话框

查看“ArcGIS→Engine→可用性”,许可模块数目为12个。在浮动许可方式下,Esri公司并没有浮动的ArcGISEngine Developer Kit许可,也就是说开发包许可方式仅仅是单机许可方式。

ArcGISEngine的模块名称如图1-9所示。图1-9 ArcGISEngine的模块名称1.5 第一个ArcGISEngine 10.0程序的开发

现在利用控件创建一个桌面应用程序。

第一步:首先打开Visual Studio 2010,选择Visual C#编程语言,创建一个Windows窗体应用程序项目,如图1-10所示。图1-10 创建Visual C#的Windows窗体应用程序

第二步:进一步添加ArcGISEngine的相关引用,可以在选择.NET框架下的相关类库,如图1-11所示。图1-11 添加ArcGISEngine的相关引用

第三步:单击“确定”按钮之后,即可在Visual Studio的工具箱中找到与ArcGIS Engine相关的控件。其中,MapControl是Map地图控件;PageLayouControl是布局地图控件;TOCControl是目录控件;ToolbarControl是GIS工具栏控件;SceneControl是Scene三维场景控件;GlobeControl是Globe控件;LicenseControl是许可控件;SymbologyControl是符号选择器控件;ArcReaderControl是ArcReader控件;ArcReaderGlobeControl是ArcReaderGlobe控件。LicenseControl是许可控件,一般GIS系统中都必须添加,否则无法使用。各控件的图标如图1-12所示。

第四步:在窗体上添加TOCControl、MapControl、ToolbarControl控件及LicenseControl控件,如图1-13所示。图1-12 ArcGISEngine控件的图标图1-13 添加了ArcGISEngine控件的窗体

第五步:配置License。右键单击LicenseControl控件,选择“属性”命令,弹出其“属性”对话框如图1-14所示,为本应用程序选择需要的ArcGIS产品和扩展许可。图1-14 License“属性”对话框

第六步:添加地图文档。右键单击MapControl控件,选择“属性”命令,弹出其“属性”对话框如图1-15所示,在“Map Document”选项中,选择要添加的.mxd地图文档。

第七步:将Toolbar控件和TOC控件与Map控件关联。分别右键单击ToolbarControl控件和TOCControl控件,选择其相应的“属性”命令,分别在“属性”对话框中设置控件的“Bubby”选项为窗体中添加的Map控件,如图1-16所示。图1-15 Map“属性”对话框图1-16 将Toolbar控件和TOC控件与Map控件关联

第八步:在Toolbar控件中添加常用的命令及工具。右键单击ToolbarControl控件,选择其“属性”命令,弹出“属性”对话框。在“Items”选项卡中添加常用的命令及工具,然后单击“应用”按钮,如图1-17所示。图1-17 在Toolbar控件中添加常用的命令及工具

第九步:ArcGISEngine10.0有一些明显的产品架构上的变更。新架构最明显的优势是:ArcGISDesktop和ArcGISEngine可以分别独立存在。用户可以将ArcGISDesktop和ArcGISEngineRuntime安装在不同的目录下。用户也可以分别为ArcGISEngineRuntime和ArcGISDesktop打补丁。但是这种构架的变化要求用户将ArcGISEngineRuntime程序以及自定义组件绑定到其机器上指定的产品。独立应用程序既可绑定到ArcGISDesktop也可以绑定到ArcGISEngine Runtime。但是用户必须在使用AO之前做绑定。因此,需要将下面语句添加到使用AO对象的前面。一般在program.cs主函数前添加代码如下:

或者通过“项目→AddArcGISLicenseChecking”命令,运行ArcGIS LicenseInitialzer Wizard,生成LicenseInitializer.cs。

整个代码如下所示:

第十步:单击“运行”按钮,完成了首个基于ArcGISEngine开发的应用程序,可以实现简单的GIS功能,如图1-18所示。图1-18 首个基于ArcGISEngine开发的应用程序界面1.6 ArcGISEngine从9.3升级到10.0方法

随着ArcGISEngine10.0的推出,许多项目或程序需要将以前9.3版本开发的程序升级到10.0版本以适应软件升级的需要。升级范围主要包括:要将开发环境Visual Studio 2008升级到2010,.NET Framework从3.5版本升级到4.0版本,ArcGISEngine从9.3版本升级到10.0版本。具体操作步骤如下所述。

1.升级项目

用Visual Studio 2010打开项目,自动提示升级,以默认配置升级即可。

2.更改.NET版本

在Visual Studio 2010下选择“Project→Properties”,在“Application”选项卡中把Target framework改成.NET Framework 4。

3.更新引用

首先将包含ESRI的引用全都删掉,然后重新添加,再追加一个ESRI.ArcGIS.Version,这是ArcGISEngine10.0特有的。

4.更改代码适应C#4

这部分内容比较多,主要是由于ArcGISEngine有些方法的命名空间发生了变化,这需要用户仔细查看相关代码所属的类库和命名空间。有一点需要指出的是,Visual Studio 2010下C#使用的是C#4,它对COM Interop的调用进行了改进,在创建CoClass对象时需要把类名的Class后缀去掉,不允许使用CoClass本身,而必须用相应的接口来创建对象。

例如:ILine line=new LineClass();

改为:ILine line=new Line();

形如LineClass一类的×××Class,统统不能用new创建实例,也不能用来声明变量类型。

再如:PolygonClass polygon=new PolygonClass();

改为:GeometryCollection polygon=new Polygon() as IGeometryCollection;

5.添加RuntimeManager.Binding

program.cs主函数前添加代码如下:

6.关于Embed Interop Type(嵌入互操作类型)

当出现类似“event invocation for COM objects requires event to be attributed with DispIdAttribute”时,需要将其所引用的Embed Interop Type属性改成False。当设置为True时,该COM组件的交互类型信息将在编译时被嵌入到项目的类库中。当设置为False时,该COM组件的交互类型都需要一个额外的Primary Interop Assemblies(PIA)来提供。但是.NET中已经将其封装了,对开发者而言是透明的。第2章ArcGIS Engine基础2.1 接口的定义2.1.1 COM的基本概念

ArcGISEngine是对ArcObjects的再次封装,而ArcObjects是基于Microsoft的COM技术开发的一套COM组件对象集,所以在利用ArcGISEngine进行二次开发时,要采用面向接口编程的开发方式。

组件对象模型(Component Object Model,COM)是一种跨应用和语言共享二进制代码的方法。ATL实现了源码级重用,但只能用于C++语言。Windows使用DLLs共享二进制代码,但DLLs是针对C语言接口而写的,只能被C语言或理解C语言调用规范的语言使用。COM通过定义二进制标准解决了这些问题,即COM明确指出二进制模块(DLLs和EXEs)必须被编译成与指定的结构相匹配。这个标准也确切规定了在内存中如何组织COM对象。COM定义的二进制标准还必须独立于任何编程语言。一旦满足了这些条件,就可以轻松地从任何编程语言中存取这些模块。由编译器负责所产生的二进制代码与标准兼容。

接口是一组函数集合,这些函数被称为方法。接口名字以大写的I开头,例如C++语言中的IShellLink。接口被设计成一个抽象基类,只有纯粹的虚拟函数。接口可以从其他接口继承,这里所说的继承的原理就好像C++语言中的单继承。接口是不允许多继承的。

组件对象类(Component object class,CoClass)被包含在DLL或EXE中,并且包含着一个或者多个接口的代码。组件对象类(CoClass)实现这些接口,COM对象在内存中表现为组件对象类(CoClass)的一个实例。COM服务器包含了一个或多个CoClass的二进制模块(DLL或EXE),可以称作COM组件。每个COM组件都有一个全球唯一标识符(Globally Uunique Identifier,GUID)标识,GUID是一个128位的数字,它是一种独立于COM编程语言的标识方法。每一个接口和CoClass有一个GUID。因为每一个GUID都是全球唯一的,所以避免了重名冲突。

COM可以通过注册的方式注册到计算机上。注册(Registration)是创建注册表入口的一个过程,告诉Windows操作系统COM服务器放在什么位置。取消注册(UnRegistration)则相反——从注册表删除这些注册入口。2.1.2 使用COM对象

每一种语言都有其自己处理对象的方式。例如,C++语言是在栈中创建对象,或者用new动态分配。因为COM必须独立于语言,所以COM库为自己提供对象管理例程。COM中,调用库中的API来创建一个新对象。同时,所有的对象保持它们自己的引用计数。调用者必须通知对象什么时候用完这个对象。当引用计数为零时,COM对象将自己从内存中释放。为了创建COM对象并从这个对象获得接口,必须调用COM库中的API函数CoCreateInstance()。为了释放COM对象,只要告诉它们已经用完该对象。IUnknown是每一个COM对象必须实现的接口,它有一种方法Realease()。调用这种方法通知COM对象不再需要该对象。一旦调用了这种方法之后,就不能再次使用这个接口。如果应用程序需使用许多不同的COM对象,因此在用完某个接口后调用Release()就显得非常重要。如果不释放接口,这个COM对象将保留在内存中,这会增加不必要的内存开销。如果应用程序需要长时间运行,就应该在应用程序处于空闲期间调用CoFreeUnused Libraries() API。这个API将卸载任何没有明显引用的COM服务器,因此这也降低了应用程序使用的内存开销。2.1.3 IUnknown接口

每一个COM接口都派生于IUnknown。IUnknown有以下3种方法。(1)AddRef():通知COM对象增加它的引用计数。如果进行了一次接口指针的复制,就必须调用一次这种方法,并且原始的值和复制的值两者都要用到。(2)Release():通知COM对象减少它的引用计数。(3)QueryInterface():从COM对象请求一个接口指针。当CoClass实现一个以上的接口时,就要用到这种方法。2.1.4 面向接口编程

使用ArcGISEngine,也就意味着使用里面的接口,其可以解释为几个没有主题代码的方法定义组成的集合体,有唯一的名称,可以被类或其他接口所实现。

面向对象的编程,有3大特性:封装、继承和多态,在其中都会接触到接口。

接口定义了一组方法和属性,在ArcObjects中接口名称都以“I”开始,如IMap,ILayer等。类实现了接口中的方法。一个类可以有多个接口,如FeatureLayerClass类有IFeatureLayer,IFeatureSelection等不同接口,而一个接口也可被多个类所拥有,如CadFeatureLayer类和FeatureLayer类都有IFeatureLayer接口。接口定义了能做什么,而类定义了该怎么做。在ArcObjects开发时,和对象间的通信是通过接口完成的,而不是在一些其他面向对象语言(如Java)中和对象的通信是通过对象完成的。一个类可以有多个接口,声明了接口变量并且指向一个对象时,这个变量只能使用该接口内的方法和属性,而不能访问其他接口中的方法和属性。

现在通过一个实例具体说明(首先定义一个接口IPerson):

该接口里面有FirstName、LastName两个属性和Save一种方法,但只对该方法进行了定义,却没有实现的内容,也就是说,通过IPerson接口的Save方法,我们不能知道它到底要干什么,但是要知道这个Save到底是干什么用的,就要看实现了这个方法的类。同理我们定义了Student类和Employee类来实现这个接口。

Student类和Employee类都继承自IPerson,并实现了其属性与方法。可以看到,两个类都实现了各自的Save方法,但是执行该方法的作用却不同,所以不同类虽然继承相同的接口,但实现了不同的功能,并且可以有自己属性或方法,这就是面向对象编程中的多态性。

采用面向接口编程在系统分析和架构中,需要分清层次和依赖关系。每个层次不是直接向其上层提供服务的,而是通过定义一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接口依赖,而不依赖具体类。这样做的好处是显而易见的,首先对系统灵活性大有好处。当下层需要改变时,只要接口及接口功能不变,则上层不用做任何修改,甚至可以在不改动上层代码时将下层整个替换掉。2.1.5 接口访问

在COM中,一个接口可以被多个类实现,一个类也实现多个接口。接口定义了方法,类实现了接口中定义的方法,一个接口只能使用自己内部定义的方法。因为一个类可以实现多个接口,每个接口只可以访问自己定义的方法,如果要使用定义在别的接口中的方法就需要将这个接口“切换”过去,也就是进行接口访问(QueryInterface,QI)。下面给出一个接口访问的例子,读者可以仔细揣摩。2.2 什么是对象模型图

要学习基于COM标准的ArcObjects,阅读对象模型图(Object Model Diagram,OMD)是基本的功力,通过阅读ArcObjects的OMD,可以很快地熟悉ArcObjects的结构和不同组件之间的关系,也可以帮助用户很快掌握ArcObjects开发所用接口的方法及参数类型。

OMD是基于统一建模语言(Unified Modeling Language,UML)基础上的,它补充了在对象浏览器中看不到的信息。OMD好比城市的道路图,可以帮助程序员来了解类之间的关系,如何从一个类到另一个类,选择正确的接口,获取需要的属性和方法等,这对于走出ArcObjects的迷宫非常重要。下面先详细说明UML描述ArcObjects组件的一些基本术语。

1.对象模型基本概念

1)类和对象

ArcGISEngine组件库的每一个组件中定义有不同的类,类下面定义了不同接口,接口中包含不同的属性和方法。类之间有类型继承(Type Inheritance)关系,接口之间有互相调用(Query Interface)及相互继承(Interface Inheritance)关系。ArcObjects中有3种类Class,分别是抽象类(AbstractClass)、组件类(CoClass)和普通类(Class)。抽象类的主要目的是为它的子类定义公共接口,一个抽象类将把它的部分或全部实现延迟到子类中,因此,一个抽象类不能被实例化。一个组件类对象可以被直接创建,普通类对象虽然不能直接创建,但它可以作为其他类的一个属性或者从其他类的实例化来创建。

在UML图中有3种类型的类:抽象类(Abstract Class)、可创建类(Createable Class)与可实例化类(Instantiable Class)。抽象类不能用以创建新对象,但可以用来指定子类。可创建类指的是那些能够直接使用开发环境中的对象定义语法来创建的对象。可实例化类不能直接创建新对象,但这种类的对象能够作为其他对象的属性被创建或是从其他类的方法中创建。

2)类之间的关系

在抽象类、可创建类和可实例化类之间,有几种存在的关联。

联系(Association)便描述了类之间的关联。在两端的类中可以定义多重性(Multiplicity)关联。

如图2-1所示,一个业主能拥有一块或多块宗地;同样的,一块宗地可以被一个或多个业主所共有。多重性关联就是限制对象类与其他对象关联的数目关系。图2-1 业主和宗地的关系

以下是用于多重性关联的符号(一个并且只有一个,这种多样性是可选的;如果不标明,则默认为“1”):(1)0..1——零个或一个。(2)M..N——从M到N(正整数)。(3)*或者0..*——从零到任意正整数。(4)1..*——从1到任意正整数。

类继承(Type Inheritance)定义了专门的类,它们拥有超类的属性和方法,并且同时也有自身的属性和方法。

如图2-2所示,说明Primary line 和Secondary line是Line的一种类型。

类实例化(Instantiation)指定一个类的对象有这样的方法,它能够创建另外一个类的对象。

如图2-3所示,Pole对象有一个方法能够创建Transformer对象。图2-2 类继承的示例图2-3 类实例化的示例

类聚合(Aggregation)是一种不对称的关联方式,在这种方式下一个类的对象被认为是一个“整体”,而另一个类的对象被认为是“部件”。

如图2-4所示,一个Transformer bank正好有3个Transformer,在这个图中Transformer能和一个Transformer bank相关联,但当Transformer bank移除以后,Transformer依然能够存在。图2-4 类聚合的示例

类组合(Composition)是一种更为强壮的聚合方式,此种方式下,“整体”对象控制着“部分”对象的生存时间。

如图2-5所示,一个Pole包含一个或多个Crossarm。在这个图中Pole被移除后,Crossarm就不能再使用了。因为Pole控制着Crossarm的生存时间。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载