首页 > 编程语言 >【Python&RS】基于Python分块处理大型遥感影像的方法

【Python&RS】基于Python分块处理大型遥感影像的方法

时间:2024-07-10 17:33:07浏览次数:11  
标签:block 分块 Python RS result array ds gdal size

        RSer工作时不可避免会用到大型的遥感影像,由于分辨率过高、区域过大、波段信息过多等原因,都会导致数据非常的大。这个时候我们在进行一些简单的操作,如计算NDVI、二值化、分类等时,计算机的内存都会溢出。因此今天跟大家分享一下我平时分块的方法,中间如何计算就按照自己的需求来即可。

原创作者:RS迷途小书童

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

1 忽略警告信息

        由于GDAL版本的更新,现在运行代码都会有一条警告Warning,但不影响程序,我有强迫症所以必须没有警告。另外就是指定Proj库的路径,以免坐标系进行警告。

gdal.DontUseExceptions()
os.environ['PROJ_LIB'] = 'G:/Anaconda/envs/pyDL/Lib/site-packages/osgeo/data/proj'
os.environ['GDAL_DATA'] = 'G:/Anaconda/envs/pyDL/Lib/site-packages/osgeo/data'

2 代码部分

        代码的思路就是按照设定好的块滑动处理影像,并按照原始的排列顺序将处理后的重新写入即可。中间计算部分可以按照自己需求来。

# -*- coding: utf-8 -*-
"""
@Time : 2023/6/25 16:28
@Auth : RS迷途小书童
@File :Raster Data Block Processing.py
@IDE :PyCharm
@Purpose:栅格数据分块处理
@Web:博客地址:https://blog.csdn.net/m0_56729804
"""
import os
import numpy as np
from osgeo import gdal
gdal.DontUseExceptions()
os.environ['PROJ_LIB'] = 'G:/Anaconda/envs/pyDL/Lib/site-packages/osgeo/data/proj'
os.environ['GDAL_DATA'] = 'G:/Anaconda/envs/pyDL/Lib/site-packages/osgeo/data'


def block_big_image(input_path: str, output_path: str, block_size: int) -> None:
    """
    :param input_path: 输入需要处理的影像
    :param output_path: 输出路径
    :param block_size: 输入块的大小
    :return: None
    """
    ds = gdal.Open(input_path, gdal.GA_ReadOnly)
    if not ds:  # 判断文件是否能打开
        print(f"无法打开文件 {input_path}")
        return
    ds_width = ds.RasterXSize  # 获取数据宽度
    ds_height = ds.RasterYSize  # 获取数据高度
    ds_geo = ds.GetGeoTransform()  # 获取仿射地理变换参数
    # ds_bands = ds.RasterCount  # 获取波段数
    # ds_type = gdal.GetDataTypeName(ds.GetRasterBand(1).DataType).lower()  # 获取位数信息
    ds_prj = ds.GetProjection()  # 获取投影信息
    driver = gdal.GetDriverByName('GTiff')  # 创建输出文件
    ds_result = driver.Create(output_path, ds_width, ds_height, 1, gdal.GDT_Float64,
                              options=["TILED=YES", "COMPRESS=LZW", "BIGTIFF=YES"])
    ds_result.SetGeoTransform(ds_geo)  # 设置仿射地理变化参数
    ds_result.SetProjection(ds_prj)  # 设置投影坐标信息

    # -----------------------------------------------逐块读取和写入数据----------------------------------------------------
    for y in range(0, ds_height, block_size):
        for x in range(0, ds_width, block_size):
            x_size = min(block_size, ds_width - x)  # 判断块和剩余的大小,避免右侧超出范围
            y_size = min(block_size, ds_height - y)  # 判断块和剩余的大小,避免右侧超出范围
            array_green = ds.GetRasterBand(2).ReadAsArray(x, y, x_size, y_size).astype(np.float64)
            array_nir = ds.GetRasterBand(4).ReadAsArray(x, y, x_size, y_size).astype(np.float64)
            b1 = array_green - array_nir
            b2 = array_green + array_nir
            array_result = np.divide(b1, b2, out=np.zeros_like(b2), where=b2 != 0)  # 相除,排除被除数为0的情况
            array_result = np.where(array_result > 0.2, 1, 0)  # 筛选array_result大于0.2的部分
            # array = np.where(array_result == 1, array, 0)  # 掩膜筛选,将array_result等于1的array部分保留,其余为0
            ds_result.GetRasterBand(1).WriteArray(array_result, x, y)  # 写入数据
            del array_green, array_nir, array_result, b1, b2, x_size, y_size
    ds_result.FlushCache()  # 清理缓存
    del ds, ds_width, ds_height, ds_prj


