基于ArcGIS Add-in开发模式的森调数据格式一致性检查

2018-12-18 07:01何伟平代劲松宋盛
自然保护地 2018年4期
关键词:数据类型窗体段长度

何伟平 代劲松 宋盛



基于ArcGIS Add-in开发模式的森调数据格式一致性检查

何伟平 代劲松 宋盛

(浙江省森林资源监测中心 浙江杭州 310020)

为完成全省各县(市、区)森林资源规划设计调查成果属性数据格式的一致性检查,在Visual Studio 2015开发环境下基于ArcObjects的开发接口,采用C#语言编写开发与浙江省森林资源规划调查技术规程要求的标准格式对比的ArcGIS插件,实现森林资源规划设计调查成果属性数据格式一致性检查自动化,具有准确、快捷、高效的特点。

ArcGIS;Add-in开发;格式检查

1 引言

浙江省新一轮森林资源规划设计调查(以下简称二类调查)的外业调查工作已基本完成,内业处理也接近尾声,各县(市、区)的调查成果已陆续上报到浙江省林业厅,进入后期的成果检查验收报批工作阶段。二类调查数据内容丰富、各区县格式不一,同时质量要求高,格式审查是规范数据的重要环节,具有工作量大、任务重、时间紧等特点。

ArcGIS的二次开发接口ArcObjects功能强大,Add-in技术是ArcObjectS开发的一种模式,采用ArcObjectS组件技术开发实现对ArcGIS桌面系统进行定制与扩展[1]。通过研发符合浙江省二类调查技术规程要求的格式审查插件,来实现对属性数据格式校验审核功能,克服传统人工检验方法的弊端,能有效提高二类调查成果检验的准确性和工作效率,对提高二类调查成果的质量有重要意义。

2 ArcGIS Add-in功能

2.1 ArcGISAdd-in简介

插件技术是在软件的设计和开发过程中,将整个应用程序划分为宿主程序和插件对象二部分,宿主程序能够调用插件对象,插件对象能够在宿主程序上实现自己的逻辑,而二者交互基于一种公共的通信契约。宿主程序可以独立于插件对象存在,即使没有任何插件对象,宿主程序的运行也不受影响,因此,我们可以在避免改变宿主程序的情况下通过增加或调整功能[2]。

ArcObjects是ESRI公司ArcGIS可采用的通用二次开发组件集,它提供基础的COM对象集合,包括1200多个可订制、可扩展、可开发的GIS应用程序的对象,利用这些组件可以进行全面的面向特殊功能的组件开发[3]。

ArcGIS Add-in 支持的功能类型广泛、文件结构简单、安装部署方便,在实际生产过程中可以快速开发投入应用。主要组件有以下几种:

Buttons and tools(按钮和工具);Combo boxes(组合框);Menus and context menus(菜单和快捷菜单);Multi items(多项目);Toolbars (工具栏);Tool palettes(工具栏选项);Dockable windows(可停靠窗体);Application extensions(应用程序扩展);Editor extensions(编辑器扩展)。

2.2 ArcGIS Add-in 的文档结构

ArcGIS Add-in 是以 Esri Add-in 为后缀的压缩文件,由配置文件、程序集和资源组成。其中,配置文件XML文件包含了描述Add-in 的信息,包括ID、目标、作者、版本等;程序集包含功能代码和相关类库等;资源包括界面图标等文件。

2.3 Microsoft Visual Studio(VS)

Microsoft Visual Studio(VS)作为目前最流行的集成开发环境之一,被大量开发团队用于实现诸多类型和不同规模的软件项目,能够支持C#、C+、javaScript、F#、Visual Basic、Python等多种编程语言,有较强的实用性。之所以选择编程语言为C#的项目,是考虑到VS的核心是基于.NET框架开发的,而C#是由微软所开发的编写.NET框架的程序设计语言。对于C#项目,VS所能提供的功能将会更加全面[4]。

2.4 开发思路

