韩红花
(山东省国土测绘院,山东 济南 250013)
地理国情监测与基础测绘是测绘行业的两大重点工程。基础测绘是建立全国统一的测绘基准和测绘系统,是进行基本航空摄影,获取基础地理信息的遥感数据,测制和更新国家基本比例尺地图,影像图和数字化产品,建立、更新基础地理信息系统[1]。地理国情主要是指地表自然和人文地理要素的空间分布、特征和相互关系,是基本国情的重要组成部分[2-4]。山东省在第一次地理国情普查完成后,省情监测与基础测绘要求进行年度更新,实际生产中出现很多重复繁琐的工作步骤,需要处理大量冗余数据,而且两者在表达方式和数据分类上有部分重合,如有价值数据的整合、代码的转换等,人工处理过程中易出错,且工作效率不高,因此,如何在保证数据更新质量的前提下实现两者数据的相互转换,提高工作效率亟待解决。
Python是一款免费的开源软件,功能强大,具有简单易学及跨平台可移植等特点。Python扩展了ArcGIS功能,许多地理处理工具都是由Python编写的。ArcPy是一个基于ArcGIS Scripting模块成功构建并继承ArcGIS Scripting功能的站点包,其目的是通过Python,以实用和高效的方式为地理数据分析、数据转换、数据管理和地图自动化创建基础[5]。它提供了使用Python语言操作所有GP工具的入口,并提供了多种有用的函数种类,以用于处理和访问GIS数据[6-7]。在Python中使用ArcPy的另一个主要原因是Python是一种通用编程语言,能够支持动态输入,而且支持交互式操作和脚本的一次性程序快速原型,具有编写大型应用程序的能力,可以便捷高效地进行数据转换和数据管理,还可以根据实际生产的需要扩展功能。
山东省“十三五”基本测绘要求对全省地形要素进行年度更新、整合,删除或不采集省内已经不存在的、有较低实际应用价值的、用于辅助制图的要素,增加一些新的政务需要和公众关注的要素,合并一些相近的要素[8]。主要工作有数据的整合、分幅、采集更新、成果检查、接边等。但是根据国家相关的规范和要求,地理省情监测数据与基础测绘数据在属性结构以及采集范围上都有所不同,因此会出现数据的结构不一致,整合和分幅工作量大,成果质量难把握等问题,这时可以利用Python编写脚本处理工具来解决。
基础测绘中地形要素表达了地球表面形态的要素,表达地球表面形态的要素,包括测量控制点、交通、管线、水系、居民地及设施、地貌、植被与土质以及地理单元,要素数据存储在34个数据层,类型远远多于地理国情普查[9-10]。山东省情监测是基于地理国情监测的技术规定和规范文件,主要包括重要地理国情监测要素、地表覆盖和地表形态3个分类对象。2018基础地理国情普查综合考虑上述3类信息,确定内容分类对象及采集指标,分为10个一级类,59个二级类,143个三级类,其中一级类包括种植土地、林草覆盖、房屋建筑(区)、铁路与道路、构筑物、人工堆掘地、荒漠与裸露地、水域、地理单元、地形[11]。基础地理国情监测数据存储方式按数据集和要素层组织,要素层要素采用点、线、面表达,数据集包括地表覆盖数据集、交通网络数据集、水域网络数据、构筑物要素数据集、地理单元数据集[12]。基础测绘和地理省情监测数据的地形要素对比分析如表1所示。
通过比较发现,“十三五”基础测绘的表达方式与分类体系和地理省情监测数据有部分重合,而且对同一个地形要素在表达内容上也是相同的[13]。从表1可以看出,地理省情数据LCRA层中的植被数据、公路和铁路线层、水系线与面层、地理单元点与面层、行政村以及构筑物要素点线面层内容是相同的,将这些能够利用的数据按照基础测绘的数据格式进行转换,然而对于同一地物,二者的表达方式不同,即属性结构不同,这样在数据转换过程中就会出现属性信息丢失的情况。在实际作业中,省情监测数据是根据图层、CC码来确定一类要素,基础测绘的数据是通过图层、GB码来确定一类要素,在此以公路层城际公路中心线为例进行分析(表2)。
表1 地形要素分类对比
表2 字段对应关系表
通过对比基础测绘数据和地理省情监测数据的属性信息,发现有部分属性字段是相同的,或者字段不同但是所表达的意思是相同的,所以在数据转换时首先要建立一一对应的关系。先按照基础测绘属性的字段类型和长度建立新的字段,按照表2确立的对应关系,把属性值转换之后赋给新的字段,然后删除原有字段,主要代码如下:
arcpy.env.workspace="E:data"#设置当前工作环境
arcpy.AddField_management("LRDL","GB","LONG",)#添加字段属性
arcpy.AddField_management("LRDL","RN","STRING",8)
arcpy.AddField_management("LRDL","NAME","STRING",64)
cursor=arcpy.UpdateCursor("LRDL")#创建更新游标
for row in cursor: # 更新字段GB、NAME的值
row.setValue("LRDL", row.getValue("GB"))
row.setValue("LRDL", row.getValue("RN"))
row.setValue("LRDL", row.getValue("NAME"))
cursor.updateRow(row)
del cursor, row
在实际作业过程中,“十三五”基础测绘数据以任务分块范围的主要道路和河流为边界划分作业网格,而之前的基础测绘和地理国情数据都是1∶10000的分幅数据,因此首先在作业之前需要对数据进行合并融合,把涵盖任务区范围的图幅进行融合,利用Python脚本将图幅与图幅边界上的线段伪结点,属性相同的未合并面进行融合,较少后期质量检查时会出现较多拓扑错误,例如道路水系线的伪节点,植被面、道路面的相邻面未合并等问题。利用Python脚本对数据进行融合处理,可以减少后期出现以上错误,主要代码如下:
arcpy.Disslove_management(path+"LRDL",path+"LRDL_Disslove",["GB","RN","NAME","RTEG"],"SINGLE_PART","DISSOLVE_LINES")#设置需要融合的属性字段
print("道路线融合完成!")
地理省情数据集要素层数较多,结构复杂,在生产中需要收集大量的参考数据,例如交通厅的道路桥梁数据,水利厅的河流水库等水利数据,铁路局的铁道数据等,数据类型多种多样,并且数据量大。同时在基础测绘数据实践生产中要分工协作,需要对使用作业区域进行分块,这就需要对参考数据进行裁切。但是在分图时靠人工裁切费时费力,通过Python编写脚本自动处理,既节省了时间,又提高了工作效率。在脚本中添加裁切范围的SHP数据路径,利用Python中的Clip语句剪切遍历gdb或mdb数据集中所有层的数据,主要代码如下:
clipshp="D: eedRegion.shp"#设置裁切范围
for fds in arcpy.ListDatasets(): #遍历数据集中所有的数据
for fc in arcpy.ListFeatureClasses('','',fds):
outputfeature=output+""+fc+".shp" #设置输出环境
arcpy.Clip_analysis(fc,clipshp,outputfeature,"")
基础测绘数据质检必须在技术、手段、方法等方面不断提高能力水平,才可以与新型基础测绘的生产水平相适应[14]。拓扑通过表达规定数据之间的空间关系,将采集的地理数据尽可能地与现实数据保持一致,以实现能够精准表达空间数据的目的。因此,结合技术规范要求和GIS 基本拓扑结构,设计出不同要素层之间要素的拓扑关系,对规范要素空间几何关系、提高验收的工作效率和保证成果数据质量具有重要意义[15]。在基础测绘中,利用拓扑规则检查各层数据之间的拓扑关系来确定数据的正确性,既规范了成果数据之间的空间几何关系,确保了数据质量,又能更逼真地表现地理要素。常见的拓扑规则有国省县乡行政区不能有缝隙,房屋建筑区不能与水域面重叠,城市道路线层要素数据不能存在悬挂点和伪节点,同层面之间不能重叠,高速公路出入口必须位于公路线上,涵洞需要落在水系线上,桥梁等须与道路重合,地理单元点不能落入地理单元面内等。
利用Python编译空间拓扑脚本,可以解决地理省情数据中的植被层与基础测绘数据中的居民地面层、水系面层以及附属设施面层出现重叠的情况,还可以检查道路层、水系层的伪节点、悬挂等问题。通过创建拓扑规则建立拓扑后,验证数据是否违反了其定义的规则。验证拓扑后,后续编辑将会把违反拓扑规则的,且需要重新验证的要素数据集子集标记出来,这样就只需处理需要重新验证的区域即可,从而来规范要素空间的几何关系,提高数据编辑工作的效率,保证成果数据的质量,主要代码如下:
input_dataset=r"C:MyProjectsMyProject.gdbfds"#设置需要拓扑的数据集路径
topo_name="Topology"#为拓扑命名
rules=r"'Must Not Overlap (Area)' #设置拓扑规则
out_topo=arcpy.CreateTopology_management(input_dataset,topo_name,cluster_tol) #创建拓扑
arcpy.AddFeatureClassToTopology_management(out_topo, in_fc, xy_rank, z_rank) #将数据集添加到拓扑中
arcpy.AddRuleToTopology_management(out_topo, rule_type, in_fc1, subtype1, in_fc2, subtype2) #将拓扑规则加入拓扑中
arcpy.ValidateTopology_management(out_topo) #验证拓扑
由于Python是纯脚本语言,对于作业者来说使用不方便,尤其是重复使用时需要对脚本进行修改,因此,在ArcGIS中可以将Python脚本导入到ArcToolBox工具箱中,这样可视化的图形界面方便作业者使用。创建一个新工具箱并在工具箱中添加脚本,设置脚本的名称,标签和描述,将编译好的脚本py文件导入,设置参数,例如变量名称和属性信息,输入输出路径等,从而方便作业者使用脚本来处理数据(图1、图2)。以拓扑错误检查为例,选择数据路径和所需检查的植被数据层与居民地数据层,运行后得到拓扑验证后的结果即数据中拓扑关系错误的红色标识,进而对错误数据进行修改(图3)。
图1 Arcpy脚本可视化界面
图2 拓扑检查操作窗口
图3 运行结果
通过创建Arcpy工具,实现图形界面的可视化,形成了一个可交互的数据处理环境,方便了对已编译的Python脚本的使用。
该文按照基础测绘的技术要求和生产所需的相关信息,结合地理省情监测数据,利用Python API for ARCGIS编写脚本工具,实现数据处理和转化中几个重要的步骤,将地理省情监测数据转换到基础测绘工作中,在保证质量的前提下减少了工作量,在数据转换中进行实践和创新。目前“十三五”基础测绘工作正在进行中,在作业过程中还可以通过Python编写相关数据的定义投影,有向点处理,合并融合等多种数据处理脚本工具,满足实际作业中的各种要求。也可利用Python工具,把现势性好的基础测绘数据转换到地理省情监测数据中,实现数据的互提取。Python的应用减少了作业过程中的重复性工作,保证了数据更新的质量,有利于实现数据的自动化处理,提升工作效率,对地理省情监测工作实现实时化和智能化有着一定的价值和意义。