Python地理数据处理 27:基于Arcpy批量处理已矫正的worldclim2.1未来气候数据——投影、重采样、多波段拆分以及裁剪

Arcpy批量处理已矫正的worldclim2.1未来气候数据

1. 写在前面

  前面我写了一篇关于如何使用ArcGIS自带的Python工具处理worldclim数据的多波段数据的文章,而这只是处理该数据的其中一步。要想得到满足要求的数据,还需要其他操作,依次为投影为指定投影坐标系(Albers)、重采样为1000m空间分辨率、多波段拆分以及裁剪。
  今天我把以上所有的相关操作基于一套代码进行演示,可以实现一键操作。并且我使用的是已矫正的worldclim2.1未来气候数据,该数据排除了异常值。

2.实现代码

  使用以上代码之前,你需要建立一个文件夹,例如:C:\Users\Jacksonzhao\Desktop\sspdata\ssp126。再将worldclim数据放入其中,这里我选择了worldclim的ssp126_2030s和ssp126_2050s两幅影像数据进行处理,之后便可以运行代码,喝一杯茶的功夫就好了:

在这里插入图片描述

# -*- coding: cp936 -*-
import arcpy
import shutil
from arcpy.sa import *
import os
import time

# 检查并获取 Spatial Analyst 扩展许可
arcpy.CheckOutExtension('Spatial')
start_time = time.time()  # 开始时间

# *****************************************************************************************
# 基础路径和子文件夹
subfolder = 'ssp126'  # 需要修改
base_path = os.path.join(r'C:\Users\Jacksonzhao\Desktop\sspdata', subfolder)

# 设置工作空间
arcpy.env.workspace = base_path

# 获取工作空间中的所有tif格式文件
raster_lists = arcpy.ListRasters("*.tif")
print(raster_lists)

