利用AO做开发的人员需要的技术基础-摘摘

1.3需要的技术基础
如何进入AO软件的领域开发?对于高级的AO程序设计人员我想必须跨越四大技术障碍:
1.面向对象技术思想;
2.COM技术;
3.AO各组件对象的层次组织和相互关系;
4.支持COM的各种开发工具及其环境(如VB、VC、DEPHI等)
    真正属于ESRI自己的东西无非就是这套AO组件库。对于初次进入AO开发领域的人员来说,我个人觉得(至于COM还有其它暂时 可以先放一边,照猫画虎完成许多任务还是没有问题的了)可以先从ArcGIS Desktop的应用开始,对AO的层次及相关概念有一个了解(如Map、Layer、View、Label、支持的数据格式等 ),否则等看到AO的示例时可能会一下子云里雾里,两厢印证我觉得最有可能豁然贯通吧。

1.4AO开发工具包
    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.5AO开发资源
1.《ArcObjects Developer Help》 ----- 这是AO开发的首选资源,个人觉得一定程度上甚至可以和微软的MSDN相媲美。不管是AO的基础COM、AO的对象层次图都提供 了说明,此外还提供了大量的开发示例。
2.《ArcObjects Online》 ----- 提供了最新的AO组件库文档,其中有一个关于AO的技术论坛相信会让大家有很多意外的收获;
3.《Exploring ArcObjects》 -----一本很不错的AO技术文档,对AO的开发进行了很好的组织,而且有大量的示例,可以随时复制利用;
4.《Building a Geodatabase》 -----应用都是围绕数据来展开的,这本书主要是用来设计和创建Geodatabase的,但理解和掌握Geodatabas e的层次和建摸方法,对AO的开发是很好的补充。
5.《Microsoft MSDN》----即使你的AO开发工具不是微软的,也建议安装一套完整的MSDN,想多了解和应用COM进行设计开发,MSD N是个宝藏。

在AO的世界里,每个东西都是一个对象,有象Map、Form、 Layer这些我们可以看到的对象,也有在表中产生查询结果集时的游标(Cursor)-这类不可见的对象。那么对象是如何产生 的呢?哦,它是由类(CLASS)实例化产生的,许多AO类对我们来说很熟悉(象Point,Line,Polygon,Lay er,Table,如果你对GIS还不是很陌生的话)。不用太多的废话,就先实际进入AO来展示下什么是类和对象吧。

Map Class
Properties Methods
MapScale (1:3,800,000) AddLayer (+)
MapUnits (6234233.32,5234234.56) ClearSelection
(很遗憾在这里我不能用图形来表达上述概念,突然觉得有些滑稽—在写一个GIS的话题)。
    如果你用过ArcMap应用程序并且还有印象的话,你会发现这个MapScale其实就是应用程序中那个文本框的内容,而Add Layer这个方法呢好象就是那个用来增加图层的“+”的行为。

********************

一般来说,COM库由操作系统加 以实现,我们不必关心其实现的细节,象大家经常看到的ActiveX,DirectX,OLEDB都是基于COM技术的),主要 应用于Microsoft Windows操作系统平台上。COM通常的发布形式是:以win32动态链接库(DLL)或可执行文件(EXE)的形式发布。

用COM开发意味着使用接口,也可以称为基于接口的设计模型。对象间的所有通信都是通过它们的接口来进行的,COM接口是抽象的 ,意味着相关的接口没有实现,和接口相关的代码来自于一个类实现。

功能用接口被抽象地构造,并且用类去真正实现。在COM中类和接口通常被当作‘做什么’和 ‘怎么做’,接口定义一个对象能做什么,类定义它怎么去做。
COM类提供了一个或多个接口相关的代码,因此功能实体封装在类中。几个类可以有同样的接口,但是它们的实现可能是极不相同的。 通过实现这些接口,COM实现了面向对象的多态性,COM不支持多重继承概念,然而,这不是一个缺点因为一个类可以实现多个接口 。
********

5COM的其它组成
    COM对象的接口可以是双接口,双接口不同于普通接口(Custom Interface)之处在于双接口是从Automation基本接口Idispatch继承的,而普通接口是从Iunknow n接口直接继承来的,缺省的接口模型是双接口模型是双接口。
**** 双向COM支持 是指有可能既在一种语言中使用COM对象,又可使用这种语言编写COM对象;

 *****进程内COM、本地COM和远程COM
