首页 > 编程语言 >【Python&RS】基于Rasterio库裁剪栅格数据&压缩栅格影像

【Python&RS】基于Rasterio库裁剪栅格数据&压缩栅格影像

时间:2024-06-14 10:43:36浏览次数:27  
标签:src RS Python 裁剪 bounds 栅格 rasterio file out

 

        之前分享过【Python&RS】Rasterio库安装+基础函数使用教程,大家有兴趣的可以去看看。由于最近有涉及到栅格裁剪和压缩的问题,所以研究了一下今天和大家分享分享。

原创作者:RS迷途小书童

博客地址:https://blog.csdn.net/m0_56729804?type=blog

1 需要的库

import os
import rasterio
import geopandas as gpd
from rasterio.mask import mask
from rasterio.plot import show
from rasterio.windows import Window, from_bounds
from shapely.geometry import Point, Polygon, box, mapping, LineString

2 自定义矩形框裁剪

        这里的矩形可以自己选择大小,当然也可以通过读取矢量的空间范围去裁剪。同时代码中还加入了压缩参数。

def compress_tif(tif_path, output_file):
    with rasterio.open(tif_path) as src:
        transform = src.transform
        # minx, miny, maxx, maxy = geometry1.bounds(要素的地理字段)
        expanded_bbox = box(minx=0, miny=0, maxx=100, maxy=100)  # 创建一个新的扩展后的边界框(Shapely box)
        window = from_bounds(expanded_bbox.bounds[0], expanded_bbox.bounds[1],
                             expanded_bbox.bounds[2], expanded_bbox.bounds[3],
                             transform=transform)  # 将Shapely几何对象转换为rasterio可以理解的边界
        clipped = src.read(window=window)  # 读取并裁剪TIFF数据

        out_meta = src.meta.copy()
        out_meta.update({"driver": "GTiff", "compress": 'lzw'})  # 更新元数据,rle,lzw等
        del src
    with rasterio.open(output_file, 'w', **out_meta) as dest:  # 写入裁剪后的TIFF文件
        dest.write(clipped)

3 使用矢量要素裁剪

        这里使用到了geopandas库用来读取每个要素的空间范围。def clip_raster_from_features(vector_file=r"彭俊喜/1.shp", raster_file=r"彭俊喜/1.tif"):

    """
    :param vector_file: 输入需要裁剪的面矢量(多面)
    :param raster_file: 输入需要裁剪的影像
    :return: None
    """
    # 读取面矢量数据
    gdf = gpd.read_file(vector_file)
    # 循环遍历面矢量中的每个面要素
    for index, row in gdf.iterrows():
        # 获取当前面要素的几何形状
        geometry1 = row.geometry
        # 确保面要素不是空的
        if geometry1.is_empty:
            print(f"Skipping empty geometry for feature {index}")
            continue
            # 打开影像文件
        with rasterio.open(raster_file) as src:
            # 将面要素的边界转换为shapely的box对象
            geometry_bounds = box(*geometry1.bounds)
            # 将rasterio的bounds转换为shapely的box对象
            src_bounds = box(*src.bounds)
            # 检查面要素的边界是否与影像的边界相交
            if not geometry_bounds.intersects(src_bounds):
                print(f"Skipping feature {index} as it does not intersect with the raster.")
                continue
                # 转换几何形状为Rasterio可以理解的格式
            geom_for_rasterio = mapping(geometry1)
            # 使用面要素裁剪影像
            try:
                out_image, out_transform = mask(src, [geom_for_rasterio], crop=True)
            except ValueError as e:
                print(f"Error clipping feature {index}: {e}")
                continue
                # 检查是否成功裁剪出影像
            if out_image is None:
                print(f"No data was clipped for feature {index}. Skipping.")
                continue
                # 为裁剪后的影像设置输出路径和文件名
            output_file = f'clipped_image_{index}.tif'
            output_path = os.path.join(r'Z:\Shanghai Metro Automatic Identification System\Data Source\weigui\1',
                                       output_file)
            # 创建输出文件,并写入裁剪后的影像数据
            dtypes = [src.dtypes[i] for i in range(src.count)]  # 确保数据类型列表与波段数量匹配
            # 假设所有波段的数据类型都是相同的,并且你想要保持与输入影像相同的数据类型
            dtype = src.dtypes[0]  # 获取第一个波段的数据类型
            # 使用这个数据类型打开输出文件
            with rasterio.open(output_path, 'w', driver='GTiff', height=out_image.shape[1],
                               width=out_image.shape[2], count=src.count, dtype=dtype,
                               crs=src.crs, transform=out_transform) as dest:
                dest.write(out_image)
            print(f'Clipped image {output_file} has been saved.')
    print('All features have been processed.')

