使用Python多处理并行拆分许多ArcGIS栅格

时间:2015-04-09 21:47:46

标签: python multiprocessing arcgis raster arcpy

我希望将10张图像分成2个部分(20个结果图像)。图像是来自this website的4波段(R,G,B,nIR)NAIP图像。我正在使用ArcGIS中的arcpy包一次拆分一个图像:

import arcpy, os

inws = r'D:\temp\temp_NAIP'  #Contains ~10 .tif images
outws = r'D:\temp\temp_NAIP_tiles'

arcpy.env.workspace = inws
rasters = arcpy.ListRasters()

for ras in rasters:
    arcpy.SplitRaster_management(
        ras, outws, 
        os.path.basename(ras).split('.')[0], 
        split_method='NUMBER_OF_TILES', 
        format='TIFF', 
        num_rasters='1 2',
        overlap=50, units='PIXELS)

如何将multiprocessing模块集成到上述脚本中,以便一次处理4个图像?

顺便说一句,我知道multiprocessing结合了arcpy和{{1}},虽然示例是针对矢量数据的,但我无法弄清楚如何利用这些工具来处理图像。

1 个答案:

答案 0 :(得分:1)

除了任何资源共享问题外,使用multiprocessing.Pool很容易将简单的for循环转换为多处理。尝试这样的事情:

from multiprocessing import Pool
import arcpy, os

inws = r'D:\temp\temp_NAIP'  #Contains ~10 .tif images
outws = r'D:\temp\temp_NAIP_tiles'

arcpy.env.workspace = inws    
rasters = arcpy.ListRasters()

def process_img(ras):
    arcpy.SplitRaster_management(
        ras, outws, 
        os.path.basename(ras).split('.')[0], 
        split_method='NUMBER_OF_TILES',
        format='TIFF', 
        num_rasters='1 2',
        overlap=50, units='PIXELS')

pool = Pool(processes=4)
pool.map(process_img, rasters)

只要rasters是可迭代的,它就应该可以映射到进程池。请记住,每个流程都将继承"继承"父进程'堆栈,这样每个进程都将使用它自己的arcpy.env.workspace

副本