AO基础.docx
- 文档编号:17830207
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:13
- 大小:28.17KB
AO基础.docx
《AO基础.docx》由会员分享,可在线阅读,更多相关《AO基础.docx(13页珍藏版)》请在冰点文库上搜索。
AO基础
前言
本文对ArcObjects开发进行一个初级介绍,主要面向开发人员。
第一章了解ArcObjects
欢迎加入AO(ArcObjects的缩写)的世界!
本节将把您引进AO的天地,并回答一些相关的问题,如:
AO是什么,为什么AO使得开发功能更加强大,如何学习和获取相关的资源信息。
1.1AO是什么?
AO是ESRI公司ArcGIS™家族中应用程序ArcMap™,ArcCatalog™和ArcScene™的开发平台,它是基于Microsoft®COM技术所构建的一系列COM组件集。
应该澄清的是到目前为止,AO还不是一个独立的应用产品,是依附在你的ArcGISDeskTop产品中的软件开发包。
也就是说,你购买了ArcGISDesktop的任何一个产品,不管是ArcView还是ArcInfo,你都有了这套强大的AO组件集,利用AO提供的组件对象来进行应用开发。
1.2AO的功能
通过AO你可完成以下甚至更多的GIS功能:
Ÿ空间数据的显示、查询检索、编辑和分析;
Ÿ创建各种专题图和统计报表;
Ÿ高级的制图和输出功能;
Ÿ空间数据管理和维护;
…………………………
等等。
其实是ArcMap、ArcCatalog和ArcScene这三个应用程序都是由AO搭建起来的,因此从理论上讲这些应用程序能完成的任务,通过AO同样可以完成(但重新搭建一个ArcMap式的应用程序先不考虑其代价,就可靠性和稳定性而言就值得怀疑,在以后的内容里我会谈到这个问题)。
我们现在绝大部分时候要做的---就是要利用ESRI提供的这些AO组件来进行积木式的组装任务。
AO已经提供了许多底层的基本功能,而你的任务是按照应用需求将这些底层功能组装集合成一个更强大的COM对象。
我们现在知道AO是基于微软的COM技术来构建的,因此它的开放性和扩展性很强大。
这儿的开放性是指在开发环境的选择上可以有VBA、VB、VC++、DEPHI等多种支持COM标准的开发工具,而扩展性是指AO组件没有提供的功能,如需要定义一种新的数据格式,你就可以利用COM技术来写自己的COM组件,对AO组件库进行扩展补充。
在ESRI的文挡中曾经看过类似‘用AO开发功能是没有限制的,这取决于你的想象力’这样的话,是不是觉得有些很狂妄。
喔,不要理解错啊,AO的确非常强大,看看ArcMap给我们展现出来的功能就知道了。
由于采用了COM技术,因此你不但可以在AO的基础上构造自己的COM组件,而且可以自己来完成一个COM组件来对AO进行补充。
至于为什么AO会基于COM技术,就我个人而言,目前和以后GIS的发展会和主流IT技术融合的越来越紧密,毕竟任何一个软件产品最终是要拿来用的,所以除了提供专业的GIS功能外,从易用性和扩展性来说也是极其重要的,而COM技术提供了一个解决之道。
是不是有些罗嗦,强调其重要性的理由无非是在开始我们对AO的开发前先需要您打针兴奋剂,虽然功能强大、使用方便的应用程序从来不是简单的几行代码和控件的拖来拖去就可以搞定的,还需要您不断地学习和掌握更多的新的东西,但对于一个开发人员而言这些投入是值得的,对于尝试利用AO做开发的人员也是如此。
那我们还不开始吗?
1.3需要的技术基础
如何进入AO软件的领域开发?
对于高级的AO程序设计人员我想必须跨越四大技术障碍:
1.面向对象技术思想;
2.COM技术;
3.AO各组件对象的层次组织和相互关系;
4.支持COM的各种开发工具及其环境(如VB、VC、DEPHI等)
真正属于ESRI自己的东西无非就是这套AO组件库。
对于初次进入AO开发领域的人员来说,我个人觉得(至于COM还有其它暂时可以先放一边,照猫画虎完成许多任务还是没有问题的了)可以先从ArcGISDesktop的应用开始,对AO的层次及相关概念有一个了解(如Map、Layer、View、Label、支持的数据格式等),否则等看到AO的示例时可能会一下子云里雾里,两厢印证我觉得最有可能豁然贯通吧。
1.4AO开发工具包
AO开发工具包的安装可以选择在安装ArcGISDesktop时,也可以任何时候使用安装光盘下的\ArcGIS\ArcObjectsDeveloperKit目录下的Setup.exe文件进行安装。
下面是AO开发包安装完成后的目录结构:
ArcobjectsDeveloperKit
Help---包含开发帮助文件:
AODev.chm,ArcObjects.chm等
Kits---附加的开发者素材诸如投影引擎头文件,类别ID文件和ESRI示例命令的源代码(在最新的8.2版本中,该代码位置有所变化)
ObjectModelDiagrams---包括所有的PDF格式对象模型图
Samples---包含所有示例工程文件的源代码
Utilities---包含ESRI对象浏览器等工具
1.5AO开发资源
1.《ArcObjectsDeveloperHelp》-----这是AO开发的首选资源,个人觉得一定程度上甚至可以和微软的MSDN相媲美。
不管是AO的基础COM、AO的对象层次图都提供了说明,此外还提供了大量的开发示例。
2.《ArcObjectsOnline》-----提供了最新的AO组件库文档,其中有一个关于AO的技术论坛相信会让大家有很多意外的收获;
3.《ExploringArcObjects》-----一本很不错的AO技术文档,对AO的开发进行了很好的组织,而且有大量的示例,可以随时复制利用;
4.《BuildingaGeodatabase》-----应用都是围绕数据来展开的,这本书主要是用来设计和创建Geodatabase的,但理解和掌握Geodatabase的层次和建摸方法,对AO的开发是很好的补充。
5.《MicrosoftMSDN》----即使你的AO开发工具不是微软的,也建议安装一套完整的MSDN,想多了解和应用COM进行设计开发,MSDN是个宝藏。
第二章AO的基础-----COM
组件化程序设计思想在今天应用已经非常普及,那么关于COM都有哪些东西呢?
在本节中我会介绍什么是CLASS,OBJECT,INTERFACE等COM等相关概念。
2.1CLASSANDOBJECT(类和对象)
要介绍COM,就不能不提到面向对象思想,那么让我们先来看看什么是对象吧?
在日常生活中,你我都是一个个对象,有姓名,有身高、体重等外在的特征,也有各自所具备的工作技能,也需要彼此间进行语言交流,同样在开发应用和GIS中也有对象的概念存在。
你在窗体上使用了一个控件,这个控件本身有大小、位置、颜色、名称等一系列称之为属性(Properties)的外在表示,而且也会有CLICK等称之为事件(Events)的通信动作存在。
在AO的世界里,每个东西都是一个对象,有象Map、Form、Layer这些我们可以看到的对象,也有在表中产生查询结果集时的游标(Cursor)-这类不可见的对象。
那么对象是如何产生的呢?
哦,它是由类(CLASS)实例化产生的,许多AO类对我们来说很熟悉(象Point,Line,Polygon,Layer,Table,如果你对GIS还不是很陌生的话)。
不用太多的废话,就先实际进入AO来展示下什么是类和对象吧。
MapClass
PropertiesMethods
MapScale(1:
3,800,000)AddLayer(+)
MapUnits(6234233.32,5234234.56)ClearSelection
(很遗憾在这里我不能用图形来表达上述概念,突然觉得有些滑稽—在写一个GIS的话题)。
如果你用过ArcMap应用程序并且还有印象的话,你会发现这个MapScale其实就是应用程序中那个文本框的内容,而AddLayer这个方法呢好象就是那个用来增加图层的“+”的行为。
2.2COM是什么?
(关于COM实在有太多的东西,以下的内容对AO的初始开发者而言,权当是一个了解吧,现在大可不必去深究)。
终于开始COM了,一个很沉重也很值得玩味的东西,我想许多AO的开发者对此都会有不同的感受。
COM是Microsoft的ComponentObjectModel缩写,它不仅定义了组件程序之间进行交互的标准,而且也提供了组件程序运行所需要的环境(COM本身要实现一个称为COM库(COMlibrary)的API,它提供诸如客户对组件的查询,以及组件的注册/反注册等一系列服务,一般来说,COM库由操作系统加以实现,我们不必关心其实现的细节,象大家经常看到的ActiveX,DirectX,OLEDB都是基于COM技术的),主要应用于MicrosoftWindows操作系统平台上。
COM通常的发布形式是:
以win32动态链接库(DLL)或可执行文件(EXE)的形式发布。
2.3COM的目标和特性
Ÿ建立在二进制代码级上的可重用性(通过包容和聚合);
Ÿ语言无关性,只要其能生成符合COM规范即可;
Ÿ对使用COM对象的客户程序而言的进程透明性;
2.3对象、类和接口
对象是COM的基本要素之一,和C++中的对象不同的是其封装特性是真正意义上的封装,对于对象使用者(通常称为客户)而言是不可见的,此外,COM对象的可重用性表现在COM对象的包容和聚合,一个对象可以完全使用另一个对象的所有功能,而C++对象的可重用性表现在c++类的继承性。
接口是指组件对象的接口,它是包含了一组函数的数据结构,通过这组数据结构,客户代码可以调用组件对象的功能,组件对象间的访问都是通过接口来进行的。
接口设计必须满足:
1.必须直接或间接地从IUNKNOWN接口继承(该接口在AO中是省缺的);
2.接口必须有唯一的标识符号;接口不变性,一旦分配和公布了IID,接口定义的任何因素都不能改变。
用COM开发意味着使用接口,也可以称为基于接口的设计模型。
对象间的所有通信都是通过它们的接口来进行的,COM接口是抽象的,意味着相关的接口没有实现,和接口相关的代码来自于一个类实现。
如何实现接口对于不同对象是不同的,因此对象只是继承接口的类型,而不是它的实现,这称为类型继承。
功能用接口被抽象地构造,并且用类去真正实现。
在COM中类和接口通常被当作‘做什么’和‘怎么做’,接口定义一个对象能做什么,类定义它怎么去做。
COM类提供了一个或多个接口相关的代码,因此功能实体封装在类中。
几个类可以有同样的接口,但是它们的实现可能是极不相同的。
通过实现这些接口,COM实现了面向对象的多态性,COM不支持多重继承概念,然而,这不是一个缺点因为一个类可以实现多个接口。
2.4COM的其它组成
COM对象的接口可以是双接口,双接口不同于普通接口(CustomInterface)之处在于双接口是从Automation基本接口Idispatch继承的,而普通接口是从Iunknown接口直接继承来的,缺省的接口模型是双接口模型是双接口。
2.入接口和出接口(Inboundinterface,Outboundinterface)
COM调用既可以是单向的(即客户程序创建组件对象,然后客户程序调用对象所提供的功能,在适当时候再把对象释放掉),通常称为入接口。
如果一个COM对象支持一个或多个主动与客户程序进行通信的接口,则这种接口称为出接口,是因为这些接口并不由对象实现,而是由客户程序实现。
类型库(TypeLibrary)
一个类型库被作为一个接口定义语言(IDL)文件的二进制版本,是一系列COM对象和接口的集合,并被编译进一个形如OLB、DLL或OCX这样的二进制文件中。
为了支持一个不依赖于开发语言工具的组件集,关于ArcObjects库所有相关的数据都被打包进esricore.olb的类型库,它就包括了一个所有coclasses的二进制描述,接口,方法和服务器类型。
Microsoft提供了多个COM接口用于类型库,这两个接口是ITypeInfo和ItypeLib。
利用标准的COM接口,不同的开发工具和编译器能够获得由一个特定库支持的coclasses和接口有关信息。
4.双向COM支持是指有可能既在一种语言中使用COM对象,又可使用这种语言编写COM对象;
5.进程内COM、本地COM和远程COM
COM是一个客户/服务器体系,服务器(或对象)提供功能,并且客户程序使用这些功能。
如果COM程序和客户程序在同一进程地址空间内,则称之为进程内COM,这通常是以DLL形式实现,而本地COM是指同一计算机上不同进程中的EXE,远程COM则是指不同计算机中的DLL或EXE。
有不耐烦或现在回过头看这章而且存有疑问的人吗?
讲了那么多COMANDCOM,那么我在DEPHI或VB下用AO写一个DLL,这个DLL到底算什么呢?
好,就让我来用C/S的概念来做一个解释。
如果你是自己写的应用程序框架,那么你的应用程序就是客户端,而调用的DLL其实就是服务器了;如果你在ArcMap中,那么ArcMap应用程序其实就充当了客户端的角色发出请求,这个请求通过COM机制传递给COM服务器—那个你写的DLL来完成相应的功能,而这个服务器外部和内部就是由ESRIAO的接口及类来完成的。
第三章AO对象的使用
在第二章中我们谈到了许多关于COM的概念,象类,对象,接口,方法等,那么一个实际的AO开发中是如何体现这些COM概念的呢---既然AO是基于COM的。
在本节中,我将使用VB代码来说明如何使用AO的对象,并对如何阅读OMD对象模型图(ObjectModelDiagram)进行介绍。
3.1AO对象的使用
让我们直接用AO相关的代码来开始这段旅程吧,如果你觉得的是的话。
:
)
DimpMapasIMap
SetpMap=NewMap
PMap.name=”地图名称为-Tour”
…………………….
…………………….
Pmap.ClearLayers
Pmap.Clear//ERROR
如何运行这段代码是下一章的内容,先看看为什么代码会这么写吧,里面奥妙不少。
DimpMapasImap
我们知道在COM中对对象的访问是通过接口来完成,因此不能象许多可视化控件那样,可以直接通过其名称来调用属性或执行其方法。
那么这句其实就是定义了一个接口变量pMap(题外注释:
其实准确地讲应该是一个指向接口的指针变量才对,好在VB把这一切都给演示了)。
有了这个接口变量还不行,因为接口是定义在对象上的,那么下来的步骤应该是产生一个对象,而对象又是从那里来的呢---类。
于是就有了这样的代码SetpMap=NewMap。
在这句中不单纯只是实例化出一个Map对象,并且将上句的pMap接口变量做为了该对象的缺省接口(pMap是Map的一个引用)。
OK,现在我们就可以通过这个接口来对地图名进行修改,或者调用ClearLayer方法来删除掉该地图中的所有图层了。
再看看增加最后一句的执行情况—会出错,至于为什么,原因很简单,不同的接口中的方法或属性只能通过其接口来访问,而Clear方法属于Map类的另外一个接口IactiveView所有。
可以通过查询接口(QueryInterface)来’切换‘到IactiveView上。
代码如下
DimmViewasIactiveView
setmview=pMap
mview.clear
3.2OMD的作用
OMD(对象模型图)是基于OMT(ObjectModelingTechnique)的表示方法,先来看看OMD能帮我们做些什么?
1.该类支持哪些接口;
2.完成任务需要哪些对象;
3.如何使用该类的对象;
4.是否可以直接实例化类;
5.接口有哪些方法和属性;
6.是否有其它类也支持该接口;
7.对象间的关系
3.3OMD符号解释
在OMD中有三类class,分别是抽象类(AbstractClass)、组件类(CoClass)和普通类(Class)。
抽象类的主要目的是为它的子类定义公共接口,一个抽象类将把它的部分或全部实现延迟到子类中,因此,一个抽象类不能被实例化。
一个组件类对象可以被直接创建(实例化),普通类对象虽然不能直接创建,但它可以作为其它类的一个属性或者从其它类的实例化来创建。
AO中的Dataset或Geometryclasses是抽象类的示例,一个Geometry类型对象不能被创建,但是一个Polyline可以被创建。
这个Polyline对象实际上在类的基础上实现了Geometry中定义的接口,因此在基类对象中被定义的接口可以从coclass来访问。
在OMD中的关系类型主要有类型继承(Typeinheritance)、实例(Instantiation)、组成(Composition)以及关联(Associations)等。
类型继承我们在COM一章过提到过,实际上就是继承类完全继承了超类的接口,这点可以利用AO对象浏览器工具清楚的看到,而组成关系指的是对象间的主次关系,也就是说主体的生命存在与否决定着次体的存在与否。
3.4AO的组织划分
整个AO的OMD看起来密密麻麻,让人有些头晕眼花的感觉。
还好,ESRI对整个AO进行了结构的组织分割,按照不同的应用领域可以找到相应的PDF格式的OMD。
从AO开发帮助中我们可以发现划分为以下的几个子系统:
1.3DAnalystExtension---用于3D可视化和表面建模的组件对象;
2.ApplicationFramework---让开发者在ArcMap和ArcCatalong中通过程序来定制用户界面;
3.ArcCatalog---能够让开发者扩展数据对象模型并集成定制对象和视图到ArcCatalog应用框架中;.
4.ArcMap---提供了ArcMap应用程序的核心功能,用于操作和显示地图文档;
5.ArcMapEditor---包括了对象编辑器扩展组件对象,要做编辑开发来这吧;
6.Display---GIS的一个重要应用就是数据表现,对国内的许多最终用户更是热衷于此,利用这里包含的对象可以完成诸如地图符号显示、图形编辑反馈轨迹、坐标转换和屏幕控制等功能;
7.Geocoding---主要用于创建和管理地理编码服务等;
8.Geodatabase---AO开发中一个不可或缺,毕竟GIS的应用都是围绕数据展开的,所以有关的GIS数据创建、加载、管理和存储等都是通过这里的对象进行的;
9.Geometry---不管是要素还是图形,涉及到空间信息的获取和应用来这儿找吧;
10.IMS---提供了连接到ArcIMS服务器并访问ArcIMS图象和要素服务的功能;
11.NetWork---提供了网络创建、管理和完成分析操作等功能,打算定制和开发特定网络应用可以利用NetWork对象;
12.OutPut---有入就有出,如果想把制作好的地图输出怎么办,通过这里提供的对象来完成吧;
13.Raster---用于访问和管理栅格数据的的AO对象;
14.SpatialReference---用于完成空间参考的设置;
15.StreetMapUSAExtension---这个和国内的用户关系不大。
诚然,在AO的开发中对象的层次和相互关系是极其重要的,稍有撼缺的是OMD中的对象层次组织看起来有些纷乱,个人觉得《ExploringArcObjects》里的对象模型图更适合入门使用-----它将一些常用和重要的对象抽取出来并以上下层次结构来表示。
絮语闲聊,权当消遣-最近抽时间整理一些以前写的程序,也开始了解MO(ESRIMapObject)的应用,有些感受一起吐出。
在GIS应用中最大的工作就是数据的采集整理了,虽然你可以采用MO、MAPX等一些地图控件(我曾经还看到过一个南非人用DEPHI写的地图控件,也是很有些特点的),如果你够超人,甚至可以自己去做一个地图控件,来完成一个实用性也很个性化的系统出来。
可是它终究只是一个应用系统而已。
?
?
?
你应该知道我要讲什么的了吧。
所有的应用都是基于一定的数据结构,你可以在自己的应用开发中定义数据模型,但是数据的来源呢。
不是CAD,就是COVERAGE,SHAPE,(标准嘛)你可以针对一两种数据格式进行转换,只是现实中的数据类型是多样的,总不能都去写吧,况且你的数据格式能否得到认可呢。
再想想看你要做多少工作---那是一个GIS平台才能完成的事情。
这就是许多情形下我们为什么没法完全用底层或地图控件去写一个完整GIS系统主要的原因吧。
扯远了。
。
。
在本章中,我会实现一个特定功能的DLL,用来说明AO开发开发的几种模式,AO工具包的使用,如何应用写好的组件。
在ArcObjectsDeveloperHelp中有许多完整和详尽的示例代码,这儿主要想就方法做一个简要的说明。
4.1选择一个开发模式
AO可选的的开发方式可以分为两种,一种是在ArcMap应用框架基础上进行定制开发,另一种是脱离ArcMap应用框架去开发独立的应用程序。
通常情况下,我们都是在ArcMap框架下进行定制开发。
开发环境可以选择ArcMap本身自带的VBA,也可以选择VB、VC、DEPHI(AO8.2以上的版本开始支持C#)。
4.2选择一个开发工具
作为首选的是VB语言,这样不管是在VBA,还是编写COM组件,你都有最充足的资源可以使用(AO开发文档中最多的SAMPLE就是VB代码了)。
第二种是VC(我更愿意将VC做为一个强有力的后备工具),第三种在我看来应该是一种无奈之举了,即用DEPHI(有一堆人该贬我了:
)一直对DEPHI是仰慕有加心仪已久的,只是在AO中有关DEPHI的例子太少了,这对快速应用开发来说是致命的)。
4.3最简单的”Hello,world”程序
讨论开发工具多少有点离题,现在让我们来转回到一个出名的小应用程序—“Hello,world”,许多语言都是以此做为第一个应用的,我也就不例外了。
打开ArcMap应用程序,选择TOOLS菜单下的MACROS子菜单,打开其中的VBA环境。
选择Project工程下的ArcMapObject,双击打开其中的ThisDocument对象,在右边的编辑环境中选择对象列表中的MxDocument对象,在任务列表中选择OpenDocumen,然后键入以下的代码:
//PrivateFunctionMxDocument_OpenDocument()AsBoolean
DimpmapAsIMap
Setpmap=NewMap
pmap.Name="Hello,world"
MsgBoxpmap.Name
//EndFunction
然后按CTRL+S保存后退出ArcMap。
当你再次打开你所保存的工程文档时看到了什么?
呵呵呵,不知道ESRI的设计人员看到这样的一个SAMPLE会不会晕掉。
有人说了,你这一堆VB代码对我来说我搞不懂啊,我熟悉的是VC,总不能让我先去学VB再来做AO开发吧。
OK,没关系,下面我就以这个“Hello,world”来写一个组件并在ArcMap中来使用。
1.启动VC,使用ATLCOMAppWizard创建一个DLL工程;
2.在INSERT菜单下选择NEWATLOBJECT来增加一个ATLCOM对象,
3.给这个COM对象就起个“world”的名字吧,选择Custom接口类型(至于为什么不选择DUAL,你可以琢磨下)
4.在工作空间上选择Cworld类,并右键选择ImplementInterface,在类型库中引入ESRIOBJECTLibrar
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AO 基础