• 批处理文件 .bat 并行Arcpy脚本提高效率的思路-提升版


    前言

    我在之前的博客园博客里,阐述了如何编写Arcpy脚本,如何利用Windows bat批处理脚本同时打开多个cmd窗口,以实现并行处理,提高数据处理效率。但是上述博客仍然存在着:1、需要编写多个Arcpy脚本;2、参数修改麻烦。最近做了一些修改,解决了上述问题。现进行分享。

    Arcpy脚本

    借鉴知乎批处理教程,脚本分为运行参数准备函数定义、Arcpy掩膜提取函数定义、循环实现三大部分。

    导入库

    import arcpy
    from arcpy.sa import *
    import time, os, glob, sys
    

    函数定义

    首先定义运行参数准备函数,将所有输入输出参数存储到一个嵌套列表中,方便掩膜提取函数调用。然后定义掩膜提取函数。

    # 函数用于准备掩膜提取工具运行参数
    def pre_parameter(inpath, outpath, mask):
        parameters = []  
        infiles = glob.glob("*.tif")
        
        for infile in infiles: 
            inRaster = infile
            inMaskData = mask
            outRaster = os.path.join(outpath, infile)
            parameter = [inRaster, inMaskData, outRaster]
            parameters.append(parameter)
        return parameters
    
    # Arcpy函数掩膜提取
    def Extract_by_Mask(Parameter):
        # Set local variables
        inRaster = Parameter[0]
        inMaskData = Parameter[1]
        outRaster = Parameter[2]
        # Execute ExtractByMask
        outExtractByMask = ExtractByMask(inRaster, inMaskData)
        # Save the output 
        outExtractByMask.save(outRaster)
        print(outRaster, 'has finshed')
    

    循环实现

    利用sys.argv语句获取命令行输入的参数,调用pre_parameter函数生成掩膜提取函数运行参数列表。然后利用for循环,根据start与end处理特定文件数。通过多个cmd窗口打开多个脚本分别运行,便可以同时处理多个文件,提高效率。本例中,若只运行一个脚本需要70多个小时,同时运行7个脚本只需要10个小时左右。

    inpath = os.path.abspath(sys.argv[1])
    outpath = os.path.abspath(sys.argv[2])
    inf = os.path.abspath(sys.argv[3]) # 掩膜文件,可以是shp或者raster
    # 这里根据处理的文件数量改动,可以分几部分打开多个shell运行多个脚本提高速度
    start = int(sys.argv[4])
    end = int(sys.argv[5])
    
    os.chdir(inpath)
    
    # Set the current workspace
    arcpy.env.workspace = (inpath)
    # Set the snapRaster
    arcpy.env.snapRaster = (inf)
    # Check out the ArcGIS Spatial Analyst extension license
    arcpy.CheckOutExtension("Spatial")
    
    para = pre_parameter(inpath, outpath, inf) 
    
    StartTime = time.time()
    print('start Mask from %d to %d'%(start, end))
    
    for i in range(start, end): 
        time1 = time.time()
        Extract_by_Mask(para[i])
        time2 = time.time()
        print(i, 'has finished! costed ' + str(time2 - time1) + ' Seconds...',)
    
    EndTime = time.time()
    print('Elapsed: ' + str(EndTime - StartTime) + ' Seconds...')
    

    批处理(.bat)脚本

    第一句要设置为你的Arcpy python.exe所在完整路径。要完全按照顺序依次输入: inpath(输入路径), outpath(输出路径), inf(掩膜文件), start(第一个处理文件的编号), end(最后一个处理文件的编号)
    命令的具体含义请参考参考这篇博客

    :: change your work folder to the path of arcpy
    cd/d D:Python27ArcGIS10.4
    :: open some cmd and run the script
    start cmd /k python.exe C:UsersxxxDesktopMaskExtract_by_Mask.py "C:/Users/xxx/Desktop/NW" "C:/Users/xxx/Desktop/NW/test" "C:/Users/xxx/Desktop/NW/mask.shp" 0 5
    :: time delay
    choice /t 5 /d y
    start cmd /k python.exe C:UsersxxxDesktopMaskExtract_by_Mask.py "C:/Users/xxx/Desktop/NW" "C:/Users/xxx/Desktop/NW/test" "C:/Users/xxx/Desktop/NW/mask.shp" 5 10
    choice /t 5 /d y
    start cmd /k python.exe C:UsersxxxDesktopMaskExtract_by_Mask.py "C:/Users/xxx/Desktop/NW" "C:/Users/xxx/Desktop/NW/test" "C:/Users/xxx/Desktop/NW/mask.shp" 10 16
    

    以上思路或许还有更加优秀的解决办法,欢迎牛人大佬朋友下方留言交流。

  • 相关阅读:
    AutoFac学习笔记
    AutoMapper学习笔记
    ROSLYN 查看C#方法执行次数
    log4net 动态创建文件名
    WPF可切换按钮,iOS风格
    咕咕咕
    贪吃的小J
    UK Day15
    UK Day15
    UK Day15
  • 原文地址:https://www.cnblogs.com/yhpan/p/14577920.html
Copyright © 2020-2023  润新知