Bootstrap

Arcpy 多线程批量重采样脚本

Arcpy 多线程批量重采样脚本

import arcpy
import os
import multiprocessing

def resample_tifs(input_folder, output_folder, cell_size=0.05, resampling_type="BILINEAR"):
    """
    将指定文件夹下的所有 TIFF 文件重采样到指定分辨率,并输出到新文件夹中。

    参数:
        input_folder (str): 输入 TIFF 文件所在的文件夹路径。
        output_folder (str): 重采样后的 TIFF 文件输出到的文件夹路径。
        cell_size (float): 重采样后的分辨率大小。默认为 symbol。
        resampling_type (str): 重采样方法。可选值包括 "NEAREST_NEIGHBOR", "BILINEAR", "CUBIC", "MAJORITY"。默认为 "BILINEAR"。
    """
    # 检查输入文件夹是否存在
    if not os.path.exists(input_folder):
        raise FileNotFoundError(f"输入文件夹不存在: {input_folder}")
    
    # 如果输出文件夹不存在,则创建
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
        print(f"已创建输出文件夹: {output_folder}")

    # 设置环境工作空间
    arcpy.env.workspace = input_folder

    # 获取所有 TIFF 文件
    tif_list = arcpy.ListRasters("*", "TIF")
    
    if not tif_list:
        print("没有找到 TIFF 文件。")
        return

    print(f"找到 {len(tif_list)} 个 TIFF 文件。开始重采样...")

    # 遍历每个 TIFF 文件并进行重采样
    for tif in tif_list:
        input_path = os.path.join(input_folder, tif)
        output_path = os.path.join(output_folder, tif)
        
        try:
            print(f"正在处理: {tif}")
            # 使用 Resample_management 工具进行重采样
            arcpy.management.Resample(
                in_raster=input_path,
                out_raster=output_path,
                cell_size=cell_size,
                resampling_type=resampling_type
            )
            print(f"成功重采样并保存到: {output_path}")
        except arcpy.ExecuteError:
            print(f"ArcPy 错误处理文件 {tif}: {arcpy.GetMessages(2)}")
        except Exception as e:
            print(f"错误处理文件 {tif}: {e}")

    print("所有文件重采样完成。")

def main():
    output_dir2 = r"./010_世界人口数据 _0.1/"    #保存new重采样文件
    symbol = 0.25 # 重采样大小
    tasks = [
        # # ("./01_land_cover", "./China_01_landcover"),
        # ("./Global_tif_0.1_LC", output_dir2, symbol, "MAJORITY"),
        ("010_世界人口数据", output_dir2, symbol, "NEAREST"),

    ] 
    # 创建进程池,进程数设为CPU核心数
    pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())

    # 准备并行执行的任务
    results = []
    print(tasks)
    for input_dir11, output_dir22,cell_size ,resampling_type in tasks:
        result = pool.apply_async(resample_tifs, args=(input_dir11, output_dir22,cell_size ,resampling_type))
        results.append(result)

    # 关闭进程池,等待所有任务完成
    pool.close()
    pool.join()

    print("所有任务已完成。")


# 示例用法
if __name__ == "__main__":
  main()

;