基于模型构建器与AE的卫片执法自动化套合图研究与应用

2021-11-10 06:00张笑涵
城市勘测 2021年5期
关键词:卫片图斑工具

张笑涵

(沈阳市勘察测绘研究院有限公司,辽宁 沈阳 110004)

1 引 言

模型构建器是ArcGIS内部包含的可视化编程工具。它以工作流的方式呈现,几乎无须编程语言,即可实现工具自动化的功能,其各个分项工具可修改其参数,内置的迭代器,可对要素、行、字段值、多值、数据集、要素类、文件、栅格、表、工作空间进行迭代,还可用编程思维的For循环,While循环进行批处理。模型构建器的基本单位为变量和方法,变量可任意从ArcMap中拖拽(相对路径),也可从ArcCatalog中加载(绝对路径)。方法即为ArcGIS工具箱(俗称红盒子)中的任意工具,其参数可自定义,可关联迭代结果,可互为前提条件。整个模型构建器应用起来可实现较为复杂的数据处理任务,如将变量设为模型参数,整个程序打包后可供他人使用,还可将多个模型构建器串联,实现更为复杂的功能。

ArcGIS Engine是用于构建定制应用的一个完整的嵌入式的GIS组件库,使用ArcEngine可以创建独立界面版本(stand-alone)的应用程序,或者对现有的应用程序进行扩展,为GIS和非GIS用户提供专门的空间解决方案。

本文通过将上述两种快速解决问题的工具相结合,各取所长,形成一套自动化的成果输出程序,不仅将工作效率提高,也为日后的相关项目提供了经验。

2 需求分析

为适应数字城市建设的需求,满足经济社会和人民生活的需要,推动城市规划、设计、管理及建设的需要,本市近些年加大了卫星遥感监控数据处理与应用服务项目的重视程度,对监测图斑中涉及违法建设、违法破坏耕种层等行为,也加大了监察和执法力度。

本次数据成果中,内业数据包括前期处理及后期成果建档,数据处理包括根据测量坐标值,影像底图数据,进行监测变更宗地图绘制,求取违法用地面积或指定区域范围面积,制作违法影像宗地图、照片成果图、测绘报告编制、卫片档案图册制作等。后期提交成果包括以县区行政区域为单位的遥感图斑卫片影像及相关矢量数据、图斑核查表、卫片档案及监控分析报告,图斑核查表包括图斑明细、中心点坐标(x轴、y轴坐标),图斑号、图斑面积等内容。

其中卫片档案图册等相关图件包含大量图形坐标,并涉及矢量数据配图等工作,因需满足宗地图制作的相关规范,如图廓,图例,指北针,起始坐标为左上角等,若人工干预,工作量巨大,因此考虑自动化成图,样图如图1所示:

3 模型构建器部分的应用

源数据为国家下发监测图斑,即为矢量面状shp数据,要提取其各拐点坐标,需使用“要素折点转点”工具,并使用“添加XY坐标”工具添加其坐标,添加若干文本及双精度字段供后期AE程序使用,其中关键字段为POINT_Y与POINT_X之间的差值,根据差值的大小,可判断出其相对左上方的ID号。

图1 卫片执法套合图(样例)

处理后,可通过“删除相同的”工具,对点状数据进行处理,如面状数据有重复拐点,可在这一步中将其删除,需要注意的是,处理后的数据因ID号不连贯,可将数据进行“要素类至要素类”工具处理,重新生成ID索引(为后期数据连贯读取做准备)。

整套流程可集成于一个模型构建器中,输入端可设为模型参数供用户选择,尽量将参数设置为1个~2个,方便用户操作。本文主要强调解决问题的快速性,读者可自行扩展,如将C#结合AE,在其GP组件中将上述命令得以实现。或运用ArcPy,用打包性更完善的python语言编译。

4 AE代码块中的应用

利用ArcGIS Engine开发者能将ArcGIS功能集成到一些应用软件。包括核心ArcObjects的功能,是对AO中的大部分接口、类等进行封装所构成的嵌入式组件,其接口、方法、属性与AO是相同的。不同之处在于开发环境,ArcObjects必须依赖ArcGIS Desktop桌面平台,即购买安装了ArcGIS Desktop的同时,安装ArcObjects,才能利用AO进行开发;ArcEngine是独立的嵌入式组件,不依赖ArcGIS Desktop桌面平台,直接安装ArcEngine Runtime和DeveloperKit后,即可利用其在不同开发语言环境下开发。

