赞
踩
六月的某一天,骄阳似火,夜幕已悄悄降临,坐在电脑前回想自己的大学四年时光,或痛心疾首,或微微憨笑,感概万千,在GIS专业学习了4年,有很多收获,也有很多遗憾,幸而考上了研究生可以继续深造。于是乎心里的雄心一下被激发了,总结自己的所学知识,打算重新开始,把ArcGIS Engine写一本入门级的教程,为初学者少做弯路,也为自己总结下知识,更为打发着无聊时光。以上为序,语无伦次自娱自乐!PS:本教程虽为入门及教程,但也要求你有入门级的知识,如果你是哲学专业的,那我也无力回天啊! 还有本教程素材全部来源于互联网,版权未知,要我说感谢的话:感谢CCTV,感谢MTV……就此打住。
ArcGIS提供了一个可伸缩的框架,可以为独立用户或者多用户,既可以在桌面端也可以在服务器端提供GIS。
ArcGIS 9是用来构建一个完整GIS应用的GIS软件产品集成。它是基于共享的GIS软件组件——ArcObjects。ArcGIS 9由以下四部分组成:
1)ArcGIS Desktop——高级GIS应用的集成
2)ArcGIS Engine——根据应用程序接口来构建基本应用的嵌入式GIS组件库
3)ArcGIS Server——在企业级或者网络框架下构建服务器端GIS应用的平台,用来构建Web服务和Web应用
4)ArcIMS——通过公开的因特网协议来发布地图、数据和元数据的GIS Web服务器
每一个GIS框架同样包含ArcSDE网关,这是在关系数据库(RDBMS)上组织地理数据的接口。
ArcGIS是构建地理信息系统的平台。ArcGIS 9在地理数据处理、3D可视化表达和开发工具方面做了新的扩展。两个新的产品——ArcGIS Engine和ArcGIS Server在这个版本中发布,是ArcGIS成为一个应用程序及服务端开发的完整产品。
1)使用ArcGIS能够开发出一系列的产品,开发者可以:
2) 配置/定制ArcGIS的应用,例如ArcMap和ArcCatalog
3)扩展ArcGIS的结构和数据模型
4)利用ArcGIS Engine在其他应用程序中嵌入地图和GIS功能
5)使用ArcGIS Engine构建并部署桌面版应用程序
6) 使用ArcGIS Server构建Web服务和应用
ArcGIS系列产品是通过称之为ArcObjects的软件组件加以构建和扩展的。ArcObjects包括一系列不同的程序组件,从高度封装的组件(例如独立的geometry objects)到低级组件(例如能够同已有的ArcMap文档集成的地图组件)。这些组件为开发者集成了大量的GIS功能。
ArcGIS 9的全线产品都具备开发功能(Engine,Server和Desktop)。作为一个开发者,您能够使用标准程序框架结合ArcObjects来扩张ArcGIS Desktop;能够用ArcGIS Engine定制应用;能够使用ArcGIS Server构建企业级的GIS应用。
ArcGIS Desktop包含了一些列的Windows桌面应用程序(例如,地图、目录、工具箱、地球方面的应用)。ArcGIS Desktop包含了三种功能级别(ArcView,ArcEditor和ArcInfo),使用ArcGIS Desktop开发包能够进行客户化和扩展。
ArcGIS Desktop的软件开发包(software developer kit,SDK)包含在ArcView,ArcEditor和ArcInfo内,支持COM(Component Objects Model,组件对象模型)和.NET程序框架。许多开发者利用Desktop SDK扩展功能,创建新的GIS工具,定制用户界面,完善ArcGIS Desktop应用中专业GIS产品的扩展功能。
ArcGIS Server不仅定义和实现了一系列标准的GIS Web服务(例如,地图、数据访问、地理编码等),同时还支持利用ArcObjects进行企业级的服务端应用开发。
ArcGIS Server开发包让开发者能构建GIS服务器用来向多用户提供可供访问的GIS功能,能通过客户端对大型GIS中央服务器进行处理,能构建和分发GIS Web应用,能进行分布式GIS运算。
ArcObjects是ArcGIS Desktop的开发平台。
ArcGIS Desktop是一系列GIS软件系统:ArcInfo,ArcEditor和ArcView。这些系统服务于GIS,例如地理数据组织、控件编辑、分级可视化等功能。
ArcGIS Desktop系统包含一系列的应用,例如ArcCatalog、ArcMap、ArcToolBox和ArcScene,并且能够集成大量不同的扩展产品,例如ArcGIS Spatial Analyst(空间分析模块),ArcGIS Geostatistical Analyst(地理统计分析模块),ArcGIS 3D Analyst(三维分析模块)等。
ArcObjects是使用微软的组件对象模型(Component Objects Model,COM)书写。因此,凡是支持COM标准的开发语言都能使用ArcObjects。您能向ESRI(Environment System Research Institute,环境系统研究所)的开发者一样,使用同样的方式来扩展ArcObjects中的任何一部分。
ArcGIS Engine是开发者用来构建应用程序的一整套嵌入式GIS组件。使用ArcGIS Engine,您可以将一些GIS功能嵌入到已有的应用程序中,这包括Microsoft Office产品,例如Word和Excel,建造有针对性的客户应用程序用来将高级GIS系统与他人分享。ArcGIS Engine由一个软件开发包(software development kit,SDK)和一个给所有ArcGIS应用提供平台的运行许可(runtime)构成。
构成ArcGIS Engine的五部分分别如下:
1)基本服务——几乎任何GIS应用都需要的核心GIS ArcObjects,例如几何(geometry),显示(display)等。
2)数据访问——ArcGIS Engine提供许多栅格和矢量数据的访问方式,包括与geodatabase相当的能力和灵活性。
3)地图表达——ArcObjects使用符号、注记和专题地图来生成和表达地图。
4)开发组件——用来快速定制应用开发程序的高度封装用户接口以及开发过程中全面的帮助系统。
5)运行许可——ArcGIS Engine运行许可可以部署标准功能或者加入一些附加的高级功能。
这中间除了运行许可之外的任何一部分,都打包集成到ArcGIS Engine开发包(SDK)中。ArcGIS Engine运行许可及其选项,尽管是开发完整的GIS应用程序中的一部分,但包含了应用部署,所以被单独打包。
ArcGIS Engine SDK是用来开发和部署GIS及地图方面应用程序的组件化软件开发产品。ArcGIS Engine SDK不是终端产品而是共应用开发者使用的软件包。它能构建基本的地图浏览或者全面的、动态的GIS编辑工具。使用ArcGIS Engine SDK,作为开发者,您在定制地图功能接口方面有空前的自由。您可以使用许多API中的一些来构建独一无二的应用程序或者将ArcGIS Engine组建与其他软件组建整合,来实现地图和用户需要的其他信息之间的完美结合。
使用ArcGIS Engine,地图既能够作为应用程序的核心,也可以作为一个可选项。例如,如果您的应用主要是数据库中的商务信息,当您查询数据库的时候,ArcGIS Engine能够将您感兴趣的商业信息在地图上高亮显示定位出来。
ArcGIS Engine SDK提供了大量的GIS组件,或者称为ArcObjects,按照之前的介绍,包括基本服务、数据访问和地图表达。之前提到的ArcGIS Engine的第四部分,也就是开发组件,也包含在SDK中间。这些都是用来构建一个高质量地图接口的开发控件。下面列出的ArcGIS 控件,或者说可视化控件,用来辅助应用程序开发(下文将针对控件进行更加详细的介绍)。
1)MapControl
2) PageLayoutControl
3) SceneControl
4)GlobeControl
5)ToolbarControl
6)TOCControl
7)ReaderControl
8)ToolbarControl中所用到的commands(命令)、tools(工具)和menus(菜单)
ArcGIS Engine的最后一部分是运行许可。所有用ArcGIS Engine SDK构建出的应用程序都需要不同级别的ArcGIS Engine运行许可才能够正常运行。ArcGIS Engine Runtime是ArcGIS Desktop(ArcGIS 桌面版)构建的平台,如果得到ArcGIS Engine应用开发许可,ArcGIS Desktop的用户就能够执行基本的基于Engine的应用。ArcGIS Engine Runtime从标准功能到企业级功能之间有许多不同的选择。
ArcGIS Engine的功能十分强大。作为ArcGIS Engine开发者,您可以实现以下列出的和其他更多的功能,这包括:
1) 用多个图层来显示地图,例如道路、水系、边界等
2) 地图的漫游和缩放
3) 地图上要素的确认
4) 地图上要素的查询和定位
5) 根据属性值显示注记
6) 根据航片或者卫片显示图像
7) 绘制几何图形,例如点、线、弧、多边形
8) 添加描述性的文字
9)沿着线选择或者选择矩形、某一范围内、多边形等内部的要素
10)选择距离在某一范围内的要素
11)利用SQL语言来寻找和选择要素
12)利用专题地图来渲染要素,如唯一值法、分级法和点状密度法
13)动态显示实时地图或者时序数据
14)根据地理编码来寻找位置
15)转换您地图的坐标系
16)根据几何操作来生成缓冲区、计算差值,或者进行求交、求并等运算
17)编辑要素形状或者旋转地图
18)创建并更新要素的几何形状及其属性
编辑要素(Editing Features)
ArcGIS Engine开发包让您构建出能创建、修改和删除geodatabase中矢量要素或者shapefile文件的应用程序。标准的ArcGIS Engine Runtime能够让编辑shapefile文件或者personal geodatabase中简单要素的程序运行。然而,要构建企业级geodatabase的全部功能,就需要ArcGIS Engine Runtime中的Geodatabase Update选项。
空间建模和分析
通过增加ArcGIS Engine Runtime中的Spatial选项,您能够扩展ArcGIS Engine的功能。这个选项(Spatial选项)能提供一系列强劲的空间建模和分析功能。您能够创建、查询、表达和分析基于象元的栅格数据,能够集成栅格和矢量数据进行分析,能够从已有数据挖掘出新的信息,能够从多层数据中查询信息,能够在ArcGIS Engine应用程序中完美集成基于象元的栅格数据和矢量数据。例如,您能够:
1)将要素(如点、线或者面)转化成栅格图
2)基于距离或者要素、栅格间的关系来创建栅格缓冲区
3)根据点状要素生成密度图
4)生成等高线、坡度、可视化区域、方向和山体阴影
5)栅格图的分类及显示
6)兼容TIFF,BIL,IMG,USGS DEM,SDTS,DTED等标准格式及多种其他格式数据
7)三维可视化等
ArcGIS Engine Runtime中的3D选项让您通过使用Scene和Globe控件来有效的表达和分析区域及全球数据。您能够从多个不同的视点查看表面;您能够查询表面,决定从某个选中的位置看,哪些要素是可见的;您能够将栅格和矢量数据贴在表面以构建真实的透视影像。例如,您能够:
1)显示Scene和Globe文档
2)展示交互性的透视图,包括漫游、缩放、旋转、倾斜、模拟飞行以便于表达和分析
3)显示真实世界的表面要素,例如楼房
4)展示视域和可见范围分析、场景高度内插、剖面分析和最短距离分析
微软提出的.NETt技术体系主要包括.NET Framework和Visual Studio.NET两部分。Visual Studio.NET是一套完整的开发工具,用于生成各种类型的应用程序,包括ASP WEB应用程序、XML Web service、桌面应用程序和移动应用程序。.NET Framework是生成、部署和运行Web服务及应用程序的平台。它包括2个主要组件:通用运行时(Common Language Runtime,CLR)和.NET Framework类库。
计算机出现以后,数学家和计算机学家们相继开发了多种计算机高级语言,从Small-talk、Pascal、Basic、C、C++、Java到.NET平台上的各种语言,他们的发展步伐,可以看作是计算机语言从面向过程相面对象发展的一段历史。许多面向对象语言的教材都会告诉读者这一段历史,并宣称OO(Oriented-Object,面向对象)编程的优越性。从面向过程向面向对象转变的时候,需要注意的术语从“过程”、“函数”转变到了“类”“对象”上。
IGraphicsContainer pGraphicsContainer = pActiveView.FocusMap as IGraphicsContainer;
IActiveView pActiveView = pGraphicsContaineer as IActiveView;//QI到IActiveView接口
AO开发中QI(接口查询)非常重要,从某种意义上说不会QI就不会做AO开发。
在讲ArcGIS Engine开发QI实例操作之前,以一个现实生活例子以方便大家理解QI。
1.首先我先定义三个接口:IZou(走),IJingzou (竞走),IHeshui(喝水)如下所示
interface IZou
{
void start();
void stop();
}
interface IJingzou : IZou
{
void niupigu();
}
interface IHeshui
{
void heshui();
}
2.定义一个人类实现IZou(走)IHeshui(喝水)两个接口
class person : IZou, IHeshui
{
void IZou.start()//注:显式接口实现后边会讲到
{
MessageBox.Show("开始走");
}
void IZou.stop()
{
MessageBox.Show("停止走");
}
void IHeshui.heshui()
{
MessageBox.Show("开始喝水");
}
}
3.定义一个运动员类继承于人类实现IJingzou 接口
class yundongyuan : person, IJingzou
{
void IZou.start()
{
MessageBox.Show("开始走");
}
void IZou.stop()
{
MessageBox.Show("停止走");
}
void IJingzou .niupigu()
{
MessageBox.Show("开始扭屁股");
}
}
定义完接口与类,接下来我给大家演示QI
1.实例化一个person类。
IZou pZou = new person();
pZou.start();
IJingzou pJIngzou = pZou as IJingzou ;//进行QI
pJIngzou.niupigu();//将会出错如下图所示
为什么会出现这个错误是因为用new实例化了一个人,但是并不是所有的人都会竞走的也就是说Person这个类没有实现IJingzou 这个接口所以报错。所以做QI之前必须查看你实例化的类是不是实现了相关接口。
2.实例化一个yundongyuan
IZou pZou = new yundongyuan();
pZou.start();
IJingzou pJIngzou = pZou as IJingzou ;
pJIngzou.niupigu();//将会执行如下图
通过实例化一个yundongyuan之后我就可以通过IZou接口直接QI到Ijingozu这个接口,然后执行Ijingozu接口所提供的方法这就是QI。
3.Ok我们现在我们再在第二部做个补充,运动员开始扭屁股竞走了,竞走运动员在竞走过程中太渴想喝水怎么办?痛过QI切到
IHeshui接口执行喝水方法即可,如下例
IZou pZou = new yundongyuan();
pZou.start();
IJingzou pJIngzou = pZou as IJingzou ;
pJIngzou.niupigu();//将会执行
IHeshui pHeshui = pJIngzou as IHeshui;//QI到IHeshui接口
pHeshui.heshui();//运动员将喝水
上边这个实例演示完,大家对QI会有所了解,那么如何在ArcGIS Engine开发中使用QI呢?接下来我以一个功能实例来演示一下QI在ArcGIS Engine开发中的使用。
下图在地图控件上有两个图层:一个面图层在上,一个是等高线图层在下
我们实现一个小功能,让面图层为半透明图层能够看到下边等高线图层,代码如下:
privatevoid button1_Click(object sender,EventArgs e)
{
//获取第一个图层
ILayer pLayer = this.axMapControl1.get_Layer(0);
if (pLayer is IFeatureLayer)//如果第一个图层时矢量图层
{
ILayerEffects pLayerEffects = pLayer as ILayerEffects;//进行QI,查询到ILayerEffects接口
pLayerEffects.Transparency = 65;//设置ILayerEffects接口的Transparency属性使该矢量图层的透明度属性为65.
}
}
通过以上操作第一个矢量图层有一定的透明度,可以看到面图层下边的等高线线图层,结果如下图所示:
分析:
首先地图控件上的第一个图层是一个矢量图层是一个FeatureLayerClass对象,在ArcGIS Engine帮助文档可以看到在FeatureLayerClass这个类实现了ILayer和ILayerEffects这两个接口,那么就可以直接从ILayer接口查询到ILayerEffects接口。
大家可能会有这样的疑问:
为什么不直接使用类的全权名直接调用FeatureLayerClass的方法的调用、属性访问?因为FeatureLayerClass 里实现相关接口的方法, 属性的实现是,以显式接口的方式实现的。
例如在第一个实例中如果我们
person pperson = new person();
pperson.start();//将会编译错误,不能通过类的全权名进行方法的调用,只能用接口实例来访问。
接下来可能还有一个疑问:为什么要用显式实现接口的方法?
这样做有以下两个目的:
1. 隐藏类的复杂性
因为显式接口成员实现不能通过类或结构的实例来访问,所以它们可以用来隐藏某些成员。因为接口的成员都是公共的,可以被任意地访问,所以当想要对外隐藏接口时,就需要使用显式接口成员实现。
2. 可以用来解决具有相同签名的成员之间的冲突
例如FeatureLayerClass这个类实现了ILayer和IFeatureLayer这两个接口,而这两个接口都有AreaOfInterest属性那么通过显式接口我就可以避免同名发生的混淆。
总结,当我们在开发时对某个对象(FeatureLayer,FeatureClass,Element等)进行操作实现功能开发时我们应该先看看你所操作的类实现了那些接口,从帮助中浏览相关接口的功能描述,然后再查询所要调用的方法。如果还需调用另外一个接口操作则进行QI。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。