arcpy批量处理

  • 1、裁剪
  • 2、重分类
  • 3、栅格计算器(乘法)
  • 4、格式转换(tif转换为ASCII格式)
  • 5、相关参考


1、裁剪

  目的: 对指定路径下的所有子文件中的tif影像进行批量裁剪,并生成对应的文件夹,保存裁剪后的tif文件。

# -*- coding: cp936 -*-
import arcpy
import os
arcpy.CheckOutExtension("spatial")

# 创建一个用于存储输出的文件夹
input_folder = r"D:\SDMs\Datasets\worldclim1.4\Future_RCP_30s\2070"
mask = r"D:\SDMs\Datasets\arcgis\China-map.shp"
# 获取指定目录下的所有文件和文件夹
all_files_and_folders = os.listdir(input_folder)
print(all_files_and_folders)
for folder_name in all_files_and_folders:
    # 子文件夹路径
    folder_path = os.path.join(input_folder, folder_name)
    # 获取子文件夹中的所有tif文件
    tif_files = [file for file in os.listdir(folder_path) if file.endswith(".tif")]

    clip_name = "Clip_" + folder_name
     # path = arcpy.CreateFolder_management(input_folder, clip_name)
    path = os.path.join(input_folder, clip_name)
    print(clip_name)
    print(path)
    arcpy.CreateFolder_management(input_folder, clip_name)

    arcpy.env.workspace = folder_path #栅格文件路径
    for i in tif_files:
         print str(i)
         # 输出tif文件路径
         output_tif = os.path.join(path, i)
         print(output_tif)
         arcpy.gp.ExtractByMask_sa(i, mask, output_tif)
         print("mask_" + i + "has done!")
    print("===============================================================")
print("All OK!!!")

  本例子中使用了os.listdir(input_folder)来获取文件夹下的子文件名,而不需要手动输入文件名,这样更加方便,之前的文章中就是手动输入的:Python地理数据处理 22:基于arcpy批量操作(四)—— 3. 栅格批量缩小n倍

2、重分类

  对文件夹下的所有tif格式图像进行重分类:

# -*- coding: cp936 -*-
import arcpy
import os

arcpy.CheckOutExtension('Spatial')

# 设置工作环境
arcpy.env.workspace = r"D:\SDMs\SCI1\finallresult"

# 输入文件夹路径
input_folder = r"D:\SDMs\SCI1\finallresult"

# 输出文件夹路径
output_folder = r"D:\SDMs\SCI1\finallresult\Resample"

# 定义重分类范围
reclass_ranges = "0 200 1; 201 400 2; 401 600 3; 601 1000 4"

# 获取文件夹中的所有TIFF文件
tif_files = arcpy.ListRasters("*", "TIF")

# 遍历每个TIFF文件并进行重分类
for tif_file in tif_files:
    # 构建输入和输出的文件路径
    input_tiff = os.path.join(input_folder, tif_file)
    output_tiff = os.path.join(output_folder, tif_file.replace(".tif", "_reclass.tif"))

    # input_tiff1 = arcpy.gp.Int_sa(input_tiff, output_tiff)

    # 进行重分类
    arcpy.gp.Reclassify_sa(input_tiff, "Value", reclass_ranges, output_tiff)
    print("重分类: {} ".format(tif_file))

print("重分类完成!")

3、栅格计算器(乘法)

# -*- coding: cp936 -*-
import arcpy
import os

arcpy.CheckOutExtension('Spatial')

# 设置工作环境
arcpy.env.workspace = r"D:\SDMs\SCI1\finallresult"

# 输入文件夹路径
input_folder = r"D:\SDMs\SCI1\finallresult"

# 输出文件夹路径
output_folder = r"D:\SDMs\SCI1\finallresult\Finally0_1"

# 获取文件夹中的所有 TIFF 文件
tif_files = arcpy.ListRasters("*", "TIF")

# 遍历每个 TIFF 文件并进行栅格计算器操作
for tif_file in tif_files:
    input_tiff = os.path.join(input_folder, tif_file)
    output_tiff = os.path.join(output_folder, tif_file.replace(".tif", "_scaled.tif"))
    print tif_file

    # 使用栅格计算器进行乘法操作
    # 注意:{}两边必须加上' '(单引号),否则会报错,如'{}'
    expression = "'{}' * 0.001".format(tif_file)  
    arcpy.gp.RasterCalculator_sa(expression, output_tiff)
    print("正在处理: {} ".format(tif_file))

print("处理完成。")

注意: 在expression中的{}两边必须加上’ ‘(单引号),否则会报错,如’{}’

4、格式转换(tif转换为ASCII格式)

# -*- coding: cp936 -*-
import arcpy
import os

arcpy.CheckOutExtension('Spatial')

# 设置工作环境
arcpy.env.workspace = r"D:\SDMs\SCI1\finallresult\Finally0_1"

# 输入文件夹路径
input_folder = r"D:\SDMs\SCI1\finallresult\Finally0_1"

# 输出文件夹路径
output_folder = r"D:\SDMs\SCI1\finallresult\Finally0_1\ASCII_Output"

# 获取文件夹中的所有TIFF文件
tif_files = arcpy.ListRasters("*", "TIF")

# 遍历每个TIFF文件并进行ASCII格式转换
for tif_file in tif_files:
    # 构建输入和输出的文件路径
    input_tiff = os.path.join(input_folder, tif_file)

     # 提取文件名中第一个下划线之前的部分
    new_name = tif_file.split('_')[0]
    output_ascii = os.path.join(output_folder, "cur_{}_thresholded.asc".format(new_name))
    
    #output_ascii = os.path.join(output_folder, tif_file.replace(".tif", ".asc"))

    # 进行ASCII格式转换
    arcpy.RasterToASCII_conversion(input_tiff, output_ascii)
    print("转换为ASCII格式: {} ".format(tif_file))

print("转换完成!")

5、相关参考

  • Python:arcpy批量重分类实现