ArcGISEngine地理信息系统开发从入门到精通(第二版)(txt+pdf+epub+mobi电子书下载)


发布时间:2021-02-18 14:44:35

点击下载

作者:邱洪钢张青莲熊友谊编著

出版社:人民邮电出版社

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

ArcGISEngine地理信息系统开发从入门到精通(第二版)

ArcGISEngine地理信息系统开发从入门到精通(第二版)试读:

前言

本书是一本指导读者快速入门ArcGIS Engine并提高的书籍,着重介绍了ArcGIS Engine的基本结构、开发技术和使用中的一些技巧,通过本书的学习,读者可以对ArcGIS Engine的许多具体功能有个较清晰的了解并加以应用。

本书内容

本书的例子采用C#编写,大部分使用MapControl控件来展示地图,本书没有将所用到的各个接口图绘制出来,这些接口图可以在ArcGIS Engine的帮助文件中获得。为了帮助读者学习到重点知识以便应用到实战中,结合自己用ArcGIS Engine开发实战经验,选择一些重要的类和接口进行详细介绍,当读者熟习本书的内容后,就会很清楚地找到所需要的接口和类,便于提高学习效率。

本书是在第1版的基础上修订的。分4篇共16章,主要内容为:第1章开发基础,主要讲解了组件对象模型、ArcGIS Engine介绍、基于.NET的ArcGIS Engine的开发等;第2章讲解了ArcGIS Engine中的控件、框架控件、控件使用实例等;第3章几何对象和空间坐标系,主要讲解了Geometry对象、点对象、空间坐标系及变换等;第4章地图组成及图层控制,主要讲解了地图对象、图层对象、屏幕显示对象、图层控制等;第5章地图制图,包括地图标注、专题图制作、地图打印输出等;第6章空间数据管理,主要包括SDE及空间数据、空间数据库及组织、空间数据模型、Geodatabase的使用与开发等;第7章数据编辑包括捕捉功能设计与实现、要素编辑、高级编辑等;第8章栅格数据,主要包括访问和创建栅格数据、栅格数据配准、栅格数据处理、栅格图层渲染等内容;第9章三维可视化,主要讲解了数据的三维显示、三维分析等;第10章空间分析,主要包括空间查询、空间几何图形的集合运算、空间拓扑运算、网络及网络分析等;第11章符号库管理系统的开发,包括系统设计、符号管理工具实现;第12章讲解空间数据管理系统;第13章~第16章将一些开发过程中常见的异常、数据库连接与释放、数据加载以及一些经验技巧作了归纳介绍,本篇的例子主要是对开发过程中经常碰到的问题和实战技巧进行了汇总,以便帮助读者提高工作效率。

本书特色

·资深技术开发工程师亲自执笔。笔者深入理解了ArcGIS Engine内涵、精髓,结合自己丰富培训经验,并结合大量的一线工程实践,潜心编写而成。

·软件版本采用当前最为流行的ArcGIS Engine版本。在知识点讲解过程中穿插了新功能的讲述与应用。

·知识全面、系统,科学安排内容层次架构,由浅入深,循序渐进,适合读者的学习规律。

·理论与实践应用紧密结合。基础理论知识穿插在知识点的讲述中,言简意赅、目标明确,目的使读者知其然,亦知其所以然,达到学以致用的目的。

·知识点+针对每个知识点的小实例+综合实例的讲述方式,可以使读者快速地学习掌握ArcGIS Engine软件操作及应用该知识点解决实践中的问题。综合实例部分,深入细致剖析工程应用的流程、细节、难点、技巧,可以起到融会贯通的作用。

·常见问题解答与技巧集萃。针对读者学习过程中容易遇到的问题,笔者实践过程中总结了实战技巧,本书在最后安排了“常见问题解答与技巧集萃”部分,将零星点滴的经验、技巧、难点一一分析,最大程度地贴近和满足读者的需要。

读者对象

本书从开发者的角度,全面讨论了 ArcGIS Engine 开发的知识,让读者了解和掌握 ArcGIS Engine开发的实战技术,无论是想对ArcGIS Engine入门还是对ArcGIS Engine感兴趣的GIS人员,都能从本书中得到提高。

本书的例子程序使用Visual Studio.NET的C#开发工具,书中的ArcGIS Engine软件和地图数据均来自ESRI公司的产品,在此表示衷心的感谢。本书的实例程序中介绍了许多实战技巧,且全部来自学习和工作实践中获得的经验,由于水平有限,书中难免会存在谬误和不足之处,欢迎读者指正。

本书有邱洪钢、张青莲、熊友谊、张文金、何云松、李霓、曹冬梅主编,参与编写的还有郝旭宁、李建鹏、赵伟茗、刘钦、于志伟、张永岗、周世宾、姚志伟、曹文平、张应迁、张洪才、汪海波、李成等。

谨以此书献给我的父母及家人,他们的支持是我人生最大的财富,也是我编写本书的最大动力。编者第一篇基础篇第1章 开发基础第2章 ArcGIS Engine中的控件第3章 几何对象和空间坐标系第4章 地图组成及图层控制第5章 地图制图第6章 空间数据管理第7章 数据编辑第8章 栅格数据第9章 三维可视化第1章开发基础

