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进行裁剪功能的开发,代码简洁、易懂,有需要的话拿去参考。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值