摘" 要:在日常数据处理过程中,由于空间数据的数据量较大,在对其进行重复性数据处理工作中,工作人员需进行大量手动操作且容易出错。空间数据的自动批处理可以大幅度降低数据处理人员的工作强度,提高工作效率。结合山东省新型基础测绘生产项目,使用ArcPy脚本对一些重复性的工作进行批处理,实现数据分发、影像挑选、数据合并等的批量操作,为ArcPy脚本在空间数据自动批处理中的应用提供一种可行且高效的方案。
关键词:新型基础测绘;ArcPy;批处理;数据分发;影像挑选
中图分类号:P208" " " "文献标志码:A" " " " " 文章编号:2095-2945(2023)31-0177-04
Abstract: In the daily data processing process, due to the large amount of spatial data, staff need to do a lot of manual operations and are prone to errors in the repetitive data processing. Automatic batch processing of spatial data can greatly reduce the work intensity of data processors and improve work efficiency. Combined with the new basic surveying and mapping production project in Shandong Province, ArcPy script is used to batch some repetitive work, and the batch operations of data distribution, image selection and data merging are realized, which provides a feasible and efficient scheme for the application of ArcPy script in automatic batch processing of spatial data.
Keywords: new basic surveying and mapping; ArcPy; batch processing; data distribution; image selection
在日常数据处理过程中,由于空间数据的数据量较大,在对其进行投影变换、字段编辑、拼接裁剪和数据转换等重复性数据处理工作中,工作人员需进行大量手动操作且容易出错[1]。为了降低数据处理人员的工作强度,提高工作效率,使用ArcPy脚本进行自动化处理是一种有效的方法。ArcPy脚本在矢量数据处理中已有较多应用,李乃强[2]、吴后清等[3]分别讨论了其在地理空间数据质量控制方面的应用,郑继武等[4]基于ArcPy研究了大比例尺地形图图幅结合表的自动绘制方法,袁玏[5]研究了其在农村土地承包经营权地块处理中的应用,本文以山东省新型基础测绘生产工作为例,探讨了使用ArcGIS中脚本工具包ArcPy进行数据自动批处理的可行性,为ArcPy在空间数据处理中的应用提供了一种可行且高效的方案。
1" ArcPy简介
ArcGIS是一款具有强大功能的地理信息数据处理软件,本身就带有许多地理信息数据处理工具,能够很好地满足日常工作中大部分情况下的数据处理工作,但其无法满足某些用户个性化的数据处理流程,因此,ArcGIS推出了ArcPy[6]。
ArcPy是一个以成功的arcgisscripting模块为基础并继承了arcgisscripting功能构建而成的站点包,目的是以实用高效的方式通过Python执行地理数据分析、数据转换、数据管理和地图自动化创建基础[7]。使用ArcPy的另一个主要原因是,Python是一种通用的编程语言。它是一种支持动态输入的解释型语言,适用于交互操作以及一次性程序(即脚本)快速原型制作,同时具有编写大型应用程序的强大功能。用ArcPy编写的ArcGIS应用程序的优势在于,可以使用由多个不同领域的GIS专业人员和程序员组成的众多Python小群体开发的附加模块[8]。
1.1" ArcPy模块
模块为包含函数和类的Python文件。ArcPy由数据访问模块(arcpy.da)、制图模块(arcpy.mapping)、ArcG IS Spatial Analyst扩展模块(arcpy.sa),以及ArcG IS Network Analyst扩展模块(arcpy.na) 等一系列模块支持,这些模块分别集成不同的功能。
1.2" ArcPy类
类的作用类似于建筑设计蓝图。蓝图为如何创建事物提供了一个框架。类可用于创建对象,即通常所说的实例。ArcPy类,如SpatialReference和Extent类,通常用作地理处理工具参数设置的快捷方式,否则的话,这些参数会使用更加复杂的字符串。
1.3" ArcPy函数
函数是用于执行某项特定任务并能够纳入更大的程序的已定义功能。在ArcPy中,所有地理处理工具均以函数形式提供,但并非所有函数都是地理处理工具。除工具之外,ArcPy还提供多种函数来更好地支持Python地理处理工作流。函数(通常称为方法)可用于列出某些数据集、检索数据集的属性、在将表添加到地理数据库之前验证表名称,或执行其他许多有用的脚本任务。
2" 生产中遇到的问题
基础测绘是测绘事业的核心组成部分,对于国防建设、经济建设、社会发展和生态保护具有重要意义,同时为自然资源管理、公共安全与应急管理等提供数据支持和技术保障。新型基础测绘是基础测绘在新时代的转型升级,其成果具有全域覆盖、数据量大、内容丰富等突出特点,这也使得在生产过程中会面临大量耗时且重复性的工作,影响工作效率。为了降低工作人员的工作强度,提高工作效率,使用ArcPy对一些重复性的工作进行批处理是一种有效的方法。
在山东省“十四五”基础测绘规划中,计划5 a内实现基于0.2 m分辨率影像全省更新一遍以及基于0.5 m分辨率影像的年度更新, 更新内容包括山体、水系、冰雪、海洋、农林用地与土质、高程、水利、交通、建(构)筑物及场地设施、管线、院落、人工地貌、行政区划单元、地名地址、国土空间规划单元和其他管理单元等。相比“十三五”的5 a全省基于0.5 m分辨率影像更新一轮,任务比以前成倍地增加,因此在分发任务的过程中需要更多的时间来处理更多的数据量。
另一方面,在“十三五”基础测绘中普遍使用的是0.5 m分辨率的影像,按照1∶10 000的图幅进行分幅,每幅图面积为25 km2,单个子任务区使用的影像数量不多,人工挑选耗时并不明显。由于“十四五”基础测绘使用的0.2 m分辨率的影像是基于1∶2 000的图幅进行分幅,即每幅图面积为1 km2,因此更新中每个子任务区使用的影像呈现指数级增加,人工挑选耗时明显增加。
以上2个问题均为重复性的海量数据处理问题,利用ArcPy站点包可以很好地解决这个问题。
3" ArcPy在生产中的应用
3.1" 数据分发
在基础测绘实际生产中,由于工期的限制,每个任务区需要分为多个子任务区由不同的作业员完成,因此在任务分配过程中涉及数据分发的问题。传统的做法是利用Arcgis制作矢量的任务分块图,然后由作业员自己对原始数据进行裁切,这样每个作业员需要处理一遍数据。由此想到使用ArcPy脚本,根据分配好的任务分块图对多个原始数据进行统一分配及裁切,能大大节省任务分配的时间。
脚本具体思路为:先将制作好的矢量任务分块图对自身进行分割处理,形成多个子任务分块图,然后使用分割好的子任务分块图对数据进行裁剪,使用“原始数据+作业员”的格式对裁切后的数据命名,处理流程如图1所示。
部分代码如下:
for fenkuai in arcpy.ListFiles(\"*.shp\"):
arcpy.Split_analysis(fenkuai,fenkuai, “作业员“, data_path+\"/guocheng\", \"\")
for shuju in arcpy.ListFiles(\"*.gdb\"):
env.workspace = data_path+\"/guocheng\"
for fenkuai2 in arcpy.ListFiles(\"*.shp\"):
clip_name=os.path.splitext(shuju)[0]+\"_\"+os.path.splitext(fenkuai2)[0]+\".gdb\"
arcpy.CreateFileGDB_management(data_path+ \"/jieguo\",clip_name, \"9.3\")
env.workspace = data_path+\"/\"+shuju
for shapefile in arcpy.ListFeatureClasses():
arcpy.Clip_analysis(shapefile, data_path + \"/guocheng/\" + fenkuai2,data_path + \"/jieguo/\" + clip_name + \"/\" + shapefile)
脚本在ArcGIS集成软件IDLE中运行,将数据放入指定文件夹中,即可实现自动运行。运行过程中显示每个gdb数据库的操作过程,可以实现实时监控,保证数据处理的准确性。对于裁切后的数据,每个作业员根据分配结果选取自己的任务区进行直接生产。
3.2" 影像挑选
每个任务区的影像在分发时在一个文件夹下,作业员需要根据自己的子任务区进行挑选。根据分配任务区大小的不同,每个作业员在单个任务区生产中需要挑选的影像为50~200 mm不等,人工挑选耗费时间且容易出错,再次想到使用ArcPy脚本,根据子任务区与图幅的空间关系进行批量挑选。
影像挑选的脚本思路为:对子任务区和影像结合表进行相交处理,得到子任务区需要的影像结合表,将相交后的影像结合表中的影像名称提取到数组中,根据提取数组中的影像名在原文件夹里将影像复制到目标文件夹内,处理流程如图2所示。
部分代码如下:
arcpy.SpatialJoin_analysis(rwfk_shp, DLGfenfu_shp,
jieguo2, \"JOIN_ONE_TO_MANY\", \"KEEP_ALL\",\"\", \"INTERSECT\", \"\", \"\")
arcpy.AddField_management(jieguo2, \"domtif\",\"TEXT\",\"\",\"\",\"20\",\"\",NULLABLE\",\"\", \"\")
arcpy.CalculateField_management(jieguo2, \" domtif \",\"!NAME! +\\".tif\\"\",\"\", \"\")
arcpy.AddField_management(jieguo2, \"domtfw\",\"TEXT\",\"\",\"\",\"20\",\"\", ULLABLE\", \"\", \"\")
arcpy.CalculateField_management(jieguo2, \" domtfw \", \"!NAME! + \\".tfw\\"\", \"\", \"\")
shpfields = [' domtif ', ' domtfw ']
shp_TXT = []
shprows = arcpy.SearchCursor(jieguo2, shpfields)
while True:
shprow = shprows.next()
if not shprow:
break
shp_TXT.append(shprow. domtif)
shp_TXT.append(shprow. domtfw)
for i in range(0, len(shp_TXT)):
if arcpy.Exists(src_file+'/'+shp_TXT[i]):
shutil.copy(src_file+'/'+shp_TXT[i],
dst_file)
else:
print src_file+'\\'+shp_TXT[i]+u\"不存在!\"
生产中根据实际情况将原始数据路径设置好,点击运行即可实现影像的自动挑选,挑选过程在后台运行,不影响作业员处理其他工作,速度数倍快于人工,并且不会出现挑选错误的情况。
3.3" 数据合并
由于基础测绘数据存储时是按县级任务区进行组织的,因此需要对每个作业员生产完成的单个子任务区数据进行合并处理,并按要求对数据进行接边。由于接边需要人工干预过程,因此考虑使用ArcPy脚本进行前期自动处理,后期人工干预。
脚本具体思路为:遍历文件夹中的数据库文件,将每个数据库的相应图层一一追加至模板数据库中,追加完成后,对每个图层的数据根据各自属性进行预接边,即融合处理,再将融合后的数据追加到模板中,处理流程如图3所示。
部分代码如下:
f_list=arcpy.ListFiles(\"*.gdb\")
env.workspace = path+\"/\"+mb_name
fcList = arcpy.ListFeatureClasses()
for f in f_list:
for shapefile in fcList:
arcpy.Append_management(path+\"/shuju/\"+f+\"/\"+shapefile,
path+\"/\"+mb_name+\"/\"+shapefile,\"NO_TEST\",\"\")
arcpy.CreateFileGDB_management (path+\"/DIS_gdb\",mb_name, \"9.3\")
arcpy.Dissolve_management(path+\"/\"+mb_name+\"/HFCL\",path+\"/DIS_gdb/\"+mb_name+\"/HFCL\", \"…………\", \"\", \"SINGLE_PART\", \"DISSOLVE_LINES\")#根据实际情况定义融合字段
disfcList=[\"HFCL\",…………]#需要融合的图层
for i in disfcList:
arcpy.TruncateTable_management(path+\"/\"+mb_name+\"/\"+i)
arcpy.Append_management(path+\"/DIS_gdb/\"+mb_name+\"/\"+i,
path+\"/\"+mb_name+\"/\"+i,\"NO_TEST\",\"\")
脚本会对各作业员提交的分块数据进行合并,并进行初步融合处理,在分界线两侧数据均无变化的情况下实现效果较好,个别变化的细节需要后期人工干预加以判断。经实际生产验证,采用此种人机交互的方式,合图速度有明显提升。
4" 工程实例
本文基于“十四五”新型基础测绘生产项目,选取具有代表性的几个任务区,分别采用原始方法和文中脚本进行数据的分发、合并以及影像的挑选工作。以样本任务区A区为例,使各子任务区作业员使用原始方法进行以上工作并记录所用时间,同时实验人员使用脚本进行处理并记录时间,最终统计时间见表1。
经实际生产验证结果,使用脚本后生产效率有明显提升,数据合并因涉及人工干预工作,效率提升不及数据分发和影像挑选明显。
5" 结束语
随着信息技术的发展,地理信息工作所需要处理的数据越来越多,如何快速、高效地处理海量信息数据,是每个从业者必须面对的问题。基于ArcPy脚本的基础测绘批处理工具针对实际生产需要进行开发,解决了生产中遇到的问题,减少了大量重复性的工作,保证成果质量的同时提高了生产效率。利用ArcPy脚本进行批量地理处理工作流设计,能够充分提高处理效率,有效规避人为错误,大幅度节约人工成本,值得学习和推广,使其在测绘地理信息工作中发挥更重要的作用。
参考文献:
[1] 李诗宇,邓吉强.基于ArcPy的地学数据自动化处理与分析方法[J].科技创新与生产力,2018(3):44-46,49.
[2] 李乃强.基于ArcPy的地理空间数据质检技术研究[J].地矿测绘,2021,37(3):38-41,45.
[3] 吴厚清,熊维康,聂晨晖,等.ArcPy脚本工具在新型基础测绘质量控制中的应用[J].测绘通报,2022(8):160-164.
[4] 郑继武,邓学锋.基于ArcPy的大比例尺地形图图幅接合表自动绘制方法[J].地理空间信息,2022,20(9):121-124.
[5] 袁玏.基于Python的农村土地承包经营权地块数据处理的研究[J].南方国土资源,2016(8):38-40.
[6] 马云岗.Arcpy在地理信息数据处理中的应用[J].华北自然资源,2019(5):78-80.
[7] 佟中石,张文朗,刘佰莹.ArcPy脚本在山东省基础测绘项目中的应用[J].测绘与空间地理信息,2021,44(S1):139-141,146.
[8] 孙咸磊,许捍卫,李文博.ArcPy在长江河道水下空间数据批量处理中的应用[J].测绘与空间地理信息,2015,38(2):97-99.