基于ArcPy的河南省小流域划分辅助工具集设计与实现

2023-06-23 17:27王松伦丁立潘子轩贾智乐
中国水土保持 2023年4期
关键词:河南省

王松伦 丁立 潘子轩 贾智乐

[关键词]ArcPy脚本;小流域划分;属性赋值;沟道;微流域;河南省

[摘要]小流域划分过程中河流沟道和微流域提取、面积控制、属性批量赋值计算及质量检查都需要GIS工具的深度参与,现有GIS软件无法直接满足小流域划分过程中批量化、流程化的需求。基于ArcPy设计并开发了河南省小流域划分辅助工具集,有针对性地实现流程化的沟道及微流域提取、小流域属性赋值计算、质量检查等功能。该工具集算法合理、操作便捷,在河南省小流域划分工作中发挥了提质增效的作用。

[中图分类号]S157.1[文献标识码]B[文章编号]1000-0941(2023)04-0019-05

以小流域为基本单元的水土流失综合治理是我国在长期水土保持工作中总结出来的一条宝贵经验,是生态建设的重要手段。多年来河南省始终重视水土流失综合治理工作,而获取小流域信息是开展流域治理工作的基础[1]。以河南省小流域划分为契机,逐步摸清全省小流域现状,可为全省水土保持规划制定、开展综合治理和信息化建设提供基础数据支撑。小流域划分的主要工作内容包括沟道及微流域提取、小流域边界划分、属性赋值计算、质量检查及数据入库等[2]。在河南省16.7万km2范围内开展小流域划分工作,仅依靠ArcGIS自带的地理处理工具存在重复作业、自动化程度低等问题[3],且容易产生人为误差,无法直接满足实际工作需求。在ArcPy技术支持下开发一個辅助河南省小流域划分工作的流程化运行、参数化选择,集水文分析、属性赋值计算、质量检查为一体的工具集尤为必要。

1ArcPy站点包

Python是一种功能强大的跨平台语言,在代码简洁性、通用性上有着显著优势,通过Python可以轻松调用ArcGIS中封装的算法来完成复杂的数据处理和分析任务[4]。ArcPy是以ArcGISscripting模块为基础并继承了其功能而构建的站点包,它继承了基于Python语言编译的数据转换、数据管理、数据分析、自动化制图等功能,开发人员可以应用该模块便捷地访问GP工具、类和模块,创建自定义的空间数据操作工作流[5];同时ArcPy还提供了多种地理处理函数,能够更好地支持地理数据的分析计算。基于ArcPy的脚本工具开发具有复杂度低、效率高、可移植性强等特点,使用该技术开发河南省小流域划分工具更加便捷高效。

2河南省小流域划分主要内容

河南省小流域划分工作的内容主要包括三部分:一是基于水文分析模型提取河南省范围内的沟道和微流域数据,为小流域精细划分提供参考;二是通过人机交互方式进行小流域划分,并对每条小流域进行属性赋值和计算;三是对河南省小流域划分成果进行拓扑和属性检查。

2.1沟道及微流域提取

流域河网水系是描述区域地形地貌和水文特征的基本地理参数,是小流域划分的重要依据[6]。在河南省小流域划分工作中需要基于水文分析进行沟道、微流域提取,主要流程是基于DEM数据提取作业单元的汇水关系,结合实际需求合理设置阈值提取沟道及相应微流域。已有DEM数据精度低于预期,造成河网提取精度无法达到实际标准[7],如何校正DEM精度从而提升水文分析成果质量值得关注。阈值设定也应该充分考虑河南省地形、地貌等自然地理状况,并结合微流域面积最终确定。

2.2小流域划分及属性赋值