1.1 组件对象模型

COM即组件对象模型,是关于如何建立组件,以及如何通过组件建立应用程序的一个规范,说明了如何动态交替更新组件。组件对象模型(COM)是微软公司为计算机工业的软件生产更加符合人类的行为方式开发的一款新的软件开发技术。在COM构架下,人们可以开发出各种各样的、功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统,因此可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制,也可以在多个应用程序中重复利用一个组件。

COM是开发软件组件的一种方法。组件实际上是一些小的二进制可执行程序,它们可以给应用程序、操作系统以及其他的组件提供服务。组件可以在运行时刻,在不被重新链接或编译应用程序的情况下被卸下或替换。Microsoft的许多技术,如Activex、Directx、Ole等都是基于COM而建立起来的,并且Microsoft的开发人员也在大量使用COM组件来定制他们的应用程序及操作系统。

ESRI选择COM作为ArcGIS组件技术的原因是因为,COM是一项成熟的技术,能提供良好的性能,目前有很多开发工具支持,而且有很多组件可用于扩展Engine的功能。因此,基于Engine开发应理解COM技术,需要理解的层次取决于开发的深度。

1.2 ArcGIS Engine介绍

1.2.1 ArcGIS Engine的体系结构

Arc Engine是一个简单的、独立于应用程序的Arc Objects编程环境,开发人员用于建立自定义应用程序的嵌入式GIS组件的一个完整类库。Arc Engine由一个软件开发包和一个可以重新分发的为ARCGIS应用程序提供平台的运行时(runtime)组成。

Arc Engine功能层次由以下 5个部分组成。

·基本服务:由GIS核心Arc Objects构成,如要素几何体和显示。

·数据存取:Arc Engine可以对许多栅格和矢量格式进行存取,包括强大而灵活的地理数据库。

·地图表达:包括用于创建和显示带有符号体系和标注功能的地图的 Arc Objects,以及包括创建自定义应用程序的专题图功能的Arc Objects。

·开发组件:用于快速应用程序开发的高级用户接口控件和高效开发的一个综合帮助系统。

·运行时选项:Arc Engine运行时可以与标准功能或其他高级功能一起部署。

1.2.2 ArcGIS Engine的类库

System类库是Engine中最底层的类库。包含给构成ArcGIS的其他类库提供服务的组件。库中包含了大量可供开发者调用的接口。AoInitializer对象也包含在System类库中,提供给开发者初始化和注销Arc Engine。应用程序不能扩展此类,可通过类库中包含的接口来扩展ARCGIS系统。

SystemUI 类库:主要定义了 ArcGIS 系统中所使用的用户界面组件类型。这些用户界面组件可以在ArcGIS Engine中进行扩展。开发者可利用接口来扩展UI组件。

Geometry 类库:包含了核心几何对象,如点、线、多边形及其几何类型和定义。除了这些实体外,就是作为多边形、多义线的组成部分的几何图形,它们是组成几何图形的子要素,如Segment、Path、Ring等。Polyline、Polygon是由一系列相连接的片段组成的,片段的类型如CircularArc、Line、BezireCurve 等,每个片段是由两个不同的点组成的:起点和终点,以及一个定义两点之间弯曲度的元素类型组成。所有的几何图形对象都支持Buffer、Clip等几何操作,几何子要素不可以扩展。

Display 类库:包含了支持向输出装置绘制符号体系的组件,除了负责实际输出图像的主要显示对象外,还包含了表示符号和颜色的对象,它们用来控制在显示上绘制实体的属性。还包含了在与显示交互时提供给用户的可视化反馈的对象。

Server类库:包含了用于获取到ArcGIS Server的连接的对象,使用GISServerConnection 对象来访问 ArcGIS Server。通过此对象来获取 ServerObjectsManager 对象,开发人员可以操作ServerContext对象,用于处理运行于服务器上的ArcObjects。还可以通过GISClient类库与ArcGIS Server进行交互。

Output类库:包含了生成输出所必须的对象,通常是从地图或页面布局输出到打印机、绘图仪,或导出到文件中。

Geodatabase 类库:包含了所有与数据访问相关的定义的类型,为地理数据提供了编程 API,是建立在标准工业关系型和对象关系数据库技术之上的地理数据库。 Geodatabase 类库提供了比ArcObjects架构中更高级的数据源提供者实现的接口,可以通过扩展地理数据库以支持特定类型的数据对象。

GISClient类库:包含了操作远程GIS服务的对象,这些Web服务可以由ArcIMS或ArcGIS Server提供。GISClient提供了以无态方式直接或通过Web服务目录操作ArcGIS Server对象的通用编程模型。在ArcGIS Server上运行的ArcObjects组件不能通过GISClient接口来访问。要直接访问在服务器上运行的ArcObjects,应使用Server类库中的功能。

DataSourcesFile类库:包含了适用于地理数据库应用程序接口(APIs)所支持的矢量数据格式的工作空间工厂和工作空间。开发者不能扩展DataSourcesFile类库。

