使用 Python 多处理并行拆分多个 ArcGIS 栅格
Split many ArcGIS rasters in parallel using Python multiprocessing
我希望将 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 张图像?
顺便说一句,我知道 blog post 结合了 multiprocessing
和 arcpy
,尽管这些示例特定于矢量数据,但我无法弄清楚如何利用这些工具来过程图像。
排除任何资源共享问题,将简单的 for 循环转换为多处理很容易使用 multiprocessing.Pool
。尝试这样的事情:
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
是可迭代的,它就应该可以映射到进程池。请记住,每个进程都会 "inherit" 父进程的堆栈,这样每个进程都会使用它自己的 arcpy.env.workspace
.
副本
我希望将 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 张图像?
顺便说一句,我知道 blog post 结合了 multiprocessing
和 arcpy
,尽管这些示例特定于矢量数据,但我无法弄清楚如何利用这些工具来过程图像。
排除任何资源共享问题,将简单的 for 循环转换为多处理很容易使用 multiprocessing.Pool
。尝试这样的事情:
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
是可迭代的,它就应该可以映射到进程池。请记住,每个进程都会 "inherit" 父进程的堆栈,这样每个进程都会使用它自己的 arcpy.env.workspace
.