小流域划分工作主要基于GIS软件,参考吴鹏等[8]提出的河南省水土保持小流域划分原则及流程,通过人机交互方式进行划分。单个小流域属性繁多,依据《小流域划分及编码规范》(SL653—2013),小流域属性主要包括小流域代码、小流域名称、小流域类型等24个指标,具体属性及相关要求见表1。属性赋值过程中需要借助其他数据图层和属性信息参与计算(如一级流域边界、县域边界、DEM数据、地形类别数据、村庄数据等),对数据质量要求较高。个别属性值计算过程复杂,涉及空间分析、逻辑判断等多种处理流程,具有较强的专业性,各字段之间相互关联,在计算过程中也应有先后之分。

2.3质量检查

河南省小流域质量检查主要包括拓扑检查和属性检查两部分。拓扑检查主要分析小流域矢量数据之间以及小流域与县级行政区边界之间的拓扑错误,在拓扑检查过程中检查工具应定义好所有类型的拓扑错误,同时将检查结果直观展示,并支持对作业单元内部、作业单元之间以及全省小流域间的拓扑检查。属性检查对象包括几何属性以及非几何属性,其中几何属性主要包括面积和坐标系;通过对几何属性检查可以将作业单元内的小流域面积总和与作业单元实际面积差值控制在一定容差范围内,这也是验证小流域拓扑错误的辅助手段,该容差需要根据实际情况设置;非几何属性则是面积及坐标系之外的其他属性,主要检查内容是字段值是否在指定值域内或必填字段值是否为空(NONE)。

3基于ArcPy的功能设计与实现

3.1功能设计

河南省小流域划分辅助工具集采用ArcPy脚本进行开发封装。根据实际工作需要,辅助工具分模块独立进行设计,主要包括水文分析模块、属性赋值计算模块和数据质检模块。参照水利部发布的《小流域划分及编码规范》(SL653—2013),以及河南省小流域综合管理业务需要,河南省小流域划分过程中采用县一级的行政区划作为作业单元,对每个县(市、区)逐一进行小流域划分操作。总体功能框架见图1,各模块间相互独立,在作业流程上存在逻辑关系。

3.2功能实现

3.2.1水文分析模块

沟道和微流域提取的前提是确定水文分析作业单元,本模块以县级行政区划作为小流域划分作业单元。为了保证作业单元内沟道、微流域数据的完整性,在水文分析中使用的DEM数据范围通常大于县区边界,水文分析工具模块的具体流程见图2。DEM数据选用ALOSDEM,其水平及垂直精度均约为12.5m。

为了尽可能地保证水文分析结果的准确性,使用AGREE算法[9]对DEM数据进行修正,从而获取到更高精度的DEM,该算法根据矢量河流数据降低与矢量线重叠的格网高程值[10]。水文分析模块的主要流程包括:填洼、流向分析、汇流累积量计算,阈值提取沟道和河流链接数据,最后基于流向分析结果和河流链接数据获取微流域分布。集水面积阈值是河网提取的关键参数,决定了提取河网的精度和与实际河网的匹配度[11]。根据河南省小流域划分的实际需要,将微流域最小面积设定为0.1km2,提取作业单元内集水区域大于0.1km2的微流域分水岭及其对应的沟道弧段、水流出口位置节点。考虑到DEM精

度为12.5m,将微流域控制面积换算为集水面积阈值,约为640个栅格。为了保持各作业单元小流域划分尺度的一致性,全省统一采用该阈值。图3为某作业单元提取的沟道和微流域数据。

3.2.2属性赋值计算模块

计算小流域属性赋值时,除个别属性可以通过简单赋值函数实现外,多数属性字段涉及多类数据间的复杂计算,需要GIS空间分析、逻辑判断、几何计算等算法深度参与。由于属性字段是统一且固定不变的,因此只需要在工具集面板中进行参数化的图层选择即可。河南省小流域属性赋值计算模块主要流程结构见图4,通过人机交互手段划分的小流域图层为属性赋值计算的核心数据,除此之外还需要属性字段表、地形类型、行政区划、一级流域、DEM、沟道及微流域、村庄点、主要河流、包含河流名称及河流代码的流域面等辅助图层(图中深灰色底纹为需要计算的小流域字段,其对应箭头的上游方向为计算该字段所需的图层数据,图中为浅色底纹图层)。下文根据字段赋值在流程上的先后顺序详细介绍各字段的计算过程及关键函数。

