爱问 爱问共享资料 爱问分类
首页 > > > ArcEngine10开发手册.pdf

ArcEngine10开发手册.pdf

ArcEngine10开发手册.pdf

上传者: RushEr100
638次下载 0人收藏 暂无简介 简介 2012-03-26 举报

简介:ESri 内部engine资料,从入门开始讲起,非常详细,值得拥有!!!

内部文档,请勿外传ArcGISEngine10开发手册ESRI中国(北京)有限公司2011年9月1/336内部文档,请勿外传制定及修订记录版本完成日期编写/修订纪要编写者备注V0.12011.3.4文档目录结构林雪淋/刘宇V0.22011.4.8完善控件介绍和空间数据库的介绍刘宇V0.32011.5.18完善栅格数据介绍刘宇V0.42011.6.25完善符号化介绍刘宇V0.52011.7.18完善网络分析功能刘宇V0.6201.8.26完善参考系的介绍刘宇V0.72011.9.3完善几何对象的介绍刘宇3/336内部文档,请勿外传目录1一.ArcGIS介绍..................................................................................................22二.和ArcGISEngine开发相关的C#知识....................................................103三.使用控件创建第一个桌面应用程序........................................................224四.空间数据库................................................................................................715五.几何对象和空间参考..............................................................................1216六.矢量数据空间分析..................................................................................1547七.符号化......................................................................................................1698八.栅格数据分析..........................................................................................2029九.编辑..........................................................................................................23710十.地图输出..................................................................................................26011十一.ArcGISEngine实战................................................................................26312十二.安装部署.................................................................................................3034/336内部文档,请勿外传1一.ArcGIS介绍ArcGIS软件架构1.1ArcGIS是ESRI在全面整合了GIS与数据库、软件工程、人工智能、网络技术及其它多方面的计算机主流技术之后,成功地推出了代表GIS最高技术水平的全系列GIS产品。ArcGIS是一个全面的,可伸缩的GIS平台,为用户构建一个完善的GIS系统提供完整的解决方案。ArcGIS的基本体系能够让用户在任何需要的地方部署GIS功能和业务逻辑,无论是在桌面、服务器、还是在野外:桌面GIS(ArcGISDesktop)—ArcGIS桌面GIS软件产品是用来编辑、设计、共享、管理和发布地理信息和概念。ArcGIS桌面可伸缩的产品结构,从ArcReader,向上扩展到ArcView、ArcEditor和ArcInfo。目前ArcInfo被公认为是功能最强大的GIS产品。通过一系列的可选的软件扩展模块,ArcGISDesktop产品的能力还可以进一步得到扩展。嵌入式GIS(EmbeddedGIS)—ArcGISEngine是一个完整的嵌入式GIS组件库和工具包,开发者能用它创建一个新的、或扩展原有的可定制的桌面应用程序。使用ArcGISEngine,开发者能将GIS功能嵌入到已有的应用程序中,如基于工业标准的产品以及一些商业应用,也可以创建自定义的应用程序,为组织机构中5/336内部文档,请勿外传的众多用户提供GIS功能。服务器GIS(ServerGIS)—ArcGISServer、ArcIMS和ArcSDE用于创建和管理基于服务的GIS应用程序,在大型机构和互联网上众多用户之间共享地理信息。ArcGISServer是一个中心应用服务器,它包含一个可共享的GIS软件对象库,能在企业和Web计算框架中建立服务器端的GIS应用。ArcIMS是通过开放的Internet协议发布地图、数据和元数据的可伸缩的网络地图服务器。ArcSDE是在各种关系型数据库管理系统中管理地理信息的高级空间数据服务器。移动GIS(MobileGIS)—ArcPad,支持GPS的无线移动设备,越来越多地应用在野外数据采集和信息访问中。ArcGIS桌面和ArcGISEngine可以运行在便携式电脑或平板电脑上,用户可以在野外进行数据采集、分析和乃至制定决策。ArcGISEngine介绍1.2ArcGISEngine是一组完备的并且打包的嵌入式GIS组件库和工具库,开发人员可用来创建新的或扩展已有的桌面应用程序。使用ArcGISEngine,开发人员可以将GIS功能嵌入到已有的应用软件中,如自定义行业专用产品;或嵌入到商业生产应用软件中,如MirosoftfWord和Excel;还可以创建集中式自定义应用软件,并将其发送给机构内的多个用户。ArcGISEngine由两个产品组成:构建软件所用的开发工具包以及使已完成的应用程序能够运行的可再发布的Runtime(运行时环境)。ArcGISEngine开发工具包是一个基于组件的软件开发产品,可用于构建自定义GIS和制图应用软件。它并不是一个终端用户产品,而是软件开发人员的工具包,适于为Windows、UNIX或Linux用户构建基础制图和综合动态GIS应用软件。ArcGISEngineRuntime是一个使终端用户软件能够运行的核心ArcObjects组件产品,并且将被安装在每一台运行ArcGISEngine应用程序的计算机上。ArcGISEngine是基于COM技术的可嵌入的组件库和工具包,ArcGISEngine可以帮助我们很轻松的构建自定义应用程序.6/336内部文档,请勿外传使用ArcGISEngine,开发人员可以将GIS功能嵌入到已有的应用软件中,如自定义行业专用产品;或嵌入到商业生产应用软件中,如MirosoftfWord和Excel;还可以创建集中式自定义应用软件,并将其发送给机构内的多个用户。ArcGISEngine由两个产品组成:面向开发人员的软件开发包(ArcGISEngineDeveloperkit)面向最终用户的运行时(ArcGISEngineRuntime)ArcGISEngine开发工具包是一个基于组件的软件开发产品,可用于构建自定义GIS和制图应用软件。它并不是一个终端用户产品,而是软件开发人员的工具包,支持四种开发环境(C++,COM,.NET,以及Java),适于为Windows、UNIX或Linux用户构建基础制图和综合动态GIS应用软件。ArcGISEngineRuntime是一个使终端用户软件能够运行的核心ArcObjects组件产品,并且将被安装在每一台运行ArcGISEngine应用程序的计算机上。ArcGISEngine的逻辑体系结构:BaseServices包含了ArcGISEngine中最核心的ArcObjects组件,几乎所有的GIS组件需要调用它们,如Geometry和Display等。DataAccess包含了访问矢量或栅格数据的GeoDatabase所有的接口和类组件。MapPresentation包含了GIS应用程序用于数据显示、数据符号化、要素标注和专题图制作等需要的接口和类组件。DevelperComponents包含了进行快速开发所需要的全部可视化控件,如MapControl、PageLayoutControl、SceneControl、GlobeControl、TOCControl、ToolbarControl、SymbologyControl和LicensenControl控件等,除了这些,该库还包括大量可以有ToolbarControl调用的内置commands、tools、Menus,它们可以极大地简化二次开发工作。Extensions在图中我们可看出,ArcGISEngine的开发体系是一条纵线,功能丰富,层次清晰。最上层的Extensions7/336内部文档,请勿外传包含了许多高级开发功能,如GeoDatabaseUpdate、空间分析、三维分析、网络分析、Schematics逻辑示意图以及数据互操作等。ArcGISEngine标准版并不包含这些ArcObjects许可,他们只能作为扩展存在,需要特定的License才能运行。注意:ArcGISEngine运行时有多种版本级别,从标准版本一直到企业版本。标准的ArcGISEngine运行时提供所有ArcGIS应用程序的核心功能。这个级别的ArcGISEngine运行时可以操作几种不同的栅格和矢量格式、进行地图表达和创建以及通过执行各种空间或属性查询查找要素。这个级别的ArcGISEngine运行时还可以进行基本数据创建、编辑Shapefile和简单的个人地理数据库(PersonalGeodatabase)及GIS分析但是如果遇到企业级数据库(ArcGISSDE)数据库的编辑以及复杂数据模型的创建(网络,拓扑)就需要EnterpriseGeodatabaseUpdate许可.ArcGISEngine运行时的标准许可相当于ArcGIS桌面View级别的功能,而EnterpriseGeodatabaseUpdate许可相当于ArcGIS桌面Editor级别的功能.8/336内部文档,请勿外传ArcGISEngine中的类库1.3ArcGISEngine开发中,为了更好的管理这些COM对象,ESRI将这些COM对象放在不同的组件库中,而他们被物理的防盗bin目录下的dll中,而逻辑上被分散到不同的命名空间中,下面我们详细对一些类库进行介绍:VersionVersion库是ArcGIS10新出来的一个类库,该类库包含了将独立应用程序绑定到特定的ArcGIS系列产品的函数和方法,该类库是在运行Engine的应用程序的时候SystemSystem库是ArcGIS架构中最底层的库。该库包含了暴露组成ArcGIS的其它库所使用的服务的组件。System库中定义了许多接口,它们可以由开发者来实现。AoInitializer对象在System中定义;所有开发者必须使用该对象在使用Engine功能的应用程序中初始化和uninitializeArcGISEngine。开发者不扩展该库,但可以通过实现其中的接口来扩展ArcGIS系统。SystemUISystemUI库中包含了可在ArcGISEngine中扩展的用户界面组件的接口定义,包括ICommand、ITool和IToolControl接口。开发者使用这些接口来扩展UI组件。该库所包含的对象是utility对象,开发者可用于简化某些用户界面的开发。开发者不扩展该库,但可以通过实现其中的接口来扩展ArcGIS系统。GeometryGeometry库处理存储在特征类(featureclasses)或其它图形要素(graphicalelements)中的特征的geometry或shape。大多数用户交互的基本几何对象有Point、MultiPoint、Polyline和Polygon。除了这些顶层的实体,还有作为Polylines和Polygons构建模块的几何体(geometries)。这些是组成几何体的基元(primitives)。它们是Segments、Paths和Rings。Polylines和Polygons由形成一条Path的依次相连的Segments组成。一个Segment包含两个不同的点,起点和终点,和一个定义从起点到终点的曲线的要素类型。这种segments有CircularArc、Line、EllipticArc和BezierCurve。所有的几何对象都可以有与它们顶点相关的Z、M和IDs。9/336内部文档,请勿外传基本的几何对象都支持几何操作,如Buffer和Clip。开发者不可以扩展几何基元。GIS中的实体是指现实世界中的特征;这些现实世界中的特征的位置由具有空间参考的几何体来定义。投影和地理坐标系统的空间参考对象都包含在Geometry库中。开发者可以通过在空间参考间添加新的空间参考和投影来扩展空间参考系统。DisplayDisplay库包含了用于GIS数据显示的对象。除了负责实际图像输出的主要显示对象,该库中还包含了表示颜色和符号的对象,这些颜色和符号用于控制显示上所绘制实体的属性。库中也包含了为用户在与显示交互时提供可视化反馈的对象。开发者大都通过类似于Map或PageLayout对象提供的视图与显示交互。该库的所有部分都可以被扩展,常被扩展的有符号、颜色和显示反馈(displayfeedbacks)。OutputOutput库被用于创建图形输出到设备,如打印机、绘图仪和硬拷贝格式,如增强型图元文件(enhancedmetafiles)和栅格影像格式(JPG、BMP等)。开发者使用该库和ArcGIS系统其它部分中的对象来创建图形输出。通常这些是Display和Carto库中的对象。开发者可以扩展output库用于定制的设备和输出格式。GeoDatabaseGeoDatabase库提供了用于geodatabase的编程API。Geodatabase是一个构建在标准工业关系和对象数据库技术基础上的地理数据储存库。库中的对象为ArcGIS支持的所有数据源提供了统一的编程模型。GeoDatabase库定义了许多由架构中较高层次数据源提供者实现的接口。开发者可以扩展geodatabase来支持特殊的数据对象(Features、Classes等)类型。此外,还可以使用PlugInDataSource对象添加自定义的矢量数据源。geodatabase支持的native数据类型不可以被扩展。DataSourcesFileDataSourcesFile库包含用于基于文件数据源的GeoDatabaseAPI的实现。这些基于文件的数据源包括shapefile、coverage、TIN、CAD、SDC、ArcGISStreetMap和VPF。开发者不能扩展DataSourcesFile库。DataSourcesGDBDataSourcesGDB库包含了用于数据库数据源的GeoDatabaseAPI的实现。这些数据源包括MicrosoftAccess和SDE软件支持的RDBMSs。开发者不能扩展DataSourcesGDB库。DataSourceOleDB10/336内部文档,请勿外传DataSourcesOleDB库包含用于MicrosoftOLEDB数据源的GeoDatabaseAPI的实现。该库只有在MicrosoftWindows操作系统上才可以使用。这些数据源包括任何OLEDB支持的数据提供者和文本文件工作空间。开发者不能扩展DataSourcesOleDB库。DataSourceRasterDataSourcesRaster库包含了用于Raster数据源的GeoDatabaseAPI的实现。这些数据源包括SDE软件支持的RDBMSs,和所有支持的RDO栅格文件格式。当需要支持新的栅格格式时,开发者不扩展该库,而是扩展RDO。开发者不扩展DataSourcesRaste库。GeoDatabaseDistributedGeoDatabaseDistributed库通过提供数据导入、导出geodatabase的工具来支持到企业geodatabase的分布式访问。开发者不扩展GeoDatabaseDistributed库。CartoCarto库支持地图的创建和显示;这些地图可以包含一幅地图或具有多幅地图和相关旁注的页中的数据。PageLayout对象是宿主一幅或多幅地图和相关旁注(指北针、图例、比例尺条等)的容器。Map对象是图层的容器。Map对象有操作地图中所有图层的属性:空间参考、地图比例尺等,还有操作地图图层的方法。有多种不同类型的图层可以被加载到地图中。不同数据源通常有一个相关图层负责在地图上显示数据;矢量特征由FeatureLayer对象处理,栅格数据由RasterLayer对象处理,TIN数据由TinLayer对象处理等。若需要,图层可以为它们的相关数据处理所有的绘制操作。但更常见的是图层拥有一个相关的Renderer对象。Renderer对象的属性控制数据在地图中怎样显示。Renderers一般使用Display库中的symbols进行实际绘图;renderer只是匹配指定的符号与要绘制的实体的属性。一个Map和一个PageLayout可以包含要素(elements)。要素利用几何体来定义它在地图或页面上的位置,以及控制要素显示的行为。有用于基本形状、文本标注、复杂旁注等的要素。Carto库也包含对地图注记和动态标注的支持。LocationLocation库包含支持地理编码和与route事件一起工作的对象。可通过full控件的finegrained对象访问地理编码功能,或GeocodeServer对象提供了一个简化的API。开发者可以创建他们自己的地理编码对象。线性参考功能提供了添加事件到线性特征的对象,并使用多种绘制方法渲染这些事件。开发者可以扩展线性参考功能。11/336内部文档,请勿外传NetworkAnalysisNetworkAnalysis库提供的对象在网络加载到geodatabase中时,使用网络数据和对象populatingageodatabase来分析网络。开发者可以扩展该库来支持定制的网络跟踪。该库是用于utility网络的——gaslines、electricitysupplylines等。Controls开发者使用Controls库来构建或扩展具有ArcGIS功能的应用程序。ArcGISControls通过封装ArcObjects和提供一个coarser-grainedAPI,简化了开发过程。尽管控件封装了finegrainedArcObjects,但它们并不限制访问这些ArcObjects。MapControl和PageLayoutControl分别封装了Carto库中的Map和PageLayout对象。ReaderControl封装了Map和PageLayout对象,并在使用该控件时提供了简化的API。如果地图出版商拥有授权许可,那么开发者可以访问Map和PageLayout控件的类似方式访问内部对象。该库也包含实现内容列表的TOCControl和宿主与一个合适控件一起工作的命令和工具的ToolbarControlGeoAnalystGeoAnalyst库包含支持核心空间分析功能的对象。这些功能在ArcGISSpatialAnalyst和ArcGIS3DAnalyst库中使用。开发者可以通过创建一个新的栅格操作类型来扩展该库。要求有ArcGISSpatialAnalyst或3DAnalyst许可才能使用该库中的对象。3DAnalyst3DAnalyst库包含在三维场景中使用的对象,它们的工作方式类似于Carto库中包含的对象在二维地图中工作。Scene对象是库中的主要对象之一,因为它与Map对象类似,是数据的容器。Camera和Target对象根据特征相对于观察者的位置,指定场景的视图。一个场景(scene)包含一个或多个图层;这些图层指定了场景中的数据和数据怎样绘制。3DAnalyst库拥有一个开发控件和一组和该控件协同工作的命令和工具。该控件可以与Controls库中的对象联合使用。除了创建命令和工具,开发者对该库的扩展较少。使用该库中的对象需要3DAnalyst许可。GlobeCoreGlobeCore库包含与globe数据一起工作的对象,工作方式类似于Carto库中包含的对象在二维地图12/336内部文档,请勿外传中工作。Globe对象是库中的主要对象之一,因为它与Map对象类似,是数据的容器。GlobeCamera对象根据globe相对于观察者的位置,指定了Globe视图。Globe可以有一个或多个图层;这些图层指定了Globe上的数据和数据怎样绘制。介绍完这些,让我们有个感性上的认识,在以后找某个对象的时候,知道去哪个dll中找。2二.和ArcGISEngine开发相关的C#知识接口编程2.1使用ArcGISEngine,也就意味着使用里面的接口,那么什么是接口呢?在面向对象的编程中,我们都会接触到这个玩意儿,我们知道面向对象有三大特性封装,继承,多态,相信很多人在学习多态的时候,会接触接口。接口可以用这样一句话来描述“接口就是包含一系列不被实现的方法.而把这些方法的实现交给继承它的类.”,这句话看起来很晦涩,没关系,我们通过下面一个例子说明我定义了一个接口IPeopleusingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceInterfaceTest{interfaceIPeople{voidgender();}}这个接口里面有一个性别的方法,这个只对方法进行了定义,而方法内却没有内容,也就是说,通过这个接口的这个gender方法,我们不能知道它到底干什么,但是要知道这个gender到底是干什么用的,那么就要看实现了这个方法的类。同理我定义两个类,分别实现这个接口。13/336内部文档,请勿外传usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceInterfaceTest{classBoy:IPeople{publicvoidgender(){Console.WriteLine("I‟maboy.");}}}usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceInterfaceTest{classGirl:IPeople{publicvoidgender(){Console.WriteLine("I‟magirl.");}}}通过上面的两个类,我们就很清楚的看到这个方法的作用了,我们也可以看到一个接口可以被多个类14/336内部文档,请勿外传实现。我们运行一下这个,看一下效果usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceInterfaceTest{classProgram{staticvoidMain(string[]args){IPeoplePerson;//声明接口变量Person=newBoy();//实例化,接口变量中存放对象的引用Person.gender();//这个调用的是Boy中的gender方法Person=newGirl();//实例化,接口变量中存放对象的引用Person.gender();//这个调用的是Gril中的gender方法Console.ReadLine();}}}运行结果如下:15/336内部文档,请勿外传2.1.1C#接口的例子2.1.2快速掌握OMD我们已经知道使用ArcGISEngine开发,也就意味着我们要和接口打交道,ArcGISEngine中提供的接口和类加起来估计上万,但是用过ArcGISEngine的人,知道这个数字不为过。ArcGISEngine为了帮助我们方便的使用这些,将这些分散在不同的类库中,为了便于我们阅读,ArcGISEngine提供了一系列的对象模型图,也就是OMD(Objectmodeldiagrams)对象模型图表。下面图示中,便是贯穿本节的对象模型图的钥匙。这些符号是基于UML画图工具创建的,UML符号是面向对象分析和设计的工业图样标准。对象模型图中提供的信息非常多,是对象浏览器中信息的重要补充。VisualBasic,或者其它的开发环境,都会列出所有的类和成员,但不会指明这些类之间的关系。所以,对象模型图是非常有利于读者对ArcInfo组件的理解的!在装了ArcGISEngine后,可以在安装目录下找到很多使用UML来描述ArcInfo组件的pdf,这些pdf详细的描述了ArcObjects,并描述你能够创建的数据模型,以下详细说明。1.类和对象16/336内部文档,请勿外传在UML图中有三种类型的类:抽象类(abstractclass)、组件类(COclass)与普通类(instantiableclass)。抽象类:不能创建或实例化,从来没有一个抽象类的实例用于定义子类的公共接口,创建实例的任务由其子类完成。子类继承其定义的接口。OMD符号为:二维的内部有阴影的矩形。普通类:不能创建,从别的对象获得实例。OMD符号为:3D矩形内部没有阴影。组件类:可以直接创建实例的类,在C#中,用New关键字。OMD符号为:带阴影的3D矩形符号。2.关联在抽象类、可创建类和可实例化类之间,有几种存在的关联(或称关系)。联系(association)便描述了类之间的关联。在两端的类中可以定义多重性(Multiplicity)关联。在这张图上,一个业主能有拥有一块或多块宗地;同样地,一块宗地可以被一个或多个业主所共有。多重性关联就是限制对象类与其它对象关联的数目关系。以下是用于多重性关联的符号:1——一个并且只有一个,这种多样性是可选的;如果不标明,则默认为“1”0..1——零个或一个M..N——从M到N(正整数)*或者0„*——从零到任意正整数1„*——从一到任意正整数在这张图上,我们知道一个对象可能和多个对象有联系类继承(typeinheritance)定义了专门的类,它们拥有超类的属性和方法,并且同时也有自身的属性和方法。17/336内部文档,请勿外传上图说明primaryline和secondaryline是line的一种类型。实例化(Instantiation)指定一个类的对象有这样的方法,它能够创建另外一个类的对象。pole对象有一个方法能够创建transformer对象。聚合(Aggregation)是一种不对称的关联方式,在这种方式下一个类的对象被认为是一个“整体”,而另一个类的对象被认为是“部件”。一个transformerbank正好有3个transformer。在这个图中transformer能和一个transformerbank相关联,但当transformerbank移除以后,transformer依然能够存在。组成(Composition)是一种更为强壮的聚合方式,此种方式下,“整体”对象控制着“部分”对象的生存时间。一个Pole包含一个或多个Crossarm。在这个图中当pole被移除后,Crossarm就不能再使用了。因为Pole控制着Crossarm的生存时间。18/336内部文档,请勿外传在OMD图中,我们不仅仅能看到类之间的相互关系,还可以得到属性的一些信息,如下图:属性和方法:属性:哑铃状的图标,Read(左侧的实心哑铃)和write(右侧的实心哑铃)属性除了我们常说的类型,还有一种属性,这个属性本身就是一个对象,符号,空心的哑铃方法:指向左侧的箭头。ArcGISEngline组件库的每一个组件中定义有不同的类,类下面定义了不同接口,接口中包含不同的19/336内部文档,请勿外传属性和方法。类之间有类型继承(Typelnheritance)关系,接口之间有互相调用(Querylnterface)及相互继承(Interfacelnheritance)关系。1.1类与对象在面向对象编程中,类和对象是两个非常重要的概念,可以这么说类就是创建对象的蓝本,而对象是指具有属性和动作的实体,它封装了一个客观实体的属性与行为。ArcObjcets中有三类class,分别是抽象类(AbstractClass)、组件类(CoClass)和普通类(Class)。抽象类的主要目的是为它的子类定义公共接口,一个抽象类将把它的部分或全部实现延迟到子类中,因此,一个抽象类不能被实例化。一个组件类对象可以被直接创建,普通类对象虽然不能直接创建,但它可以可以作为其它类的一个属性或者从其它类的实例化来创建。1.2接口和类接口定义了一组方法和属性,在ArcObjects中接口名称都以”I”开始,如IMap,Ilayer等。类实现了接口中的方法。一个类可以有多个接口,如FeatureLayerClass类有IFeatureLayer,IFeatureSelection等不同接口,而一个接口也可被多个类所拥有,如CadFeatureLayer类和FeatureLayer类都有IFeatureLayer接口。接口定义了能做什么,而定义了该怎么做(Theinterfacedefineswhatanobjectcando,andtheclassdefineshowitisdone.79页ExplroingArcObjectsV9.0),在AO开发的时候,和对象间的通信是通过接口完成的,而不是我们在一些其他面向对象语言如(Java)中和对象的通信是通过对象完成的.1.3接口查询(QueryInterface)一个类可以有多个接口,声明了接口变量并且指向一个对象的时候,这个变量只能使用该接口内的方法和属性,而不能访问其他接口中的方法和属性,如:DimpMapasIMapSetpMap=NewMappMap.Clear„这里会产生错误此时的pMap只能使用IMap接口中定义的方法和属性,比如获取图层的个数,添加图层等,但是不能清空视图上的内容(因为这个方法是在IActiveView中定义的)QueryInterface(QI)很方便的让我们在一个类的不同接口间进行切换:DimpViewasIActiveViewsetpView=pMap„QI现在mView就可以使用IActiveView中定义的方法了.1.4类类型继承类型继承是指类之间的接口类型的继承,而不是继承其实现。继承过来的接口只是名称相同,具体的实现则不同。比如ShpfileWorkspaceFactry和AccessWorkspaceFactry都继承WorkspaceFactry,而他们的打开(OpenFromFile)方法却不一样,ShpfileWorkspaceFactry的(OpenFromFile)方法需要一个文件目录位置作为参数,而AccessWorkspaceFactry的(OpenFromFile)方法需要一个数据库(mdb)位置作为参数。1.5接口继承如ImapFrame接口和IMapSurroundFrame接口继承于IFrameElement接口,则父类接口IFrameElement所具有的方法和属性对派生接口ImapFrame和IMapSurroundFrame都有效。20/336内部文档,请勿外传快速理解QI2.22.2.1C#+QI的例子COM中,和我们打交道的是接口,也就是说类对我们是隐形的,那么我们要做开发,要使用这些功能,我们只能通过接口,通过接口暴露出来的方法,COM是一种服务器端/客户端架构,服务器端定义了操作的方法,客户端通过接口调用这些方法。下面的这幅图很能说明COM的结构:言归正传,说这篇博文的主题QI,还记得上一篇我强调的,一个接口可以被多个类实现,而QI要解决的就是一个类实现多个接口的问题。在COM中,接口定义了方法,类实现了接口中定义的方法,而一个接口只能使用自己内部定义的方法,而不能越界,就好比一个班级一样,这个班级内有班长,有学习委员,有体育委员,每位干部各司其职,每一位干部负责自己职权范围之内的事情,各位干部相互协作,解决班级内的事情,这班级内的每一位干部就相当于一个接口,而这个班级就相当于实现了这些接口的类。当这个班级的一些事情需要班长处理的时候,我们就执行班长这个接口中定义的方法,当需要学习委员处理的话,我们再将执行权交给学习委员这个接口,这也就是接口之间的互相访问(QueryInterface),通过这个我们大体上对QI有了感性上的认识,下面我们通过实例演示一下。我定义了两个接口usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceQITest{interfaceIFavoriteFood{21/336内部文档,请勿外传voidFood();}}usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceQITest{interfaceIVoice{voidVoice();}}然后定义了一个Cat的类实现这里面的方法usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceQITest{classCat:IFavoriteFood,IVoice22/336内部文档,请勿外传{publicvoidFood(){Console.WriteLine("我喜欢的食物是老鼠.");}publicvoidVoice(){Console.WriteLine("喵,喵,喵...");}}}这个Cat类的功能就是实现两个接口的方法,猫最喜欢的事物是老鼠,而他的声音是“喵,喵,喵”。运行下usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceQITest{classProgram23/336内部文档,请勿外传{staticvoidMain(string[]args){IVoicepVoice=newCat();pVoice.Voice();//只能调用IVoice中定义的方法//pVoice.Food();这个就会报错,因为IVoice接口中没有这个方法的定义IFavoriteFoodpFavoriteFood=pVoiceasIFavoriteFood;pFavoriteFood.Food();//只能调用IFavoriteFood定义的方法Console.ReadLine();}}}效果如下:24/336内部文档,请勿外传3三.使用控件创建第一个桌面应用程序1)新建一个Windows窗体应用程序(文件--新建--项目--Windos窗体应用程序)2)在点了确定之后,在VS的工具箱中找到到和ArcGISEngine相关的控件其中,AxMapControl就是Map地图控件,AxPageLayouControl是布局地图控件,AxTOCControl是目录控件,AxToolbarControl是GIS工具栏控件,AxSceneControl是Scene三维场景控件,axGlobeControl是Globe控件,AxLicenseControl是许可控件,AxSymbologyControl是符号选择器25/336内部文档,请勿外传控件,AxArcReaderControl是ArcReader控件,AxArcReaderGlobeControl是ArcReaderGlobe控件。AxLicenseControl是许可控件,一般GIS系统中都必须添加,否则无法使用。将刚才的窗体的名称改为Engine.3)然后添加Toc,Map,Toolbar控件。许可控件是首选的,否则无法使用添加完这几个控件后,VS会自动为我们添加一些引用4)添加地图文档(Map控件-右键-属性)26/336内部文档,请勿外传5)Toolbar控件和Toc控件与Map控件的关联(设置Buddy属性)27/336内部文档,请勿外传6)在Toolbar中进行设置(Toolbar控件-右键-属性-Itmes选项)7)添加工具命令在Toolbarcontrol上右键—属性在items选项卡中添加几个工具命令28/336内部文档,请勿外传8)运行我们的应用程序,发现下面的错误出现这个问题的原因是因为ArcGIS10发生了变化,将下面的语句添加到使用AO对象的前面:ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Engine);如我放在Main函数中29/336内部文档,请勿外传利用刚才添加的打开文档的命令打开一个新的文档:30/336内部文档,请勿外传也可利用上面的放大,缩小工具进行简单的操作了。在上面,当我们将这些空间拖到窗体中的时候,会自动加载一些dll,我们知道ArcGISEngine编程,也就意味着和COM对象接触。代码加载Mxd文档3.1用代码添加Mxd文档,用到AxMapControl.LoadMxFile(sFilePath),我们只要将Mxd文档的路径传给这个方法即可。我们添加一个按钮:31/336内部文档,请勿外传在这个按钮的单击事件中填写如下代码:OpenFileDialogOpenMXD=newOpenFileDialog();OpenMXD.Title="打开地图";OpenMXD.InitialDirectory="E:";OpenMXD.Filter="MapDocuments(*.mxd)|*.mxd";if(OpenMXD.ShowDialog()==DialogResult.OK){stringMxdPath=OpenMXD.FileName;axMapControl1.LoadMxFile(MxdPath);}控件的LoadMxFile是用来加载地图文档的我们将刚才写的代码封装成一个函数publicstringOpenMxd(){stringMxdPath="";OpenFileDialogOpenMXD=newO