COM是一个客户/服务器体系,服务器(或对象)提供功能,并且客户程序使用这些功能。如果COM程序和客户程序在同一进程地址 空间内,则称之为进程内COM,这通常是以DLL形式实现,而本地COM是指同一计算机上不同进程中的EXE,远程COM则是指 不同计算机中的DLL或EXE。有不耐烦或现在回过头看这章而且存有疑问的人吗?讲了那么多COM AND COM,那么我在DEPHI或VB下用AO写一个DLL,这个DLL到底算什么呢?好,就让我来用C/S的概念来做一个解释。如 果你是自己写的应用程序框架,那么你的应用程序就是客户端,而调用的DLL其实就是服务器了;如果你在ArcMap中,那么Ar cMap应用程序其实就充当了客户端的角色发出请求,这个请求通过COM机制传递给COM服务器—那个你写的DLL来完成相应的 功能,而这个服务器外部和内部就是由ESRI AO的接口及类来完成的。

///**************************************//
第三章 AO对象的使用
1AO对象的使用
    让我们直接用AO相关的代码来开始这段旅程吧,如果你觉得的是的话。:)
Dim pMap as IMap
Set pMap = New Map
PMap.name =”地图名称为-Tour”
…………………….
…………………….
Pmap.ClearLayers
Pmap.Clear //ERROR
    如何运行这段代码是下一章的内容,先看看为什么代码会这么写吧,里面奥妙不少。
Dim pMap as Imap
    我们知道在COM中对对象的访问是通过接口来完成,因此不能象许多可视化控件那样,可以直接通过其名称来调用属性或执行其方法。 那么这句其实就是定义了一个接口变量(题外注释:其实准确地讲应该是一个指向接口的指针变量才对,好在VB把这一切都给演示了) 。有了这个接口变量还不行,因为接口是定义在对象上的,那么下来的步骤应该是产生一个对象,而对象又是从那里来的呢---类。
于是就有了这样的代码Set pMap = New Map。
在这句中不单纯只是实例化出一个Map对象,并且将上句的pMap接口变量做为了该对象的缺省接口。OK,现在我们就可以通过这 个接口来对地图名进行修改,或者调用ClearLayer方法来删除掉该地图中的所有图层了。再看看增加最后一句的执行情况—会 出错,至于为什么,原因很简单,不同的接口中的方法或属性只能通过其接口来访问,而Clear方法属于Map类的另外一个接口I activeView所有。可以通过查询接口(Query Interface)来’切换‘到IactiveView上。代码如下
Dim mView as IactiveView
set mview=pmap
mview.clear 
 OMD(对象模型图)是基于OMT(Object Modeling Technique)的表示方法,先来看看OMD能帮我们做些什么?
1. 该类支持哪些接口;
2. 完成任务需要哪些对象;
3. 如何使用该类的对象;
4. 是否可以直接实例化类;
5. 接口有哪些方法和属性;
6. 是否有其它类也支持该接口;
7. 对象间的关系

3OMD符号解释
    在OMD中有三类class,分别是抽象类(AbstractClass)、组件类(CoClass)和普通类(Class)。 抽象类的主要目的是为它的子类定义公共接口,一个抽象类将把它的部分或全部实现延迟到子类中,因此,一个抽象类不能被实例化。一 个组件类对象可以被直接创建,普通类对象虽然不能直接创建,但它可以可以作为其它类的一个属性或者从其它类的实例化来创建。AO 中的Dataset或Geometry classes是抽象类的示例,一个Geometry类型对象不能被创建,但是一个Polyline可以被创建。这个Polyl ine对象实际上在类的基础上实现了Geometry中定义的接口,因此在基类对象中被定义的接口可以从coclass来访问。
在OMD中的关系类型主要有类型继承(Type inheritance)、创建(Instantiation)、组成(Composition)以及关联(Associati ons)等。类型继承我们在COM一章过提到过,实际上就是继承完全继承了超类的接口,这点可以利用AO对象浏览器工具清楚的看 到,而组成关系指的是对象间的主次关系,也就是说主体的生命存在与否决定着次体的存在与否。

4AO的组织划分
    整个AO的OMD看起来密密麻麻,让人有些头晕眼花的感觉。还好,ESRI对整个AO进行了结构的组织分割,按照不同的应用领域 可以找到相应的PDF格式的OMD。从AO开发帮助中我们可以发现划分为以下的几个子系统:
1. 3D Analyst Extension ---用于3D可视化和表面建模的组件对象;
2. Application Framework ---让开发者在ArcMap和ArcCatalong中通过程序来定制用户界面;
3. ArcCatalog --- 能够让开发者扩展数据对象模型并集成定制对象和视图到ArcCatalog应用框架中;.
4. ArcMap --- 提供了ArcMap应用程序的核心功能,用于操作和显示地图文档;
5. ArcMap Editor--- 包括了对象编辑器扩展组件对象,要做编辑开发来这吧;
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. Spatial Reference--- 用于完成空间参考的设置;
15.StreetMap USA Extension---这个和国内的用户关系不大。
诚然,在AO的开发中对象的层次和相互关系是极其重要的,稍有撼缺的是OMD中的对象层次组织看起来有些纷乱,个人觉得《Exp loring ArcObjects》里的对象模型图更适合入门使用-----它将一些常用和重要的对象抽取出来并以上下层次结构来表示。
*******************
最简单的“Hello,world”程序
    讨论开发工具多少有点离题,现在让我们来转回到一个出名的小应用程序—“Hello,world”,许多语言都是以此做为第一个 应用的,我也就不例外了。
打开ArcMap应用程序,选择TOOLS菜单下的MACROS子菜单,打开其中的VBA环境。选择Project工程下的Ar cMap Object ,双击打开其中的ThisDocument对象,在右边的编辑环境中选择对象列表中的MxDocument对象,在任务列表中选 择OpenDocumen,然后键入以下的代码:
//Private Function MxDocument_OpenDocument() As Boolean
Dim pmap As IMap
Set pmap = New Map
pmap.Name = "Hello,world"
MsgBox pmap.Name
//End Function
    然后按CTRL+S保存后退出ArcMap。当你再次打开你所保存的工程文档时看到了什么?呵呵呵,不知道ESRI的设计人员看 到这样的一个SAMPLE会不会晕掉。
有人说了,你这一堆VB代码对我来说我搞不懂啊,我熟悉的是VC,总不能让我先去学VB再来做AO开发吧。OK,没关系,下面我 就以这个“Hello,world”来写一个组件并在ArcMap中来使用。
1. 启动VC,使用ATL COM AppWizard创建一个DLL工程;

4AO程序实现的一般过程
    不管是用VB还是VC或是其它,要做的第一步就是在集成环境因入AO对象库(Esricore.olb),剩下的工作在接口中实 现你要做的事情。关于如何进入VB和VC开发的完整代码及说明,请参阅ArcObject Developer Help。
第五章 AO高级通用组件
    可能是有感于独立AO应用程序开发群的迅速扩大,ESRI在其最新的ArcGIS8.2版本中不但继续提供对MapContro l控件的开发支持,而且新增了一个PageLayoutControl控件,这对于有制图应用的开发者来说无疑带来了福音。许多 时候可能会对组件和控件有些糊涂,其实Active X并不能代表整个COM,它只是COM对象的封装技术,由于COM对象使用的复杂性,因此才会创建框架(如Active X控件)来简化它。所以这两个控件也可称为AO高级通用组件,它由AO基础组件构造而成,面向通用功能,简化了用户开发过程,组 件之间的协同控制消息都被封装起来。这级组件经过封装后,使二次开发更为简单。如一个简单的AO应用系统,若用基础AO组件对象 开发,需要编写不少的代码,而利用高级通用组件,只需几句代码就够了。

5.1MapControl控件
    MapControl控件提供了类似ArcMap中的数据视图(Data View)的窗口,通过它你可完成以下甚至更多功能:
?显示图层地图。
?放大,缩小,漫游。
?生成图形元素,如点,线,圆,多边形。
?说明注记
?识别地图上被选中的元素,进行空间或属性查询。
?标注地图元素。
    总之在ArcMap中能能够完成的大部分任务,通过MapControl控件也可以完成。通过设置MapControl General, Layers, Map 属性,你甚至不需要写一行代码可以获得一些GIS功能。关于MapControl控件有许多完整的应用示例,存放在//ArcObjects Developer Kit/Samples/Controls目录下
5.2PageLayout控件
    PageLayout控件提供了类似ArcMap中的版面视图的窗口,它有以下的属性、方法和事件:
? 管理控件的外观设置
? 管理控件的显示属性
? 管理页面属性
? 在控件中增加和查找元素
? 加载地图文档到控件
? 可以直接从资源管理器和ArcCatalog中拖放数据到控件中
? 打印页面设计.
    至于它的功能嘛,ArcMap的Layout 视图能完成的工作,使用PageLayoutControl同样可以完成,象增加和设置图例、打印输出等许多功能。关于Page Layout控件有许多完整的应用示例,也存放在//ArcObjects Developer Kit/Samples/Controls目录下。

你可能感兴趣的:(GIS,开发与学习)