本次程序将AO相关组件集成于winform中,并加载Microsoft.Office.Interop.Excel,itextsharp等相关组件,通过游标IFeatureCursor对mxd中的已加载图层Layer进行字段逐行遍历,后用feature.get_Value方法将所需字段进行提取,用GetMaxValue(list)方法对坐标差值进行筛选,取最大值ID暂定为左上角J1起始点。

界址点成果表核心代码如下:

//获取J1关键id

queryFilter.WhereClause = "jian = '" + GetMaxValue(list1).ToString() + "'" + " AND ORIG_FID =" + hao;

IFeatureCursor featureCursor3 = QSZD2.Search(queryFilter,false);

IFeature feature3 = featureCursor3.NextFeature();

int guanjianid = Convert.ToInt32(feature3.get_Value(feature3.Fields.FindField(suoyin)).ToString());

//j赋值

queryFilter.WhereClause = "ORIG_FID = " + hao;

IFeatureCursor featureCursor4 = QSZD2.Search(queryFilter,false);

IFeature feature4 = featureCursor4.NextFeature();

//excel

Microsoft.Office.Interop.Excel.Workbook workbook = excel.Application.Workbooks.Open("D:\界址点坐标成果表模板.xls",missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing);

Microsoft.Office.Interop.Excel.Worksheet newWorksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets.get_Item(1);

for (int i = 1;i <= numall;i++)

{

string jhao = "J" + i.ToString();

queryFilter.WhereClause = "ORIG_FID = " + hao + " AND j ='" + jhao + "'";

IFeatureCursor featureCursor5 = QSZD2.Search(queryFilter,false);

IFeature feature5 = featureCursor5.NextFeature();

double qux = Convert.ToDouble(feature5.get_Value(feature5.Fields.FindField("POINT_X")));

double quy = Convert.ToDouble(feature5.get_Value(feature5.Fields.FindField("POINT_Y")));

newWorksheet.Cells[i - 2 + 5,1] = jhao;

newWorksheet.Cells[i - 2 + 5,2] = qux.ToString("0.000");

newWorksheet.Cells[i - 2 + 5,3] = quy.ToString("0.000");

}

对于套合图配图部分,其主要思路为,通过IFeatureLayerDefinition接口,将指定图件的ID号锁定(也可为其他,但必须唯一值),运用IEnvelope接口将目标要素缩放,可通过envelope.Expand方法调节缩放比例。m_MapDcument.PageLayout as IActiveView方法可将窗口调整为页面布局。IFontDisp接口可提供字体调整方案,包括字体,字号,是否加重等相关属性,通过ESRI.ArcGIS.Carto.ITextElement接口将标题添加到布局视图中,位置可事先随意加载,并调整到合适位置,在ArcMap中查看其中心点坐标。

成果输出可将模板另存为mxd格式,也可直接利用图件输出接口ESRI.ArcGIS.Output.IExport及相应代码生成pdf图件。

套合图配图核心代码如下:

string zongdicaotupath = @"D:*.mxd";

IMapDocument m_MapDcument;

m_MapDcument = new MapDocumentClass();

m_MapDcument.Open(zongdicaotupath,"");

int num = 1;

IFeatureLayer QSZDLayer1 = m_MapDcument.Map[0].get_Layer(1) as IFeatureLayer;

IFeatureLayer QSZDLayer = m_MapDcument.Map[0].get_Layer(0) as IFeatureLayer;

IFeatureClass QSZD = QSZDLayer1.FeatureClass;

IFeatureCursor featureCursor1 = QSZD.Search(null,false);

IFeature feature = featureCursor1.NextFeature();

while (feature != null)

{

string hao = feature.get_Value(feature.Fields.FindField("OBJECTID")).ToString();

string hao2 = feature.get_Value(feature.Fields.FindField("JCBH")).ToString();

string hao3 = feature.get_Value(feature.Fields.FindField("值")).ToString();

string hao4 = feature.get_Value(feature.Fields.FindField("XMC")).ToString();

//mxd

IActiveView activeaaa = m_MapDcument.ActiveView.FocusMap as IActiveView;

IFeatureLayerDefinition fea_c = QSZDLayer as IFeatureLayerDefinition;

fea_c.DefinitionExpression = "土地证号 in(" + hao3+")";

IFeatureLayerDefinition fea_c2 = QSZDLayer1 as IFeatureLayerDefinition;

fea_c2.DefinitionExpression = "OBJECTID =" + hao;

activeaaa.Extent = feature.Extent;

IEnvelope envelope = new EnvelopeClass();

envelope = activeaaa.Extent;

envelope.Expand(2,2,true);

activeaaa.Extent = envelope;

activeaaa = m_MapDcument.PageLayout as IActiveView;

}

