logo资料库

Engine+开发手册ArcEngine 10.0 C#二次开发.pdf

第1页 / 共326页
第2页 / 共326页
第3页 / 共326页
第4页 / 共326页
第5页 / 共326页
第6页 / 共326页
第7页 / 共326页
第8页 / 共326页
资料共326页,剩余部分请下载后查看
一. ArcGIS 介绍 ArcGIS 软件架构 ArcGIS 是 ESRI 在全面整合了 GIS 与数据库、软件工程、人工智能、网络技术及其它多方面的计算机主流 技术之后,成功地推出了代表 GIS 最高技术水平的全系列 GIS 产品。ArcGIS 是一个全面的,可伸缩的 GIS 平台,为用户构建一个完善的 GIS 系统提供完整的解决方案。ArcGIS 的基本体系能够让用户在任何需要的 地方部署 GIS 功能和业务逻辑,无论是在桌面、服务器、还是在野外: 桌面 GIS(ArcGIS Desktop)—ArcGIS 桌面 GIS 软件产品是用来编辑、设计、共享、管理和发布地理信息 和概念。ArcGIS 桌面可伸缩的产品结构,从 ArcReader,向上扩展到 ArcView、ArcEditor 和 ArcInfo。目 前 ArcInfo 被公认为是功能最强大的 GIS 产品。通过一系列的可选的软件扩展模块,ArcGIS Desktop 产品 的能力还可以进一步得到扩展。 嵌入式 GIS(Embedded GIS)—ArcGIS Engine 是一个完整的嵌入式 GIS 组件库和工具包,开发者能用它创 建一个新的、或扩展原有的可定制的桌面应用程序。使用 ArcGIS Engine,开发者能将 GIS 功能嵌入到已 有的应用程序中,如基于工业标准的产品以及一些商业应用,也可以创建自定义的应用程序,为组织机构 中的众多用户提供 GIS 功能。 服务器 GIS(Server GIS)—ArcGIS Server、ArcIMS 和 ArcSDE 用于创建和管理基于服务的 GIS 应用程序, 在大型机构和互联网上众多用户之间共享地理信息。ArcGIS Server 是一个中心应用服务器,它包含一个 可共享的 GIS 软件对象库,能在企业和 Web 计算框架中建立服务器端的 GIS 应用。ArcIMS 是通过开放的 I
nternet 协议发布地图、数据和元数据的可伸缩的网络地图服务器。ArcSDE 是在各种关系型数据库管理系 统中管理地理信息的高级空间数据服务器。 移动 GIS(Mobile GIS)—ArcPad,支持 GPS 的无线移动设备,越来越多地应用在野外数据采集和信息访 问中。ArcGIS 桌面和 ArcGIS Engine 可以运行在便携式电脑或平板电脑上,用户可以在野外进行数据采集、 分析和乃至制定决策。 ArcGIS Engine 介绍 ArcGIS Engine 是一组完备的并且打包的嵌入式 GIS 组件库和工具库,开发人员可用来创建新的或扩展已 有的桌面应用程序。使用 ArcGIS Engine,开发人员可以将 GIS 功能嵌入到已有的应用软件中,如自定义 行业专用产品;或嵌入到商业生产应用软件中,如 Mirosoftf Word 和 Excel;还可以创建集中式自定义 应用软件,并将其发送给机构内的多个用户。 ArcGIS Engine 由两个产品组成:构建软件所用的开发工具包以及使已完成的应用程序能够运行的可再发 布的 Runtime(运行时环境)。ArcGIS Engine 开发工具包是一个基于组件的软件开发产品,可用于构建 自定义 GIS 和制图应用软件。它并不是一个终端用户产品,而是软件开发人员的工具包,适于为 Windows、 UNIX 或 Linux 用户构建基础制图和综合动态 GIS 应用软件。ArcGIS Engine Runtime 是一个使终端用户 软件能够运行的核心 ArcObjects 组件产品,并且将被安装在每一台运行 ArcGISEngine 应用程序的计算机 上。  ArcGIS Engine 是基于 COM 技术的可嵌入的组件库和工具包,ArcGIS Engine 可以帮助我们很轻松的构 建自定义应用程序.  使用 ArcGIS Engine,开发人员可以将 GIS 功能嵌入到已有的应用软件中,如自定义行业专用产品; 或嵌入到商业生产应用软件中,如 Mirosoftf Word 和 Excel;还可以创建集中式自定义应用软件,并 将其发送给机构内的多个用户。 ArcGIS Engine 由两个产品组成:  面向开发人员的软件开发包(ArcGIS Engi ne Developer ki t)  面向最终用户的运行时(ArcGIS Engi ne Runtime) ArcGIS Engine 开发工具包是一个基于组件的软件开发产品,可用于构建自定义 GIS 和制图应用软件。它 并不是一个终端用户产品,而是软件开发人员的工具包,支持四种开发环境(C++, COM, .NET,以及 Java),适于为 Windows、UNIX 或 Linux 用户构建基础制图和综合动态 GIS 应用软件。 ArcGIS Engine Runtime 是一个使终端用户软件能够运行的核心 ArcObjects 组件产品,并且将被安装在 每一台运行 ArcGIS Engine 应用程序的计算机上。
ArcGIS Engine 的逻辑体系结构 : ◆ Base Services 包含了 ArcEngine 中最核心的 ArcObjects 组件,几乎所有的 GIS 组件需要调用它们,如 Ge ometry 和 Display 等。 ◆ Data Access 包含了访问矢量或栅格数据的 GeoDatabase 所有的接口和类组件。 ◆ Map Presentation 包含了 GIS 应用程序用于数据显示、数据符号化、要素标注和专题图制作等需要的接口和类 组件。 ◆ Develper Components 包含了进行快速开发所需要的全部可视化控件,如 MapControl、PageLayoutControl、SceneControl、Glo beControl、TOCControl、ToolbarControl、SymbologyControl 和 LicensenControl 控件等,除了这些, 该库还包括大量可以有 ToolbarControl 调用的内置 commands、tools、Menus,它们可以极大地简化二次 开发工作。 ◆ Extensions 在图中我们可看出,ArcEngine 的开发体系是一条纵线,功能丰富,层次清晰。最上层的 Extensions 包含 了许多高级开发功能,如 GeoDatabase Update、空间分析、三维分析、网络分析、Schematics 逻辑示意图 以及数据互操作等。ArcEngine 标准版并不包含这些 ArcObjects 许可,他们只能作为扩展存在,需要特定 的 License 才能运行。
ArcGIS Engine 中的类库 ArcGIS Engine 开发中,为了更好的管理这些 COM 对象,ESRI 将这些 COM 对象放在不同的组件库中,而他 们被物理的防盗 bin 目录下的 dll 中,而逻辑上被分散到不同的命名空间中 System System 库是ArcGIS 架构中最底层的库。该库包含了暴露组成ArcGIS 的其它库所使用的服务的组件。 System 库中定义了许多接口,它们可以由开发者来实现。AoInitializer 对象在System 中定义;所有开 发者必须使用该对象在使用Engine 功能的应用程序中初始化和uninitialize ArcGIS Engine。开发者不扩 展该库,但可以通过实现其中的接口来扩展ArcGIS系统。 SystemUI SystemUI 库中包含了可在ArcGIS Engine 中扩展的用户界面组件的接口定义,包括ICommand、ITool 和 IToolControl 接口。开发者使用这些接口来扩展UI 组件。该库所包含的对象是utility 对象,开发者可 用于简化某些用户界面的开发。开发者不扩展该库,但可以通过实现其中的接口来扩展ArcGIS 系统。 Geometry Geometry 库处理存储在特征类(feature classes)或其它图形要素(graphical elements)中的特征的 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 库中。开发者可以通过在空间参考间添加新的空间参考和投影来扩展空间参考系统。 Display Display 库包含了用于GIS 数据显示的对象。除了负责实际图像输出的主要显示对象,该库中还包含了表 示颜色和符号的对象,这些颜色和符号用于控制显示上所绘制实体的属性。库中也包含了为用户在与显示 交互时提供可视化反馈的对象。开发者大都通过类似于Map 或PageLayout 对象提供的视图与显示交互。该 库的所有部分都可以被扩展,常被扩展的有符号、颜色和显示反馈(display feedbacks)。 Output Output 库被用于创建图形输出到设备,如打印机、绘图仪和硬拷贝格式,如增强型图元文件(enhanced metafiles)和栅格影像格式(JPG、BMP 等)。开发者使用该库和ArcGIS 系统其它部分中的对象来创建图形 输出。通常这些是Display 和Carto 库中的对象。开发者可以扩展output 库用于定制的设备和输出格式。 GeoDatabase GeoDatabase 库提供了用于geodatabase 的编程API。Geodatabase 是一个构建在标准工业关系和对象数据
库技术基础上的地理数据储存库。库中的对象为ArcGIS 支持的所有数据源提供了统一的编程模型。 GeoDatabase 库定义了许多由架构中较高层次数据源提供者实现的接口。开发者可以扩展geodatabase 来 支持特殊的数据对象(Features、Classes 等)类型。此外,还可以使用PlugInDataSource 对象添加自定义 的矢量数据源。geodatabase 支持的native 数据类型不可以被扩展。 DataSourcesFile DataSourcesFile 库包含用于基于文件数据源的GeoDatabase API 的实现。这些基于文件的数据源包括 shapefile、coverage、TIN、CAD、SDC、ArcGIS StreetMap™和VPF。开发者不能扩展DataSourcesFile 库。 DataSourcesGDB DataSourcesGDB 库包含了用于数据库数据源的GeoDatabase API 的实现。这些数据源包括Microsoft Access 和SDE®软件支持的RDBMSs。开发者不能扩展DataSourcesGDB库。 DataSourceOleDB DataSourcesOleDB 库包含用于Microsoft OLE DB 数据源的GeoDatabase API 的实现。该库只有在 Microsoft Windows 操作系统上才可以使用。这些数据源包括任何OLE DB 支持的数据提供者和文本文件工 作空间。开发者不能扩展DataSourcesOleDB库。 DataSourceRaster DataSourcesRaster 库包含了用于Raster 数据源的GeoDatabase API 的实现。这些数据源包括SDE 软件支 持的RDBMSs,和所有支持的RDO栅格文件格式。当需要支持新的栅格 格式时,开发者不扩展该库,而是扩展RDO。开发者不扩展DataSourcesRaste 库。 GeoDatabaseDistributed GeoDatabaseDistributed 库通过提供数据导入、导出geodatabase 的工具来支持到企业geodatabase 的分 布式访问。开发者不扩展GeoDatabaseDistributed 库。 Carto Carto 库支持地图的创建和显示;这些地图可以包含一幅地图或具有多幅地图和相关旁注的页中的数据。 PageLayout 对象是宿主一幅或多幅地图和相关旁注(指北针、图例、比例尺条等)的容器。Map 对象是图层 的容器。Map 对象有操作地图中所有图层的属性:空间参考、地图比例尺等,还有操作地图图层的方法。 有多种不同类型的图层可以被加载到地图中。不同数据源通常有一个相关图层负责在地图上显示数据;矢 量特征由FeatureLayer 对象处理,栅格数据由RasterLayer 对象处理,TIN 数据由TinLayer 对象处理等。 若需要,图层可以为它们的相关数据处理所有的绘制操作。但更常见的是图层拥有一个相关的Renderer 对 象。Renderer 对象的属性控制数据在地图中怎样显示。Renderers 一般使用Display 库中的symbols 进行 实际绘图;renderer 只是匹配指定的符号与要绘制的实体的属性。一个Map 和一个PageLayout 可以包含 要素(elements)。要素利用几何体来定义它在地图或页面上的位置,以及控制要素显示的行为。有用于基 本形状、文本标注、复杂旁注等的要素。Carto 库也包含对地图注记和动态标注的支持。 Location Location 库包含支持地理编码和与route 事件一起工作的对象。可通过full 控件的finegrained对象访问 地理编码功能,或GeocodeServer 对象提供了一个简化的API。开发者可以创建他们自己的地理编码对象。 线性参考功能提供了添加事件到线性特征的对象,并使用多种绘制方法渲染这些事件。开发者可以扩展线 性参考功能。 NetworkAnalysis NetworkAnalysis 库提供的对象在网络加载到geodatabase 中时,使用网络数据和对象populating a geodatabase 来分析网络。开发者可以扩展该库来支持定制的网络跟踪。该库是用于utility 网络的—— gas lines、electricity supply lines 等。
Controls 开发者使用Controls 库来构建或扩展具有ArcGIS 功能的应用程序。ArcGIS Controls 通过封装 ArcObjects 和提供一个coarser-grained API,简化了开发过程。尽管控件封装了fine grained ArcObjects, 但它们并不限制访问这些ArcObjects。MapControl 和PageLayoutControl分别封装了Carto 库中的Map 和 PageLayout 对象。ReaderControl 封装了Map 和PageLayout对象,并在使用该控件时提供了简化的API。 如果地图出版商拥有授权许可,那么开发者可 以访问Map 和PageLayout 控件的类似方式访问内部对象。该库也包含实现内容列表的TOCControl 和宿主 与一个合适控件一起工作的命令和工具的ToolbarControl GeoAnalyst GeoAnalyst 库包含支持核心空间分析功能的对象。这些功能在ArcGIS Spatial Analyst和ArcGIS 3D Analyst™库中使用。开发者可以通过创建一个新的栅格操作类型来扩展该库。要求有ArcGIS Spatial Analyst 或3D Analyst 许可才能使用该库中的对象。 3DAnalyst 3DAnalyst 库包含在三维场景中使用的对象,它们的工作方式类似于Carto 库中包含的对象在二维地图中 工作。Scene 对象是库中的主要对象之一,因为它与Map 对象类似,是数据的容器。Camera 和Target 对 象根据特征相对于观察者的位置,指定场景的视图。一个场景(scene)包含一个或多个图层;这些图层指定 了场景中的数据和数据怎样绘制。 3DAnalyst 库拥有一个开发控件和一组和该控件协同工作的命令和工具。该控件可以与Controls 库中的对 象联合使用。除了创建命令和工具,开发者对该库的扩展较少。使用该库中的对象需要3D Analyst 许可。 GlobeCore GlobeCore 库包含与globe 数据一起工作的对象,工作方式类似于Carto 库中包含的对象在二维地图中工 作。Globe 对象是库中的主要对象之一,因为它与Map 对象类似,是数据的容器。GlobeCamera 对象根据 globe 相对于观察者的位置,指定了Globe 视图。Globe 可以有一个或多个图层;这些图层指定了Globe 上 的数据和数据怎样绘制。 介绍完这些,让我们有个感性上的认识,在以后找某个对象的时候,知道去哪个 dll 中找。 二.和 ArcGIS Engine 开发相关的 C#知识 接口编程 使用 ArcGIS Engine,也就意味着使用里面的接口,那么什么是接口呢?在面向对象的编程中,我们都会 接触到这个玩意儿,我们知道面向对象有三大特性 封装,继承,多态,相信很多人在学习多态的时候, 会接触接口。
接口可以用这样一句话来描述“接口就是包含一系列不被实现的方法.而把这些方法的实现交给继承它的 类.”,这句话看起来很晦涩,没关系,我们通过下面一个例子说明 我定义了一个接口 IPeople using System; using System.Collections.Generic; using System.Text; namespace InterfaceTest { interface IPeople { void gender(); } } 这个接口里面有一个性别的方法,这个只对方法进行了定义,而方法内却没有内容,也就是说,通过这个 接口的这个 gender 方法,我们不能知道它到底干什么,但是要知道这个 gender 到底是干什么用的,那么 就要看实现了这个方法的类。同理我定义两个类,分别实现这个接口。 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace InterfaceTest { class Boy:IPeople { public void gender() { Console.WriteLine("I’m a boy."); }
} } using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace InterfaceTest { class Girl:IPeople { public void gender() { Console.WriteLine("I’m a girl."); } } } 通过上面的两个类,我们就很清楚的看到这个方法的作用了,我们也可以看到一个接口可以被多个类实现。 我们运行一下这个,看一下效果 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace InterfaceTest { class Program { static void Main(string[] args) { IPeople Person; // 声明接口变量
分享到:
收藏