阅读:1375回复:0
arcgis8.3 arcobject入门简介
欢迎加入AO(ArcObjects的缩写)的世界! 本节将把您引进AO的天地,并回答一些相关的
问题,如:AO是什么,为什么AO使得开发功能更加强大,如何学习和获取相关的资源信息 。 1.1 AO是什么? AO是ESRI公司ArcGIS™ 家族中应用程序ArcMap™, ArcCatalog™ 和 ArcScene™的开发平台,它是基于Microsoft® COM技术所构建的一系列COM组件 集。应该澄清的是到目前为止,AO还不是一个独立的应用产品, 是依附在你的ArcGIS Des kTop产品中的软件开发包。也就是说,你购买了ArcGIS Desktop的任何一个产品,不管是 ArcView还是ArcInfo,你都有了这套强大的AO组件集,利用AO提供的组件对象来进行应用 开发。 1.2 AO的功能 通过AO你可完成以下甚至更多的GIS功能: Ÿ 空间数据的显示、查询检索、编辑和分析; Ÿ 创建各种专题图和统计报表; Ÿ 高级的制图和输出功能; Ÿ 空间数据管理和维护; ………………………… 等等。其实是ArcMap、ArcCatalog和ArcScene这三个应用程序都是由AO搭建起来的,因此 从理论上讲这些应用程序能完成的任务,通过AO同样可以完成(但重新搭建一个ArcMap式 的应用程序先不考虑其代价,就可靠性和稳定性而言就值得怀疑,在以后的内容里我会谈 到这个问题)。我们现在绝大部分时候要做的---就是要利用ESRI提供的这些AO组件来进行 积木式的组装任务。 AO已经提供了许多底层的基本功能,而你的任务是按照应用需求将这 些底层功能组装集合成一个更强大的COM对象。我们现在知道AO是基于微软的COM技术来构 建的,因此它的开放性和扩展性很强大。这儿的开放性是指在开发环境的选择上可以有VB A、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还有其它暂时可以先放一边,照猫画虎完成许多任务还是没有问题的 了)可以先从ArcGIS Desktop的应用开始,对AO的层次及相关概念有一个了解(如Map、L ayer、View、Label、支持的数据格式等),否则等看到AO的示例时可能会一下子云里雾里 ,两厢印证我觉得最有可能豁然贯通吧。 1.4 AO开发工具包 AO开发工具包的安装可以选择在安装ArcGIS Desktop时,也可以任何时候使用安装光盘下 的\ArcGIS\ArcObjects Developer Kit目录下的Setup.exe文件进行安装。下面是AO开发包 安装完成后的目录结构: Arcobjects Developer Kit Help --- 包含开发帮助文件:AODev.chm, ArcObjects.chm等 Kits --- 附加的开发者素材诸如投影引擎头文件,类别ID文件和ESRI 示例命令的源代码 (在最新的8.2版本中,该代码位置有所变化) Object Model Diagrams --- 包括所有的PDF格式对象模型图 Samples --- 包含所有示例工程文件的源代码 Utilities --- 包含ESRI 对象浏览器等工具 1.5 AO开发资源 1.《ArcObjects Developer Help》 ----- 这是AO开发的首选资源,个人觉得一定程度上 甚至可以和微软的MSDN相媲美。不管是AO的基础COM、AO的对象层次图都提供了说明,此外 还提供了大量的开发示例。 2.《ArcObjects Online》 ----- 提供了最新的AO组件库文档,其中有一个关于AO的技术 论坛相信会让大家有很多意外的收获; 3.《Exploring ArcObjects》 -----一本很不错的AO技术文档,对AO的开发进行了很好的 组织,而且有大量的示例,可以随时复制利用; 4.《Building a Geodatabase》 -----应用都是围绕数据来展开的,这本书主要是用来设 计和创建Geodatabase的,但理解和掌握Geodatabase的层次和建摸方法,对AO的开发是很 好的补充。 5.《Microsoft MSDN》----即使你的AO开发工具不是微软的,也建议安装一套完整的MSD N,想多了解和应用COM进行设计开发,MSDN是个宝藏。 组件化程序设计思想在今天应用已经非常普及,那么关于COM都有哪些东西呢? 在本节中 我会介绍什么是CLASS,OBJECT,INTERFACE等COM等相关概念。 2.1 CLASS AND OBJECT(类和对象) 要介绍COM,就不能不提到面向对象思想,那么让我们先来看看什么是对象吧?在日常生活 中,你我都是一个个对象,有姓名,有身高、体重等外在的特征,也有各自所具备的工作 技能,也需要彼此间进行语言交流,同样在开发应用和GIS中也有对象的概念存在。 你在窗体上使用了一个控件,这个控件本身有大小、位置、颜色、名称等一系列称之为属 性(Properties)的外在表示,而且也会有CLICK等称之为事件(Events)的通信动作存在 。在AO的世界里,每个东西都是一个对象,有象Map、Form、Layer这些我们可以看到的对 象,也有在表中产生查询结果集时的游标(Cursor)-这类不可见的对象。那么对象是如何 产生的呢?哦,它是由类(CLASS)实例化产生的,许多AO类对我们来说很熟悉(象Point ,Line,Polygon,Layer,Table,如果你对GIS还不是很陌生的话)。不用太多的废话,就先实 际进入AO来展示下什么是类和对象吧。 Map Class Properties Methods MapScale (1:3,800,000) AddLayer (+) MapUnits (6234233.32,5234234.56) ClearSelection (很遗憾在这里我不能用图形来表达上述概念,突然觉得有些滑稽—在写一个GIS的话题) 。 如果你用过ArcMap应用程序并且还有印象的话,你会发现这个MapScale其实就是应用程序 中那个文本框的内容,而AddLayer这个方法呢好象就是那个用来增加图层的“+”的行为。 2.2 COM是什么?(关于COM实在有太多的东西,以下的内容对AO的初始开发者而言,权当是 一个了解吧,现在大可不必去深究)。 终于开始COM了,一个很沉重也很值得玩味的东西,我想许多AO的开发者对此都会有不 同的感受。COM是Microsoft的Component Object Model缩写,它不仅定义了组件程序之间 进行交互的标准,而且也提供了组件程序运行所需要的环境(COM本身要实现一个称为COM 库(COM library)的API,它提供诸如客户对组件的查询,以及组件的注册/反注册等一系列 服务,一般来说,COM库由操作系统加以实现,我们不必关心其实现的细节,象大家经常看 到的ActiveX,DirectX,OLEDB都是基于COM技术的),主要应用于Microsoft Windows操作 系统平台上。COM通常的发布形式是:以win32动态链接库(DLL)或可执行文件(EXE)的形 式发布。 2.3 COM的目标和特性 Ÿ 建立在二进制代码级上的可重用性(通过包容和聚合); Ÿ 语言无关性,只要其能生成符合COM规范即可; Ÿ 对使用COM对象的客户程序而言的进程透明性; 2.3 对象、类和接口 对象是COM的基本要素之一,和C++中的对象不同的是其封装特性是真正意义上的封装,对 于对象使用者(通常称为客户)而言是不可见的,此外,COM对象的可重用性表现在COM对 象的包容和聚合,一个对象可以完全使用另一个对象的所有功能,而C++对象的可重用性表 现在c++类的继承性。 接口是指组件对象的接口,它是包含了一组函数的数据结构,通过这组数据结构,客户代 码可以调用组件对象的功能,组件对象间的访问都是通过接口来进行的。接口设计必须满 足: 1. 必须直接或间接地从IUNKNOWN接口继承(该接口在AO中是省缺的); 2. 接口必须有唯一的标识符号;接口不变性,一旦分配和公布了IID,接口定义的任何因 素都不能改变。 用COM开发意味着使用接口,也可以称为基于接口的设计模型。对象间的所有通信都是通过 它们的接口来进行的,COM接口是抽象的,意味着相关的接口没有实现,和接口相关的代码 来自于一个类实现。如何实现接口对于不同对象是不同的,因此对象只是继承接口的类型 ,而不是它的实现,这称为类型继承。功能用接口被抽象地构造,并且用类去真正实现。 在COM中类和接口通常被当作‘做什么’和‘怎么做’,接口定义一个对象能做什么,类定 义它怎么去做。 COM类提供了一个或多个接口相关的代码,因此功能实体封装在类中。几个类可以有同样的 接口,但是它们的实现可能是极不相同的。通过实现这些接口,COM实现了面向对象的多态 性,COM不支持多重继承概念,然而,这不是一个缺点因为一个类可以实现多个接口。 2.4 COM的其它组成 COM对象的接口可以是双接口,双接口不同于普通接口(Custom Interface)之处在于双接 口是从Automation基本接口Idispatch继承的,而普通接口是从Iunknown接口直接继承来的 ,缺省的接口模型是双接口模型是双接口。 2. 入接口和出接口(Inbound interface,Outbound interface) COM调用既可以是单向的(即客户程序创建组件对象,然后客户程序调用对象所提供的功能 ,在适当时候再把对象释放掉),通常称为入接口。如果一个COM对象支持一个或多个主动 与客户程序进行通信的接口,则这种接口称为出接口,是因为这些接口并不由对象实现, 而是由客户程序实现。类型库(Type Library) 一个类型库被作为一个接口定义语言(IDL)文件的二进制版本,是一系列COM对象和接口 的集合,并被编译进一个形如OLB、DLL或OCX这样的二进制文件中。为了支持一个不依赖于 开发语言工具的组件集,关于ArcObjects库所有相关的数据都被打包进esricore.olb的类 型库,它就包括了一个所有coclasses的二进制描述,接口,方法和服务器类型。 Microsoft提供了多个COM接口用于类型库,这两个接口是ITypeInfo 和ItypeLib。利用标 准的COM接口,不同的开发工具和编译器能够获得由一个特定库支持的coclasses和接口有 关信息。 4. 双向COM支持 是指有可能既在一种语言中使用COM对象,又可使用这种语言编写CO M对象; 5. 进程内COM、本地COM和远程COM COM是一个客户/服务器体系,服务器(或对象)提供功能,并且客户程序使用这些功能。 如果COM程序和客户程序在同一进程地址空间内,则称之为进程内COM,这通常是以DLL形式 实现,而本地COM是指同一计算机上不同进程中的EXE,远程COM则是指不同计算机中的DLL 或EXE。有不耐烦或现在回过头看这章而且存有疑问的人吗?讲了那么多COM AND COM,那 么我在DEPHI或VB下用AO写一个DLL,这个DLL到底算什么呢?好,就让我来用C/S的概念来 做一个解释。如果你是自己写的应用程序框架,那么你的应用程序就是客户端,而调用的 DLL其实就是服务器了;如果你在ArcMap中,那么ArcMap应用程序其实就充当了客户端的角 色发出请求,这个请求通过COM机制传递给COM服务器—那个你写的DLL来完成相应的功能, 而这个服务器外部和内部就是由ESRI AO的接口及类来完成的。 |
|