(1)小流域属性字段添加。通过调用外部预定义属性表将所需字段追加至小流域图层,除字段名称外还包括字段别名、字段类型、长度、数值位数、小数位数等信息,在程序中通过逐单元格遍历的形式将字段信息追加至小流域属性表。

(2)划分人、划分时间、县(市、区)、县(市、区)代码、地(市)。在同一作业单元内的上述5个字段属性值通常是相同的,通过字段批量计算函数arcpy.management.CalculateField()进行赋值。

(3)面积最东经度、最西经度、最南纬度、最北纬度(四至地理坐标)。通过arcpy.CalculateGeometryAttributes_management()方法进行几何空间属性计算,字段值采用与小流域一致的CGCS2000坐标,考虑ArcPy计算的四至地理坐标结果不支持度分秒格式,需要定义函数进行相应格式转换。

(4)一级流域、地形类型、河流名称、河流代码。参照属性赋值计算逻辑,首先使用arcpy.analysis.Intersect()函数获取相交图层信息,若单个小流域被分割为多块,则使用arcpy.analysis.Statistics(Intersect,None,["Shape_Area","MAX"],LinkField)函数得到其中面积最大的要素字段信息,并通过字段链接形式进行赋值。

(5)小流域类型、亚单元。不同类型的小流域和亚单元在小流域边界与河流沟道的空间关系特征上各有差异,其中完整型小流域与沟道只有一个交点,区间型小流域存在两个或多个交点,地形类型为丘陵或山地的坡面型小流域部分边界通常与河流共线。亚单元小流域往往在和县(市、区)的公共边界上同河流沟道存在交点。基于这些特征设计小流域类型及亚单元属性赋值功能。亚单元赋值的主要Python语句如下:

XLY_XJ_RV_insect=arcpy.analysis.Intersect([[Layer,1],[XJ_Layer,1],[GD_Layer,1]],out_insect_in,"ONLY_FID","","POINT")#小流域、县界、沟道相交获取交点

insect_xly_id_list.append(FID)#将所有存在交点的小流域FID值存入类别

witharcpy.da.UpdateCursor(Layer,["OID@",XLY])ascursor:#遍历目标要素并赋值

row[1]=1

(6)小流域代码批量赋值。小流域代码需要满足全省唯一性的条件,除通过县(市、区)代码和河流代码进行控制外,为避免在作业单元内出现重复值,在同一县区内为小流域赋予唯一标识,即ID值。小流域代码根据规范要求采用英文大写字母(舍弃I、O、Z)和數字的混合码,共17位,分别由全国河流代码、小流域顺序码、亚单元标识码和县级行政区区划代码构成,主要Python语句如下:

arcpy.management.CalculateField(Layer,"XLYDM","str(!HLDM!)[1:7]+str(!ID!).zfill(4)+str(!YDY!)+str(!XQDM!)","PYTHON3","","TEXT")

(7)平均海拔、平均坡度。基于作业单元DEM数据计算小流域平均海拔、平均坡度,调用arcpy.ddd.Slope()函数,通过三维分析提取坡度,使用arcpy.sa.ZonalStatisticsAsTable()函数计算每个小流域的平均海拔和坡度值,最后通过字段链接的方式赋值至相应字段。

