python:根据矢量数据裁剪栅格

其他   2022-08-27 18:02   湖北  

1、前言(可略过)

“OK兄弟们,全体目光向我看齐嗷,看我看我,我宣布个事儿,我是个......”

本来,想写个栅格转矢量的,因为最近也有需求需要用到,但是呢,刚刚在测试的时候发现了新问题,我#%……&……*……&

暴躁老哥直接上线

最近的脾气确实有点不好,可能是王者荣耀打多了吧,希望这周可以守住我的王者一颗星,再输下去可就真滴是“手握日月摘星辰”啊(╥╯^╰╥)

xdm,情况不对了啊,这外面感觉要下雨了啊,别啊,我还没下班啊o(╥﹏╥)o

2、需求(真正的前言)

我有一个NDVI影像,它大概长这样

我还有一个随笔画的矢量数据,它确定长这样

你看它圆圆的,像不像你手中的币(ΦωΦ)

整体如下

矢量裁剪栅格其实就是根据已有是矢量数据在栅格影像上扣下来一块具有相同形状的影像(这不是废话吗?)

3、代码

主要使用的包是rasterio 和geopandas

import geopandas as gpd
import rasterio
from rasterio.mask import mask


def clip(shpPath, imagePath, outImagePath):
    """
    根据传入的矢量数据裁剪栅格影像
    :param shpPath: 矢量数据
    :param imagePath: 栅格影像
    :param outImagePath: 裁剪后的影像
    :return:
    "
""
    shpData = gpd.read_file(shpPath)
    # 列表推导式
    # __geo_interface__ :转成地理接口
    shapes = [shpData.geometry[i].__geo_interface__ for i in range(len(shpData))]

    # 读取输入图像
    with rasterio.open(imagePath) as src:
        out_image, out_transform = mask(src, shapes, crop=True, nodata=np.nan)
        out_meta = src.meta

    # 更新元数据
    out_meta.update({"driver""GTiff",
                     "height": out_image.shape[1],
                     "width": out_image.shape[2],
                     "transform": out_transform})

    # 输出掩膜提取图像
    with rasterio.open(outImagePath, "w", **out_meta) as dest:
        dest.write(out_image)
        
        
if __name__ == '__main__':
    shpPath = r'D:\temp\test\vector.shp'
    imgPath = r'D:\temp\test\raster.tif'
    outPath = r'D:\temp\test\test.tif'
    clip(shpPath, imgPath, outPath)

提取结果如下

4、结局

完犊子了xdm,雨好大,我好怕

这雨,就像

那天,依萍找她爸要钱

那天,二月红找佛爷求药

那天,楚雨荨和慕容云海分手

那天,我成了落汤鸡

现在,照应前言了(╯﹏╰)b

(图源皆来自网络,侵删)

我是腰椎,see you!



壹贰叁言
赠予生活,聊以安慰。