DataSourcesGDB类库:包含了适用于存储在RDBMS中的地理数据库所支持的矢量和栅格数据格式的工作空间工厂和工作空间。开发者不能扩展此类库。

DataSourcesOleDB类库:包含了用于Microsoft OLE DB数据源的GeoDatabase API实现。此类库只能用在Microsoft Windows操作系统上。这些数据源包括支持数据提供者和文本工作空间的所有OLE DB。此类库不能扩展。

DataSourcesRaster 类库:包含了用于栅格数据源的 GeoDatabaseAPI 实现,这些数据源包括ArcSDE 支持的关系型数据库管理系统,以及其支持的 RDO 栅格文件格式。当需要支持新的栅格格式时,可以通过扩展RDO实现,而不能直接扩展DataSourcesRaster。

GeoDatabaseDistributed类库:包含了支持分布式地理数据库的访问。不能扩展此类库。

Carto类库:该类库支持地图的创建和显示,PageLayout对象是地图及其底图元素的容器。地图元素包括指北针、图例、比例尺等。Map对象包括地图上所有图层都有的属性,如空间坐标系、地图比例尺以及地图图层的操作。此对象可以加载各种类型的图层,不同类型的图层由相应的对象处理,如FeatureLayer对象处理矢量数据,RasterLayer对象处理栅格数据,TinLayer对象处理TIN数据等。通常图层都有一个相关的Renderer对象,来控制数据在地图中的显示方式。Renderer通常用Display类库中的符号来进行绘制,Renderer只是将特定符号与待绘制实体属性相匹配。

Location类库:包含了与位置数据操作相关的对象,位置数据可以是路径事件或者地理编码的位置,开发者可以创建自己的地理编码对象。线性参考功能提供对象用于向线性要素添加事件,并可用各种绘制方法来绘制这些事件。

NetworkAnalysis 类库:该类库支持应用网络的创建和分析,提供了用于在地理数据库中加载网络数据的对象,并提供对象用于分析加载到地理数据库中的网络。

Controls类库:包含了用于应用软件开发的控制器,包括通过控制器来使用命令和工具。ArcGIS Controls 通过封装 ArcObjects,并提供粗粒度的 API 简化了开发的过程,开发者也可以同时对ArcObjects 进行细粒度的访问。

GeoAnalyst类库:包含了核心空间分析的操作,这些操作可以通过空间分析和3D分析扩展模块来使用。

3Danalyst 类库:包含了用于进行数据 3D 分析以及支持 3D 数据显示的对象。Scene 对象是3Danalyst类库中的主要对象之一,是数据的容器。Camera和Target 对象规定在考虑要素位置与观察者关系时场景如何浏览等。

GlobeCore类库:包含了用于进行球体数据分析以及支持球体数据显示的对象。该类库中有一个开发控件及与其一起使用的命令和工具。该开发控件可以与Controls类库中的对象协同使用。为了使用这个类库中的对象,需要 3D Analyst扩展模块的许可,或者ArcGIS Engine运行时 3D分析选项的许可。

SpatialAnalyst 类库:包含了用于进行栅格与矢量空间分析的对象。使用该类库中的对象,需要ArcGIS空间分析扩展模块的许可,或者ArcGIS Engine运行时空间分析选项的许可。

1.2.3 ArcGIS Engine10新特性介绍

在ArcGIS 10中,将ArcGIS Desktop、ArcGIS Engine、Net sdks以及ArcGIS Server上的AO整合成一个SDK。ArcGIS 10版本开始,除了支持原有的操作系统外,还增加了Windows 7的支持。应用许可方面,之前的版本 ArcGIS Engine每台机器支持单个用户,ArcGIS 10版本开始使用浮动许可机制,允许应用程序在一个拥有一定许可的License服务器上取许可。

此外,在编辑方面也做了比较大的改变,新版本的捕捉环境允许自定义工作中使用,并不仅限于编辑器中的工具,捕捉环境可以通过ArcMap中获取或者通过ArcGIS Engine的 esricontrols中获取。TOC窗体和视图在ArcGIS 10版本中重新架构,以及高级MapTips的表达,更加详细信息,读者可以在中文官网查看http://www.esrichina.com.cn/。

1.3 .NET平台概述

1.3.1 .NET平台介绍

Web服务是由简单网页构成的静态服务网站,发展到可以交互执行一些复杂步骤的动态服务网站,这些服务可能需要一个Web服务调用其他的Web服务,并且像一个传统软件程序那样执行命令。这就需要和其他服务整合,需要多个服务能够一起无缝地协同工作,需要能够建立与设备无关的应用程序,需要能够容易地协调网络上的各个服务的操作步骤,容易地建立新的用户化的服务。

微软推出的.NET技术正是为了满足这一需求而开发的。.NET将Internet本身作为构建新一代操作系统的基础,并对Internet和操作系统的设计思想进行了延伸,使得开发人员能够创建出与设备无关的应用程序,很容易地实现Internet连接。

.NET系统由以下5部分组成。(1).NET开发平台。

