ArcGIS的基础是ArcObject,ArcObject基于COM技术构建,是所有ArcGIS开发活动,例如桌面版开发,服务器开发的基础。总的来说,应用ArcGIS开发,包括以下几个方面:
○ 设置或自定义ArcGIS应用程序,例如ArcMap;
○ 扩展ArcGIS,例如开发自己的扩展工具包(Toolbox),或者增加新的数据模型;
○ 应用ArcEngine开发胖客户端应用程序,例如在其他程序中嵌入GIS功能;
○ 应用ArcGIS Server创建Web程序或者Web服务。
有关AO和ArcGIS系列的关系,我们在各类文档中已经见得很多了,这里就不说了。有一点要强调,就是所有产品的核心是AO,而ArcGIS Engine或者ArcGIS server与Desktop不同之处在于前者提供了面向胖客户端和服务器端的中等粒度的控件,而后者的开发则无法使用这些控件。
对于应用ArcGIS开发过的读者可以发现,即使不安装ArcEngine,ArcEngine下的很多控件,例如Map、3D显示的控件,也是在系统中存在的,可以推测,在ArcGIS 9.x中,Desktop应该也使用了这些控件(需要证实!)。
本系列文章这篇主要介绍ArcGIS Desktop的开发。
ArcGIS Desktop开发的类型
○ 自定义ArcMap、ArcCatalog的布局和界面,包括增加自定义的按钮,指定相应的宏;
○ 使用VBA创建解决方案;
○ 创建ArcGIS扩展;
○ 创建独立的应用程序(后面单独说明)。
自定义ArcGIS Desktop
理解自定义ArcGIS Desktop和理解Office下的Word的自定义类似。以ArcMap为例,对于一个Map文档(mxd),包括下面几个部分:使用的数据(即该地图使用了那些数据);地图的布局;当前程序的界面布局(自定义);VBA工程。对于模版(template),有Normal Template和地图Template的区别,前者影响ArcMap程序本身,即所有打开文档都有应用Normal模版,后者只影响使用了该模版的地图。
因此,使用自定义的模版,是ArcGIS Desktop开发的第一个层次,通过将需要的界面元素集合起来,并重新安排,即可组成一个符合客户需求的自定义程序,而集合一定的VBA代码,可以完成的工作就非常多了。
例如一个快递公司,可以把地图操作(缩放、移动、打印等)、网络分析相关的界面元素通过自定义工具,整合在一起,隐藏掉其他工具和界面元素,就可以比较好的应用于实际工作。
应用VBA
应用VBA开发解决方案有很多优势,例如不需要安装第三方开发工具、简单、易于使用,还有一点就是在不熟悉AO结构的前提下,使用VBA要比使用其他方式更易上手。对于非专业程序员,使用VBA应该是ArcGIS Desktop开发的首选;对于专业开发者,通过VBA也是学习和熟悉AO很好的途径。
VBA工程
VBA工程是ArcGIS中VBA程序和代码的载体,和地图模版(template)或者地图(mxd文件)一起保存。打开VBA编辑器后,有Normal和目前打开的文件2个VBA工程。对于一个VBA工程,由以下几类对象组成:
○ ArcMap对象
○ 过程模块
○ 窗体模块
○ 类模块
○ 引用(对Normal模版的引用)
对于大多数开发,首先是通过自定义界面,例如创建工具按钮,然后就可以在ArcMap对象中选择这个工具,创建其事件响应过程。例如我们自定义一个按钮,UIButtonControl1,然后在ThisDocumnet代码窗口的对象选择列表框选择UIButtonControl1,在事件列表框选择Click,创建UIButtonControl1_Click过程,在其中就可以书写该按钮单击后调用的代码。
通过窗体可以创建自定义对话框或者窗口,类模块则可以创建自己的对象。
编写ArcGIS Desktop扩展
编写ArcGIS扩展,可以完成以下任务(下图):
○ Command:即一个按钮、菜单,通过实现ICommand、ITool、IToolCommand接口来创建;
○ Edit Task:与ArcMap Editor协同工作的组件,需要实现IEditTask接口;
○ Table of Contents tab:类似左侧的数据和图层视图的小窗口,通过实现IContentsView接口来创建;
○ Class extension:自定义对象(feature),即有自己属性和规则的空间对象,例如红绿灯对象,电线,电闸等等,需要实现IClassExtension等接口。
应用程序的插件架构
对于ArcGIS Desktop的开发,最关键的核心问题在于理解ArcGIS插件架构的运行机制,下面我们就对这个问题做一简单介绍。
![](http://www.3snews.net/attachments/2006/07/2006719_ae6c5cc79dcc0a5e5820ba4eb382d82b.jpg)
插件架构的核心在于应用程序定义插件遵循的接口,然后由自定义组件来实现这个接口。其中有几个关键点:
第一,主应用程序如何知道要加载插件
对于ArcGIS是使用注册表,和MS Office类似,在注册表中建立一个“component categories”的条目,而组件要被ArcGIS加载,就需要注册后,在这里增加添加一个条目。对于现在的大多数.net程序和前COM时代的C或C++程序,则通过目录来做到这点,通过遍历目录中的文件,然后通过反射机制(.net)来加载。
而COM程序,如VB环境下,则可以通过CreatObject来加载一个组件。
第二,插件的初始化
初始化包括2方面,一方面,主程序要创建一个变量,类型为插件所实现的接口,然后创建该插件,而同时,调用插件的初始化代码,例如Connect,传入需要主程序要暴露给插件的引用(App)。对于COM程序或者.net,是通过事件来做到这一点。主程序触发初始化事件,该事件在插件的代码中实现,根据传来的变量,初始化插件的运行环境。对于C或者C++这样的环境,可以通过函数指针和回调函数来实现这一点。
插件的初始化过程,就是插件插件和主程序通讯桥梁的过程,这个桥梁,对于ArcGIS,就是IApplication接口。
第三,插件和应用程序之间的通讯
其实上边已经差不多说清楚了,对于主应用程序,是通过创建插件对象,获得当前插件的实例,然后控制他,如果是插件是一个按钮,那么初始化插件的时候,创建了按钮对象,并绑定按钮的click事件由插件的相应过程来处理。
对于插件,则由于在初始化中通过初始化事件(例如OnCreat或者Connect这样的事件)的参数得到了当前应用程序的Application等对象实例,因此就可以使用这些对象实例来操作应用程序。
对于应用程序的一些状态变化,可以通过定义事件,然后在插件代码中响应这些事件来完成。
第四,用户界面
Microsoft Office的COM加载宏的编写,需要通过调用Office的Commandbar等对象来创建用户界面元素,可以完全自定义。对于Photoshop这样的程序,插件程序使用C或C++来完成,扩展的位置固定在几个确定的扩展点。ArcGIS个人觉得基本上处于二者之间。
开发ArcGIS扩展模块的步骤和方法
明白了ArcGIS的插件架构,下来的开发主要就是在熟悉AO的基础上,应用AO的功能开发具体的应用,或者扩展AO没有提供的功能。
一个扩展模块开发的基本步骤如下:
(1)新建工程,添加AO的引用;
(2)实现需要的接口,添加具体的代码;
(3)编译为DLL,注册该COM组件,并在ArcGIS的omponent categories注册(也可以使用界面的自定义对话框浏览定位到具体的dll来注册);
(4)测试和调试。
目前,ArcGIS Desktop扩展的开发环境包括COM兼容环境(例如VB或者VC),.net 1.1的VB.net或者C#。
独立应用程序
一个GIS应用程序,必须实现基本的地图功能,打开VB 6或者.net开发环境,可以看到随ArcGIS Desktop安装的有Map,PageLayout,Toc,Toolbar等控件。而在Desktop下可以使用(有许可)的只有Map和PageLayout控件。对于某些程序,也可以通过此类方法开发,但ESRI推荐在嵌入式或者胖客户端程序,使用ArcGIS Engine。
总结
熟悉了ArcGIS Desktop开发的基本思路以及ArcGIS Desktop的插件架构的基本思想,应用ArcGIS Desktop开发就不再是复杂度很大的事情了。下来的主要工作就是熟悉AO,要熟悉AO,除了面向对象的知识外,GIS的很多原理和知识也是必要的,下回再见。
ps:本来2个多月前就要写这篇东西,但因为种种原因一直没有动笔,3sNews改版终于告一段落,花了半天草就该文,希望可以把这个系列写完。