ArcGIS ModelBuilder模型设计方法在影像解译中的应用
2015-12-14张建新
张建新,纪 凯
(1.安徽省第四测绘院,安徽 合肥230031;2.安徽交通职业技术学院,安徽 合肥230051)
在影像解译过程中,大量的数据分析、处理工作需要通过GIS软件来完成。目前常用的GIS软件有ERDAS、ArcGIS等,这些软件提供了功能强大的分析和处理工具;其中ArcToolbox的各种工具已经被广泛地应用于实际生产中。然而在应用过程中,需要把多种工具组合在一起,才能有效地完成某项具体的任务。另外待处理数据有着类型相同、数量庞大的特点,如果每一项操作、每一个数据都需要人工干预,势必会降低生产效率;而且人工管理繁杂的原始资料和过渡数据更容易产生错误。
ModelBuilder是一种可视化编程环境,直接利用ArcGIS平台中已有的各类工具,把几种工具按一定的规则组合起来,前一个工具的输出作为后一工具的输入,最终形成一个流程化的模型程序。目前基于ArcGIS的开发研究主要集中在ArcObject和ArcEngine功能应用方面;而ModelBuilder具有可视性、快捷性、组合性等特点,非常适合实际生产中,可根据具体需求快速地构建模型程序。因此有必要深入研究ModelBuilder并推广到生产单位中。
本文利用影像解译研究ModelBuilder设计模型的方法以及如何有效地控制模型程序的正常运行;通过实际应用去验证模型程序在生产中所发挥的作用;通过对比试验,分析ArcObject和 Model-Builder各自特点及适用范围。
1 ModelBuilder设计模型的技术与方法
1.1 ModelBuilder设计模型的方法
ModelBuilder设计模型的主要步骤如图1所示。其中工具和脚本是模型实现具体功能的核心部分,一个模型程序由多个工具或脚本组成。ModelBuilder的优势在于能直接使用ArcGIS提供的所有工具(包括Esri网站可供下载的工具),无需编写大量的代码便可实现强大功能。每一个工具需要有一定的输入、输出变量和参数才能正常运行。一般情况下前一个工具的输出可作为后一工具的输入,第一个工具的输入和最后一个工具的输出可作为人机交互的接口,也可作为该模型与其它模型连接的接口。
图1 模型的设计流程
控制工具是控制整个模型有序运行的必要手段;如同其他编程语言一样,ModelBuilder也提供了判断分支、迭代循环、前提条件等工具或脚本。模型中所有工具、脚本、变量、参数等要按一定的顺序连接起来,经过反复验证和调试成最终的成果模型。模型程序可保存在ArcToolbox工具箱中,便于随时使用。在设计新模型时,可将已有模型作为模型工具重复使用,不必重新设计。
1.2 模型程序的控制技术
模型的核心部分是一些ArcGIS内置的处理工具或分析工具,通过工具的功能组合实现模型的功能。ArcGIS所提供的工具基本可以满足实际工程的需要,因此绝大多数模型的设计重点不是研究如何实现具体的功能,而是如何控制一系列工具,使其有序的运行。
ModelBuilder提供了多种迭代器,这些迭代器相当于编程语言中的循环指令(如For,While等),其作用是控制模型重复执行任务。例如:“要素类迭代器”将工作空间或数据集中的所有要素类分别提取并执行相应操作,不断循环直至所有的要素类被处理完成。因此在模型中的适当位置放置迭代器,对于模型实现批处理功能有十分重要的意义。但ModelBuilder并不提供迭代嵌套功能,如需对每个要素类中所有要素分别提取,就不能把“要素迭代器”嵌入“要素类迭代器”中使用。经过试验分析,通过以下方法可以解决ModelBuilder循环嵌套的问题。将“要素迭代器”所实现的功能生成一个模型工具,设置好接口参数;使用“要素类迭代器”迭代预先构建的模型。
If-then-else逻辑看似简单,功能却十分强大,根据不同条件执行不同的操作。然而ModelBuilder并没有提供条件分支工具。通过分析研究,该功能可以通过编写脚本工具或利用“计算值”工具输出布尔值的两种方法来实现。
以上为python脚本工具的核心代码,判断field_value值的两种情况,分别设置两个布尔型参数。应用时把脚本工具添加到模型中,通过两个布尔型参数的“true”或“false”来控制程序的分支路线。
运用迭代器和分支脚本控制模型运行实例如图2所示,其功能是:“要素迭代器”提取每一个线要素,判断其字段值,确定是否应闭合,如需要则执行闭合操作。
除了常用的循环、判断工具外,ModelBuilder还提供了一些其它的程序控制工具,如“合并分支”、“停止”等,由于使用起来比较简单,这里就不再赘述。
图2 迭代与分支的应用
1.3 利用python扩展模型功能
Python是一种不受局限、跨平台的开源编程语言,它功能强大且简单易学。Python已延伸到Arc-GIS中,成为了一种用于数据分析、数据转换、数据管理和地图自动化的语言。ArcPy为用户提供了使用Python语言操作所有地理处理工具的入口,并提供了多种有用的函数种类,用于处理和询问GIS数据。使用Python和ArcPy,可以开发出大量的用于地理处理的实用程序。
Python脚本可以不依赖ArcGIS独立运行,可以作为脚本工具保存到工具箱中使用,也可以嵌入到模型工具中随整个模型一起运行。下面具体分析Python脚本在ModelBuilder的应用的两种方式。
1)Python作为脚本工具的应用。
以上部分代码的作用是从一个工作空间中,提取各种要素类,然后判断该要素类是否存在“NAME”字段,如存在,即把变量“intext”的值赋给该字段。如此不断循环,直到所有的“NAME”字段都被赋值;“intext”值可以是固定值,也可以是某一个或某几个字段计算出的值。原本非常烦琐的字段处理过程,仅通过几句简洁的代码就能轻松实现。因本示例程序需要引用到ArcPy类库,还应在程序之前加入“import arcpy”代码。
如果需要将上述Python程序作为脚本工具供ModelBuilder调用,还应设置好接口参数。一般利用“arcpy.GetParameterAsText()”函数来实现接口参数的设定。
2)Python嵌入内置工具的应用。在“计算字段”工具的“代码块(可选)”控件中填写Python脚本,在“表达式”控件中加入变量运算式;以此实现在“代码块”程序的控制下,根据“表达式”计算出不同的结果,如图3所示。
图3 Python嵌入内置工具的应用
通过实例分析,Python脚本非常灵活地应用在ArcGIS的各个内置工具中;对于扩展ModelBuilder功能有着十分重要的意义。
2 ModelBuilder在影像解译工程中的应用
在当前测绘生产中,普遍采用“内业定位、外业定性”生产流程,因此影像解译对于测绘生产有着非常重要的意义。影像解译的整个生产环节包括:栅格影像预处理、栅格影像解译、矢量数据提取、图形编辑、属性录入等;其中每一个生产环节都有各自的特点,有些环节依靠计算机自动化处理数据,有些环节依靠人工判读和人机交互处理数据。如何减少人机交互操作量,实现自动化处理,也是现在测绘科研的一个方向。
2.1 栅格影像预处理
栅格预处理工作包括投影转换、格式转换、波段合成、重采样、镶嵌与裁剪、DEM正射校正等。栅格影像预处理工作涉及到海量影像数据;有着数据处理时间长,对计算机性能要求高的特点;但其工作流程相对单一,非常适用于计算机程序化地批量处理。利用ModelBuilder把ArcToolbox中现有的栅格处理、分析工具,按一定的方法连接起来,构成自动化处理的模型。
在影像预处理工作中,需要把一整幅影像按照一定的范围线,裁切成多块图像,供后期解译时使用,如图4所示。
图4 影像自动裁切的方法
模型所示:分块工作空间中存放了多个裁切范围面,迭代器分别提取并提供给“裁切工具”作为输入参数,裁切工具同时收集被裁切影像等参数,然后开始执行裁切任务,最终把裁切好的影像存放在输出工作空间中,如此循环直至裁切完成。
使用模型,避免手工重复操作,在计算机性能和存储空间满足要求前提下,可利用空闲时间自动化地处理数据。
矢量分割模型功能:将CAD结合表中图号作为label点,利用裁切线自动构面,再通过ArcToolbox的“Split”空间分析工具,把整个SHP面分割成独立裁切面,自动命名并自动存储,如图5所示。
图5 自动获取裁切面的方法
把图4和图5两个模型再通过ModelBuilder组合起来形成新的模型,操作起来会更加方便、快捷。如果需要实现多幅影像批量裁切功能,还应在模型中加入“栅格迭代器”。
在栅格影像预处理中,绝大多数的处理工作都可以通过模型程序实现自动化操作。模型设计的总体方法与图4、图5类似。
2.2 矢量数据编辑与出图
影像解译后期工作主要是数据编辑、检查修改和属性录入等;这些数据处理过程可以由Model-Builder为具体工作设计模型程序。例如:自动封闭线模型、面裂隙检查模型、自动消除悬挂与伪节点模型、属性自动录入模型等。通过ArcToolbox中的“编辑工具”、“拓扑工具”、“分析工具“、“字段工具”等常用工具的组合,再配合控制工具及Python脚本实现上述模型功能。
在影像的矢量提取工作完成之后,还需要利用整个测区的栅格影像和矢量成果制作1∶2 000分幅调绘底图。调绘底图内容包括高分辩率影像、图斑边线、注记、界线等。具体工作包括栅格和矢量数据的裁切、属性标注、线宽、线型修改、图外整饰等。以上工作可以使用ModelBuilder设计出自动分幅、自动符号化、自动整饰等模型程序。
2.3 数据统计
在影像解译工程中,除了数据处理、空间分析、地图制图外,统计工作也非常重要,成果中往往包括大量的统计表格。
某影像解译项目的工作情况统计见表1,由ModelBuilder设计的模型根据成果矢量数据和任务分配表自动生成。模型中应用了“增加字段”、“空间连接”、“生成面要素”等ArcGIS内置工具和python脚本工具等。此类模型可以快速地提取信息,生成工作量统计表、元数据表、其它统计表等。
3 ArcObject与ModelBuilder的对比
ArcObject是ESRI基于微软组件对象模型技术所构建的一系列COM组件集,用户可以使用任何支持COM的编程语言(如VB、VC++、C#)进行开发。ArcObject提供许多ArcGIS底层的基本功能,可以把这些基本功能组合集成一个强大的ArcObject功能。ArcObject可以对ArcGIS进行底层控制且更加灵活;但ArcObject有繁多的接口、对像模型图,让学习ArcObject变得非常困难。另外开发ArcObject应用的人员还应具备多年程序开发经验。
表1 某影像解译项目工作情况统计表
ModelBuilder是基于可视化的开发工具,也是一种高度集成化的开发方法。开发人员不需要花费大量的时间去学习,也不需要花费大量时间编写和调试程序。实践证明只要利用几天时间去学习ArcGIS帮助文档,即便是非程序员也可以轻松地构建成出实用的模型程序,特别适合生产任务紧急时使用。两种开发方法的对比见表2。
以“自动封闭线”功能作为试验对象,使用ModelBuilder和ArcObject这两种开发方法分别设计出程序,通过对比分析,再说明各自方法的特点。使用ModelBuilder的设计方法在图2中已说明,这里不在赘述,以下是利用ArcObject SDK和C#编写的核心代码:
表2 ArcObject与ModelBuilder的对比
该程序应用了ImxDocument、IenumFeature、Ifeature、Ipolyline、IpointCollection等接口类。其核心部分是:用接口IPointCollection中的方法“AddPoint(inPoint,[,before][,after])”,为 Polyline要素增加顶点。
通过分析:ModelBuilder设计的模型有着结构清晰,操作简单的优点。ArcObject设计程序其优点在于丰富的接口类和底层控制能力,可以实现许多ModelBuilder无法实现的功能;例如在人机交互式操作方面,ModelBuilder很难实现响应用户随时发出的指令和动作。
使用以上两种方法分别处理相同的数据,以此作为各自运行效率的对比。在约150条左右的Polyline线自动封闭试验中:使用模型程序,数据处理总花费时间约为56s;使用ArcObjects程序,数据处理总花费时间约为5s。ArcObjects程序处理数据更快是因为ArcObjects直接从底层读取并修改数据;而模型程序每操作一个要素,都要调用模型中所有的工具。
因此ArcObjects SDK和ModelBuilder作用互补,ArcObjects可通过新的行为来扩展ArcGIS,而ModelBuilder是专为自动执行任务而设计的。
4 结束语
本文研究ModelBuilder设计模型的方法,把所设计好的模型程序应用于影像解译的实际生产过程中,ModelBuilder无论在提高地理数据处理效率,还是在扩展ArcGIS功能方面都有着十分重要的意义。在研究过程中,本文对比分析了利用ModelBuilder构建的模型与利用ArcObjects设计的应用程序之间的差异;笔者也对如何有效地运用两种程序方案为测绘生产服务提出了自己的观点。
[1]任思思,张学之,张禹.地理国情普查影像解译自动化方案研究[J].测绘与空间地理信息,2014,37(6):44-46.
[2]杜蕾.遥感影像解译在地理国情普查中的应用[J].测绘工程,2014,24(6):46-49
[3]高燕,周成虎,苏奋振.基于OLI影像多参数设置的SVM 分类研究[J].测绘工程,2014,24(6):1-5
[4]翁代云,杨莉.人工智能技术在遥感图像分类中的应用[J].计算机仿真,2012(6):240-244.
[5]傅仲良.ArcObject二次开发教程[M].北京:测绘出版社,2008.
[6]牟乃夏,刘文宝,王海银,等.ArcGIS10地理信息系统教程—从初学到精通[M].北京:测绘出版社,2012.
[7]吕伟臣,霍言,吕宝臣.Visual C#2005入门与提高[M].北京:清华大学出版社,2006.