.NET开发平台包括.NET Framework和Visual Studio.net。Visual Studio.net是一套完整的开发工具,用于生成ASP Web应用程序、Web Services、桌面应用程序和移动应用程序等。多种开发语言使用同一集成开发环境,该环境允许它们共享工具并有助于创建混合语言解决方案。.NET Framework 是生成、部署和运行 Web 服务及应用程序的平台。其具有两个主要组件:通用语言运行时(Common Language Runtime)和.NET Framework类库。通用语言运行时是.NET Framework的基础,提供了内存管理、线程管理和远程处理等核心服务,并严格检查类型安全。.NET Framework类库是一个综合的面向对象的类型集合,可以使用它开发多种应用程序。(2).NET服务器。

.NET服务器提供了广泛聚合和集成Web服务的服务器,是搭建.NET平台的后端基础。(3).NET基础服务。

.NET基础服务提供密码认证、日历、文件存储、用户信息等功能。(4).NET终端设备。

.NET终端设备提供Internet连接,并实现Web服务的终端设备的前端基础。个人计算机、个人数字助理(PDA)设备以及各种嵌入式设备,将在这个领域发挥作用。(5).NET用户服务。

.NET用户服务即是满足人们各种需求的服务,是.NET的最终目标,也是.NET的价值体现。

1.3.2 .NET FrameWork 4.0 新特性

.NET4框架引入一个改进的安全模式,.NET4框架不会自动使用当前版本公共语言运行库来运行使用以前版本的.NET框架构建应用程序,因此,在.NET4框架下运行以前的应用程序,你必须使用你的Visual Studio项目的属性中制定的目标.NET框架来重新编译你的应用程序,或者在应用程序的配置文件中使用元素来指定支持的运行时刻库。这里只介绍和代码相关的新特性,其他的内容,读者可以自行查阅官网的介绍。

1.4 基于.NET的 ArcGIS Engine的开发

本节通过一个例子程序介绍基于.NET的ArcGIS Engine开发过程,从而为后续章节学习打下基础。本例子的样例数据采用 ArcGIS 安装目录下的“World.mxd”数据文件,本书的安装目录“D:\Program Files\ArcGIS\DeveloperKit10.0\Samples\data\World”。为方便本书样例使用,将Word文件夹复制到E盘根目录下。

在应用程序编写代码之前,应先把应用程序用到的ArcGIS控件和其他的ArcGIS Engine库引用装载到开发环境之中。

重点提示(1)安装好Engine后,在VS2010的工具箱中,自动会增加“ArcGIS Windows Forms”选项卡标签,无需要按下面的步骤重新创建“ESRI”选项卡,本实例重新创建的目的是,演示当选择项丢失时,可以通过该方式重新加载到“ArcGIS Windows Forms”选项卡标签中。(2)本实例添加的“ESRI”选项卡中,每个控件名字都比“ArcGIS Windows Forms”选项卡中多了“AX”前缀,但控件功能及使用是一样的。(3)本实例中“添加引用”内容,也是为了演示目的,让读者知道从哪里添加引用,从工具箱中拖曳控件到Form窗体上后,解决方案的引用中,自动添加相关的内容,本书第一版中有读者反馈代码运行出错等问题,其中就是因为引用丢失,所示代码编译出错。(1)启动Visual Studio.NET,从“新建项目”对话框中创建一个新的Visual C#“Windows窗体应用程序”项目,如图1-1所示。(2)将项目命名为“Sample”,并选择“位置”保存该项目。(3)单击“视图”菜单,选择“工具箱”子菜单项,如图1-2所示。▲图1-1 新建项目▲图1-2 选择工具箱(4)在“工具箱”空白处单击鼠标右键,在弹出的快捷菜单中选择“添加选项卡”,然后在新增选项卡上输入“ESRI”作为选项卡标签,如图1-3所示。(5)在“工具箱”的“ESRI”标签上单击鼠标右键,然后从弹出的快捷菜单中选择“选择项”,如图1-4所示。▲图1-3 添加选项卡▲图1-4 选择项(6)在弹出的“选择工具箱项”对话框中选择“.NET Framework 组件”选项卡,选中“AxMapControl”、“AxPageLayoutControl”、“AxTOCControl”和“AxToolbarControl”等复选框,单击“确定”按钮,将所选择的控件添加到工具栏上,如图1-5所示。(7)在“项目”菜单中选择“添加引用”项,在弹出的“添加引用”对话框中,如图1-6所示;双 击 “ ESRI.ArcGIS.Carto ”、“ ESRI.ArcGIS.Display ”、“ ESRI.ArcGIS.Geometry ”、“ESRI.ArcGIS.System”、“ESRI.ArcGIS.SystemUI”和“ESRI.ArcGIS.Utility”等选项,单击“确定”按钮,如图1-7所示。▲图1-5 选择工具箱项▲图1-6 添加引用菜单▲图1-7 添加引用(8)打开.NET窗体,双击“工具箱”中“ESRI”标签栏中的AxMapControl控件,将MapControl加入到窗体上,再将AxToolbarControl也添加到窗体上。(9)在窗体上双击显示窗体代码窗口(或按“F7”键),加载图层到MapControl中,在Form_Load事件中添加地图文档加载代码,代码如下:

