(1)
#-*- encoding:UTF-8 -*-
# Name: 根据矢量边界批量裁剪栅格
# Script: ExtractByMask02.py
# Author: zengsk in HHU
# Created: 2019/7/22
import arcpy
import os
import arcpy.sa
from arcpy import env
env.overwriteOutput=True # 允许覆盖
env.workspace = r'I:\syan\TIFF'# 栅格数据集所在文件夹
rasters = arcpy.ListRasters()
spatialRef = arcpy.SpatialReference(4326) # 给定一个坐标系 WGS_1984
print(rasters)
mask_fea = r'I:\syan\eth2level_Project.shp' # 矢量边界文件
sc = arcpy.CheckOutExtension("Spatial")
print("Clip...Clip...Clip...")
for ras in rasters:
ras_name = os.path.basename(ras).split('.')[0]
o_ras_name = r'I:\syan\TIFF'+os.sep+ras_name+'_clip.tif' # 输出文件名定义
arcpy.DefineProjection_management(ras, spatialRef) # 定义坐标系
oras=arcpy.sa.ExtractByMask(ras, mask_fea)
oras.save(o_ras_name)
print(ras_name, "... is being processed")
print('works have done!')
(2)R语言
if (!requireNamespace("terra", quietly = TRUE)) install.packages("terra")
if (!requireNamespace("sf", quietly = TRUE)) install.packages("sf")
library(terra)
library(sf)
# 定义栅格数据文件夹路径
raster_directory <- "F:/00pet"
# 定义矢量区域文件路径
vector_path <- "E:/02data/njdsq1_level1_PBuffer2km.shp"
# 读取矢量区域
vector_area <- st_read(vector_path)
# 获取所有.tif文件的列表
raster_files <- list.files(raster_directory, pattern = "\\.tif$", full.names = TRUE)
# 设置输出目录
output_directory <- "E:/02data/05mean/pet"
# 遍历所有栅格文件并进行裁剪
for (raster_file in raster_files) {
# 读取栅格文件
raster_layer <- rast(raster_file)
# 将sf对象转换为SpatVector,以便与terra兼容
vector_area_terra <- vect(vector_area)
# 检查并确保CRS匹配,如果不匹配,则将矢量边界转换为栅格数据的CRS
if (!crs(raster_layer) %in% crs(vector_area_terra)) {
vector_area_terra <- project(vector_area_terra, crs(raster_layer))
}
# 裁剪栅格数据
cropped_raster <- crop(raster_layer, vector_area_terra)
masked_raster <- mask(cropped_raster, vector_area_terra)
# 构建输出文件名
output_file_name <- file.path(output_directory, paste0(tools::file_path_sans_ext(basename(raster_file)), ".tif"))
# 导出裁剪后的栅格文件
writeRaster(masked_raster, filename=output_file_name, overwrite=TRUE)
}