(8)沟壑密度、最长汇流路径。沟壑密度和最长汇流路径以小流域为单位进行统计,利用区域统计分析工具实现,其中小流域沟壑密度为小流域内沟道长度值之和与小流域面积之比,最长汇流路径长度为小流域内最长的河流长度,对于无河流数据的小流域,自动遍历并将其最长汇流路径赋值为“0”。沟壑密度计算过程:使用小流域图层对沟道数据进行裁剪,通过arcpy.analysis.Identity("Goudao_Clip",Layer,"Gouhe_Identify","ALL",None,"NO_RELATIONSHIPS")函数进行标识以建立与小流域的空间关联,利用arcpy.analysis.Statistics("Gouhe_Identify","Zonal_GHCD_SUM_Statis_Tb","GHCDSUM","XLYDM")函数计算小流域内的沟道长度总和,并将其链接至小流域图层,最后基于arcpy.management.CalculateField(Layer,"GHMD","!SUM_GHCD!/!MJ!","PYTHON3","TEXT")函数批量获取作业单元小流域沟壑密度属性。

(9)小流域名称。根据小流域命名原则,小流域名称应简明确切、易于辨识,可采用当地沟道、村庄等标志性地物命名,本研究以小流域几何中心附近村庄名称命名。通过arcpy.FeatureToPoint_management()函数将小流域面要素转换为包含于面内的点要素,使用arcpy.Near_analysis()函数捕捉邻近村庄点作为小流域名称,在捕捉的过程中使用arcpy.management.DeleteIdentical()函数移除村名重复点,以避免在同一县区范围内存在同名小流域。

为了提高字段赋值计算工具的操作便捷性,将开发的功能模块打包为工具箱,实现在同一个地理处理工具面板中统一批处理,即选择所有参与计算的图层数据,按照相应计算逻辑和字段赋值顺序一次性完成一个作业单元内小流域的所有属性批量赋值。

3.2.3数据质检模块

质量检查是保障小流域划分成果准确性、可靠性的重要手段。在程序中检测到错误后以弹窗形式进行提示,便于小流域划分人员快速定位错误进行修改。

河南省小流域属性检查主要包括以下内容:

(1)属性完整性检查。将小流域图层中的所有属性字段存入列表,通过遍历与外部预定义的属性表信息逐一对照,对缺少的字段进行提示,并删除多余字段。

(2)坐标系正确性检查。获取作业单元小流域的元数据信息,判断坐标系是否为CGCS2000国家大地坐标系,否则进行提示。

(3)字段完整性检查。检查所有小流域要素的必填字段属性值是否为空或“NONE”值,若为空或“NONE”'值则警告提示,并列出相应小流域编码及字段名。

(4)面积误差控制。汇总统计同一县(市、区)内的小流域总和面积并与该县(市、区)总面积进行对比,绝对误差值应控制在0.01km2内,否则进行提示。

在河南省小流域划分空间拓扑数据质量检查时,调用arcpy.management.AddRuleToTopology()函数为拓扑检查定义规则。针对以下3种常见的拓扑错误类型,分别设置“MustNotOverlap(Area)”“MustNotHaveGaps(Area)”“BoundaryMustBeCoveredByBoundaryOf(Area-Area)”为对应的拓扑规则参数。

面拓扑错误为小流域边界相互重叠,如图REF_Ref85896294h*MERGEFORMAT5中小流域A与小流域B间的区域所示。线拓扑错误一为小流域边界之间存在空隙,如图5中小流域B和小流域C间的区域所示;二为县(市、区)行政边界没有被小流域边界覆盖,如图5中小流域A与县区行政边界间的区域所示。

4总结与讨论

目前关于小流域划分技术的研究较多,但多是基于水文分析模型的小流域自动划分技术探讨,很少有对后续属性赋值流程及结果的关注,但这也是小流域划分成果的重要组成部分。同时,现有研究对小流域划分效率与质量方面也鲜有提及。本研究重点在于:一是将县(市、区)作为小流域划分的最小作业单元,进一步提升了小流域划分成果的精细化程度;二是更加关注小流域划分成果中的属性赋值计算和质量检查过程,将小流域的属性成果放在了与空间划分成果同等重要的位置;三是更加重视小流域划分的效率和质量问题,并在梳理每个属性赋值计算的流程基础上定制开发了对应的自动批处理工具,在降低小流域划分后续工作复杂度的基础上又极大地提升了效率和质量。