private void Form1_Load(object sender, EventArgs e)

{

 InitializeComponent();

  string path = @"D:\World\";

  string fileName = @"World.mxd";

 //加载地图文件

 axMapControl1.LoadMxFile(path+fileName);

 //将地图全屏最大化

  axMapControl1.Extent = axMapControl1.FullExtent;

}(10)设置ToolbarControl与MapControl控件关联。

设置工具控件与地图控件关联,使用工具栏来操作地图。在 .NET窗体上选中 ToolbarControl控件,单击“ActiveX –Properties…”,弹出“属性”对话框,或者鼠标右键单击ToolbarControl控件,选择“属性”菜单项,在“Buddy”下拉列表中选择关联“axMapControl1”,如图1-8所示。

选择“Items”选项卡,单击“Add”按钮,在弹出的“Controls Commands”对话框中添加“Pan”、“Zoom In”和“Zoom Out”,如图 1-9所示。▲图1-8 设置工具控件与地图控件关联▲图1-9 Items选项卡(11)在Visual Studio.NET中按“F5”键运行程序,结果如图 1-10所示。▲图1-10 运行程序界面

重点提示

ArcGIS Engine 10版本开始有一些明显的产品架构上的变更,新架构最明显的优势就是独立存在的ArcGIS Desktop和Engine runtime,可以将这两个产品安装在不同的目录下,可以分别对这两个产品打补丁等。基于这一架构的变化,要求 Engine应用程序以及自定义组件等绑定到计算机上指定的产品。例如,绑定到Desktop和Engine两种产品上,则如下所示。(12)添加绑定产品代码,本例绑定“EngineOrDesktop”,如图1-11所示。▲图1-11 运行程序界面(13)在Visual Studio.NET中按“F5”键运行程序,结果如图 1-12所示。▲图1-12 运行程序界面

1.5 本章小结

本章对全书的知识点作了一个概要的介绍,让读者有个基本印象。介绍了组件对象模型、ArcGIS Engine的体系结构、ArcGIS Engine的类库,以及ArcGIS Engine、.Net平台新特性。最后做了一个简单的小程序,演示了基于.NET的ArcGIS Engine的开发过程,并给出了新版本的一些差异,以使读者能对ArcGIS Engine有一个感性认识。第2章ArcGIS Engine中的控件

为了快速构建一个GIS应用程序,ArcGIS Engine给开发者提供了一些可视化控件,如制图控件、3D 控件、框架控件等。ArcGIS 控件可以通过两种方式建立应用程序,其一,ArcGIS 控件可以嵌入到现有的应用程序中以增强制图功能;其二,ArcGIS控件可用于创建新的独立应用程序。

制图控件,如MapControl、PageLayoutControl,其中MapControl控件主要用于地理数据的显示和分析,PageLayoutControl用于生成一幅成品地图。MapControl封装了Map对象,而PageLayoutControl则封装了PageLayout对象。这两个控件都实现了IMxContents接口,因此不仅可以读取ArcMap创建的地图文档,而且可以将自身的地图内容写到一个新的地图文档中。

三维控件,如GlobeControl、SceneControl都具有导航功能,允许终端用户操作三维视图,而不必使用控件命令或自定义命令。通过设置 Navigate 属性,用户就可以操作三维视图,如前后左右移动、放大缩小等。

框架控件,如TOCControl、ToolbarControl,需要与其他的控件协作使用。例如在TOCControl控件属性页中设置与MapControl关联,单在MapControl中删除一个图层时,该图层也从TOCControl中删除。

本章详细介绍这6个控件,并给出C#的实际使用。

2.1 制图控件介绍

2.1.1 地图控件

MapControl控件封装了Map对象,并提供了其他的属性、方法和事件,用于管理控件的外观、显示属性和地图属性,管理、添加数据图层,装载地图文档,显示、绘制跟踪图层。MapControl上存在着诸如TrackRectangle、TrackPolygon、TrackLine和TrackCircle等帮助方法,用于追踪或“橡皮圈箍(rubber banding)”显示上的几何图形(Shape)。VisibleRegion属性可用于更改MapControl显示区内的几何图形。MapControl 控件实现的主要接口有 IMapControlDefault、IMapControl2、IMapControl3、IMapControlEvents2等,如图2-1所示。▲图2-1 MapControl控件实现的主要接口

2.1.1.1 IMapControlDefault接口

IMapControlDefault接口是地图控件默认接口。当将MapControl控件拖曳到容器上时,会自动创建一个axMapControl1的对象,该对象全部继承父类接口的属性和方法。下面的代码演示了如何使用这个接口。

IMapControlDefault mapControlDefault;

MapControl mapControl;

MapControl = axMapControl1.Object as IMapControlDefault;

2.1.1.2 IMapControl2接口

IMapControl2接口提供了一系列的属性和方法,如设置控件外观,设置Map对象或控件的显示属性,添加和管理数据图层、地图文挡,在控件上绘制图形和返回几何对象等,如图2-2所示。▲图2-2 IMapControl2接口提供的属性和方法

