类似这种样式,多个shp文件裁剪一个栅格文件,但栅格文件不止一个。
前提:具有相同的坐标系,且对应着
借鉴的文章:
http://t.csdnimg.cn/xm37chttp://t.csdnimg.cn/xm37c在此基础上修改的批量处理方法(python),需要os,geopandas,rasterio库,没有可以用pip命令来下载。
import os
import geopandas as gpd
import rasterio
from rasterio.mask import mask
# 假设所有shp文件都在一个文件夹内,所有tif文件(不同时间点的数据)在另一个文件夹内
shp_folder = r'G:/arcgis_2023_9/nation_shpe'
tif_folder = r'H:/Snow/unint'
output_folder = r'H:/Snow/shape'
# 加载所有的shp文件
shp_files = [os.path.join(shp_folder, f) for f in os.listdir(shp_folder) if f.endswith('.shp')]
# 加载所有的tif文件
tif_files = [os.path.join(tif_folder, f) for f in os.listdir(tif_folder) if f.endswith('.tif')]
# 裁剪函数
def clip_tif_by_shp(tif_path, shp_path, output_path):
gdf = gpd.read_file(shp_path)
with rasterio.open(tif_path) as src:
out_image, out_transform = mask(src, gdf['geometry'], crop=True)
out_meta = src.meta.copy()
out_meta.update({"driver": "GTiff",
"height": out_image.shape[1],
"width": out_image.shape[2],
"transform": out_transform})
with rasterio.open(output_path, "w", **out_meta) as dest:
dest.write(out_image)
# 为每个shp文件和每个tif文件执行裁剪操作
for shp_path in shp_files:
shp_basename = os.path.basename(shp_path).replace('.shp', '')
for tif_path in tif_files:
tif_basename = os.path.basename(tif_path)
output_filename = f"{shp_basename}_{tif_basename}"
output_path = os.path.join(output_folder, output_filename)
clip_tif_by_shp(tif_path, shp_path, output_path)
print("Clipping completed!")
shp_folder是shp文件存储的路径
tif_folder 是要批处理栅格文件的路径
output_folder处理后的存储路径
最后的结果