刘康晨
(江苏师范大学地理测绘与城乡规划学院,江苏徐州 221116)
ArcGIS是美国ESRI公司在对其早期开发产品整合的基础上,于1999年推出的一款可伸缩、全系列GIS平台,供用户选择使用。从最初的ArcInfo 8发展到如今的ArcGIS10.7,当前ArcGIS主要包括了ArcGIS for Desktop,ArcGIS Server,ArcGIS Online,ArcGIS Enterprise,ArcGISPro等产品。其中,ArcGIS桌面系统是供GIS专业人员编辑、管理和分析地理信息的软件套件,可用于完成数据编辑、制图、可视化、地理分析和空间处理等一系列由简单到复杂的GIS任务[1]。目前的ArcGIS桌面系统主要包括两大类:ArcGISfor Desktop,ArcGISPro。在传统ArcGISfor Desktop中主要包括 ArcMap,ArcCatalog,ArcScene和ArcGlobe四类产品,而ArcGISPro在整合传统ArcGISfor Desktop产品于一体的基础上,又加入City Engine以提升ArcGIS三维建模能力,在未来有取代ArcGIS for Desktop的可能。
随着版本不断更新,ArcGIS桌面系统功能更加完善,现已成为GIS专业人员处理地理信息的必备软件。利用ArcGIS桌面系统处理地理数据时优势明显[2-3]:借助其强大的分析工具和扩展模块,可实现对地理数据方便快捷地处理;同时,凭借其友好地人机交互界面,用户可以对数据快速处理;而软件本身提供的模板和具备的能力,能极大减少地图的生产耗时,且在一定程度上实现地图生产自动化;此外,还可以轻松创建GIS资源,便于信息分享。
ArcGIS桌面系统不仅功能强大,还提供灵活的定制开发方式,用以进一步满足用户个性化需求。如 ArcGIS提供了VBA(Visual Basic for Applications),ArcObjects(简称 AO),ArcEngine(简称 AE),Model-Builder,Addin等多种定制扩展开发技术[4-5],供用户自主定制开发。在开发过程中,传统开发方式更侧重基于VBA,AO或AE的开发,而Addin技术作为新推出的开发技术,目前少有人对其研究分析。为更好地利用Addin开发技术,实现对ArcGIS桌面系统的扩展,本文进一步对该种开发方式进行解释说明。
Addin通常被译作插件,是从ArcGIS10开始引入的新的桌面定制开发技术。相较于AO,AE等传统二次开发方式,Addin具有容易创建、易于安装、便于共享、更加安全及方便卸载等特性。在开发过程中,根据所采用的开发语言不同,可将Addin开发方式具体分为两种[6]:基于Python脚本语言的Addin技术、面向.NET(包含C#,VB,C++等)及Java高级编程语言的Addin技术。
其中,Python Addin技术在开发过程中可直接调用ArcGIS内置的ArcPY站点包,再利用ArcPY站点包实现对ArcGIS工具箱中各种工具直接调用。这既避免了了解复杂AO组件的难题,又降低了对开发人员的要求[7]。同时,Python语言简洁、写法独特的优势,使得在开发过程中可减少代码数量,且不需要编译。但在这种开发方式下,其编码不易调试且可扩展元素较少,缺点较为明显。
同Python Addin技术相比,面向.NET及Java高级编程语言的开发方式可支持更多可扩展元素。该方式是基于AO组件的扩展开发,可实现细粒度的控制ArcGIS的各种操作。同时,C#作为专为.NET Framework设计的一门面向对象的高级编程语言,其语言简洁、兼容性强、面向对象及与Web紧密结合等优势突出[8],更容易受到开发人员的青睐。
基于C#的Addin开发过程一般可分为4个步骤:创建项目、添加组件、编写代码、调试安装。具体开发流程如图1所示。
图1 Addin开发流程
打开Visual Studio 2010,选择Desktop Add-Ins模板 ,具 体 有 ArcCatalog Add-in,ArcMap Add-in,ArcScene Add-in及ArcGlobe Add-in四种选择,在开发过程中可根据实际需要选择相应的模板。随后,设置项目名称及其存放位置,并完善相关描述信息,如项目名称、开发单位、开发人员姓名、插件的用途介绍及插件的图标设置等。完成后即可点击Next进行下一步设置。
完善相关信息后,根据插件界面设计的实际需要,为该项目添加相应组件。Addin中支持的组件类型主要有交互类和容器类两种[9],具体如图2所示,且部分交互类组件还可依托于容器类组件上。为组件添加相应的描述信息后,点击Finish即可实现项目创建。此外,在完成项目创建后,还可以通过右击项目名称,选择“添加”—“组件”方式继续添加其他组件元素。
图2 Addin支持功能类型
完成项目创建后,在生成的Config.esriaddinx文件中可查看上述添加的相关描述信息及组件信息。同时,利用AO及C#语言在组件对应的类文件中输入相应代码,通过具体的对象或接口,实现扩展元素相应功能及彼此间的交互。
首次对Addin插件编译调试时,需先将其附加到已启动的ArcMap主程序上,具体通过选择“工具”-“附加到进程”实现。随后要先关闭ArcMap,然后再进行反复调试。在确保程序正确无误后,即可发布后缀名为.esriAddIn的文件,双击文件即可实现安装部署,操作简单快捷。同时,可通过ArcMap下的“加载项管理器”直接卸载已安装的Addin插件,不会存在注册表残留等问题。
当前ArcMap面向Geodatabase表或要素类,将栅格数据以属性形式存储到字段中时,存在只能人工手动逐条加入、不能批量加载的不足。根据第三章中基于C#的Addin开发步骤,以开发设计一个实现栅格数据批量加载的“ILoader”插件为例,进一步阐述基于C#的Addin开发过程。开发设计的插件用户界面如图3所示。
图3 ILoader工具条界面
“ILoader”插件中包括的具体组件名称及其作用,具体如表1所示。同时,关于插件的相关描述性信息及所有的组件元素信息,均可在配置文件Config.esriaddinx中查看,如下所示。
//配置文件Config.esriaddinx信息
//项目描述信息
<Name>ILoader</Name>
<AddInID>{40b44017-99e7-4acf-acb5-5805b96 d111f}</AddInID>
<Description>一个向Geodatabase表批量加载图像的工具栏</Description>
<Version>1.0</Version>
<Image>ImagesILoader.png</Image>
<Author>刘康晨</Author>
<Company>JSNU</Company>
<Date>2020/01/01</Date>
<Targets>
<Target name="Desktop"version="10.2"/>
</Targets>
<AddIn language="CLR"library="ILoader.dll"namespace="ILoader">
//组合框C1ComBox相关信息
<ComboBox id="JSNU_ILoader_C1ComBox"class="C1ComBox"
message="选择一个可加载图像数据的目标表或要素类"caption="表"tip="目标表"category="Add-InControls"image="ImagesC1ComBox.png"sizeString="WWWWWWWWWWW"rows="12"itemSizeString="WWWWWWWWWWW"hintText="-------目标表-------"editable="true"/>
//工具栏ILoader相关信息
<Toolbar id="JSNU_ILoader_ILoader"caption="ILoader"showInitially="false">
<Items>
<ComboBoxrefID="JSNU_ILoader_C1ComBox"/>
<ComboBox refID=
"JSNU_ILoader_C2ComBox"separator="true"/>
<ItemrefID=
"JSNU_ILoader_C3Button"separator="true"/>
<Button refID="JSNU_ILoader_C4Button"/>
</Items>
利用该插件进行栅格数据加载时,首先通过C1ComBox组合框选择包含栅格字段的表,通过C2ComBox组合框选择一个字段用于匹配;然后通过C3Button,C4Button按钮选择待匹配的栅格数据,依次分析其文件名,并将与“匹配字段”中取值匹配的栅格数据返回栅格字段中,未匹配的则返回Null,直至处理完所有被选中的数据为止。此外,匹配结果还可通过C5DWnd可停靠窗口上的DataGridView控件显示。通过本插件最终可实现栅格数据的批量加载,完善ArcMap原有功能的不足[10]。
ArcGIS桌面系统作为一个专业GIS应用软件套件,其包含的ArcGISfor Desktop及ArcGISPro在各行业领域的数据处理过程中均得到广泛应用,但其本身在一些功能细节上还存在一定不足。目前,针对ArcGISfor Desktop扩展的方法多样,而利用Addin技术扩展ArcGIS桌面系统,不仅降低了开发门槛,还极大地提高了开发效率。本文主要阐述了基于C#的Addin开发一般流程,并通过开发实例具体验证扩展插件的优越性,希望能为有意愿学习Addin开发技术的人员提供一定借鉴意义。
表1 ILoader组件构成