2.1.1.3 IMapControl3接口

该接口继承自IMapControl2,并增加了8个属性和一个方法。

CustomProperty:设置自定义控件属性。

DocumentFilename:返回MapControl装入的地图文档的文件名。

DocumentMap:返回MapControl最后装入的地图名称。

KyeIntercept:返回或设置MapControl截取键盘按键信息。

Object:返回MapControl控件。

IMapControl2 mapControl2;

mapControl2=axMapControl1.Object as IMapControl2 ;

mapControl2 =axMapControl1.GetOcx() as IMapControl2 ;

IMapControl3 mapControl3;

mapControl3 = axMapControl1.Object as IMapControl3;

mapControl3 = axMapControl1.GetOcx() as IMapControl3;

ShowMapTips:确定是否显示地图的Map Tips。

TipDelay:设置Map Tips的延迟时间。

TipStyle:设置Map Tips的显示样式。

SuppressResizeDrawing():当控件尺寸发生变化时阻止数据实时重绘。

2.1.1.4 IMapControlEvents2接口

IMapcontrolEvents2 定义了 MapControl 能够处理的全部事件,如图 2-3 所示。图中, OnBeforeScreenDraw事件是屏幕绘制前触发的事件,OnViewRefreshed是视频刷新触发事件。▲图2-3 MapControl能够处理的全部事件

2.1.2 页面布局控件

PageLayoutControl控件主要用于页面布局与制图。该控件封装了PageLayout类,提供了布局视图中控制元素的属性和方法,以及其他的事件、属性和方法。

·Printer属性提供了处理地图打印的设置。

·Page 属性提供了处理控件的页面效果。

·Element属性则用于管理控件中的地图元素。

PageLayoutControl控件不能添加地图图层或地理数据,必须通过使用MXD文件来加载需要处理的数据。PageLayoutControl 控件主要实现 IPageLayoutControlDefault、IPageLayoutControl、IPageLayoutControl2、IPageLayoutControlEvents等接口,如图2-4所示。▲图2-4 PageLayout Control控件主要实现的接口

IPageLayoutControlDefault接口

IPagelayoutControlDefault 是界面调用的默认接口。该接口是纯接口,因此可以在新版本中使用。接口的方法和属性都是相同的最高版本的主界面上的 PageLayoutControl ,例如IPageLayoutControlDefalut 相当于 IPageLayoutControl2 ,但在以后的新版本中可能成为IPageLayoutControl3。通过使用IPageLayoutControlDefault接口,可以保证使用的PageLayoutControl是最新版本。

注意 mapDocument属于 carto名称空间在属性,嵌入式互操作类型中改为FALSE。

2.2 3D控件介绍

SceneControl 和 GlobeControl 都是嵌入式的开发组件,可以通过开发环境增加到窗体中或者对话框中,它们都提供了设置属性,并且能直接单击控件来增加功能,当然这个属性页也提供了快捷的选择控件属性和方法,并允许开发者编写自己的代码来进行相关的操作。3D 控件主要用到两个类:3DAnalyst和GlobeCore。

1.3DAnalyst 类

包含了 3D scenes的对象,当然也包含了ArcGlobe应用程序运用的类库,主要的开发组件是在 GlobeCore 类库中的定义,定义文件为 esri3DAnalyst.olb,主要定义了 SceneControl、Scene、SceneGraph、3Dproperties、SceneExporter3D、SceneViewer、3Dsymbol和AnimationTrack等。

2.GlobeCore类

是 ArcGlobe 应用程序主要运用的类库,同时进行基于 global 数据的 ArcGIS 3D 分析。在GlobeCore 类库中,定义了 2D 和 3D 数据在 globe 的表面显示及数据操作,定义文件为esriGlobeCore.olb,主要定义了GlobeControl、Globe、GlobeDisplay、GlobeCamera、GlobeViewer、GlobeLayerProperties、GlobeLayer和AnimationTrack等。

3DAnalyst和GlobeCore类库包括了SceneControl 和GlobeControl开发组件,并且提供了基于Scene 和 Globe 的命令并可协同工作。SceneControl 和 GlobeControl 也可以与 ToolbarControl 和TOCControl开发组件关联。它所定义的类库如图2-5所示。▲图2-5 定义的类库

但是需要注意的是:SceneControl 和GlobeControl对图层的定义有所区别。Globe的图层分为esriGlobeLayerTypeDraped、esriGlobeLayerTypeFloating、esriGlobeDataElevation等3种,更适合三维用户使用。而在SCENE中就没有这种概念,这也是很多SCENE用户转向GLOBE时比较迷茫的。Elevation 图层一经定义,所有的 Draped 图层将依附于 Elevation 图层表面上。如果要单独定义图层的Elevation,就必须定义该图层为Draped 图层,这一点就与SCENE一样了。

2.2.1 场景控件——SceneControl

SceneControl是一个高性能的嵌入式的开发组件,提供给开发者建立和扩展Scene程序,当然也提供了基于ArcScene的功能给用户,以便进行绘图等操作。控件SceneControl相当于ArcScene Desktop应用程序中的3D视图,并且提供了显示和增加空间数据到3D的方法等。

