全国高分辨率土地利用数据服务 土地利用数据服务 土地覆盖数据服务 坡度数据服务 土壤侵蚀数据服务 全国各省市DEM数据服务 耕地资源空间分布数据服务 草地资源空间分布数据服务 林地资源空间分布数据服务 水域资源空间分布数据服务 建设用地空间分布数据服务 地形、地貌、土壤数据服务 分坡度耕地数据服务 全国大宗农作物种植范围空间分布数据服务
多种卫星遥感数据反演植被覆盖度数据服务 地表反照率数据服务 比辐射率数据服务 地表温度数据服务 地表蒸腾与蒸散数据服务 归一化植被指数数据服务 叶面积指数数据服务 净初级生产力数据服务 净生态系统生产力数据服务 生态系统总初级生产力数据服务 生态系统类型分布数据服务 土壤类型质地养分数据服务 生态系统空间分布数据服务 增强型植被指数数据服务
多年平均气温空间分布数据服务 多年平均降水量空间分布数据服务 湿润指数数据服务 大于0℃积温空间分布数据服务 光合有效辐射分量数据服务 显热/潜热信息数据服务 波文比信息数据服务 地表净辐射通量数据服务 光合有效辐射数据服务 温度带分区数据服务 山区小气候因子精细数据服务
全国夜间灯光指数数据服务 全国GDP公里格网数据服务 全国建筑物总面积公里格网数据服务 全国人口密度数据服务 全国县级医院分布数据服务 人口调查空间分布数据服务 收入统计空间分布数据服务 矿山面积统计及分布数据服务 载畜量及空间分布数据服务 农作物种植面积统计数据服务 农田分类面积统计数据服务 农作物长势遥感监测数据服务 医疗资源统计数据服务 教育资源统计数据服务 行政辖区信息数据服务
Landsat 8 高分二号 高分一号 SPOT-6卫星影像 法国Pleiades高分卫星 资源三号卫星 风云3号 中巴资源卫星 NOAA/AVHRR MODIS Landsat TM 环境小卫星 Landsat MSS 天绘一号卫星影像
引 言:
我们为什么要进行ArcObjects嵌入式组件开发?
以一个问题开始我们今天的文章也许并不切合技术文档一贯的严肃作风,但这也许是很多读者可能想要知道的问题。ArcGIS Desktop系列软件(ArcMap、ArcCatalog)一直以来都是ESRI产品体系中的核心产品,它以它强大的性能以及良好的拓展能力为越来越多的中国用户提供多样化的数据浏览、查询、统计、分析、入库及编辑功能。由于它的强大性能,在桌面用户眼中ArcGIS Desktop系列软件是一套用户界面良好的GIS功能平台,用户将ESRI为用户提供的各种工具进行组合,完成自己想要的功能。但GIS的应用千变万化,而各个用户单位的业务模式和业务流程又各不相同,使用ArcGIS Desktop系列软件提供的通用功能处理所有可能遇到的问题就显得繁琐或者力不从心。如果解决这个问题呢?ArcObjects嵌入式组件开发可以帮助我们。
ArcObjects嵌入式组件开发是指使用ArcObjects以及相关的开发语言,开发出包含用户业务逻辑以及GIS功能的工具及组件。这些工具及组件都将嵌入ArcGIS Desktop平台运行。众所周知,ArcGIS Desktop系列软件的核心是由ArcObjects搭建的。为了帮助用户在这套强大的桌面平台上进一步进行开发并添加自己的业务逻辑和功能,ESRI提供了两种用户开发手段:(1)使用脚本式语言(Python)结合Geoprossing框架进行支持晚期绑定的功能开发;(2)使用VB 6.0、VC++或VS.NET中的各种高级语言进行早期绑定的嵌入式功能开发。这两种方式各有千秋,第一种方式更适合完成功能接近于批处理的功能,而第二种方式由于和ArcGIS Desktop原本的开发方式更为吻合,适用的工具也更加强大,所以更加适合于高级嵌入式功能的开发以及ArcGIS Desktop插件的产品开发。而第二种开发方式也是本文的主要探讨目标。
既然ArcObjects嵌入式组件开发可以完成如此强大的功能,为何它现在没能成为一种最为主流的开发方式呢。这除了与国内GIS领域以应用项目为主的现状有关以外,也与ArcObjects嵌入式组件开发相对复杂的调试方式有关。目前在国内,专职为ESRI开发插件产品的公司和单位并不多,这就决定了进行ArcObjects嵌入式组件开发的开发人员主要是用户单位的个人开发人员。ArcObjects嵌入式组件开发相对复杂的调试方式为让这部分开发者产生畏难情绪或放弃,这无论对用户自己还是ESRI来说都是一个巨大的损失。
本文将结合主流的开发言语VB 6.0向用户阐述ArcObjects嵌入式组件开发的调试技巧,帮助有志于此项技术的用户早日进入角色。
VB 6.0下的ArcObjects嵌入式组件调试技巧
B6.0为用户提供大量的界面元素(在VB中称为控件对象),用户只要利用鼠标,键盘把这些控件对象拖动到适当的位置,设置它们的大小,形状,属性等,就可以设计出所需的应用程序界面。而不是要编制大量的代码然后再编译生成。VB6.0支持以事件驱动编程。在传统的或"过程化"的应用程序中,应用程序自身控制了执行哪一部分代码和按何种顺序执行代码。在VB6.0应用程序中,代码不是按照预定的路径执行,而是在响应不同的事件时执行不同的代码片段。事件可以由用户操作触发,也可以由来自操作系统或其他应用程序的消息触发,甚至由应用程序本身的消息触发。这些事件的顺序决定了代码执行的顺序。VB6.0与其他可视化语言相比更加易学易用。Visual C++是为专业程序设计员提供的开发工具,相对而言,VB6.0对于非专业程序员而言功能足够强大。并且同Visual C++一样,也支持网络编程和数据库编程。这一切的特征都决定了高级用户可以选用VB6.0作为首选的快速ArcObjects嵌入式组件开发工具。
那么现在我们以插入一个按钮为例演示相应的调试技巧。
VB 6.0下进行ArcObjects嵌入式按钮的开发
1. 实现相应的接口
创建一个ActiveX DLL的工程,并在工程下添加一个新的类(以ArcGISCommand为例)。ArcGIS桌面平台通过接口来识别不同的组件是否可以合法的嵌入到平台中。想要实现一个ArcObjects的嵌入式按钮,我们需要至少需要实现ICommand接口。故在ArcGISCommand中我们首先需要输入以下代码:
Implements ICommand
2.添加相应的实现
根据COM规则,我们需要为所实现的接口中的每一个成员提供实现,故我们在下图所示的环境中选中每一个成员,使其至少拥有一个空实现。
进一步的,我们为上图所示的每一个方法和属性填入我们需要的代码。需要注意的是,ICommand的接口下的很多成员我们可以提供空的实现,这样可以避免书写太多的代码。但是有两个成员是我们必须提供实现的,它们是OnCreate以及Category。通过OnCreate我们可以接收系统传入的钩子,从而达到使黑盒模式中的代码有效的目的。而Category属性则可以保证我们在ArcMap中的自定义对话框内可以看到我们所写的这个类。
Private Sub ICommand_OnCreate(ByVal hook As Object)
'Set m_app = hook
Exit Sub
Private Property Get ICommand_Category()AsString
ICommand_Category = "ESRI China Training"
End Property
3.编译动态链接库
最终通过一系列的实现(此过程篇幅较长,再次省略),我们将希望插入的代码添加到这个模块的各个成员中。经过检查无误后,我们将其编译成想要的DLL文件。在VB 6.0的开发环境中选中ESRI自带的插件:ESRI Compile and Register(这个工具由ESRI提供,安装ArcGIS Desktop Develop Kit后可以获得。在\DeveloperKit\Addins文件夹下找到RegisterVBAddIns.EXE可执行程序,安装后即可获得。)。点击后我们可以看到以下的窗体。在左侧窗体中选中您开发的类名,在右侧窗体中选中ESRI MX COMMANDS类别,开始进行编译。
编译后我们可以获得一个DLL文件以及一个同名的*.reg文件。这个注册表文件可以帮助用户将开发成果顺利的注册到其他客户机器上。Reg的中包含了我们编写的类的ProgID、ClsID以及的注册表类别ID,内容大致如下:; CoClass: EsriChinaTraining.ArcGISCommand
; CLSID: {5458535E-52D8-4879-9C38-5D53323D2059}
; Component Category: ESRI Mx Commands
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{5458535E-52D8-4879-9C38-5D53323D2059}\Implemented Categories\{B56A7C42-83D4-11D2-A2E9-080009B6F22B}]
4. 调用按钮
在ArcMap的“自定义”对话框中,在左侧找到我们所设定的Category名称,右侧选中相应的类名。拖放到ArcMap中的任意工具栏上即可完成按钮的创建。
VB 6.0下ArcObjects嵌入式按钮的调试
可以一次运行成功不需要调试和修改的代码在编程过程中毕竟是少数。在开发完整按钮的嵌入式组件后,我们将面临如何调试它的难题。由于ArcGIS Desktop中的组件采用了双重注册的方式,所以简单的采用VB 6.0下的“启动外部应用程序”的调试方式将难以达到目的。常常会出现所设的断点无法捕捉系统相应动作的情况。
为了解决这个问题,我们可以采用下面这样的方式对“启动外部应用程序”进行一定的补充,以便达到调试的目的。
1. 设置外部启动程序
在VB 6.0的环境下,选中“工程”-“工程属性”,并且切换到“调试”标签页下。在“调试”标签页,选中启动外部应用程序并找到ArcMap.exe。
2. 添加组件到ArcMap环境中
点击运行,ArcMap自动引导应用程序启动。如果发现我们自己所写的类尚未出现在ArcMap的自定义对话框中,我们可以打开ArcGIS的注册工具:组件类别注册器 进行注册。(“开始”菜单 - >ArcGIS - >Develop Tools ->Componet Category Manager)
选中下图的类别后点击“Add Object”,找到编译好的动态链接库,添加
3. 关闭ArcMap
关闭ArcMap,但保持编译环境的运行状态不变
4. 重新启动ArcMap
重新启动ArcMap,但保持编译环境的运行状态不变
5. 添加断点并调试
此时在我们开发的模块中添加断点,如在OnClick事件下添加断点。并在ArcMap环境下点击此按钮,我们会发现断点顺利拦截运行。此时,我们就可以像在同一个开发环境下一样进行代码的调试了。