批处理文件 .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

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

原文地址:https://www.cnblogs.com/yhpan/p/14577920.html