崔文化
(1.安徽省第二测绘院,安徽 合肥 230601)
基础地理信息数据是国家信息化建设中重要的基础性与战略性资源,主要由水系、地貌、植被等自然要素以及居民地、交通、境界、特殊地物、地理名称等社会要素构成。作为地理要素统一的定位基础和空间载体,基础地理信息数据主要包括地形要素数据、数字正射影像数据、数字高程模型数据、地形图制图数据等。
近年来,随着国家经济建设与社会公共事业的快速发展,基础设施和公共服务设施的逐步完善,基础地理信息数据在城乡建设规划和社区事务管理中的作用愈加重要[1]。城市化建设的持续进展,使得地表地形变化日益频繁、复杂,实时、快速、准确地实现地理信息数据更新,对基础地理信息数据的规范性、完整性、现势性等也提出了迫切要求。因此,在发现、采集、核查、编辑、整理等数据实时快速更新时,数据的质量控制,特别是数据的属性检查至关重要。属性是地理信息要素重要的组成部分,若要素的属性录入错误,则可能导致非此即彼、似是而非、含糊不清等后果。要素属性检查采用人机交互的方式,不仅工作量大、效率低,而且不具备直观性,因此“迫切需要可快速而有效地对数据进行处理和检验的软件工具”[2]。本文利用Python语言和ArcGIS自带的ArcPy站点包开发脚本工具[3],对gdb格式的基础地理信息数据结构以及属性字段录入的正确性和一致性进行了自动检查,提高了工作效率,减少甚至消除了质量问题,提升了数据质量。
基于Python开发的软件可用于处理地理信息数据库的相关属性[4],已被广泛应用于气象地理信息数据处理和城市规划建设中[5-7]。在ArcGIS桌面环境中,基础地理信息数据由点、线、面要素组成,存储在被称作数据库的数据文件里。这些要素被放置在对应的点、线、面要素类中(如HYDP、HYDL、HYDA等),每个要素类设置若干个字段(如NAME、TYPE、GB等)分别记录要素不同的属性。地球表面纷繁复杂的万事万物,通过人们的综合取舍,均以要素的形式归类在相应的要素类中,要素类又以属性表的形式记录每一个要素,每个要素在属性表中就是一个记录。
利用Python语言来创建地理处理脚本软件,即对属性表中的记录进行操作。首先在确保库数据结构正确的前提下,导入ArcGIS开发的Arcpy站点包和Python内置的os、sys等处理模块;然后设置工作空间环境env.workspace,调用Arcpy.da数据访问模块创建搜索游标SearchCursor或更新游标UpdateCursor;再基于for循环迭代游标中的每一个记录,比较记录的属性值是否与技术要求规定阈值一致,以确定属性的正确与否,并可实现对某些属性的自动修改。属性检查和更改流程如图1所示。
图1 属性检查和更改流程图
软件是根据《安徽省1∶10 000基础地理信息数据更新工程技术规程(2019 版)》(以下简称《规程》)和《2020年1∶10 000基础地理信息数据更新补充规定》的技术要求,采用Python语言编写的一个数据属性检查和处理工具,包括1∶10 000基础地理信息数据32个字段值正确性检查程序、数据结构正确性检查程序、数据更新版本标识VERS修改程序、“可以为空”字段空格字符和隐性空字符置空程序。所有程序均封装在“2020版10000属性检查”文件夹内,并提供了使用说明。
软件采用Python内置的Tkinter模块,创建了一个用户界面,如图2所示。所有功能均在用户界面上创建按钮,通过点击按钮驱动程序运行,实现对应属性的检查或修改;同时设置了一个“选择文件夹”按钮和一个输入框,用以选择数据文件放置的文件夹和显示选择的文件夹位置(程序运行的工作环境);界面中还有一个“Attribute”按钮,点击后即可对所有数据属性进行一次性检查。
图2 1∶10 000属性检查程序窗口
主程序用于创建用户界面窗口、生成界面元素,并通过点击按不同钮运行应用程序的相应模块。首先利用import语句导入Python内置模块os、sys、Tkinter,建立一个文件夹查找函数,用以定位存放需检查的gdb数据的文件夹对象;再赋值给变量PathName。这里PathName设置为全局变量,其他所有子程序均需共享这一变量,代码为:
采用Tkinter模块定制Tk对话框用户界面,对话框的标题设置为“2020版10000属性检查”。界面设置一个数据输入框,用以接收并显示PathName变量代表的文件夹,代码为:
以Button(root,text = u''选择文件夹'',width =23,command = askdirectory,fg = ''white'',bg = ''red'',font =(''Arial'',12)).grid(row = 1,column = 2)语句创建“选择文件夹”按钮,并与输入框显示内容形成联动机制。利用from(ANGLE…) import *等语句调用自定义的字段属性检查模块,并创建各检查模块的调用函数,代码为:
以Button(root,text = ''ANGLE'',width = 10,command= checkangle).grid(row = 3,column = 0)等语句创建执行各字段检查程序的按钮,并以按钮Button(root,text =''Attribute'',width = 15,command = attr,fg = ''red'').grid(row= 10,column = 2)实现对所有属性的检查。界面中还添加了“FIELD”、“字段置空”、“VERS值修改”等按钮,以执行相应的功能。
子程序包括33个属性检查模块和2个属性处理模块,且均被打包在文件夹Attr内,点击用户界面窗口对应按钮即可调用该子程序。
1)数据结构检查程序。数据属性检查时,首先点击“FIELD”按钮,检查数据库数据结构是否与规程要求一致,若数据结构错误,则会影响数据使用,甚至可能引发严重问题。编写数据库数据结构检查程序,需导入内置模块和ArcGIS站点包ArcPy模块,因此需安装ArcGIS平台。程序以folder= os.listdir(PathName)语句接收主程序选择的文件夹对象,并进行循环迭代,遍历文件夹内所有文件,对文件夹内所有gdb数据文件执行操作。通过语句fcs=arcpy.ListFeatureClasses('','','')迭代循环,检索文件中的每个要素类,获取每个要素类的字段描述信息列表。提取每个字段的名称并创建字段列表的语句为:
根据该列表分别获取字段的数据类型列表和“可以为空”的True和False属性列表。程序还编制了《规程》规定的每个要素类的字段属性列表oldFlds、oldTyps、oldIsNuls。通过运行以下代码与规程字段结构进行比较,以检查数据结构的正确性。
在对数据类型和“可以为空”属性进行检查时,必须保证字段名称列表名称、数量、顺序与《规程》一致,在保证数据结构正确的前提下,再进行其他属性检查,因为数据结构错误属于严重错误。
2)TYPE属性检查程序。本文以TYPE属性检查模块为例,示意程序编写思路,其他检查模块与其编写结构基本一致。
从主程序获取变量PathName代表的文件夹,通过os.listdir、Arcpy.ListFeatureClasses函数以及for语句得到gdb文件及其要素类。根据要素类建立搜索游标并运行arcpy.da.SearchCursor(fc,(“GB”, “TYPE”,“OBJECTID”) as cursor语句,对cursor进行循环迭代,得到该要素类下每一条记录的row[1]值;再通过if语句与《规程》的GB国标码要素TYPE属性进行比较,二者若不一致则记录一条错误,并标出要素的OBJECTID序号,供修改参考。另外,程序还添加了“字段置空”和“VERS值修改”两个数据批处理程序。
在检查各要素属性时,为统一数据标准,针对“可以为空”的字段,通常把属性值作删除操作而遗留的空格字符“ ”和没有内容的空字符“”均作为问题列出,以修改为ArcGIS的None值,“字段置空”按钮及其功能就是为实现该目的而建立的。通过代码descFC=arcpy.Describe(fc)和flds=descFC.fields得到数据要素类和字段的描述信息;然后迭代循环过滤出“可以为空”的字段fld.isNullable;再利用arcpy.da.UpdateCursor语句创建更新游标,将属性值为“ ”和“”的row[i]赋值为None;最后运行cursor.updateRow(row)语句,使修改生效。“VERS值修改”用于修改年度更新版本号,一般在数据更新完毕,合并和融合时使用。程序运行过程中还生成了一个弹出界面,如图3所示。修改VERS值是默认设置,还可统一修改其他属性值,如DATE,不再赘述。
图3 字段值修改弹出窗口
本文以安徽省某市1∶10 000基础地理信息数据执行操作为验证实例,由于篇幅有限,只对部分模块功能进行验证。
该数据库数据属性表字段结构的检查结果如图4所示,可以看出,LFCA要素类中数据字段列表与《规程》要求不一致,缺少TYPE字段;LFCL和LFCP要素类中STACOD字段的isNullable(是否允许为空)属性定义与《规程》要求不一致,数据为False,而《规程》为True。
图4 数据结构检查问题截图
该数据库数据的TYPE属性检查结果如图5所示。对于有该属性而又必填的要素,必须填写真值或缺省值“/”;对于非必填且属性不确定的以及没有该属性的要素,则应为None(真的空值)。内容中“TYPE属性[]错误”的要素,TYPE皆为选填,没有真值应为None,填写“”的隐性假空字符是错误的,是由曾录入过数值后来又被删除所导致的。要素分类码GB为321600(堆放场)的要素,填写“废料”、“石子”不符合《规程》阈值的标准写法。属性为“垃圾”的堆放场应归类为340602(垃圾场)。“TYPE属性[篮球场]错误”也与《规程》阈值不一致,应填写“篮球”。
图5 TYPE属性检查问题截图
“字段置空”、“VERS值修改”两个数据批处理程序的验证效果如图6、7所示,可以看出,内容显示均已达到预定效果。
图6 “字段置空”程序效果截图
图7 “VERS值修改”程序效果截图
由于在1∶10 000基础地理信息数据更新生产的质量检查过程中,名称、类型、等级等相关属性信息填写仅通过人机交互的形式进行错误查验,较为费时、费力,且容易导致疏忽和遗漏。本文利用Python语言进行二次开发,编写了检查程序,对ArcGIS平台gdb数据的属性进行了机器检查,能有效减少人为因素的局限和干扰;并根据需要拓展了“字段置空”、“VERS值修改”两个批处理工具。软件界面直观清晰、元素排列有序、操作简单方便,且能根据技术要求的更改或使用者建议的反馈随时修正。
ArcGIS是一个功能强大的地理信息处理平台,但通常为通用的处理工具,不具备解决问题的针对性。运用Python人工智能语言,通过二次开发并加以应用,能收到事半功倍的效用,从而提高工作效力,提升测绘成果质量。