python利用shp面对tif进行批量裁剪(掩膜)

文章目录


前言

不知道各位在日常处理遥感影像时,是否会遇到这种情况:就是假设有一个shp文件,里面有很多面,需要基于这些面对tif分别进行裁剪。这种裁剪其实arcgis也可以,但是就比较麻烦,于是乎我想到了利用python代码直接批量裁剪,请看下文。


一、基于那些库?

主要利用的库有geopandasrasterioos

1.geopandas主要用于处理地理空间数据。提供了一个GeoDataFrame对象,它是pandas的DataFrame对象的扩展,能够存储和操作地理空间数据。

2.rasterio用于读取、写入和处理栅格数据集。它建立在GDAL(Geospatial Data Abstraction Library)之上,提供了一种简单而高效的方式来处理遥感和地理信息系统数据。

3.os不做介绍,懂得都懂。

二、使用步骤

1.引入库

代码如下:

import os
import geopandas as gpd
import rasterio
from rasterio.mask import mask
from rasterio.crs import CRS

2.定义裁剪函数

代码如下:

def clip_raster_by_shp(raster_path, shp_path, output_folder):
    # 读取shp文件
    gdf = gpd.read_file(shp_path)

    # 读取栅格数据
    with rasterio.open(raster_path) as src:
        # 获取栅格数据的元数据
        src_meta = src.meta

        if src.crs:
            gdf_crs = CRS.from_user_input(gdf.crs) if gdf.crs else None
            src_crs = CRS.from_user_input(src.crs) if src.crs else None

            if gdf_crs != src_crs:
                gdf_projected = gdf.to_crs(src.crs)
            else:
                gdf_projected = gdf
        else:
            gdf_projected = gdf

        # 遍历shp文件中的每个区域
        for index, row in gdf_projected.iterrows():
            # 获取当前区域的几何形状
            geometry_projected = row['geometry']

            # 使用区域的几何形状裁剪栅格数据
            out_image, out_transform = mask(src, [geometry_projected], 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
            })

            # 保存裁剪后的栅格数据
            out_filename = os.path.join(output_folder, f"clip_{index}.tif")
            with rasterio.open(out_filename, "w", **out_meta) as dest:
                dest.write(out_image)

3.引用函数裁剪

代码如下:

raster_path =r'demo.tif'      # 设置需要裁剪的tif路径

shp_path =   r'fanwei.shp'    # 设置shp路径

output_folder = r'cut_result' # 设置结果保存路径

# 调用函数实现裁剪
clip_raster_by_shp(raster_path, shp_path, output_folder)

总结

本文利用python实现了 基于shp中的每个单独面批量对tif进行裁剪功能的开发,代码简洁、易懂,有需要的话拿去参考。

  • 25
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
裁剪栅格是指根据指定的范围或边界,将栅格数据集中的数据裁剪为指定区域的子集。在Python中,可以使用GDAL库来进行栅格数据裁剪操作。下面是一个示例代码,演示了如何使用Python批量裁剪栅格数据: ```python import os from osgeo import gdal def batch_clip_raster(input_folder, output_folder, clip_extent): # 获取输入文件夹中的所有栅格文件 raster_files = \[f for f in os.listdir(input_folder) if f.endswith('.tif')\] # 遍历每个栅格文件 for raster_file in raster_files: # 构建输入和输出文件路径 input_path = os.path.join(input_folder, raster_file) output_path = os.path.join(output_folder, raster_file) # 打开栅格文件 dataset = gdal.Open(input_path) # 获取栅格文件的投影和地理转换信息 projection = dataset.GetProjection() geotransform = dataset.GetGeoTransform() # 获取栅格文件的行列数 rows = dataset.RasterYSize cols = dataset.RasterXSize # 创建输出栅格文件 driver = gdal.GetDriverByName('GTiff') output_dataset = driver.Create(output_path, cols, rows, 1, gdal.GDT_Float32) # 设置输出栅格文件的投影和地理转换信息 output_dataset.SetProjection(projection) output_dataset.SetGeoTransform(geotransform) # 进行裁剪操作 gdal.Warp(output_dataset, dataset, cutlineDSName=clip_extent, cropToCutline=True) # 关闭数据集 dataset = None output_dataset = None print("批量裁剪栅格完成!") # 设置输入文件夹路径 input_folder = 'path/to/input/folder' # 设置输出文件夹路径 output_folder = 'path/to/output/folder' # 设置裁剪范围的矢量文件路径 clip_extent = 'path/to/clip/extent.shp' # 调用批量裁剪函数 batch_clip_raster(input_folder, output_folder, clip_extent) ``` 在上述代码中,需要设置输入文件夹路径(包含待裁剪栅格数据)、输出文件夹路径(保存裁剪后的栅格数据)和裁剪范围的矢量文件路径。代码会遍历输入文件夹中的所有栅格文件,并将其裁剪为指定范围的子集,然后保存到输出文件夹中。请确保已经安装了GDAL库,并将路径替换为实际的文件路径。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值