基于ArcPy站点包构建的小流域划分辅助工具集在河南省小流域划分项目中实现了流程化、专业化、高效化的批处理,通过水文分析提取了河南省沟道、微流域数据,分别计算了河南省5576个小流域的24个属性字段,并对小流域成果进行了质量检查等。该工具集具有以下特点:

(1)运行效率高。结合实际工作需求对算法逻辑进行优化,减少了大量重复操作,能够实现数据的批量自动化处理,与传统方式相比作业效率明显提高。

(2)运行稳定可靠。字段通过链接形式添加在属性中,处理完成后自动取消字段关联,不会产生冗余数据;字段赋值过程严格按照规范流程执行,设置异常捕捉机制,产生错误后立即停止运行避免产生错误数据;空间分析的结果为新图层,不会更改输入数据的空间属性。

(3)操作简单。工具集算法合理,操作便捷,只需输入相关图层参数即可由后台完全自动化处理。河南省小流域划分辅助工具集的研发切实解决了生产实践中的问题,提高了工作效率,是小流域划分工作按时高质量完成的保障。利用ArcPy工具进行高效数据分析处理是一种科学有效的方法,这种开发思路在众多数据生产项目中均具有借鉴意义,本研究成果具备一定的推广价值和可移植性。

[参考文献]

[1]俞春娜,冯存均.面积约束的小流域提取算法研究[J].测绘科学,2022,47(12):216-222.

[2]张景扬,卢远,刘斌涛.基于ArcHydroTools的广西小流域划分研究[J].水利水电技术,2017,48(9):65-71.

[3]余咏胜,彭艳丽,尹言军,等.基于Arcpy的影像地图自动处理技术研究[J].测绘通报,2015(3):82-85.

[4]吕德昊,宋伟东,董山,等.ArcGIS中应用Python脚本实现地理数据的批处理[J].测绘与空间地理信息,2021,44(2):111-112,117.

[5]冯里涛,陈艳艳,李兆丰,等.基于Geoprocessing的基础地理信息数据库质量工具集的开发[J].测绘与空间地理信息,2013,36(9):102-105.

[6]王奎,林孝松.基于GIS的小流域特征信息提取[J].重庆理工大学学报(自然科学),2015,29(9):105-110.

[7]赵远洋,丁永生,孙丹,等.基于Arcpy编程修正的数字高程模型小流域水文分析[J].大连海事大学学报,2016,42(4):55-60.

[8]吴鹏,韩锦琳.河南省水土保持小流域划分原则与流程[J].中国水土保持,2022(5):29-31.

[9]FERDIHellweger.AGREE-DEMSurfaceReconditioningSystem[D].Austin:UniversityofTexasatAustin,1997:17.

[10]鄭倩,史海滨,李仙岳,等.基于AGREE算法与BURN-IN算法的平原灌区DEM河网提取问题剖析[J].灌溉排水学报,2019,38(5):122-128.

[11]李照会,郭良,刘荣华,等.基于DEM数字河网提取时集水面积阈值与河源密度关系的研究[J].地球信息科学学报,2018,20(9):1244-1251.

[作者简介]王松伦(1981—),男,河南扶沟人,高级工程师,硕士,主要研究方向为水利信息化;通信作者潘子轩(1996—),男,河南辉县人,助理工程师,硕士,主要研究方向为水利遥感监管。[收稿日期]2022-12-01

(责任编辑杨傲秋)

猜你喜欢
河南省
河南省树人教育交流中心
河南省树人教育交流中心
河南省树人教育交流中心
河南省树人教育交流中心
河南省树人教育交流中心
河南省树人教育交流中心
河南省树人教育交流中心
河南省树人教育交流中心
河南省树人教育交流中心
河南省树人教育交流中心