根据浙江省二类调查技术规程的要求形成标准的小班(林带)属性数据结构表和树带属性数据结构表,将小班(林带)和树带等图层数据加载到ArcGIS Desktop,再通过利用Visual studio2015开发的ArcGIS Desktop Add-in自动检验相关属性数据格式与标准数据结构表的一致性。

本次ArcGIS Add-in的开发环境VS2015+ ArcGIS Desktop 10.5+ Win7 64bit。

3 应用要点及核心算法

3.1 启动VS2015,新建项目

启动VS2015,打开“新建项目”界面,确定好项目的名称和保存的位置,点击确定,完成新建一个项目(ArcMap Add-in)。

3.2 进入Welcome页面设置

在Welcome页面中填写好相应的Add-inName(插件的名称),Company/Publisher(插件的制作公司或发布者),Author(插件的制作者),Description(插件的描述),最后选择Image(插件的图标)。

3.3 进入Add-inTypes页面

Add-inTypes页面用于设置创建的插件类型。

选择Add-inTypes,此处选择按钮。填写ClassName:类的名称;Caption:按钮上显示的文本;Image:按钮上的图标;Category:所属Command的分类;Tooltip:鼠标在上面时状态栏显示的文字;Description:工具的描述。点击Finish完成设置。

3.4 windows窗体应用程序

在已安装模板中,选择Visual C#,右边会显示出各种项目类型。这里第一项就是Windows窗体应用程序。

默认状态下,会自动生成一个窗体文件。这个窗体是主启动窗体,当程序运行的时候会先运行这个窗体。如果需要修改,可以在创建项目时默认生成的Program.cs文件中进行更改。

一个桌面应用程序中往往会有多个窗体。我们可以右键点击项目名称,在“添加”选项中,选择“新建项”来添加窗体。注意不要选错,否则会进行其它操作。本次程序就只要一个窗体,无需添加多个窗体。

3.5 添加控件

有了窗体,我们就可以在窗体上放置各种各样的控件。左边的工具箱中有各式各样的控件,按钮、文本框、复选框等。用鼠标按住工具箱中的某个控件,把它拖放到窗体上,便可以往窗体内添加控件。也可以直接双击工具箱内的某个控件,将控件添加到窗体上。

可以用鼠标对窗体上的控件进行拖动操作,来改变控件在窗体上的位置。当鼠标移动到窗体中的控件上时,鼠标的指针会变成十字形状,左键点住,就可以进行拖动。

右键点击窗体中的控件,在上下文菜单中选择“属性”,右侧就会出现这个控件的属性设置栏。在属性设置栏中,可以设置控件的各种属性。有显示文本、颜色等。

本次程序的窗体设计的最终结果如下图:

双击某个控件,就会跳到对应的代码编辑页面,进行相对应的操作响应事件代码的编写。比如,双击按钮,就会跳到代码编写页面,进行按钮点击响应事件代码的编写。这里可以编写各种各样的事件。

3.6 核心算法

借助C#开发语言程序将图层属性数据表的格式和标准属性数据结构表通过Add-in插件加入至ArcGIS数据环境中,通过插件窗体的控件Click事件程序来实现图层属性数据的格式检查。其中“检查”控件的Click事件代码[5]如下:

{

Var fileName=txtBox_CSV.Text;

If (File.Exists(fileName))

{

Var fldStruct = HelperClass.CSV_2_DataTable(fileName);

try

{

Var lyr = (cb_Layers.SelectedItemaslyrInfo).featureLyr;

对照组中,男性患者27例,女性患者23例,年龄区间为41.15~78.52岁,平均年龄为(59.63±1.17)岁。心功能诊断结果:Ⅰ级患者21例,Ⅱ级患者15例,Ⅲ级患者10例,Ⅳ级患者4例。观察组中,男性患者31例,女性患者19例,年龄区间为42.22~79.63岁,平均年龄为(60.25±1.31)岁。心功能诊断结果:Ⅰ级患者22例,Ⅱ级患者14例,Ⅲ级患者9例,Ⅳ级患者5例。两组受试者基线资料比较,差异无统计学意义(P>0.05),具有可比性。

If (lyr == null)

{

return;

}

String Message = "";

For (int i=0 ; I < fldStruct.Rows.Count ; i++)

{

#region读取CSV文件中的数据结构信息

Var fldName = fldStruct.Rows[i][0].ToString().Trim();

Var fldName2 = fldStruct.Rows[i][1].ToString().Trim();

Var fldType = fldStruct.Rows[i][2].ToString().Trim().ToUpper();

Var fldLength = fldStruct.Rows[i][3].ToString().Trim();

Var fldAlias = fldStruct.Rows[i][4].ToString().Trim();

Var fldMustCheck = fldStruct.Rows[i][5].ToString().Trim();

#endregion

//根据字段名查找其在矢量图中的索引

Var featureFldIndex = lyr.FeatureClass.FindField(fldName);

//是否有可选字段名

If (fldName2!="")

{

Var featureFldIndex2 = lyr.FeatureClass.FindField(fldName2);

featureFldIndex = Math.Max(featureFldIndex, featureFldIndex2);

}

//字段名存在

if(featureFldIndex!=-1)

{

//字段类型是否匹配

Bool typeMatch=true;

//矢量图中的数据类型

String RecordDataType = "";

//读取矢量图的字段信息

Var featureFld = lyr.FeatureClass.Fields.Field[featureFldIndex];

//判断字段类型是否匹配

Switch (featureFld.Type)

{

Case esriFieldType.esriFieldTypeSmallInteger:

Case esriFieldType.esriFieldTypeInteger:

If (fldType !="INT")

{

typeMatch = false;

RecordDataType = "INT";

}

break;

case esriFieldType.esriFieldTypeSingle:

if (fldType != "FLOAT")

{

typeMatch = false;

RecordDataType = "FLOAT";

}

break;

case esriFieldType.esriFieldTypeDouble:

if (fldType != "DOUBLE")

{

typeMatch = false;

RecordDataType = "DOUBLE";

}

break;

case esriFieldType.esriFieldTypeString:

var len = featureFld.Length;

if (fldType != "TEXT")

{

typeMatch = false;

RecordDataType = "TEXT";

}

else

{

//判断数据长度是否匹配

Var sdLen = Int32.Parse(fldLength);

if (len != sdLen)

{

Message = Message + fldName + ",” + fldType +", " fldLength + "," + fldAlias + "," + fldMustCheck + ","+ len.ToString() + " , 字段长度不对 ";

}

}

break;

default:

typeMatch = false;

break;

}

If (typeMatch == false)

{

Message = Message + fldName + "," + fldType + "," + fldLength + "," + fldAlias + "," + fldMustCheck + "," + RecordDataType + ",数据类型不匹配 ";

}

}

//未找到相应字段名

else

{

Message = Message + fldName + "," + fldType + "," + fldLength + "," + fldAlias + "," + fldMustCheck + ",, 未找到 ";

}

}

If (Message!="")

{

//错误信息文件名

Var fn = System.DateTime.Now.Year.ToString() + System.DateTime.Now.Month.ToString() + System.DateTime.Now.Day.ToString() + System.DateTime.Now.Hour.ToString() + System.DateTime.Now.Minute.ToString() + System.DateTime.Now.Second.ToString();

//错误信息输出目录

Var path = System.IO.Path.GetDirectoryName(fileName);

//错误信息文件全名

varoutName=path+"\数据结构错误_"+fn+".csv";

//将错误信息写入文件

StreamWritersw = newStreamWriter(outName,false,Encoding.Default);

sw.WriteLine("字段名,数据类型,字段长度,中文名,备注,使用的数据类型或长度,错误类型");

sw.Write(Message);

sw.Flush();

sw.Close();

//用记事本打开保存的IP信息

System.Diagnostics.Process.Start("EXCEL.exe", outName);

3.7 调试运行

基本的控件和代码完成之后,就需要进行调试运行。点击上方的调试按钮,就可以就行窗体应用程序的生成、运行和调试。如果没有报错,就说明编译成功了,能够运行。

因为Add-in程序是ArcGIS的插件程序,本身没有单独的主程序,调试时,选择附加到进程(选择ArcMap,第一次要打开一个ArcMap[6]。当然,如果程序没有问题,可直接生成*.esriAddIn文件在ArcMap中加载使用。

3.8 加载使用

点击生成好的Add-in插件,安装到ArcGIS中去,再打开ArcMap,打开扩展管理,选择Commands选项卡,找到Add-in Controls,这时候会发现编写的工具会出现在这一组中。

在ArcMap窗口菜单栏的右下角出现相应的插件图标,如下图:

4 应用案例

浙江省二类调查成果标准小班数据表有95个字段,相应的字段名称、数据类型、最小长度和中文名等都有具体要求[7],利用本插件程序对这些格式进行检查,操作简单、快捷、准确、方便,且不会出现漏查和误查的情况。现对温州市苍南县的调查成果数据进行检查,耗时不到十秒钟,远远快于人工检查,且准确性高。检查结果如下表:

字段名数据类型最少长度中文名规程是否要求使用数据类型或长度错误类型 PINGJUN_XJFLOAT 平均胸径(cm)YINT数据类型不匹配 PINGJUN_GFLOAT 平均高(m)YDOUBLE数据类型不匹配 YU_BI_DUFLOAT 郁闭度/覆盖度YDOUBLE数据类型不匹配 SMDFLOAT 疏密度YDOUBLE数据类型不匹配 HUO_LMXJFLOAT 每亩蓄积(m?)YDOUBLE数据类型不匹配 REMARKSTEXT200附记Y50字段长度不对 ZHAO_NDTEXT6造林年度Y10字段长度不对 HUOZAI_DJTEXT1森林火灾等级Y2字段长度不对 TRGX_QKTEXT1天然更新生长情况Y30字段长度不对 SZ_ZCⅡTEXT23树种组成Ⅱ 30字段长度不对 DXSWTEXT3地下水位 未找到 HFFLTEXT3海风风力 未找到 TRHYLTEXT3土壤含盐量 未找到

5 小结

基于 VS2015的ArcGIS Add-in生成的格式检查插件安装简单快捷,检查速度快,检查正确性高,在二类调查成果格式检查工作中,节约了生产成本,提高了生产效率,获得了比较好的效果。基于这次成功的开发经验,接下来可以进一步开发相关检查的功能插件,比如:拓扑错误检查插件和属性逻辑检查插件等,从而更好地实现成果检查验收工作的批量化和自动化,这样能有效提高二类调查成果检验的准确性和工作效率,对提高二类调查成果质量有重要的意义。

[1] 朱旭红,许国安,陈咬根.基于 ArcObjects 组件的地理数据检查软件的实现的数字校园导航系统的研究与实现[J].测绘工程,2010,19(2):49-52.

[2] 苏旭明.组件式地理信息系统的特点及开发方法[J].北京测绘,2002,(4):40-41.

[3] 赵文峰,刘南,刘仁义.基于ArcObjects的系统开发技术剖析[J].计算机应用研究,2014,(3): 130-132.

[4] 刘亚珺,李兵,李增扬,等.软件集成开发环境的技术债务管理研究[J].计算机科学,2017,44(11): 16-18.

[5] 崔群法,唐有朋,王俊伟.Visual C#2008从入门到精通[M].北京:电子工业出版社,2009.

[6] ESRI Corp, Arcobjects DeveIoper’s Help[R].2015.

[7] 浙江省林业厅.浙江省森林资源规划设计调查技术操作细则[S].2014.

2018-07-28

TP319

B

1004-7743(2018)04-0075-6

猜你喜欢
数据类型窗体段长度
中俄原油管线冻土融沉对输油管道应变的影响研究
“以宽代深”模式在流域骨干引排工程中的应用研究
如何理解数据结构中的抽象数据类型
喷嘴结构对耙吸挖泥船高压冲水性能影响的试验研究
重力热管几何结构优化的数值研究
试谈Access 2007数据库在林业档案管理中的应用
基于Qt的多窗体快速并行图形绘制方法研究
基于SeisBase模型的地震勘探成果数据管理系统设计
线上众筹产品的特征分析与研究
相似度计算及其在数据挖掘中的应用