if __name__ == "__main__":
    # 定义输入和输出文件夹路径
    input_path1 = r'Y:\彭俊喜\1.tif'
    output_path1 = r'Y:\彭俊喜\2.tif'
    block_big_image(input_path1, output_path1, 256)

        在遥感影像处理中,面对高分辨率、大区域及多波段数据带来的巨大挑战,内存溢出成为常见难题。本博客旨在分享一种高效应对策略——影像分块处理法。通过将大型遥感影像分割成多个小块,独立处理后再整合结果,有效缓解了内存压力,使得NDVI计算、二值化、分类等操作得以顺畅进行。此方法灵活易行,为RSer在处理大数据集时提供了实用参考,助力提升工作效率与数据处理能力。

标签:block,分块,Python,RS,result,array,ds,gdal,size
From: https://www.cnblogs.com/RSran/p/18294633

相关文章

  • Python爬虫:BeautifulSoup的基本使用方法!
    1.简介BeautifulSoup提供一些简单的、python式的函数用来处理导航、搜索、修改分析“标签树”等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。BeautifulSoup自动将输入文档转换为Unicode编码,输出文......
  • python执行shell并获取结果
    在Python中执行Shell命令并获取其结果,通常可以使用subprocess模块。这个模块允许我们启动新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回码。下面是一个详细的示例,展示了如何使用subprocess.run()函数来执行Shell命令并获取其输出。1.示例一:使用subprocess.run()执行......
  • 【Mathematical Model】基于Python的相关性/显著性分析&成图
        很久之前编写的代码了,当时是用来分析遥感波段组合对于某地物反演的相关性分析。今天正好整理数据时一块分享出来。原创作者:RS迷途小书童博客地址:https://blog.csdn.net/m0_56729804?type=blog1相关性的概念        “相关性”是统计学中的一个基本......
  • 【案例详解】1. Python实现九九乘法表的24种方法
    【案例详解】1.Python实现九九乘法表的24种方法Python实现九九乘法表的24种方法案例详细讲解一、基础方法(嵌套循环)二、列表推导式三、函数封装四、使用`map`函数五、列表嵌套六、使用`itertools`库七、使用字符串格式化八、使用`format`方法九、递归实现十、使用`for`和......
  • python urllib 基础2
    请求对象的定制importurllib.requesturl=("https://www.baidu.com")heards={'user-agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/128.0.0.0Safari/537.36'}request=urlli......
  • rsync
    rsync与inotify【1】、rsync同步操作应用场景(业务场景)应用建议rsync作为命令使用临时拉取,推送数据。未来这和需求可以通过scp命令实现定时备份:rsync服务+定时任务定时备份,定期备份(定时任务进行备份+通过rsync传输备份)实时同步:rsync服务+sersync/lsyncd是先试试......
  • Python教程:Pandas数据转换编码的10种方式
    1.构建测试数据集importpandasaspdimportnumpyasnpdf=pd.DataFrame({'Sex':['M','F','M','M','M','F','M','F','F','F'],'Cou......
  • Python教程:sort和sorted实现排序之对比
    总的来说,sort是应用在列表上的方法,修改原始列表。内建函数sorted可对所有可迭代的对象进行排序操作,返回新的对象。list.sort()方法效率会比sorted(iter)稍微高些。一、sort函数sort()函数用于对原列表进行排序,如果指定参数,则依据指定的函数进行排序。列表才可以进行修......
  • 要将 Python 脚本制作成可执行程序,您可以使用以下几种方法:
    要将Python脚本制作成可执行程序,您可以使用以下几种方法:1.使用PyInstallerPyInstaller是一个非常流行的工具,可以将Python脚本打包成独立的可执行文件,支持Windows、macOS和Linux。您可以按照以下步骤进行操作:安装PyInstaller:复制代码pipinstallpyinstaller......
  • Python实现爬虫并输出
    1.Python爬虫并输出示例下面是一个使用Python编写的简单网络爬虫示例,该爬虫将抓取某个网页(例如,我们假设为https://example.com,但请注意实际使用时我们需要替换为一个真实且允许抓取的网站)的标题(Title)并打印出来。由于直接访问和抓取真实网站可能涉及版权和法律问题,这里我们仅提......