面向Geodatabase的栅格数据批量加载插件开发
2019-02-12王育红刘康晨
王育红,刘康晨
(江苏师范大学 地理测绘与城乡规划学院,江苏 徐州 221116)
0 引 言
1999年, 美国ESRI公司发布了当时代表最高技术水平的全系列GIS平台——ArcGIS。Geodatabase则是伴随ArcGIS而生的、 采用对象关系数据库技术的新一代空间数据模型。 相对于早期的Shapefile与Coverage空间数据模型, Geodatabase具有一体化、 智能化等优势, 能够更清晰、 准确地反映、 描述现实实体的静态属性与动态行为特征[1]。 经过多次的技术革新和版本升级, 目前Geodatabase已具备统一集中管理矢量、 栅格、 DEM、 TIN、 网络、 时态、 常规属性表格、 音视频等多种数据的强大能力, 并广泛应用于众多领域和部门[2-3]。
为满足不同的应用需要,Geodatabase针对栅格数据提供了5种不同的存储与管理机制。其中:栅格数据集用来直接存储原始格式的栅格数据;栅格目录和镶嵌数据集作为特殊形式的关系表,主要来存储记录多幅栅格数据及其相关的属性信息;要素类与表则通过其中自定义的栅格型属性列(字段)来进一步存储记录相关的栅格数据,以丰富扩展空间和非空间对象主体记录的信息内容、增加直观认识。对于前3种主体型存储方式,可通过ArcMAP应用程序提供的“导入栅格数据集”、“加载栅格数据集”等功能将外部原始栅格数据批量加载到所建Geodatabase中。但对于后两种辅助型存储方式,目前尚没有批量加载工具,只能根据表或要素类中已有的数据记录,人工逐条加载与之相关的栅格数据,人机交互频繁、效率低、易出错。针对这一不足,本文在总结分析ArcGIS平台功能定制扩展方法的基础上,采用插件技术设计开发了一个面向Geodatabase表与要素类的栅格数据批量加载ArcMAP插件。
1 ArcGIS定制开发技术
为方便在已有功能基础上量身定制开发出更个性、更简洁、更智能、更高效的功能或系统,最大限度地满足不同用户的应用需要,不同版本的ArcGIS平台适时提供了多项定制扩展开发技术,如图1所示。
1.1 ArcObjects
ArcObjects(AO)是基于Microsoft COM技术所构建的一系列可重用COM组件集, 几乎提供了ArcGIS全部的底层功能。 基于AO的开发,早期主要有3种方式[4-5]: 利用ArcGIS内嵌的VBA脚本语言直接对ArcGIS桌面应用(如ArcMap)功能进行扩展开发[6-7]; 利用支持COM技术的编程语言(如VB、.Net、C++等), 在AO组件基础上进一步包装其自身的dll组件, 经编译注册后将其功能添加到ArcGIS系统或其他应用程序中; 采用高级编程语言通过引用AO类库及其包含的MapControl、 PageLayoutControl等可视化控件开发具有单独界面、 可独立运行的GIS应用程序。
图1 不同版本ArcGIS支持的定制开发技术Fig.1 Customizing and development technology in ArcGIS
1.2 ArcEngine
ArcEngine(即ArcGIS Engine, AE)是ESRI公司对AO核心组件进行再封装之后对外发布的一个独立产品和开发工具包,其组件接口、方法、属性与AO相同,但功能稍弱于AO。AE主要用来开发独立GIS应用或嵌入式GIS应用,如将GIS功能嵌入到Mirosoft Word和Excel等已有应用程序中。利用AE开发的应用程序可以脱离ArcGIS产品(如Desktop),只依赖于ArcGIS Engine Runtime独立运行,而AO程序则必须依赖于ArcGIS产品才能运行[8-9]。
1.3 ModelBuilder
ModelBuilder是一个用来创建、编辑和管理模型的应用程序,也可以将其视为用于构建工作流的可视化编程语言。ModelBuilder主要用于对复杂地理处理流程进行简化,无需编码,仅通过拖拽、连线、参数设置等方式就可以将已有地理处理工具串联起来扩展形成一个新的地理处理工具(模型或工作流),该工具可以进一步嵌入到新模型中,并可以发布为地理处理服务供Web应用调用[10-11]。因此,ModelBuilder所建模型具有可重用、易共享等特点。
1.4 Addin
Addin(与Add-in、Addon、Add-on、Plugin、Plug-in等词同义)通常译作插件,俗称外挂,是一种遵循一定接口规范编写出来的程序,主要用来改变宿主软件的功能和性能[12-13]。这里的宿主软件是指插件依附于其上,发挥功能的目标程序。ArcGIS目前支持两种桌面插件扩展开发技术[14]:面向C#、VB、.Net和Java高级编程语言的Addin技术;面向Python脚本语言的Addin技术。前者基于AO组件进行扩展开发,支持的可扩展元素较多;后者基于ArcPY站点包进行扩展开发,不需要了解复杂的AO组件,代码数量少,不需要编译,但编码不易调试、可扩展元素较少。
1.5 ArcGIS Runtime
ArcGIS Runtime是一款基于服务架构的轻量级全新开发产品集合,可用来在不同平台设备上(如Window、 Linux、 Mac、 iOS、 Android等)通过不同编程语言(C++、 Java、 C#、 Qt等)开发离线或在线的制图应用及地理分析应用,并且支持按需部署,无需注册安装。与AO、AE技术相比,ArcGIS Runtime具有跨平台、易部署、显示效率高、与WebGIS无缝集成等特点。
2 栅格数据批量加载插件开发
基于对以上各种扩展开发方式的分析,以及已有开发经验,笔者采用C# 2010编程语言与Addin技术对ArcMAP 10.2栅格数据加载功能进行扩展, 设计实现了一个工具栏插件——iLoader,如图2所示。
图2 iLoader插件Fig.2 Addin of iLoader
2.1 插件功能原理
首先,从“目标表”组合框中选择ArcMAP文档中具有栅格型字段(以存储栅格数据)的表或要素类,并根据需要在“匹配字段”组合框中选择“目标表”的一个字符型字段用于后期的查询比较;然后,选择指定文件夹内的部分或全部栅格图像文件;最后,依次解析所选栅格图像文件的文件名,在“目标表”中查询“匹配字段”取值等于该文件名的记录,如果返回结果非空,则将该栅格图像文件赋给返回记录的栅格字段,直到处理完全部所选栅格文件为止。
2.2 插件实现过程
(1)创建项目:在Visual Studio 2010中,根据ESRI提供的ArcGIS Desktop Add-ins模板创建一个名称为“iLoader”的ArcMAP add-in项目,向该项目中添加组成该插件的相应元素并设置名称、图片等参数,主要包括2个组合框元素、2个按钮元素、1个可停靠窗口元素和1个工具栏元素。前5个是基本交互类元素,最后1个是容器类元素, 用来存放前4个元素。可停靠窗口上再添加一个DataGridView控件,用来记录栅格文件加载结果。
(2)编写代码:在上述前5个扩展元素对应的类文件中输入相应代码,通过ArcMAP、Addin、thisAddin、IFeatureLayer、ITable、IQueryFilter、IRasterDataset、IRasterValue、IRowBuffer等对象或接口,实现扩展元素之间的交互以及表、要素类的查询与修改。
(3)编译调试:第一次编译调试Addin程序时,应先将其附加到已启动的ArcMAP主程序上。在关闭主程序之后,重新启动Addin程序,并将其添加到ArcMAP中,则可以开始反复多次的调试纠正工作。在确保运行正确无误后,就可对外发布、安装编译生成的esriAddIn文件。该文件是一个包含配置文件、程序集和资源文件的zip压缩包,通过双击就可以安装部署到需要的计算机上,也可通过ArcMap的“加载项管理器”进行查看和卸载所安装的Addin程序。
2.3 主要功能实现代码
(1)获取ArcMAP文档中的表或要素类。
//获取表。
IStandaloneTableCollection iSTC;
iSTC=ArcMap.Document.FocusMap as IStandaloneTableCollection;
IStandaloneTable iSTable;
iSTable=iSTC.getStandaloneTable(i);
ITable iTable=iSTable.Table;
//获取要素类对应的表。
IFeatureLayer iFlayer;
iFlayer=ArcMap.Document.FocusMap.getLayer(i)as IFeatureLayer;
if (iFlayer !=null)
{
ITable iTable=(ITable) iFlayer.FeatureClass;
//如果iFlayer为Null,则不是要素类。
}
(2)获取插件包含的扩展元素。
//获取类名为“C2ComBox”组合框。
C2ComBox cBox2;
cBox2=AddIn.FromID
//获取类名为“C5DWnd”的可停靠窗口。
UID uID=new UIDClass();
uID=ThisAddIn.IDs.C5DWnd.ToUID();
var dWnd=ArcMap.DockableWindowManager. GetDockableWindow(uID);
//获取停靠窗口上的DataGridView控件。
DataGridView dGV;
dGV=AddIn.FromID< C5DWnd.AddinImpl> (Th-isAddIn.IDs.C5DWnd).DataGrid;
(3)判断Geodatabase类型。
Geodatabase有个人、文件和ArcSDE三种类型,不同类型的Geodatabase其查询语法不同,因此在对表或要素类进行查询前,应先判断其所在数据库的类型,以便输入符合语法的查询语句。
//将表接口变量iSTable转化为数据集接口。
IDataset iDSet=iSTable as IDataset;
//获取数据集所在工作空间。
IWorkspace iWSpace=iDSet.Workspace;
//判断工作空间的后缀名,并设置相应的表达式。
string wsName=iWSpace.PathName.Substring (iWSpace.PathName.Length-4)
string SQLExp="";
if (wsName==".mdb")
{
//个人地理数据库查询语句一般形式
SQLExp="[字段名]='字段值'";
}
else if (wsName==".gdb")
{
//文件地理数据库查询语句一般形式
SQLExp="字段名='字段值'";
}
else
{
//个ArcSDE地理数据库查询语句一般形式
SQLExp=@"""字段名""='字段值'";
}
(4)查询记录,并修改栅格字段的值。
//将一般形式的查询语句转换为具体的查询语句。
SQLExp=SQLExp.Replace(“字段名”, mFldName);//mFldName为所选匹配字段名称。
SQLExp=SQLExp.Replace(“字段值”,imageName);//imageName为不包括扩展名的所选图像文件名称。
IQueryFilter iQFilter=new QueryFilterClass();
iQFilter.WhereClause=SQLExp;
int rowCount=iTable.RowCount(iQFilter);
if (rowCount> 0)
{
IWorkspaceFactory iWF;
iWF=new RasterWorkspaceFactoryClass();
IRasterWorkspace iRW=iWF.OpenFromFile (imagePath, 0) as IRasterWorkspace;//imagePath为所选栅格图像文件的路径目录。
IRasterDataset iRD=iRW.OpenRasterDataset (imageNameExt);//imageNameExt为包括扩展名的所选图像文件名称。
IRasterValue iRV=new RasterValueClass();
iRV.RasterDataset=iRD;
IRowBuffer iRB=iTable.CreateRowBuffer();
//iTable为所选的表或要素类转化后的表。
iRB.setValue(rFldIndex, iRV);
//rFldIndex为所选表中栅格字段的索引值。
iTable.UpdateSearchedRows(iQFilter, iRB);
Marshal.ReleaseComObject(iQFilter);
}
3 应用与验证
本插件已在江苏师范大学Geodatabase建设中得到应用,主要用来加载建筑物、景观等要素类中所需的平面或全景栅格数据。这两个要素类(可储存几何图形的特殊表)的数据组织结构形式分别见表1和表2。
表1 建筑物要素类数据组织结构Table 1 Data structure of building features
表2 景观要素类数据组织结构Table 2 Data structure of landscape features
对于上述要素类,主要采用如下方式采集加载所需数据:首先,利用ArcGIS的“加载数据”功能加载通过实地测量获得的AutoCAD地图数据,即要素类所需的几何图形与属性数据;然后,通过实地拍照方式采集各要素相关的栅格图像数据,并进行拼接、编辑、按要素名称命名等处理;最后,利用所开发的iLoader插件工具批量加载各要素所需的栅格数据。
为验证本插件的优越性,笔者以上述两个要素类为例,对栅格数据人工和批量两种加载方式进行了对比实验分析,具体结果见表3。
表3 人工与批量加载对比实验结果Table 3 Test results of two uploading methods
相对于人工手动逐项加载方式,本文所开发的批量加载方式具有交互少、效率高等明显优势,加载效率至少可提高50倍以上。
4 结束语
作为一个全系列、多层次、跨平台、可伸缩的GIS产品平台,ArcGIS力争为各类用户提供全面的解决方案,虽然新技术、新方法、新工具层出不穷,但遇到特殊情况时这些并非是万能的,在实际应用中常常需要用户进行针对性的整合、扩展与改造。本文针对Geodatabase表与要素类加载栅格数据的不足,采用Addin技术设计开发了一个批量加载插件,进一步验证了Addin技术易创建、易安装、易共享、更安全的特征,大大提高了加载效率。