基于ArcGIS+Python 在矢量数据图表中自动化输出中的研究
2023-02-05李徐亮高鹏远王春博
李徐亮,高鹏远,王春博,徐 斌,刘 伟
(河北省煤田地质局物测地质队,河北邢台 054000)
0 引言
ArcGIS 是一套综合性的专业地理信息系统(GIS)应用软件,拥有一套独立扩展功能的模块服务于核心产品[1]。它不仅具有处理遥感影像的功能,而且还具有制图出图、管理数据、分析数据等能力。但是针对一些项目时,它的部分工具会重复运行或者交叉使用,使其工作量大大增加。
Python 是一种跨平台面向对象的编程的计算机语言,它不仅处理速度快、功能强大,而且简单易学。Python 是不需要编译器就能使用的,因此它被看作是一种脚本(或解释型)语言。
ArcPy 在ArcGIS 就是Python 的一个站点包,这样就能通过Python 对其工具箱进行编写,简化工作流程,减少部分功能的重复、交叉使用,提高工作效率,促进快速生产。
地理信息数据运用ArcGIS 软件进行矢量处理完成后在输出图和表时,由于软件限制,只能进行单一处理,但由于项目不同,输出的图和表的数量并不统一,对图和表数据需求量大的时候也是单一输出,造成了很大的时间浪费。本研究成果能使图和表批量化输出,输出的内容表头一致、格式一致、命名方式一致,且内容简洁明了。用Python 对ArcGIS的工具箱进行二次开发使其项目生产的过程方便、快捷,并通过使用Python 来扩展ArcGIS 的功能,使其实现自动化、流程化来完成任务。Python 简单易学易操作,具有很完善的程序开发功能。Python 被封装在ArcGIS 的安装程序中,能直接嵌入到ArcGIS 的许多地理处理工具集中[2]。
1 项目概况
1.1 项目简介
本研究以农业特色作物种植面积监测内业数据处理为例,为深入推进农业供给侧结构性改革,有效提高亩均产值效益的特色产量,全面提升农业质量效益和竞争力,促进农业增效、村民增收,主要以高效蔬菜(设施蔬菜)、高效水果(苹果、梨、葡萄等)、高效中药材(金银花、麻山药、半夏等)、高效特色粮油等特色农业产业为重点,探索发展间作套种、林下种植等种植模式。通过利用卫星遥感技术进行月度监测,并运用ArcGIS 对其作物种类、位置、面积进行矢量化,形成可视化图表进行管理。
1.2 技术流程
项目组根据设计及实际工作需要制定了详细的技术路线,分为资料数据收集及上报数据初核、遥感影像获取及处理、制作参考点数据、种植作物遥感监测核实、外业核实、反馈修正、成果汇总等阶段。
1)资料数据收集及数据初核阶段,对收集到的项目区所需的影像数据及其他相关资料,进行分类核实,统一测绘基准,对填报有误、漏项的信息进行了反馈重报。
2)遥感影像获取及处理阶段,对项目所需遥感影像数据进行正射校正、数据融合、降位、增强、配准,形成解译底图成果。并以景为单位制作了高分遥感成果元数据,标识出每景影像覆盖的空间范围图斑,方便数据索引与调用。
3)种植作物遥感监测核实阶段,根据影像特征及解译标志,结合测量指标进行图斑的解译、分类及人工勾绘。
4)外业核实阶段,提取内业解译的新增面积高分卫星遥感监测图斑当中的“是否外业”为“是”的疑问图斑,进行外业实地验证,针对“备注”中填写的疑问说明进行实地核实。
5)反馈修正阶段,根据调查结果,对种植作物认定错误的按照外业调查结果修正内业数据,对地块边界认定错误的结合边界草图及遥感影像底图重新绘制图斑范围,测算面积。
6)成果汇总阶段,根据遥感数据及解译成果开展相关分析评价工作,并形成相关图件、报告、矢量、栅格成果。
由于是月度监测,所以每月汇总数据量很大,各地方上报汇总人员、汇总方式并不相同,格式不统一,给操作人员造成了一定困扰。在图表输出时又要根据不同的部门分别汇总成反馈表、区县汇总表、乡镇汇总表、特色类别汇总表等多种表格,运用ArcGIS 的工具箱自带的工具在输出图表时只能单一输出,浪费时间且容易出现汇总错误,给后期数据分析留下很大隐患。
2 数据源及成果分析
ArcGIS 软件内的矢量要素分为点矢量要素、线矢量要素和面矢量要素3 种。本研究运用的主要是点矢量数据和面矢量数据,这些数据字段包含区县名称、主要作物、经纬度、种植位置等多项信息,如表1所示,它涵盖了长整型、文本型、双精度等多种格式。
表1 点和面矢量字段信息单位:字节
最终成果以区县为单位汇总制作,它主要包括汇总表、明细表及地块示意图等资料。表类需细化到村,图纸按区县、地块等进行制作输出。为了成果管理统一化,县级特色种植作物分布图设定为60 cm×80 cm 图纸,明细表要求A4 横版打印,野外调查的草图利用MXD 制作标准的版式,为了方便管理与使用,野外草图统一设定为A4 横版打印。野外调查时把所需要调查的野外地块利用ArcGIS工具箱转换工具内的转为KML 工具使其矢量数据转为KMZ 格式,导入到手机内方便外业调查时进行路线规划等,分别如图1、表2 和表3 所示。
图1 新增地块分布示意图
表2 上报地块核查情况汇总表
表3 主要成果格式及类型
3 工具设计及方法实现
基于项目数据源及成果分析,利用Python 编辑的脚本工具在设计方面主要分为标准模板创建、字段内容检查、乡镇名称检查、自动填写序号及内部序号自动挂接、自动导出表格等几个模块,如图2所示。
图2 程序设计流程图
3.1 创建数据模板
3.1.1 字段标准化模板
由于上报数据混乱,为了方便作业和后期管理,将预先规划好的标准字段信息写入脚本代码,通过脚本工具箱对矢量数据字段信息进行检查,对不符合标准的或者遗漏的根据脚本编辑的规则进行重新创建,使其形成标准化的字段信息,脚本工具的主要代码内容如下:
For 矢量字段in arcpy.ListFields(矢量路径):
字段集合.append(矢量字段.name)
for 标准字段in 标准字段集合:
if 标准字段not in 字段集合:
arcpy.AddField_management(矢量路径,标准字段,"字段类型","","","字段长度")
3.1.2 MXD制图模板
利用ArcMap 地图文档制作标准的MXD 制图模板,制作过程是首先遍历文件目录中的MXD 文档,然后将每个文件中所包含的图层遍历出来,按版式及变量设置好对应字段[3],输出MXD 格式制图模板,如图3 所示。
图3 MXD 制图模板
图幅自动输出时由于数据量大,且内部信息不统一,故每次只能单一地替换变量字段,并不能实现自动化。本研究运用ArcGIS 自带的“数据驱动器”对其数据驱动,调出“数据驱动器”后在索引图层和索引字段的页面设置保存MXD 文档,使用Python 编辑的脚本打开MXD 文档模板,设置将成果固定存放的文件夹路径及出图格式。通过设置的唯一字段进行驱动,结合Python 编辑的语言对其完成表头自动变换。
表头索引如下:
XX 市<dyn type= "page" property= "attribute"field="行政区名称"domainlookup="true"/>特色种植<dyn type="page" property="attribute" field="类型"domainlookup="true"/>野外核查示意图,具体如图4所示。
图4 数据驱动页面示意图
3.2 字段内容检查
字段标准化的创建采用判断的方式对字段填写内容进行关键字识别判读,根据Python 编辑的脚本工具对字段县名、乡镇名称、作物名称等内容进行检查,将字段内的非空值、0 值等错误信息以.txt格式导出报告。根据报告内容对这些问题字段内容进行修改,并对字段的序号重新进行顺序赋值,对字段内的内部序号根据乡镇名称进行统一赋值,赋值后对其后期表格汇总起关键作用。主要代码如下:
矢量数据=arcpy.da.SearchCursor(查询游标)(矢量路径,["检查字段名称"]
for i in range(1,len(矢量数据)):
if row[i]in["","0"None,"无"]:
文档.write("必填项空项")
矢量数据= arcpy.da.UpdateCursor(更新游标)(矢量路径,["序号"])
k=1
for row in 矢量数据:
row[0]=k
k=k+1
矢量数据.updateRow(row)
3.3 自动挂接
根据点矢量数据和面矢量数据之间的属性编号唯一值进行链接,使点矢量数据的字段属性信息赋值更新到面矢量数据字段信息上。这样就能保证图标输出内容一致,方便管理。此功能的主要实现方式为运用 UpdateCursor(更新游标)及SearchCursor(查询游标)两个模块对点矢量数据、面矢量数据值进行读写,通过SearchCursor 对点矢量数据内的字段信息遍历后,运用UpdateCursor 对面矢量数据内相对应的字段通过唯一字段值进行赋值或更新。主要代码如下:
图斑路径=arcpy.GetParameterAsText(0)
参考点路径=arcpy.GetParameterAsText(1)
图斑= arcpy.da.UpdateCursor(更新游标)(图斑路径,["DKBH","序号","QXMC","XZMC","","导表"])
for row in 图斑:
导表=format(row[18])
If 导表in["1","1.0"]:
参考点= arcpy.da.SearchCursor(查询游标)(参考点路径,
["DKBH","序号","县名","乡镇名","",""导表"])
for row 1 in 参考点:
if int(float(row[0]))==int(float(row1[0])):
图斑.updateRow(row)
3.4 图表成果输出
3.4.1 表格自动化输出
标准化表格自动输出时需要通过脚本工具箱引入xlwt(一个用于创建XLS 格式Excel 文件的Python 库)站点包,通过遍历读取点矢量数据和面矢量数据字段的全部内容,进行数据的过滤及整理[4],对乡镇名称、面积等信息进行计算并统计,然后分别写入不同的表格当中,并对不同表格内容进行统计后完成成果表制作。实现方式如下:
1)用xlwt.Workbook 以及book.add_sheet 这两个模块创建新的标准化的表格及表单。
2)在脚本工具箱内新建表头集合,遍历读取表头集合并运用sheet.write 将标准化的表头写进Excel 表单内。
3)用arcpy.da.SearchCursor(查询游标)读取点矢量数据和面矢量数据字段信息内容。
4)需要分类统计的信息按细化程度创建不同的标准集合,并在点矢量数据和面矢量数据遍历过程中,根据关键字信息将不同的数据放到对应的集合当中。
5)对通过遍历过滤及整理后的标准集合,用sheet.write 写入对应的Excel 表单当中,并通过book.save(路径)进行输出并保存成各类标准的统计表格。
3.4.2 图件自动化输出
使用标准化MXD 制图模板,通过替换点矢量数据和面矢量数据数据源的方法,替换模板相对应的内容,对多种不同信息,通过唯一属性字段进行命名[5-7],通过驱动来完成图件自动化输出,如图5所示。
图5 自动化出图流程图
需引入os 站点包,主要代码如下:
路径,文件名=os.路径.split(矢量路径)
模板= arcpy.mapping.MapDocument(MXD 模板路径)
数据框=arcpy.mapping.ListDataFrames(模板)
要素=arcpy.mapping.ListLayers(模板,"",数据框[图层序号])[要素序号]
要素.replaceDataSource(文件名,"SHAPEFILE_WORKSPACE",路径)#替换数据源
模板.save()
模板.dataDrivenPages.exportToPDF(PDF 路径,"ALL")#输出pdf 成果
4 成果应用
1)针对该项目,本研究提升了以下几项流程中的工作效率:
在“资料收集及数据初核阶段”运用字段标准化模块进行统一数据格式,解决了各县上报不统一问题,为后期管理和作业提供标准信息。
在“种植作物遥感监测核实阶段”运用工具箱内的字段内容检查、自动挂接解模块解决了数据内容的填写初核及人为挂接时间长易出错的问题,通过点矢量数据和面矢量数据的唯一字段进行自动挂接,将点矢量数据内的信息赋予面矢量数据内。
在“外业核实阶段”运用MXD 制图模板一次性将外业调查草图及表格全部导出,为野外核实提供依据。改变了原来只能单一导出的模式,方便快捷,提高了工作效率。
在“成果汇总阶段”运用自动导出反馈表模块,一次导出各种标准的汇总表、区县表、乡镇表等等汇总表格,对成果形成统一格式进行管理。
2)本研究中,由于数据获取方式为各区县自主上报,上报的数据各不相同,数据量大而且混乱,加之参与研究的人员众多,造成了表格汇总错误、制图样式不统一等问题。此外制作各种表格所需要的时间长,汇总容易出错;出图时只能单一制作处理,耗时耗力,造成人员浪费。
本次研究解决了由于各种原因造成的图表输出错误、整体汇总难的问题。经测试,以区县为单位,单人操作运用ArcGIS 自带工具及Excel 等软件进行数据整理及图表输出时(包含错误问题的修改)共用时45 min,运用该工具后全流程总用时9 min,节省了80% 的图表成果制作时间。相关图表自动输出成果如表4 和图6 所示。
图6 图表输出成果
表4 区县汇总表
3)本研究代码经稍许改动后,成功应用到了某省特色产业集群遥感监测、某市人居环境遥感监测、某县工业企业用地遥感调查等项目中,解决了具体问题。
5 结语
通过本次研究,运用Python+ArcGIS 进行的二次开发,利用其脚本批处理大量作业时比传统单一运用ArcGIS 自带工具操作简单,节省了大量时间,提高数据处理的效率和准确率,根据研究需求导出的各种汇总表格清晰明了,避免人为汇总出错,从而获得高质量的数据成果。
本次研究给矢量数据的图表成果自动化输出提供了解决思路,能为后续GIS 相关数据可视化方面研究提供一定思路。