SceneControl是单一的开发进程,并且提供了粗粒度ArcEngine组件对象,也提供了强大纹理着色的功能。SceneControl通过对象接口ISceneViewer来表现,ISceneViewer接口提供了一个Camera对象,该对象由视角(Observer)和目标(Target)构成。SceneControl控件提供一些属性和方法操作三维对象。例如,Camera、Scene、SceneGraph和SceneViewer等属性。LoadSxFile方法,用于导入scene文档。SceneControl是进行三维开发最基本的控件,如图2-6所示。▲图2-6 SceneControl开发进程

3DAnalyst类库包含了命令、工具和工具集,可与SceneControl控件共同工作来进行操作。例如,scene navigation命令和工具用来移动对象到新的位置(camera),Scene命令包含了GUID和命令描述,详细信息读者可以参考帮助中的“Names and IDs of the ControlCommands”部分。帮助信息中介绍了Commands和 tools使用,例如:Pan, zoom, fly, set observer, select Toolbars,我们可以看看下面所有SceneControl中已经提供了命令、工具,如图2-7所示。▲图2-7 SceneControl提供的命令、工具

2.2.2 Globe控件

GlobeControl 是一个高性能的嵌入式的开发组件,提供给开发者建立和扩展 ArcGlobe 程序,当然也提供了基于ArcGlobe的功能给用户,以便进行绘图等操作。GlobeControl显示3D视图,并能提供全球表现的位置,而且是基于3D数据。GlobeControl控件对应于ArcGlobe桌面应用程序的三维视图。GlobeControl封装了GlobeViewer对象,可以加载ArcGlobe应用程序创作的Globe文档。

GlobeControl 也是单一的开发进程,并且提供了粗粒度ArcEngine组件对象,当然也提供了强大纹理着色的 ArcEngine 组件。GlobeControl 通过对象接口来操作 IGlobe 视图,用户可以通过IGlobeViewer 对象来操作 ArcGlobe 应用程序。IGlobeViewer 接象包含一个 GlobeDisplay , GlobeDisplay又包含一个Globe。GlobeControl提供了经常使用的属性和方法,例如,GlobeControl有GlobeCamera、Globe、GlobeDisplay和GlobeViewer等属性,当然GlobeControl也能执行一些方法或任务,例如,GlobeControl有Load3dFile方法用于导入globe文档。GlobeControl是进行三维开发最基本的控件,因为其提供了用户界面,所以更容易进行开发,当然使用对象模型也能很容易地理解及开发三维功能,如图2-8所示。▲图2-8 Globe Control开发进程

esriGlobeCore 类库中包含了工具、命令和工具集与 GlobeControl 控件共同工作来执行操作,详细信息读者可以参考帮助中的“Names and IDs of the ControlCommands”部分,我们可以看看下面所有GlobeControl中已经提供了命令、工具,如图2-9所示。

2.2.3 SceneControl和GlobeControl的异同

SceneControl支持下面的主要特征:

3D线符号有Tubes、walls和 textured lines;

TIN 数据显示和分析;

基于内存Memory的显示原理;

支持立体和平面视图;

表面分析工具,比如最短路径和等高线的生成1;

Layer 支持,比如图层坐标转换;

输出到3D格式(vrml);

动态阴影效果。

GlobeControl支持下面的主要特征:

所有的数据源必须具有空间参考;

空间参考可以是地理坐标系统或工程坐标系统;

页面显示,提供多级显示机制,对于大数据量支持caching的方式;

超链接(hyperlinks);▲图2-9 Globe Control提供的命令、工具

导航和分析工具,比如量测、步行、放大、缩小、移动目标到中心、缩放目标;

地图符号支持光栅要素图层;

旋转工具栏;

各式各样的显示目标(正面朝上)、观测者位置和指北针、剪切控制面板。

可以创建一个模板图层,比如MapServer layers、ArcIMS Image layers、feature annotation layers、WMS layers和MOLE(Military Overlay Editor) layers。对Feature透明度,在GlobeControl中有一些数据不被支持,比如Tracking Analyst图层、测量 layers和Geostatistics 图层。另外,TINs数据不直接支持,所以要转换成栅格(rasters)。

Scene和Globe

SceneControl和GlobeControl有一些对于3D对象操作的类似功能,Scene和Globe都支持2D和 3D数据图层,Scene或Globe中的对象都允许进行 3D控制,其中MapControl中的Map CoClass相似。从图2-10所示中可以看到这两者的一些区别及相似的地方。▲图2-10 Scene和Globe比较

下面进一步说明其内在的联系及区别。

SceneGraph和GlobeDisplay

SceneGraph和GlobeDisplay都是进行3D绘制和着色功能的类,当然在3D制图程序方面还是有一些不同。对于视图窗口,可以进行Add、remove、set active、refresh等操作,也可以改变一些属性,比如Vertical exaggeration、extent、contrast,以及对 caches的控制。它们在模型中的位置,如图2-11所示。▲图2-11 Scene Graph和Globe Display

SceneViewer和GlobeViewer

