首页 ArcEngine10开发手册.pdf

ArcEngine10开发手册.pdf

ArcEngine10开发手册.pdf

上传者: RushEr100 2012-03-26 评分1 评论0 下载638 收藏0 阅读量742 暂无简介 简介 举报

简介:本文档为《ArcEngine10开发手册pdf》,可适用于IT行业分析领域,主题内容包含内部文档请勿外传ArcGISEngine开发手册ESRI中国(北京)有限公司年月/内部文档请勿外传制定及修订记录版本完成日期编写修订纪要编写者备注V符等。

内部文档请勿外传ArcGISEngine开发手册ESRI中国(北京)有限公司年月/内部文档请勿外传制定及修订记录版本完成日期编写修订纪要编写者备注V文档目录结构林雪淋刘宇V完善控件介绍和空间数据库的介绍刘宇V完善栅格数据介绍刘宇V完善符号化介绍刘宇V完善网络分析功能刘宇V完善参考系的介绍刘宇V完善几何对象的介绍刘宇/内部文档请勿外传目录一ArcGIS介绍二.和ArcGISEngine开发相关的C#知识三.使用控件创建第一个桌面应用程序四.空间数据库五.几何对象和空间参考六.矢量数据空间分析七.符号化八.栅格数据分析九.编辑十.地图输出十一ArcGISEngine实战十二安装部署/内部文档请勿外传一ArcGIS介绍ArcGIS软件架构ArcGIS是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功能嵌入到已有的应用程序中如基于工业标准的产品以及一些商业应用也可以创建自定义的应用程序为组织机构中/内部文档请勿外传的众多用户提供GIS功能。服务器GIS(ServerGIS)ArcGISServer、ArcIMS和ArcSDE用于创建和管理基于服务的GIS应用程序在大型机构和互联网上众多用户之间共享地理信息。ArcGISServer是一个中心应用服务器它包含一个可共享的GIS软件对象库能在企业和Web计算框架中建立服务器端的GIS应用。ArcIMS是通过开放的Internet协议发布地图、数据和元数据的可伸缩的网络地图服务器。ArcSDE是在各种关系型数据库管理系统中管理地理信息的高级空间数据服务器。移动GIS(MobileGIS)ArcPad支持GPS的无线移动设备越来越多地应用在野外数据采集和信息访问中。ArcGIS桌面和ArcGISEngine可以运行在便携式电脑或平板电脑上用户可以在野外进行数据采集、分析和乃至制定决策。ArcGISEngine介绍ArcGISEngine是一组完备的并且打包的嵌入式GIS组件库和工具库开发人员可用来创建新的或扩展已有的桌面应用程序。使用ArcGISEngine开发人员可以将GIS功能嵌入到已有的应用软件中如自定义行业专用产品或嵌入到商业生产应用软件中如MirosoftfWord和Excel还可以创建集中式自定义应用软件并将其发送给机构内的多个用户。ArcGISEngine由两个产品组成:构建软件所用的开发工具包以及使已完成的应用程序能够运行的可再发布的Runtime(运行时环境)。ArcGISEngine开发工具包是一个基于组件的软件开发产品可用于构建自定义GIS和制图应用软件。它并不是一个终端用户产品而是软件开发人员的工具包适于为Windows、UNIX或Linux用户构建基础制图和综合动态GIS应用软件。ArcGISEngineRuntime是一个使终端用户软件能够运行的核心ArcObjects组件产品并且将被安装在每一台运行ArcGISEngine应用程序的计算机上。ArcGISEngine是基于COM技术的可嵌入的组件库和工具包,ArcGISEngine可以帮助我们很轻松的构建自定义应用程序/内部文档请勿外传使用ArcGISEngine开发人员可以将GIS功能嵌入到已有的应用软件中如自定义行业专用产品或嵌入到商业生产应用软件中如MirosoftfWord和Excel还可以创建集中式自定义应用软件并将其发送给机构内的多个用户。ArcGISEngine由两个产品组成:面向开发人员的软件开发包(ArcGISEngineDeveloperkit)面向最终用户的运行时(ArcGISEngineRuntime)ArcGISEngine开发工具包是一个基于组件的软件开发产品可用于构建自定义GIS和制图应用软件。它并不是一个终端用户产品而是软件开发人员的工具包支持四种开发环境(C++COMNET以及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的开发体系是一条纵线功能丰富层次清晰。最上层的Extensions/内部文档请勿外传包含了许多高级开发功能如GeoDatabaseUpdate、空间分析、三维分析、网络分析、Schematics逻辑示意图以及数据互操作等。ArcGISEngine标准版并不包含这些ArcObjects许可他们只能作为扩展存在需要特定的License才能运行。注意:ArcGISEngine运行时有多种版本级别从标准版本一直到企业版本。标准的ArcGISEngine运行时提供所有ArcGIS应用程序的核心功能。这个级别的ArcGISEngine运行时可以操作几种不同的栅格和矢量格式、进行地图表达和创建以及通过执行各种空间或属性查询查找要素。这个级别的ArcGISEngine运行时还可以进行基本数据创建、编辑Shapefile和简单的个人地理数据库(PersonalGeodatabase)及GIS分析但是如果遇到企业级数据库(ArcGISSDE)数据库的编辑以及复杂数据模型的创建(网络,拓扑)就需要EnterpriseGeodatabaseUpdate许可ArcGISEngine运行时的标准许可相当于ArcGIS桌面View级别的功能,而EnterpriseGeodatabaseUpdate许可相当于ArcGIS桌面Editor级别的功能/内部文档请勿外传ArcGISEngine中的类库ArcGISEngine开发中为了更好的管理这些COM对象ESRI将这些COM对象放在不同的组件库中而他们被物理的防盗bin目录下的dll中而逻辑上被分散到不同的命名空间中,下面我们详细对一些类库进行介绍:VersionVersion库是ArcGIS新出来的一个类库该类库包含了将独立应用程序绑定到特定的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。/内部文档请勿外传基本的几何对象都支持几何操作如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库。DataSourceOleDB/内部文档请勿外传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。开发者可以创建他们自己的地理编码对象。线性参考功能提供了添加事件到线性特征的对象并使用多种绘制方法渲染这些事件。开发者可以扩展线性参考功能。/内部文档请勿外传NetworkAnalysisNetworkAnalysis库提供的对象在网络加载到geodatabase中时使用网络数据和对象populatingageodatabase来分析网络。开发者可以扩展该库来支持定制的网络跟踪。该库是用于utility网络的gaslines、electricitysupplylines等。Controls开发者使用Controls库来构建或扩展具有ArcGIS功能的应用程序。ArcGISControls通过封装ArcObjects和提供一个coarsergrainedAPI简化了开发过程。尽管控件封装了finegrainedArcObjects但它们并不限制访问这些ArcObjects。MapControl和PageLayoutControl分别封装了Carto库中的Map和PageLayout对象。ReaderControl封装了Map和PageLayout对象并在使用该控件时提供了简化的API。如果地图出版商拥有授权许可那么开发者可以访问Map和PageLayout控件的类似方式访问内部对象。该库也包含实现内容列表的TOCControl和宿主与一个合适控件一起工作的命令和工具的ToolbarControlGeoAnalystGeoAnalyst库包含支持核心空间分析功能的对象。这些功能在ArcGISSpatialAnalyst和ArcGISDAnalyst库中使用。开发者可以通过创建一个新的栅格操作类型来扩展该库。要求有ArcGISSpatialAnalyst或DAnalyst许可才能使用该库中的对象。DAnalystDAnalyst库包含在三维场景中使用的对象它们的工作方式类似于Carto库中包含的对象在二维地图中工作。Scene对象是库中的主要对象之一因为它与Map对象类似是数据的容器。Camera和Target对象根据特征相对于观察者的位置指定场景的视图。一个场景(scene)包含一个或多个图层这些图层指定了场景中的数据和数据怎样绘制。DAnalyst库拥有一个开发控件和一组和该控件协同工作的命令和工具。该控件可以与Controls库中的对象联合使用。除了创建命令和工具开发者对该库的扩展较少。使用该库中的对象需要DAnalyst许可。GlobeCoreGlobeCore库包含与globe数据一起工作的对象工作方式类似于Carto库中包含的对象在二维地图/内部文档请勿外传中工作。Globe对象是库中的主要对象之一因为它与Map对象类似是数据的容器。GlobeCamera对象根据globe相对于观察者的位置指定了Globe视图。Globe可以有一个或多个图层这些图层指定了Globe上的数据和数据怎样绘制。介绍完这些让我们有个感性上的认识在以后找某个对象的时候知道去哪个dll中找。二.和ArcGISEngine开发相关的C#知识接口编程使用ArcGISEngine也就意味着使用里面的接口那么什么是接口呢?在面向对象的编程中我们都会接触到这个玩意儿我们知道面向对象有三大特性封装继承多态相信很多人在学习多态的时候会接触接口。接口可以用这样一句话来描述“接口就是包含一系列不被实现的方法而把这些方法的实现交给继承它的类”这句话看起来很晦涩没关系我们通过下面一个例子说明我定义了一个接口IPeopleusingSystemusingSystemCollectionsGenericusingSystemTextnamespaceInterfaceTest{interfaceIPeople{voidgender()}}这个接口里面有一个性别的方法这个只对方法进行了定义而方法内却没有内容也就是说通过这个接口的这个gender方法我们不能知道它到底干什么但是要知道这个gender到底是干什么用的那么就要看实现了这个方法的类。同理我定义两个类分别实现这个接口。/内部文档请勿外传usingSystemusingSystemCollectionsGenericusingSystemLinqusingSystemTextnamespaceInterfaceTest{classBoy:IPeople{publicvoidgender(){ConsoleWriteLine("I‟maboy")}}}usingSystemusingSystemCollectionsGenericusingSystemLinqusingSystemTextnamespaceInterfaceTest{classGirl:IPeople{publicvoidgender(){ConsoleWriteLine("I‟magirl")}}}通过上面的两个类我们就很清楚的看到这个方法的作用了我们也可以看到一个接口可以被多个类/内部文档请勿外传实现。我们运行一下这个看一下效果usingSystemusingSystemCollectionsGenericusingSystemLinqusingSystemTextnamespaceInterfaceTest{classProgram{staticvoidMain(stringargs){IPeoplePerson声明接口变量Person=newBoy()实例化接口变量中存放对象的引用Persongender()这个调用的是Boy中的gender方法Person=newGirl()实例化接口变量中存放对象的引用Persongender()这个调用的是Gril中的gender方法ConsoleReadLine()}}}运行结果如下:/内部文档请勿外传C#接口的例子快速掌握OMD我们已经知道使用ArcGISEngine开发也就意味着我们要和接口打交道ArcGISEngine中提供的接口和类加起来估计上万但是用过ArcGISEngine的人知道这个数字不为过。ArcGISEngine为了帮助我们方便的使用这些将这些分散在不同的类库中为了便于我们阅读ArcGISEngine提供了一系列的对象模型图也就是OMD(Objectmodeldiagrams)对象模型图表。下面图示中便是贯穿本节的对象模型图的钥匙。这些符号是基于UML画图工具创建的UML符号是面向对象分析和设计的工业图样标准。对象模型图中提供的信息非常多是对象浏览器中信息的重要补充。VisualBasic或者其它的开发环境都会列出所有的类和成员但不会指明这些类之间的关系。所以对象模型图是非常有利于读者对ArcInfo组件的理解的!在装了ArcGISEngine后,可以在安装目录下找到很多使用UML来描述ArcInfo组件的pdf这些pdf详细的描述了ArcObjects并描述你能够创建的数据模型,以下详细说明。类和对象/内部文档请勿外传在UML图中有三种类型的类:抽象类(abstractclass)、组件类(COclass)与普通类(instantiableclass)。抽象类:不能创建或实例化从来没有一个抽象类的实例用于定义子类的公共接口创建实例的任务由其子类完成。子类继承其定义的接口。OMD符号为:二维的内部有阴影的矩形。普通类:不能创建从别的对象获得实例。OMD符号为:D矩形内部没有阴影。组件类:可以直接创建实例的类在C#中用New关键字。OMD符号为:带阴影的D矩形符号。关联在抽象类、可创建类和可实例化类之间有几种存在的关联(或称关系)。联系(association)便描述了类之间的关联。在两端的类中可以定义多重性(Multiplicity)关联。在这张图上一个业主能有拥有一块或多块宗地同样地一块宗地可以被一个或多个业主所共有。多重性关联就是限制对象类与其它对象关联的数目关系。以下是用于多重性关联的符号:一个并且只有一个这种多样性是可选的如果不标明则默认为“”零个或一个MN从M到N(正整数)*或者„*从零到任意正整数„*从一到任意正整数在这张图上我们知道一个对象可能和多个对象有联系类继承(typeinheritance)定义了专门的类它们拥有超类的属性和方法并且同时也有自身的属性和方法。/内部文档请勿外传上图说明primaryline和secondaryline是line的一种类型。实例化(Instantiation)指定一个类的对象有这样的方法它能够创建另外一个类的对象。pole对象有一个方法能够创建transformer对象。聚合(Aggregation)是一种不对称的关联方式在这种方式下一个类的对象被认为是一个“整体”而另一个类的对象被认为是“部件”。一个transformerbank正好有个transformer。在这个图中transformer能和一个transformerbank相关联但当transformerbank移除以后transformer依然能够存在。组成(Composition)是一种更为强壮的聚合方式此种方式下“整体”对象控制着“部分”对象的生存时间。一个Pole包含一个或多个Crossarm。在这个图中当pole被移除后Crossarm就不能再使用了。因为Pole控制着Crossarm的生存时间。/内部文档请勿外传在OMD图中我们不仅仅能看到类之间的相互关系还可以得到属性的一些信息如下图:属性和方法:属性:哑铃状的图标Read(左侧的实心哑铃)和write(右侧的实心哑铃)属性除了我们常说的类型还有一种属性这个属性本身就是一个对象符号空心的哑铃方法:指向左侧的箭头。ArcGISEngline组件库的每一个组件中定义有不同的类类下面定义了不同接口接口中包含不同的/内部文档请勿外传属性和方法。类之间有类型继承(Typelnheritance)关系接口之间有互相调用(Querylnterface)及相互继承(Interfacelnheritance)关系。类与对象在面向对象编程中类和对象是两个非常重要的概念可以这么说类就是创建对象的蓝本,而对象是指具有属性和动作的实体它封装了一个客观实体的属性与行为。ArcObjcets中有三类class,分别是抽象类(AbstractClass)、组件类(CoClass)和普通类(Class)。抽象类的主要目的是为它的子类定义公共接口一个抽象类将把它的部分或全部实现延迟到子类中因此一个抽象类不能被实例化。一个组件类对象可以被直接创建普通类对象虽然不能直接创建但它可以可以作为其它类的一个属性或者从其它类的实例化来创建。接口和类接口定义了一组方法和属性在ArcObjects中接口名称都以”I”开始如IMapIlayer等。类实现了接口中的方法。一个类可以有多个接口如FeatureLayerClass类有IFeatureLayerIFeatureSelection等不同接口,而一个接口也可被多个类所拥有如CadFeatureLayer类和FeatureLayer类都有IFeatureLayer接口。接口定义了能做什么而定义了该怎么做(Theinterfacedefineswhatanobjectcando,andtheclassdefineshowitisdone页ExplroingArcObjectsV)在AO开发的时候和对象间的通信是通过接口完成的而不是我们在一些其他面向对象语言如(Java)中和对象的通信是通过对象完成的接口查询(QueryInterface)一个类可以有多个接口声明了接口变量并且指向一个对象的时候这个变量只能使用该接口内的方法和属性而不能访问其他接口中的方法和属性,如:DimpMapasIMapSetpMap=NewMappMapClear„这里会产生错误此时的pMap只能使用IMap接口中定义的方法和属性比如获取图层的个数添加图层等但是不能清空视图上的内容(因为这个方法是在IActiveView中定义的)QueryInterface(QI)很方便的让我们在一个类的不同接口间进行切换:DimpViewasIActiveViewsetpView=pMap„QI现在mView就可以使用IActiveView中定义的方法了类类型继承类型继承是指类之间的接口类型的继承而不是继承其实现。继承过来的接口只是名称相同具体的实现则不同。比如ShpfileWorkspaceFactry和AccessWorkspaceFactry都继承WorkspaceFactry而他们的打开(OpenFromFile)方法却不一样ShpfileWorkspaceFactry的(OpenFromFile)方法需要一个文件目录位置作为参数而AccessWorkspaceFactry的(OpenFromFile)方法需要一个数据库(mdb)位置作为参数。接口继承如ImapFrame接口和IMapSurroundFrame接口继承于IFrameElement接口,则父类接口IFrameElement所具有的方法和属性对派生接口ImapFrame和IMapSurroundFrame都有效。/内部文档请勿外传快速理解QIC#QI的例子COM中和我们打交道的是接口也就是说类对我们是隐形的那么我们要做开发要使用这些功能我们只能通过接口通过接口暴露出来的方法COM是一种服务器端客户端架构服务器端定义了操作的方法客户端通过接口调用这些方法。下面的这幅图很能说明COM的结构:言归正传说这篇博文的主题QI还记得上一篇我强调的一个接口可以被多个类实现而QI要解决的就是一个类实现多个接口的问题。在COM中接口定义了方法类实现了接口中定义的方法而一个接口只能使用自己内部定义的方法而不能越界就好比一个班级一样这个班级内有班长有学习委员有体育委员每位干部各司其职每一位干部负责自己职权范围之内的事情各位干部相互协作解决班级内的事情这班级内的每一位干部就相当于一个接口而这个班级就相当于实现了这些接口的类。当这个班级的一些事情需要班长处理的时候我们就执行班长这个接口中定义的方法当需要学习委员处理的话我们再将执行权交给学习委员这个接口这也就是接口之间的互相访问(QueryInterface)通过这个我们大体上对QI有了感性上的认识下面我们通过实例演示一下。我定义了两个接口usingSystemusingSystemCollectionsGenericusingSystemLinqusingSystemTextnamespaceQITest{interfaceIFavoriteFood{/内部文档请勿外传voidFood()}}usingSystemusingSystemCollectionsGenericusingSystemLinqusingSystemTextnamespaceQITest{interfaceIVoice{voidVoice()}}然后定义了一个Cat的类实现这里面的方法usingSystemusingSystemCollectionsGenericusingSystemLinqusingSystemTextnamespaceQITest{classCat:IFavoriteFood,IVoice/内部文档请勿外传{publicvoidFood(){ConsoleWriteLine("我喜欢的食物是老鼠")}publicvoidVoice(){ConsoleWriteLine("喵,喵,喵")}}}这个Cat类的功能就是实现两个接口的方法猫最喜欢的事物是老鼠而他的声音是“喵,喵,喵”。运行下usingSystemusingSystemCollectionsGenericusingSystemLinqusingSystemTextnamespaceQITest{classProgram/内部文档请勿外传{staticvoidMain(stringargs){IVoicepVoice=newCat()pVoiceVoice()只能调用IVoice中定义的方法pVoiceFood()这个就会报错因为IVoice接口中没有这个方法的定义IFavoriteFoodpFavoriteFood=pVoiceasIFavoriteFoodpFavoriteFoodFood()只能调用IFavoriteFood定义的方法ConsoleReadLine()}}}效果如下:/内部文档请勿外传三.使用控件创建第一个桌面应用程序)新建一个Windows窗体应用程序(文件新建项目Windos窗体应用程序))在点了确定之后在VS的工具箱中找到到和ArcGISEngine相关的控件其中AxMapControl就是Map地图控件AxPageLayouControl是布局地图控件AxTOCControl是目录控件AxToolbarControl是GIS工具栏控件AxSceneControl是Scene三维场景控件axGlobeControl是Globe控件AxLicenseControl是许可控件AxSymbologyControl是符号选择器/内部文档请勿外传控件AxArcReaderControl是ArcReader控件AxArcReaderGlobeControl是ArcReaderGlobe控件。AxLicenseControl是许可控件一般GIS系统中都必须添加否则无法使用。将刚才的窗体的名称改为Engine)然后添加TocMapToolbar控件。许可控件是首选的否则无法使用添加完这几个控件后,VS会自动为我们添加一些引用)添加地图文档(Map控件右键属性)/内部文档请勿外传)Toolbar控件和Toc控件与Map控件的关联(设置Buddy属性)/内部文档请勿外传)在Toolbar中进行设置(Toolbar控件右键属性Itmes选项))添加工具命令在Toolbarcontrol上右键属性在items选项卡中添加几个工具命令/内部文档请勿外传)运行我们的应用程序发现下面的错误出现这个问题的原因是因为ArcGIS发生了变化将下面的语句添加到使用AO对象的前面:ESRIArcGISRuntimeManagerBind(ESRIArcGISProductCodeEngine)如我放在Main函数中/内部文档请勿外传利用刚才添加的打开文档的命令打开一个新的文档:/内部文档请勿外传也可利用上面的放大缩小工具进行简单的操作了。在上面当我们将这些空间拖到窗体中的时候会自动加载一些dll我们知道ArcGISEngine编程也就意味着和COM对象接触。代码加载Mxd文档用代码添加Mxd文档用到AxMapControlLoadMxFile(sFilePath),我们只要将Mxd文档的路径传给这个方法即可。我们添加一个按钮:/内部文档请勿外传在这个按钮的单击事件中填写如下代码:OpenFileDialogOpenMXD=newOpenFileDialog()OpenMXDTitle="打开地图"OpenMXDInitialDirectory="E:"OpenMXDFilter="MapDocuments(*mxd)|*mxd"if(OpenMXDShowDialog()==DialogResultOK){stringMxdPath=OpenMXDFileNameaxMapControlLoadMxFile(MxdPath)}控件的LoadMxFile是用来加载地图文档的我们将刚才写的代码封装成一个函数publicstringOpenMxd(){stringMxdPath=""OpenFileDialogOpenMXD=newO

职业精品

XX有限公司(薪资福利管理制度).doc

公司采购流程管理制度制定方法.doc

招聘管理与面试技巧.ppt

公司采购流程管理制度.doc

用户评论

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

精彩专题

相关资料换一换

  • ArcEngine_C#_开发.…

  • ArcEngine开发.pdf

  • ArcEngine开发第二课.p…

资料评价:

/ 0
所需积分:2 立即下载

意见
反馈

返回
顶部