标签:src,RS,Python,裁剪,bounds,栅格,rasterio,file,out
From: https://www.cnblogs.com/RSran/p/18247344

相关文章

  • 浙大版PTA python程序设计 第七章题目解析
    一、判断题1.以"w"模式打开的文件无法进行读操作。  -正确。以"w"模式(写入模式)打开文件时,只允许写操作,不能进行读操作。如果尝试读操作会引发错误。2.Pandas库是用于图像处理的库。  -错误。Pandas库主要用于数据处理和分析,不是用于图像处理的。图像处理通常......
  • python利用蒙版进行抠图,背景透明和前景透明
    深度学习中利用黑白蒙版进行抠图importcv2importnumpyasnpdefget_alpha(image,mask):#归一化mask=mask/255back_mask=mask#将透明度A值转成一样维度back_transparent=back_mask.reshape(back_mask.shape[0],back_mask.shape[1],1......
  • python爬虫:实现动态网页的爬取,以爬取视频为例
    引言:爬虫也被称为网络蜘蛛(Spider),是一种自动化的软件程序,能够在互联网上漫游,按照一定的规则和算法抓取数据。爬虫技术广泛应用于搜索引擎、数据挖掘、信息提取等领域,是互联网技术的重要组成部分。摘要:作为爬虫的初学者,网页越简单越好,因为网页的结构越简单,则组织框架更清晰......
  • 基于Python3.11及SQL Server实现股票组合价值曲线相关计算分析
       本文中Python的版本使用的是3.11,数据库使用的是SQLSERVER2008,项目运行效果图如下:蒙特卡洛相关:突出风险最小点:夏普比率相关夏普比率无风险最大点文章中的股票每日交易数据摘取自:英为财情 https://cn.investing.com/蒙特卡洛及夏普相关计算参考【胖哥真......
  • 【RSMamba安装】pip install causal-conv1d和pip install mamba-ssm解决方法[亲测有效
    问题描述:在安装Mamba的过程中,我们会根据教程安装依赖项:pipinstallcausal-conv1d和pipinstallmamba-ssm,在绝大多数情况下,都会报错以下内容:error:subprocess-exited-with-errorerror:metadata-generation-failed❌Encounterederrorwhilegeneratingpackagem......
  • Python脚本中使用 if 语句导致的错误代码
    在Python脚本中使用if语句是一种常见的控制流程结构,用于根据条件决定程序的执行路径。当使用Python中的if语句时,可能会导致一些常见的错误。下面就是我经常遇到的错误代码示例及其可能的原因和解决方法,希望对大家有些帮助,少走弯路。1、问题背景一位用户在编写一......
  • 代码随想录 算法训练营 day9 Leetcode151 反转字符串单词 karma55 右旋转字符串 28 实
    Leetcode151反转字符串单词题目链接讲解此题方法很多很重要注重基础解法classSolution{publicStringreverseWords(Strings){char[]initialArr=s.toCharArray();//新字符数组char[]newArr=newchar[initialArr.length+1];//下......
  • python通知 设置系统托盘图标
    pythonQSystemTrayIcon.setIconQSystemTrayIcon.setIcon 是一个用于设置系统托盘图标的方法,它是PyQt5或PySide中的Qt库的一部分。这个方法让你可以设置系统托盘图标,它可以接受一个 QIcon 对象作为参数。以下是一些使用 QSystemTrayIcon.setIcon 的方法:直......
  • Python笔记 - 正则表达式
    正则表达式(RegularExpression,简称regex)是一种强大的工具,用于匹配字符串模式。在Python中,正则表达式通过re模块提供。本文将带你深入了解Python中的正则表达式,从基础概念到高级用法。1.什么是正则表达式?正则表达式是一种用来描述字符串模式的方法。它可以用来匹配、查找......
  • 【Java】 深入解析Java安全异常:Error - trustAnchors parameter must be non-empty
    >>【痕迹】QQ+微信朋友圈和聊天记录分析工具>>(1)纯Python语言实现,使用Flask后端,本地分析,不上传个人数据。>>(2)内含QQ、微信聊天记录保存到本地的方法,真正实现自己数据自己管理。>>(3)数据可视化分析QQ、微信聊天记录,提取某一天的聊天记录与大模型对话。>>下载地......