SceneViewer 和GlobeViewer 是SceneControl和GlobeControl中的3D显示窗口,当然它们都各自支持自身的控件。这个当前的视图还可以通过 ActiveViewer 得到。I3DViewer 提供了一些共同的属性和方法来对 scene和 globe的视图进行操作,并且比如全屏等都可以在 Scene和 Globe中使用,它们都是非模态3D显示窗口,也能通过不同的视角来显示3D数据。它们在模型中的位置,如图2-12所示。▲图2-12 SceneViewer和Globe Viewer

Camera和GlobeCamera

Camera 和 GlobeCamera分别控制着一个 scene viewer和Globe中的不同的观测点。它们在模型中的位置,如图2-13所示。▲图2-13 Camera和Globe Camera

2.3 框架控件介绍

2.3.1 图层树控件——TOCControl

TOCControl是用来管理图层的可见性和标签的编辑。TOCControl需要一个“伙伴控件”,或实现了 IActiveView 接口的对象协同工作。“伙伴控件”可以是 MapControl、PageLayoutControl 、ReaderControl、SceneControl或GlobeControl。“伙伴控件”可以通过TOCControl属性页设置,或者在驻留TOCControl的容器被显示时用SetBuddyControl方法通过编程设置。TOCControl的每个“伙伴控件”都实现了ITOCBuddy 接口。TOCControl用“伙伴控件”来显示其地图、图层和符号体系内容的一个交互树视图,并保持其内容与“伙伴控件”同步。TOCControl通过ITOCBuddy接口来访问其“伙伴控件”。

TOCControl 的主要接口有两个,一个是 ITOCControl ,另一个是 ITOCControlEvents。ITOCControl 接口是任何与 TOCControl 有关的任务的出发点,如设置控件的外观、设置“伙伴控件”、管理图层的可见性和标签的编辑等。ITOCControlEvents是一个事件接口,它定义了TOCControl能够处理的全部事件,如 OnMouseDown、OnMouseMove、OnMouseUp 等,这些事件在构建独立应用程序中经常使用,如OnBeginLabelEdit、OnEndLabelEdit分别是TOCControl中的标签开始编辑、结束编辑时触发。

2.3.2 工具栏控件——ToolbarControl

ToolbarControl 包括 6个对象及相关接口:ToolbarControl、ToolbarItem、ToolbarMenu、CommandPool、CustomizeDialog、MissingCommand。ToolbarControl要与一个“伙伴控件”协同工作,通过ToolbarControl属性页设置,或者在驻留ToolbarControl的容器被显示时用SetBuddyControl方法通过编程设置。

ToolbarControl的每个“伙伴控件”都实现了IToolbarBuddy接口,这个接口用于设置“伙伴控件”的CurrentTool 属性。如通过设置MapControl作为其“伙伴控件”,当用户单击该ToolbarControl上的“拉框放大”工具时,该放大工具就会成为MapControl的CurrentTool。放大工具的实现过程是:通过ToolbarControl获取其“伙伴控件”,然后在MapControl上提供显示终端用户拉动鼠标所画的框,并改变MapControl的显示范围。

ToolbarControl 一般要与一个“伙伴控件”协同工作,并有一个控件命令选择集,以便快速提供功能强大的GIS应用程序。ToolbarControl 不仅提供了部分用户界面,而且还提供了部分应用程序框架。ArcGIS Desktop应用程序,如ArcMap、ArcGlobe和ArcScene等具有强大而灵活的框架,包括工具条、命令、菜单、泊靠窗口和状态条等用户界面组件,这些框架使终端用户可以通过改变位置、添加和删除这些用户界面组件来定制应用程序。

ArcGIS Engine提供了几套使用ArcGIS控件的命令,以便执行某种特定动作,开发人员可通过创建执行特定任务的定制命令来扩展这套控件命令。所有的命令对象都实现了 ICommand 接口, ToolbarControl 在适当的时候要使用该接口来调用方法和访问属性。在命令对象被驻留到ToolbarControl后,就会立即调用ICommand::OnCreate方法,这个方法将一个句柄(Handle)或钩子(hook)传递给该命令操作的应用程序。命令的实现一般都要经过测试,以查看该钩子(hook)对象是否被支持,如果不支持则该钩子自动失效,如果支持,命令则存储该钩子以便以后使用。ToolbarControl使用钩子(hook)来联系命令对象和“伙伴控件”,并提供了属性、方法和事件用于管理控件的外观,设置伙伴控件,添加、删除命令项,设置当前工具等。ToolbarControl 的主要接口有:IToolbarControl、IToolbarControlDefault、IToolbarControlEvents。(1)IToolbarControl:该接口是任何与 ToolbarControl 有关的任务的出发点,如设置“伙伴控件”的外观,设置伙伴控件,添加或去除命令、工具、菜单等。(2)IToolbarControlDefault:该接口是自动暴露的默认的 dispatch 接口,该接口的属性和方法与ToolbarControl的最高版本主接口的属性、方法相同。例如目前版本中的IToolbarControlDefault等同于 IToolbarControl ,但在今后的新版本中,可能会变为

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

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载