ArcEngine10开发手册.pdf

ArcEngine10开发手册.pdf

上传者: RushEr100
638次下载 0人收藏 暂无简介 简介 2012-03-26 举报

简介:ESri 内部engine资料,从入门开始讲起,非常详细,值得拥有!!!

内部文档,请勿外传ArcGISEngine10开发手册ESRI中国(北京)有限公司2011年9月1/336内部文档,请勿外传制定及修订记录版本完成日期编写/修订纪要编写者备注V0.12011.3.4文档目录结构林雪淋/刘宇V0.22011.4.8完善控件介绍和空间数据库的介绍刘宇V0.32011.5.18完善栅格数据介绍刘宇V0.42011.6.25完善符号化介绍刘宇V0.52011.7.18完善网络分析功能刘宇V0.6201.8.26完善参考系的介绍刘宇V0.72011.9.3完善几何对象的介绍刘宇3/336内部文档,请勿外传目录1一.ArcGIS介绍..................................................................................................22二.和ArcGISEngine开发相关的C#知识....................................................103三.使用控件创建第一个桌面应用程序........................................................224四.空间数据库................................................................................................715五.几何对象和空间参考..............................................................................1216六.矢量数据空间分析..................................................................................1547七.符号化......................................................................................................1698八.栅格数据分析..........................................................................................2029九.编辑..........................................................................................................23710十.地图输出..................................................................................................26011十一.ArcGISEngine实战................................................................................26312十二.安装部署.................................................................................................3034/336内部文档,请勿外传1一.ArcGIS介绍ArcGIS软件架构1.1ArcGIS是ESRI在全面整合了GIS与数据库、软件工程、人工智能、网络技术及其它多方面的计算机主流技术之后,成功地推出了代表GIS最高技术水平的全系列GIS产品。ArcGIS是一个全面的,可伸缩的GIS平台,为用户构建一个完善的GIS系统提供完整的解决方案。ArcGIS的基本体系能够让用户在任何需要的地方部署GIS功能和业务逻辑,无论是在桌面、服务器、还是在野外:桌面GIS(ArcGISDesktop)—ArcGIS桌面GIS软件产品是用来编辑、设计、共享、管理和发布地理信息和概念。ArcGIS桌面可伸缩的产品结构,从ArcReader,向上扩展到ArcView、ArcEditor和ArcInfo。目前ArcInfo被公认为是功能最强大的GIS产品。通过一系列的可选的软件扩展模块,ArcGISDesktop产品的能力还可以进一步得到扩展。嵌入式GIS(EmbeddedGIS)—ArcGISEngine是一个完整的嵌入式GIS组件库和工具包,开发者能用它创建一个新的、或扩展原有的可定制的桌面应用程序。使用ArcGISEngine,开发者能将GIS功能嵌入到已有的应用程序中,如基于工业标准的产品以及一些商业应用,也可以创建自定义的应用程序,为组织机构中5/336内部文档,请勿外传的众多用户提供GIS功能。服务器GIS(ServerGIS)—ArcGISServer、ArcIMS和ArcSDE用于创建和管理基于服务的GIS应用程序,在大型机构和互联网上众多用户之间共享地理信息。ArcGISServer是一个中心应用服务器,它包含一个可共享的GIS软件对象库,能在企业和Web计算框架中建立服务器端的GIS应用。ArcIMS是通过开放的Internet协议发布地图、数据和元数据的可伸缩的网络地图服务器。ArcSDE是在各种关系型数据库管理系统中管理地理信息的高级空间数据服务器。移动GIS(MobileGIS)—ArcPad,支持GPS的无线移动设备,越来越多地应用在野外数据采集和信息访问中。ArcGIS桌面和ArcGISEngine可以运行在便携式电脑或平板电脑上,用户可以在野外进行数据采集、分析和乃至制定决策。ArcGISEngine介绍1.2ArcGISEngine是一组完备的并且打包的嵌入式GIS组件库和工具库,开发人员可用来创建新的或扩展已有的桌面应用程序。使用ArcGISEngine,开发人员可以将GIS功能嵌入到已有的应用软件中,如自定义行业专用产品;或嵌入到商业生产应用软件中,如MirosoftfWord和Excel;还可以创建集中式自定义应用软件,并将其发送给机构内的多个用户。ArcGISEngine由两个产品组成:构建软件所用的开发工具包以及使已完成的应用程序能够运行的可再发布的Runtime(运行时环境)。ArcGISEngine开发工具包是一个基于组件的软件开发产品,可用于构建自定义GIS和制图应用软件。它并不是一个终端用户产品,而是软件开发人员的工具包,适于为Windows、UNIX或Linux用户构建基础制图和综合动态GIS应用软件。ArcGISEngineRuntime是一个使终端用户软件能够运行的核心ArcObjects组件产品,并且将被安装在每一台运行ArcGISEngine应用程序的计算机上。ArcGISEngine是基于COM技术的可嵌入的组件库和工具包,ArcGISEngine可以帮助我们很轻松的构建自定义应用程序.6/336内部文档,请勿外传使用ArcGISEngine,开发人员可以将GIS功能嵌入到已有的应用软件中,如自定义行业专用产品;或嵌入到商业生产应用软件中,如MirosoftfWord和Excel;还可以创建集中式自定义应用软件,并将其发送给机构内的多个用户。ArcGISEngine由两个产品组成:面向开发人员的软件开发包(ArcGISEngineDeveloperkit)面向最终用户的运行时(ArcGISEngineRuntime)ArcGISEngine开发工具包是一个基于组件的软件开发产品,可用于构建自定义GIS和制图应用软件。它并不是一个终端用户产品,而是软件开发人员的工具包,支持四种开发环境(C++,COM,.NET,以及Java),适于为Windows、UNIX或Linux用户构建基础制图和综合动态GIS应用软件。ArcGISEngineRuntime是一个使终端用户软件能够运行的核心ArcObjects组件产品,并且将被安装在每一台运行ArcGISEngine应用程序的计算机上。ArcGISEngine的逻辑体系结构:BaseServices包含了ArcGISEngine中最核心的ArcObjects组件,几乎所有的GIS组件需要调用它们,如Geometry和Display等。DataAccess包含了访问矢量或栅格数据的GeoDatabase所有的接口和类组件。MapPresentation包含了GIS应用程序用于数据显示、数据符号化、要素标注和专题图制作等需要的接口和类组件。DevelperComponents包含了进行快速开发所需要的全部可视化控件,如MapControl、PageLayoutControl、SceneControl、GlobeControl、TOCControl、ToolbarControl、SymbologyControl和LicensenControl控件等,除了这些,该库还包括大量可以有ToolbarControl调用的内置commands、tools、Menus,它们可以极大地简化二次开发工作。Extensions在图中我们可看出,ArcGISEngine的开发体系是一条纵线,功能丰富,层次清晰。最上层的Extensions7/336内部文档,请勿外传包含了许多高级开发功能,如GeoDatabaseUpdate、空间分析、三维分析、网络分析、Schematics逻辑示意图以及数据互操作等。ArcGISEngine标准版并不包含这些ArcObjects许可,他们只能作为扩展存在,需要特定的License才能运行。注意:ArcGISEngine运行时有多种版本级别,从标准版本一直到企业版本。标准的ArcGISEngine运行时提供所有ArcGIS应用程序的核心功能。这个级别的ArcGISEngine运行时可以操作几种不同的栅格和矢量格式、进行地图表达和创建以及通过执行各种空间或属性查询查找要素。这个级别的ArcGISEngine运行时还可以进行基本数据创建、编辑Shapefile和简单的个人地理数据库(PersonalGeodatabase)及GIS分析但是如果遇到企业级数据库(ArcGISSDE)数据库的编辑以及复杂数据模型的创建(网络,拓扑)就需要EnterpriseGeodatabaseUpdate许可.ArcGISEngine运行时的标准许可相当于ArcGIS桌面View级别的功能,而EnterpriseGeodatabaseUpdate许可相当于ArcGIS桌面Editor级别的功能.8/336内部文档,请勿外传ArcGISEngine中的类库1.3ArcGISEngine开发中,为了更好的管理这些COM对象,ESRI将这些COM对象放在不同的组件库中,而他们被物理的防盗bin目录下的dll中,而逻辑上被分散到不同的命名空间中,下面我们详细对一些类库进行介绍:VersionVersion库是ArcGIS10新出来的一个类库,该类库包含了将独立应用程序绑定到特定的ArcGIS系列产品的函数和方法,该类库是在运行Engine的应用程序的时候SystemSystem库是ArcGIS架构中最底层的库。该库包含了暴露组成ArcGIS的其它库所使用的服务的组件。System库中定义了许多接口,它们可以由开发者来实现。AoInitializer对象在System中定义;所有开发者必须使用该对象在使用Engine功能的应用程序中初始化和uninitializeArcGISEngine。开发者不扩展该库,但可以通过实现其中的接口来扩展ArcGIS系统。SystemUISystemUI库中包含了可在ArcGISEngine中扩展的用户界面组件的接口定义,包括ICommand、ITool和IToolControl接口。开发者使用这些接口来扩展UI组件。该库所包含的对象是utility对象,开发者可用于简化某些用户界面的开发。开发者不扩展该库,但可以通过实现其中的接口来扩展ArcGIS系统。GeometryGeometry库处理存储在特征类(featureclasses)或其它图形要素(graphicalelements)中的特征的geometry或shape。大多数用户交互的基本几何对象有Point、MultiPoint、Polyline和Polygon。除了这些顶层的实体,还有作为Polylines和Polygons构建模块的几何体(geometries)。这些是组成几何体的基元(primitives)。它们是Segments、Paths和Rings。Polylines和Polygons由形成一条Path的依次相连的Segments组成。一个Segment包含两个不同的点,起点和终点,和一个定义从起点到终点的曲线的要素类型。这种segments有CircularArc、Line、EllipticArc和BezierCurve。所有的几何对象都可以有与它们顶点相关的Z、M和IDs。9/336内部文档,请勿外传基本的几何对象都支持几何操作,如Buffer和Clip。开发者不可以扩展几何基元。GIS中的实体是指现实世界中的特征;这些现实世界中的特征的位置由具有空间参考的几何体来定义。投影和地理坐标系统的空间参考对象都包含在Geometry库中。开发者可以通过在空间参考间添加新的空间参考和投影来扩展空间参考系统。DisplayDisplay库包含了用于GIS数据显示的对象。除了负责实际图像输出的主要显示对象,该库中还包含了表示颜色和符号的对象,这些颜色和符号用于控制显示上所绘制实体的属性。库中也包含了为用户在与显示交互时提供可视化反馈的对象。开发者大都通过类似于Map或PageLayout对象提供的视图与显示交互。该库的所有部分都可以被扩展,常被扩展的有符号、颜色和显示反馈(displayfeedbacks)。OutputOutput库被用于创建图形输出到设备,如打印机、绘图仪和硬拷贝格式,如增强型图元文件(enhancedmetafiles)和栅格影像格式(JPG、BMP等)。开发者使用该库和ArcGIS系统其它部分中的对象来创建图形输出。通常这些是Display和Carto库中的对象。开发者可以扩展output库用于定制的设备和输出格式。GeoDatabaseGeoDatabase库提供了用于geodatabase的编程API。Geodatabase是一个构建在标准工业关系和对象数据库技术基础上的地理数据储存库。库中的对象为ArcGIS支持的所有数据源提供了统一的编程模型。GeoDatabase库定义了许多由架构中较高层次数据源提供者实现的接口。开发者可以扩展geodatabase来支持特殊的数据对象(Features、Classes等)类型。此外,还可以使用PlugInDataSource对象添加自定义的矢量数据源。geodatabase支持的native数据类型不可以被扩展。DataSourcesFileDataSourcesFile库包含用于基于文件数据源的GeoDatabaseAPI的实现。这些基于文件的数据源包括shapefile、coverage、TIN、CAD、SDC、ArcGISStreetMap和VPF。开发者不能扩展DataSourcesFile库。DataSourcesGDBDataSourcesGDB库包含了用于数据库数据源的GeoDatabaseAPI的实现。这些数据源包括MicrosoftAccess和SDE软件支持的RDBMSs。开发者不能扩展DataSourcesGDB库。DataSourceOleDB10/336内部文档,请勿外传DataSourcesOleDB库包含用于MicrosoftOLEDB数据源的GeoDatabaseAPI的实现。该库只有在MicrosoftWindows操作系统上才可以使用。这些数据源包括任何OLEDB支持的数据提供者和文本文件工作空间。开发者不能扩展DataSourcesOleDB库。DataSourceRasterDataSourcesRaster库包含了用于Raster数据源的GeoDatabaseAPI的实现。这些数据源包括SDE软件支持的RDBMSs,和所有支持的RDO栅格文件格式。当需要支持新的栅格格式时,开发者不扩展该库,而是扩展RDO。开发者不扩展DataSourcesRaste库。GeoDatabaseDistributedGeoDatabaseDistributed库通过提供数据导入、导出geodatabase的工具来支持到企业geodatabase的分布式访问。开发者不扩展GeoDatabaseDistributed库。CartoCarto库支持地图的创建和显示;这些地图可以包含一幅地图或具有多幅地图和相关旁注的页中的数据。PageLayout对象是宿主一幅或多幅地图和相关旁注(指北针、图例、比例尺条等)的容器。Map对象是图层的容器。Map对象有操作地图中所有图层的属性:空间参考、地图比例尺等,还有操作地图图层的方法。有多种不同类型的图层可以被加载到地图中。不同数据源通常有一个相关图层负责在地图上显示数据;矢量特征由FeatureLayer对象处理,栅格数据由RasterLayer对象处理,TIN数据由TinLayer对象处理等。若需要,图层可以为它们的相关数据处理所有的绘制操作。但更常见的是图层拥有一个相关的Renderer对象。Renderer对象的属性控制数据在地图中怎样显示。Renderers一般使用Display库中的symbols进行实际绘图;renderer只是匹配指定的符号与要绘制的实体的属性。一个Map和一个PageLayout可以包含要素(elements)。要素利用几何体来定义它在地图或页面上的位置,以及控制要素显示的行为。有用于基本形状、文本标注、复杂旁注等的要素。Carto库也包含对地图注记和动态标注的支持。LocationLocation库包含支持地理编码和与route事件一起工作的对象。可通过full控件的finegrained对象访问地理编码功能,或GeocodeServer对象提供了一个简化的API。开发者可以创建他们自己的地理编码对象。线性参考功能提供了添加事件到线性特征的对象,并使用多种绘制方法渲染这些事件。开发者可以扩展线性参考功能。11/336内部文档,请勿外传NetworkAnalysisNetworkAnalysis库提供的对象在网络加载到geodatabase中时,使用网络数据和对象populatingageodatabase来分析网络。开发者可以扩展该库来支持定制的网络跟踪。该库是用于utility网络的——gaslines、electricitysupplylines等。Controls开发者使用Controls库来构建或扩展具有ArcGIS功能的应用程序。ArcGISControls通过封装ArcObjects和提供一个coarser-grainedAPI,简化了开发过程。尽管控件封装了finegrainedArcObjects,但它们并不限制访问这些ArcObjects。MapControl和PageLayoutControl分别封装了Carto库中的Map和PageLayout对象。ReaderControl封装了Map和PageLayout对象,并在使用该控件时提供了简化的API。如果地图出版商拥有授权许可,那么开发者可以访问Map和PageLayout控件的类似方式访问内部对象。该库也包含实现内容列表的TOCControl和宿主与一个合适控件一起工作的命令和工具的ToolbarControlGeoAnalystGeoAnalyst库包含支持核心空间分析功能的对象。这些功能在ArcGISSpatialAnalyst和ArcGIS3DAnalyst库中使用。开发者可以通过创建一个新的栅格操作类型来扩展该库。要求有ArcGISSpatialAnalyst或3DAnalyst许可才能使用该库中的对象。3DAnalyst3DAnalyst库包含在三维场景中使用的对象,它们的工作方式类似于Carto库中包含的对象在二维地图中工作。Scene对象是库中的主要对象之一,因为它与Map对象类似,是数据的容器。Camera和Target对象根据特征相对于观察者的位置,指定场景的视图。一个场景(scene)包含一个或多个图层;这些图层指定了场景中的数据和数据怎样绘制。3DAnalyst库拥有一个开发控件和一组和该控件协同工作的命令和工具。该控件可以与Controls库中的对象联合使用。除了创建命令和工具,开发者对该库的扩展较少。使用该库中的对象需要3DAnalyst许可。GlobeCoreGlobeCore库包含与globe数据一起工作的对象,工作方式类似于Carto库中包含的对象在二维地图12/336内部文档,请勿外传中工作。Globe对象是库中的主要对象之一,因为它与Map对象类似,是数据的容器。GlobeCamera对象根据globe相对于观察者的位置,指定了Globe视图。Globe可以有一个或多个图层;这些图层指定了Globe上的数据和数据怎样绘制。介绍完这些,让我们有个感性上的认识,在以后找某个对象的时候,知道去哪个dll中找。2二.和ArcGISEngine开发相关的C#知识接口编程2.1使用ArcGISEngine,也就意味着使用里面的接口,那么什么是接口呢?在面向对象的编程中,我们都会接触到这个玩意儿,我们知道面向对象有三大特性封装,继承,多态,相信很多人在学习多态的时候,会接触接口。接口可以用这样一句话来描述“接口就是包含一系列不被实现的方法.而把这些方法的实现交给继承它的类.”,这句话看起来很晦涩,没关系,我们通过下面一个例子说明我定义了一个接口IPeopleusingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceInterfaceTest{interfaceIPeople{voidgender();}}这个接口里面有一个性别的方法,这个只对方法进行了定义,而方法内却没有内容,也就是说,通过这个接口的这个gender方法,我们不能知道它到底干什么,但是要知道这个gender到底是干什么用的,那么就要看实现了这个方法的类。同理我定义两个类,分别实现这个接口。13/336内部文档,请勿外传usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceInterfaceTest{classBoy:IPeople{publicvoidgender(){Console.WriteLine("I‟maboy.");}}}usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceInterfaceTest{classGirl:IPeople{publicvoidgender(){Console.WriteLine("I‟magirl.");}}}通过上面的两个类,我们就很清楚的看到这个方法的作用了,我们也可以看到一个接口可以被多个类14/336内部文档,请勿外传实现。我们运行一下这个,看一下效果usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceInterfaceTest{classProgram{staticvoidMain(string[]args){IPeoplePerson;//声明接口变量Person=newBoy();//实例化,接口变量中存放对象的引用Person.gender();//这个调用的是Boy中的gender方法Person=newGirl();//实例化,接口变量中存放对象的引用Person.gender();//这个调用的是Gril中的gender方法Console.ReadLine();}}}运行结果如下:15/336内部文档,请勿外传2.1.1C#接口的例子2.1.2快速掌握OMD我们已经知道使用ArcGISEngine开发,也就意味着我们要和接口打交道,ArcGISEngine中提供的接口和类加起来估计上万,但是用过ArcGISEngine的人,知道这个数字不为过。ArcGISEngine为了帮助我们方便的使用这些,将这些分散在不同的类库中,为了便于我们阅读,ArcGISEngine提供了一系列的对象模型图,也就是OMD(Objectmodeldiagrams)对象模型图表。下面图示中,便是贯穿本节的对象模型图的钥匙。这些符号是基于UML画图工具创建的,UML符号是面向对象分析和设计的工业图样标准。对象模型图中提供的信息非常多,是对象浏览器中信息的重要补充。VisualBasic,或者其它的开发环境,都会列出所有的类和成员,但不会指明这些类之间的关系。所以,对象模型图是非常有利于读者对ArcInfo组件的理解的!在装了ArcGISEngine后,可以在安装目录下找到很多使用UML来描述ArcInfo组件的pdf,这些pdf详细的描述了ArcObjects,并描述你能够创建的数据模型,以下详细说明。1.类和对象16/336内部文档,请勿外传在UML图中有三种类型的类:抽象类(abstractclass)、组件类(COclass)与普通类(instantiableclass)。抽象类:不能创建或实例化,从来没有一个抽象类的实例用于定义子类的公共接口,创建实例的任务由其子类完成。子类继承其定义的接口。OMD符号为:二维的内部有阴影的矩形。普通类:不能创建,从别的对象获得实例。OMD符号为:3D矩形内部没有阴影。组件类:可以直接创建实例的类,在C#中,用New关键字。OMD符号为:带阴影的3D矩形符号。2.关联在抽象类、可创建类和可实例化类之间,有几种存在的关联(或称关系)。联系(association)便描述了类之间的关联。在两端的类中可以定义多重性(Multiplicity)关联。在这张图上,一个业主能有拥有一块或多块宗地;同样地,一块宗地可以被一个或多个业主所共有。多重性关联就是限制对象类与其它对象关联的数目关系。以下是用于多重性关联的符号:1——一个并且只有一个,这种多样性是可选的;如果不标明,则默认为“1”0..1——零个或一个M..N——从M到N(正整数)*或者0„*——从零到任意正整数1„*——从一到任意正整数在这张图上,我们知道一个对象可能和多个对象有联系类继承(typeinheritance)定义了专门的类,它们拥有超类的属性和方法,并且同时也有自身的属性和方法。17/336内部文档,请勿外传上图说明primaryline和secondaryline是line的一种类型。实例化(Instantiation)指定一个类的对象有这样的方法,它能够创建另外一个类的对象。pole对象有一个方法能够创建transformer对象。聚合(Aggregation)是一种不对称的关联方式,在这种方式下一个类的对象被认为是一个“整体”,而另一个类的对象被认为是“部件”。一个transformerbank正好有3个transformer。在这个图中transformer能和一个transformerbank相关联,但当transformerbank移除以后,transformer依然能够存在。组成(Composition)是一种更为强壮的聚合方式,此种方式下,“整体”对象控制着“部分”对象的生存时间。一个Pole包含一个或多个Crossarm。在这个图中当pole被移除后,Crossarm就不能再使用了。因为Pole控制着Crossarm的生存时间。18/336内部文档,请勿外传在OMD图中,我们不仅仅能看到类之间的相互关系,还可以得到属性的一些信息,如下图:属性和方法:属性:哑铃状的图标,Read(左侧的实心哑铃)和write(右侧的实心哑铃)属性除了我们常说的类型,还有一种属性,这个属性本身就是一个对象,符号,空心的哑铃方法:指向左侧的箭头。ArcGISEngline组件库的每一个组件中定义有不同的类,类下面定义了不同接口,接口中包含不同的19/336内部文档,请勿外传属性和方法。类之间有类型继承(Typelnheritance)关系,接口之间有互相调用(Querylnterface)及相互继承(Interfacelnheritance)关系。1.1类与对象在面向对象编程中,类和对象是两个非常重要的概念,可以这么说类就是创建对象的蓝本,而对象是指具有属性和动作的实体,它封装了一个客观实体的属性与行为。ArcObjcets中有三类class,分别是抽象类(AbstractClass)、组件类(CoClass)和普通类(Class)。抽象类的主要目的是为它的子类定义公共接口,一个抽象类将把它的部分或全部实现延迟到子类中,因此,一个抽象类不能被实例化。一个组件类对象可以被直接创建,普通类对象虽然不能直接创建,但它可以可以作为其它类的一个属性或者从其它类的实例化来创建。1.2接口和类接口定义了一组方法和属性,在ArcObjects中接口名称都以”I”开始,如IMap,Ilayer等。类实现了接口中的方法。一个类可以有多个接口,如FeatureLayerClass类有IFeatureLayer,IFeatureSelection等不同接口,而一个接口也可被多个类所拥有,如CadFeatureLayer类和FeatureLayer类都有IFeatureLayer接口。接口定义了能做什么,而定义了该怎么做(Theinterfacedefineswhatanobjectcando,andtheclassdefineshowitisdone.79页ExplroingArcObjectsV9.0),在AO开发的时候,和对象间的通信是通过接口完成的,而不是我们在一些其他面向对象语言如(Java)中和对象的通信是通过对象完成的.1.3接口查询(QueryInterface)一个类可以有多个接口,声明了接口变量并且指向一个对象的时候,这个变量只能使用该接口内的方法和属性,而不能访问其他接口中的方法和属性,如:DimpMapasIMapSetpMap=NewMappMap.Clear„这里会产生错误此时的pMap只能使用IMap接口中定义的方法和属性,比如获取图层的个数,添加图层等,但是不能清空视图上的内容(因为这个方法是在IActiveView中定义的)QueryInterface(QI)很方便的让我们在一个类的不同接口间进行切换:DimpViewasIActiveViewsetpView=pMap„QI现在mView就可以使用IActiveView中定义的方法了.1.4类类型继承类型继承是指类之间的接口类型的继承,而不是继承其实现。继承过来的接口只是名称相同,具体的实现则不同。比如ShpfileWorkspaceFactry和AccessWorkspaceFactry都继承WorkspaceFactry,而他们的打开(OpenFromFile)方法却不一样,ShpfileWorkspaceFactry的(OpenFromFile)方法需要一个文件目录位置作为参数,而AccessWorkspaceFactry的(OpenFromFile)方法需要一个数据库(mdb)位置作为参数。1.5接口继承如ImapFrame接口和IMapSurroundFrame接口继承于IFrameElement接口,则父类接口IFrameElement所具有的方法和属性对派生接口ImapFrame和IMapSurroundFrame都有效。20/336内部文档,请勿外传快速理解QI2.22.2.1C#+QI的例子COM中,和我们打交道的是接口,也就是说类对我们是隐形的,那么我们要做开发,要使用这些功能,我们只能通过接口,通过接口暴露出来的方法,COM是一种服务器端/客户端架构,服务器端定义了操作的方法,客户端通过接口调用这些方法。下面的这幅图很能说明COM的结构:言归正传,说这篇博文的主题QI,还记得上一篇我强调的,一个接口可以被多个类实现,而QI要解决的就是一个类实现多个接口的问题。在COM中,接口定义了方法,类实现了接口中定义的方法,而一个接口只能使用自己内部定义的方法,而不能越界,就好比一个班级一样,这个班级内有班长,有学习委员,有体育委员,每位干部各司其职,每一位干部负责自己职权范围之内的事情,各位干部相互协作,解决班级内的事情,这班级内的每一位干部就相当于一个接口,而这个班级就相当于实现了这些接口的类。当这个班级的一些事情需要班长处理的时候,我们就执行班长这个接口中定义的方法,当需要学习委员处理的话,我们再将执行权交给学习委员这个接口,这也就是接口之间的互相访问(QueryInterface),通过这个我们大体上对QI有了感性上的认识,下面我们通过实例演示一下。我定义了两个接口usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceQITest{interfaceIFavoriteFood{21/336内部文档,请勿外传voidFood();}}usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceQITest{interfaceIVoice{voidVoice();}}然后定义了一个Cat的类实现这里面的方法usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceQITest{classCat:IFavoriteFood,IVoice22/336内部文档,请勿外传{publicvoidFood(){Console.WriteLine("我喜欢的食物是老鼠.");}publicvoidVoice(){Console.WriteLine("喵,喵,喵...");}}}这个Cat类的功能就是实现两个接口的方法,猫最喜欢的事物是老鼠,而他的声音是“喵,喵,喵”。运行下usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceQITest{classProgram23/336内部文档,请勿外传{staticvoidMain(string[]args){IVoicepVoice=newCat();pVoice.Voice();//只能调用IVoice中定义的方法//pVoice.Food();这个就会报错,因为IVoice接口中没有这个方法的定义IFavoriteFoodpFavoriteFood=pVoiceasIFavoriteFood;pFavoriteFood.Food();//只能调用IFavoriteFood定义的方法Console.ReadLine();}}}效果如下:24/336内部文档,请勿外传3三.使用控件创建第一个桌面应用程序1)新建一个Windows窗体应用程序(文件--新建--项目--Windos窗体应用程序)2)在点了确定之后,在VS的工具箱中找到到和ArcGISEngine相关的控件其中,AxMapControl就是Map地图控件,AxPageLayouControl是布局地图控件,AxTOCControl是目录控件,AxToolbarControl是GIS工具栏控件,AxSceneControl是Scene三维场景控件,axGlobeControl是Globe控件,AxLicenseControl是许可控件,AxSymbologyControl是符号选择器25/336内部文档,请勿外传控件,AxArcReaderControl是ArcReader控件,AxArcReaderGlobeControl是ArcReaderGlobe控件。AxLicenseControl是许可控件,一般GIS系统中都必须添加,否则无法使用。将刚才的窗体的名称改为Engine.3)然后添加Toc,Map,Toolbar控件。许可控件是首选的,否则无法使用添加完这几个控件后,VS会自动为我们添加一些引用4)添加地图文档(Map控件-右键-属性)26/336内部文档,请勿外传5)Toolbar控件和Toc控件与Map控件的关联(设置Buddy属性)27/336内部文档,请勿外传6)在Toolbar中进行设置(Toolbar控件-右键-属性-Itmes选项)7)添加工具命令在Toolbarcontrol上右键—属性在items选项卡中添加几个工具命令28/336内部文档,请勿外传8)运行我们的应用程序,发现下面的错误出现这个问题的原因是因为ArcGIS10发生了变化,将下面的语句添加到使用AO对象的前面:ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Engine);如我放在Main函数中29/336内部文档,请勿外传利用刚才添加的打开文档的命令打开一个新的文档:30/336内部文档,请勿外传也可利用上面的放大,缩小工具进行简单的操作了。在上面,当我们将这些空间拖到窗体中的时候,会自动加载一些dll,我们知道ArcGISEngine编程,也就意味着和COM对象接触。代码加载Mxd文档3.1用代码添加Mxd文档,用到AxMapControl.LoadMxFile(sFilePath),我们只要将Mxd文档的路径传给这个方法即可。我们添加一个按钮:31/336内部文档,请勿外传在这个按钮的单击事件中填写如下代码:OpenFileDialogOpenMXD=newOpenFileDialog();OpenMXD.Title="打开地图";OpenMXD.InitialDirectory="E:";OpenMXD.Filter="MapDocuments(*.mxd)|*.mxd";if(OpenMXD.ShowDialog()==DialogResult.OK){stringMxdPath=OpenMXD.FileName;axMapControl1.LoadMxFile(MxdPath);}控件的LoadMxFile是用来加载地图文档的我们将刚才写的代码封装成一个函数publicstringOpenMxd(){stringMxdPath="";OpenFileDialogOpenMXD=newO

相关资料推荐

  • 名称/格式
  • 下载次数
  • 资料大小

用户评论

0/200
暂无评论
上传我的资料

资料阅读排行

该用户的其它资料

关闭

请选择举报的类型

关闭

提示

提交成功!

感谢您对爱问共享资料的支持,我们将尽快核实并处理您的举报信息。

关闭

提示

提交失败!

您的举报信息提交失败,请重试!

关闭

提示

重复举报!

亲爱的用户!感觉您对爱问共享资料的支持,请勿重复举报噢!

全屏 缩小 放大
收藏
资料评价:

/ 0
所需积分:2 立即下载
返回
顶部
举报
资料
关闭

温馨提示

感谢您对爱问共享资料的支持,精彩活动将尽快为您呈现,敬请期待!