5 程序与数据的结合及部署

程序整合后,要对其与数据库进行关联,实际应用过程中可以有两种方式,不同的方式都有各自不同的效果和优点。

方法一是定义绝对路径,即设置为数据源存于C盘或D盘的根目录(实际生产中此方法最为常用)。这样用户使用时,可将整个程序包按使用说明置于相应盘符下,直接运行程序时,软件会自动读取绝对路径下的数据库,遍历其中的要素类及要素,得到的分析结果也会存于绝对路径下的数据库中,方便读取,查询。此方法可将一些程序变为一键式或者导航式的界面,用户体验简单,可操作性强。

方法二是将输入的要素及过程中的参数在模型构建器中设置为“模型参数”,此方法可将程序各项参数激活,灵活性更高,用户可以根据自己的计算机容量,数据存放路径等个人实际条件,自主选择相应的数据来源,使用起来更加人性化。但菜单界面中下拉式菜单,文本框,和文件选择按钮较多,可能会使界面略微复杂化。

AE部分的部署,因在winform窗体中编译,其exe可直接应用,用户自带ArcGIS环境即可使用,本文不再赘述。

6 全流程中注意事项及要点

(1)模型构建器的强大,是建立于要提前熟悉将要使用的具体ArcTools的功能,才能快速组合出工作流。

(2)如果你已经可以熟练使用一些ArcToolbox中的工具,此时刚开始尝试模型构建器的话,首先应该花时间了解行内变量这个重要概念,并熟悉其语法。

(3)变量引用依靠图形中标注的名称,所以最好规范化,方便后续通过行内变量的方式引用。

(4)可以通过设定一个模型内通用的数据库,方便查看中间数据以及结果。在模型中添加一个孤立的数据库变量就行了,然后通过行内变量的方式来引用。

(5)要十分注意待使用工具的输入输出数据的格式,由于AecToolbox的包容性比较强,可能某一步输出了一种和预想不同的数据类型(比如你设计在某个gdb数据库中输出要素类,实际工具输出的是shp,但由于gdb数据库的包容性,这一步程序一切正常),且后续几步都无异常,但最终却可能影响结果。

(6)迭代是使用模型构建器的重要原因之一,一个模型中只能存在一个迭代器,但是模型中可以嵌套另一个存在迭代器的模型,这样可以实现迭代的嵌套。

(7)嵌套模型的要点是,让存在外循环的模型的输出数据成为模型参数(右键点击图形,设置模型变量),此时从Catalog中拖拽该模型到内循环所在模型中的时候,输出数据可以暴露出来。

(8)如果模型中的工具需要多个输入变量,好像只允许其中一个变量是通过迭代而来。比如笔者要实现以下功能,A.gdb和B.gdb两个数据库中分别放了a1、a2和b1、b2两个要素类,希望通过裁切功能实现b1和b2分布裁切A.gdb,最终得到A_B1.gdb以及A_B2.gdb。

(9)由于模型构建器中是依靠主流向执行的,分支中如果有中间数据需要在主流向的后续工具中使用的话,需要将支线的执行优先级提高到后续工具以上,也就需要用到所谓的“前提条件”连接符。

(10)路径解析工具配合行内变量可以提高模型的自动化程度。

(11)行内变量在一条路径中只能出现一次。

(12)textelement等元素添加后需及时删除,否则迭代后将积存于页面布局中。

(13)图形索引有时会出现OBJECTID_12等情况,需注意调整。

7 结 论

利用ArcGIS的模型构建器(Model Builder)可以方便、高效地实现数据的自动化处理。结合强大的C#+AE语言代码块,可以对各类数据进行数据分析、统计及批量化处理。能在短时间内为各个项目提供高效的解决方案。同时,操作人员只需简单的编程基础,就能利用模型构建器辅助编程,获得底层开发同等的功效。这不仅能为测绘一线生产提高效率,也能在寻求更快的解决方案,更多元的处理手段上,提供了更广泛的思路。

猜你喜欢
卫片图斑工具
地理国情监测中异形图斑的处理方法
山西省自然资源厅党组成员、副厅长邵社教一行到山西省测绘地理信息院调研
基于C#编程的按位置及属性值自动合并图斑方法探究
波比的工具
波比的工具
土地利用图斑自动检测算法研究
卫片执法系统的设计与实现
准备工具:步骤:
“巧用”工具
基于ArcGIS 10的土地利用总体规划图斑自动化综合