for raster_list in raster_lists:
     #print(raster_list)
     raster_list = [raster_list]
     # 检查是否找到了tif文件
     if raster_list:
         # 遍历文件列表
         for raster in raster_list:
             print("*****************************************************************************")
             print("正在处理文件:{}************************************************".format(raster))
             # 移除.tif扩展名
             raster_name = os.path.splitext(raster)[0]
             #print(raster_name)  # 打印不含扩展名的文件名

             # 子文件夹模板列表
             subfolders = [
                 '{}/Albers998m'.format(raster_name),
                 '{}/Albers1000m'.format(raster_name),
                 '{}/Albers1000m_19bio'.format(raster_name),
                 '{}_Finish'.format(raster_name)
             ]
             
             print("=========================文件夹创建=========================")
             # 遍历子文件夹模板列表,为每个raster_name创建子文件夹
             for subfolder_template in subfolders:
                 subfolder_path = subfolder_template.format(raster_name=raster_name)
                 folder_path = os.path.join(base_path, subfolder_path)

                 # 检查文件夹是否已经存在
                 if not os.path.exists(folder_path):
                     
                     os.makedirs(folder_path)
                     print("文件夹 '{}' 已创建".format(os.path.basename(folder_path)))
                 else:
                     print("文件夹 '{}' 已存在".format(os.path.basename(folder_path)))

             print("所有文件夹创建完毕,耗时:{:.2f}分====================================".format((time.time()  - start_time)/60))


             # 1、投影为albers
             print("=========================投影为Albers=========================")
             arcpy.env.workspace = base_path
             #rasters = arcpy.ListRasters("*","tif")
             for raster in raster_list:
                 out = os.path.join(base_path, raster_name, 'Albers998m', raster)  # 输出路径
                 print(os.path.join(base_path, raster_name, 'Albers998m', raster))
                 arcpy.ProjectRaster_management(raster, out, "PROJCS['Asia_North_Albers_WGS84_LCR',GEOGCS['GCS_WGS_1984',DATUM['D_WGS_1984',SPHEROID['WGS_1984',6378137.0,298.257223563]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]],PROJECTION['Albers'],PARAMETER['False_Easting',0.0],PARAMETER['False_Northing',0.0],PARAMETER['Central_Meridian',105.0],PARAMETER['Standard_Parallel_1',25.0],PARAMETER['Standard_Parallel_2',47.0],PARAMETER['Latitude_Of_Origin',0.0],UNIT['Meter',1.0]]")
             print("操作完毕,耗时:{:.2f}分====================================".format((time.time()  - start_time)/60))


             # 2、重采样为1000m
             print("=========================重采样为1000m=========================")
             arcpy.env.workspace = os.path.join(base_path, raster_name, 'Albers998m')

             input_folder = os.path.join(base_path, raster_name, 'Albers998m')
             output_folder = os.path.join(base_path, raster_name, 'Albers1000m')

             resampling_resolution = "1000" # 设置重采样分辨率

             tif_list = arcpy.ListFiles("*.tif")

             # 循环处理每个tif文件
             for tif_file in tif_list:
                 #构建输入和输出路径
                 input_path = os.path.join(input_folder, tif_file)
                 output_path = os.path.join(output_folder, tif_file)
                 # 执行重采样
                 arcpy.Resample_management(input_path, output_path, resampling_resolution, "NEAREST")
                 
                 print(output_path)
             print("操作完毕,耗时:{:.2f}分====================================".format((time.time()  - start_time)/60))



             # 3、拆分为单波段
             print("=========================多波段拆分为单波段=========================")
             arcpy.env.workspace = os.path.join(base_path, raster_name, 'Albers1000m')
             output_directory = os.path.join(base_path, raster_name, 'Albers1000m_19bio')
             print(output_directory)

             # 获取栅格列表
             raster_list = arcpy.ListRasters("*.tif")

             # 遍历栅格集合
             for raster in raster_list:
                 # 获取栅格数据集的全路径
                 raster_full_path = os.path.join(arcpy.env.workspace, raster)
                 
                 # 创建栅格对象
                 raster_obj = arcpy.Raster(raster_full_path)
                 
                 # 获取波段数量
                 number_of_bands = raster_obj.bandCount
                 
                 # 构建基本的文件名
                 base_filename = "wc2.1BCC_" + raster_name
                 
                 # 遍历所有波段
                 for i in range(1, number_of_bands + 1):
                     # 提取单波段并创建栅格图层
                     band_name = "band_" + str(i)
                     arcpy.MakeRasterLayer_management(raster_full_path, band_name, "", "", i)

                     # 保存单波段影像
                     output_path = os.path.join(output_directory, base_filename + "_Bio{0}.tif".format(i))
                     arcpy.CopyRaster_management(band_name, output_path)
                     
                     print("Saved:", output_path)
             print("操作完毕,耗时:{:.2f}分====================================".format(time.time()  - start_time))



             # 4、裁剪
             print("=========================影像裁剪=========================")
             finish_folder = os.path.join(base_path, '{}_Finish'.format(raster_name))
             arcpy.env.workspace = os.path.join(base_path, raster_name, 'Albers1000m_19bio')
             rasters = arcpy.ListRasters("*", "tif")
             mask ="C:/Users/Jacksonzhao/Desktop/CSCD/Data/Bio_Topo/envi1km/wc2.1_30s_bio_1.tif"

             for raster in rasters:
                 print(raster)
                 out = os.path.join(finish_folder,  raster)
                 arcpy.gp.ExtractByMask_sa(raster, mask, out)
                 print("Clip_" + raster + "has done!")
             print("操作完毕,耗时:{:.2f}分====================================".format((time.time()  - start_time)/60))



             # 5、删除文件夹
             folder_paths = [
                  os.path.join(base_path, raster_name, 'Albers998m'),
                  os.path.join(base_path, raster_name, 'Albers1000m_19bio')
                  ]

             # 检查并删除文件夹
             for folder_path in folder_paths:
                  if os.path.isdir(folder_path):
                       shutil.rmtree(folder_path)
                       print("文件夹 : {} 及其内容已删除".format(folder_path))
                  else:
                       print("文件夹 : {} 不存在".format(folder_path))
             end_time = time.time()  # 开始时间
             print("所有操作完毕,耗时:{:.2f}分*****************************************".format((end_time - start_time)/60))

     else:
         print("没有找到tif文件。")

print("所有操作完毕!!!,耗时:{:.2f}分*****************************************".format((end_time - start_time)/60))

处理结果:
在这里插入图片描述

BCC_ssp126_2030s_Bio1结果如下:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jackson的生态模型

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值