Python遥感开发之分段读取和保存遥感数据

news2024/11/25 11:03:37

Python遥感开发之分段读取和保存遥感数据

  • 1 分段读取数据
  • 2 实现分批读取数据以及进行计算
  • 3 实现分批保存成TIF文件(所有完整代码)
  • 4 分段TIF整合到一个TIF
  • 5 生成一个空白TIF(每个像元值为0的TIF)

前言:当遇到批量读取大量遥感数据进行运算的时候,如果不进行分段读取操作的话,电脑内存可能面临着不够使用的情况,所以我们要进行分段读取数据然后进行运算,运算结束之后把这段数据保存成tif文件。


1 分段读取数据

在这里插入图片描述
如图所示,有三个这样的数据,且该数据为5600行6800列,我们可以分成10个批次分段读取该TIF数据,10个批次以此为0,560,1120,1680,2240,2800,3360,3920,4480,5040,5600。
代码实现:

import os
import numpy as np
from osgeo import gdal, gdalnumeric

def read_tif(filepath):
    dataset = gdal.Open(filepath)
    col = dataset.RasterXSize#图像长度
    row = dataset.RasterYSize#图像宽度
    geotrans = dataset.GetGeoTransform()#读取仿射变换
    proj = dataset.GetProjection()#读取投影
    data = dataset.ReadAsArray()#转为numpy格式
    data = data.astype(np.float32)
    # a = data[0][0]
    # data[data == a] = np.nan
    data[data <= -3] = np.nan
    return [col, row, geotrans, proj, data]

def read_tif02(file):
    data = gdalnumeric.LoadFile(file)
    data = data.astype(np.float32)
    # a = data[0][0]
    # data[data == a] = np.nan
    data[data <= -3] = np.nan
    return data

def get_all_file_name(ndvi_file):
    list1=[]
    if os.path.isdir(ndvi_file):
        fileList = os.listdir(ndvi_file)
        for f in fileList:
            file_name= ndvi_file+"\\"+f
            list1.append(file_name)
        return list1
    else:
        return []

if __name__ == '__main__':
    file_ndvi = r"D:\AAWORK\work\研究方向\研究方向01作物分类内容\风云数据\MERSI-II植被指数旬产品(250M)\NDVI主合成"
    file_out = r"D:\AAWORK\work\2021NDVISUM.tif"
    ndvi_file_list = get_all_file_name(file_ndvi)
    col00, row00, geotrans00, proj00, data_00_ndvi = read_tif(ndvi_file_list[0])
    data_01_ndvi = read_tif02(ndvi_file_list[1])
    data_02_ndvi = read_tif02(ndvi_file_list[2])
    list_row = [0,560,1120,1680,2240,2800,3360,3920,4480,5040,5600]
    for index,i in enumerate(list_row):
        if index <= len(list_row)-2:
            print(list_row[index],list_row[index+1])
            #分段进行操作
            # sum_list = get_section(list_row[index],list_row[index+1],col00,data_00_ndvi,data_01_ndvi,data_02_ndvi)
            # 分段进行保存
            # save_section(sum_list, list_row[index], list_row[index+1], col00,data_00_ndvi,data_01_ndvi,data_02_ndvi)

在这里插入图片描述

2 实现分批读取数据以及进行计算

拿到开始的行和结束的行数,进行分批读取数据并进行计算,(这里求和求的是整数,如有需要的话可以自己更改)代码如下:

import os
import tensorflow as tf
import numpy as np
import pandas as pd
from osgeo import gdal, gdalnumeric

def get_sum_list(data_list):
    list1 = []
    for data in data_list:
        sum = 0
        for d in data:
            if not np.isnan(d):
                sum = sum+d
        list1.append(int(sum))
    return list1

def read_tif(filepath):
    dataset = gdal.Open(filepath)
    col = dataset.RasterXSize#图像长度
    row = dataset.RasterYSize#图像宽度
    geotrans = dataset.GetGeoTransform()#读取仿射变换
    proj = dataset.GetProjection()#读取投影
    data = dataset.ReadAsArray()#转为numpy格式
    data = data.astype(np.float32)
    # a = data[0][0]
    # data[data == a] = np.nan
    data[data <= -3] = np.nan
    return [col, row, geotrans, proj, data]

def read_tif02(file):
    data = gdalnumeric.LoadFile(file)
    data = data.astype(np.float32)
    # a = data[0][0]
    # data[data == a] = np.nan
    data[data <= -3] = np.nan
    return data

def get_all_file_name(ndvi_file):
    list1=[]
    if os.path.isdir(ndvi_file):
        fileList = os.listdir(ndvi_file)
        for f in fileList:
            file_name= ndvi_file+"\\"+f
            list1.append(file_name)
        return list1
    else:
        return []

def get_nan_sum(ndvi_list):
    """
    得到NAN数据的个数
    :param ndvi_list:
    :return:
    """
    count = 0
    for ndvi in ndvi_list:
        if np.isnan(ndvi):
            count = count+1
    return count

def get_section(row0, row1, col1,data1,data2,data3):
    """
    分段读取数据,读取的数据进行计算
    :param row0:
    :param row1:
    :param col1:
    :param data1:
    :param data2:
    :param data3:
    :return:
    """
    list1 = []
    for i in range(row0, row1):  # 行
        for j in range(0, col1):  # 列
            ndvi_list = []
            ndvi_list.append(data1[i][j])
            ndvi_list.append(data2[i][j])
            ndvi_list.append(data3[i][j])
            if get_nan_sum(ndvi_list)>1:
                pass
            else:
                list1.append(ndvi_list)
            ndvi_list = None
    sum_list = get_sum_list(list1)
    list1 = None
    return sum_list


if __name__ == '__main__':
    file_ndvi = r"D:\AAWORK\work\研究方向\研究方向01作物分类内容\风云数据\MERSI-II植被指数旬产品(250M)\NDVI主合成"
    file_out = r"D:\AAWORK\work\2021NDVISUM.tif"
    ndvi_file_list = get_all_file_name(file_ndvi)
    col00, row00, geotrans00, proj00, data_00_ndvi = read_tif(ndvi_file_list[0])
    data_01_ndvi = read_tif02(ndvi_file_list[1])
    data_02_ndvi = read_tif02(ndvi_file_list[2])
    list_row = [0,560,1120,1680,2240,2800,3360,3920,4480,5040,5600]
    for index,i in enumerate(list_row):
        if index <= len(list_row)-2:
            print(list_row[index],list_row[index+1])
            #分段进行操作
            sum_list = get_section(list_row[index],list_row[index+1],col00,data_00_ndvi,data_01_ndvi,data_02_ndvi)
            print(np.array(sum_list))
            # 分段进行保存
            # save_section(sum_list, list_row[index], list_row[index+1], col00,data_00_ndvi,data_01_ndvi,data_02_ndvi)

在这里插入图片描述

3 实现分批保存成TIF文件(所有完整代码)

在2中已经得到了每一批的list结果,我们拿到list结果之后,可以进行保存成tif文件。代码如下:

import os
import numpy as np
from osgeo import gdal, gdalnumeric

def get_sum_list(data_list):
    list1 = []
    for data in data_list:
        sum = 0
        for d in data:
            if not np.isnan(d):
                sum = sum+d
        list1.append(int(sum))
    return list1

def read_tif(filepath):
    dataset = gdal.Open(filepath)
    col = dataset.RasterXSize#图像长度
    row = dataset.RasterYSize#图像宽度
    geotrans = dataset.GetGeoTransform()#读取仿射变换
    proj = dataset.GetProjection()#读取投影
    data = dataset.ReadAsArray()#转为numpy格式
    data = data.astype(np.float32)
    # a = data[0][0]
    # data[data == a] = np.nan
    data[data <= -3] = np.nan
    return [col, row, geotrans, proj, data]

def read_tif02(file):
    data = gdalnumeric.LoadFile(file)
    data = data.astype(np.float32)
    # a = data[0][0]
    # data[data == a] = np.nan
    data[data <= -3] = np.nan
    return data

def get_all_file_name(ndvi_file):
    list1=[]
    if os.path.isdir(ndvi_file):
        fileList = os.listdir(ndvi_file)
        for f in fileList:
            file_name= ndvi_file+"\\"+f
            list1.append(file_name)
        return list1
    else:
        return []

def save_tif(data, file, output):
    """
    保存成tif
    :param data:
    :param file:
    :param output:
    :return:
    """
    ds = gdal.Open(file)
    shape = data.shape
    driver = gdal.GetDriverByName("GTiff")
    dataset = driver.Create(output, shape[1], shape[0], 1, gdal.GDT_Float32)#保存的数据类型
    dataset.SetGeoTransform(ds.GetGeoTransform())
    dataset.SetProjection(ds.GetProjection())
    dataset.GetRasterBand(1).WriteArray(data)

def get_nan_sum(ndvi_list):
    """
    得到NAN数据的个数
    :param ndvi_list:
    :return:
    """
    count = 0
    for ndvi in ndvi_list:
        if np.isnan(ndvi):
            count = count+1
    return count

def get_section(row0, row1, col1,data1,data2,data3):
    """
    分段读取数据,读取的数据进行计算
    :param row0:
    :param row1:
    :param col1:
    :param data1:
    :param data2:
    :param data3:
    :return:
    """
    list1 = []
    for i in range(row0, row1):  # 行
        for j in range(0, col1):  # 列
            ndvi_list = []
            ndvi_list.append(data1[i][j])
            ndvi_list.append(data2[i][j])
            ndvi_list.append(data3[i][j])
            if get_nan_sum(ndvi_list)>1:
                pass
            else:
                list1.append(ndvi_list)
            ndvi_list = None
    sum_list = get_sum_list(list1)
    list1 = None
    return sum_list

def save_section(sum_list, row0, row1, col1,data1,data2,data3):
    """
    保存分段的数据
    :param sum_list:
    :param row0:
    :param row1:
    :param col1:
    :param data1:
    :param data2:
    :param data3:
    :return:
    """
    file = r"D:\AAWORK\work\研究方向\研究方向01作物分类内容\风云数据\MERSI-II植被指数旬产品(250M)\kongbai_zhu_250m.tif"#这是一个空白数据,每个像元的值为0
    data = read_tif02(file)
    m = 0
    for i in range(row0, row1):  # 行
        for j in range(0, col1):  # 列
            ndvi_list = []
            ndvi_list.append(data1[i][j])
            ndvi_list.append(data2[i][j])
            ndvi_list.append(data3[i][j])
            if get_nan_sum(ndvi_list)>1:
                pass
            else:
                data[i][j] = sum_list[m]
                m = m + 1
    save_tif(data,file,file_out.replace(".tif","_"+str(row0)+"_"+str(row1)+".tif"))
    data = None


if __name__ == '__main__':
    file_ndvi = r"D:\AAWORK\work\研究方向\研究方向01作物分类内容\风云数据\MERSI-II植被指数旬产品(250M)\NDVI主合成"
    file_out = r"D:\AAWORK\work\2021NDVISUM.tif"
    ndvi_file_list = get_all_file_name(file_ndvi)
    col00, row00, geotrans00, proj00, data_00_ndvi = read_tif(ndvi_file_list[0])
    data_01_ndvi = read_tif02(ndvi_file_list[1])
    data_02_ndvi = read_tif02(ndvi_file_list[2])
    list_row = [0,560,1120,1680,2240,2800,3360,3920,4480,5040,5600]
    for index,i in enumerate(list_row):
        if index <= len(list_row)-2:
            print(list_row[index],list_row[index+1])
            #分段进行操作
            sum_list = get_section(list_row[index],list_row[index+1],col00,data_00_ndvi,data_01_ndvi,data_02_ndvi)
            print(np.array(sum_list))
            # 分段进行保存
            save_section(sum_list, list_row[index], list_row[index+1], col00,data_00_ndvi,data_01_ndvi,data_02_ndvi)

在这里插入图片描述
在这里插入图片描述

4 分段TIF整合到一个TIF

我们要把上述10个TIF文件整合到一个TIF文件里,方法很多,我这里提供一个方法,供大家使用,代码如下:

import os

from osgeo import gdalnumeric, gdal
import numpy as np


def get_all_file_name(file):
    list1=[]
    if os.path.isdir(file):
        fileList = os.listdir(file)
        for f in fileList:
            file_name= file+"\\"+f
            list1.append(file_name)
        return list1
    else:
        return []

def read_tif(filepath):
    dataset = gdal.Open(filepath)
    col = dataset.RasterXSize#图像长度
    row = dataset.RasterYSize#图像宽度
    geotrans = dataset.GetGeoTransform()#读取仿射变换
    proj = dataset.GetProjection()#读取投影
    data = dataset.ReadAsArray()#转为numpy格式
    data = data.astype(np.float32)
    # a = data[0][0]
    # data[data == a] = np.nan
    data[data <= -3] = np.nan
    return [col, row, geotrans, proj, data]

def read_tif02(file):
    data = gdalnumeric.LoadFile(file)
    data = data.astype(np.float32)
    # a = data[0][0]
    # data[data == a] = np.nan
    data[data <= -3] = np.nan
    return data

def save_tif(data, file, output):
    ds = gdal.Open(file)
    shape = data.shape
    driver = gdal.GetDriverByName("GTiff")
    dataset = driver.Create(output, shape[1], shape[0], 1, gdal.GDT_Int16)#保存的数据类型
    dataset.SetGeoTransform(ds.GetGeoTransform())
    dataset.SetProjection(ds.GetProjection())
    dataset.GetRasterBand(1).WriteArray(data)

if __name__ == '__main__':
    file_path = r"D:\AAWORK\work\分段数据"
    file_out = r"D:\AAWORK\work\2021NDVISUM.tif"
    file_list = get_all_file_name(file_path)
    data_all = read_tif02(r"D:\AAWORK\work\研究方向\研究方向01作物分类内容\风云数据\MERSI-II植被指数旬产品(250M)\kongbai_zhu_250m.tif")
    for file in file_list:
        data = read_tif02(file)
        data_all = data_all+data
    save_tif(data_all,r"D:\AAWORK\work\研究方向\研究方向01作物分类内容\风云数据\MERSI-II植被指数旬产品(250M)\kongbai_zhu_250m.tif",file_out)

在这里插入图片描述

5 生成一个空白TIF(每个像元值为0的TIF)

思路比较简单,就是遍历每个像元,然后把每个像元的值设置为0,设置为其它可以,然后再进行保存。

from osgeo import gdal
import numpy as np

def read_tif(filepath):
    dataset = gdal.Open(filepath)
    col = dataset.RasterXSize#图像长度
    row = dataset.RasterYSize#图像宽度
    geotrans = dataset.GetGeoTransform()#读取仿射变换
    proj = dataset.GetProjection()#读取投影
    data = dataset.ReadAsArray()#转为numpy格式
    data = data.astype(np.float32)
    # a = data[0][0]
    # data[data == a] = np.nan
    # data[data <= -3] = np.nan
    return [col, row, geotrans, proj, data]

def save_tif(data, file, output):
    ds = gdal.Open(file)
    shape = data.shape
    driver = gdal.GetDriverByName("GTiff")
    dataset = driver.Create(output, shape[1], shape[0], 1, gdal.GDT_Int16)#保存的数据类型
    dataset.SetGeoTransform(ds.GetGeoTransform())
    dataset.SetProjection(ds.GetProjection())
    dataset.GetRasterBand(1).WriteArray(data)

if __name__ == '__main__':
    file_path = r"D:\AAWORK\work\2021NDVISUM.tif"
    file_out = r"D:\AAWORK\work\kongbai.tif"
    col, row, geotrans, proj, data = read_tif(file_path)
    for i in range(0,row):
        for j in range(0,col):
            data[i][j] = 0
    
    save_tif(data,file_path,file_out)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/874413.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DIP: Spectral Bias of DIP 频谱偏置解释DIP

On Measuring and Controlling the Spectral Bias of the Deep Image Prior 文章目录 On Measuring and Controlling the Spectral Bias of the Deep Image Prior1. 方法原理1.1 动机1.2 相关概念1.3 方法原理频带一致度量与网络退化谱偏移和网络结构的关系Lipschitz-controlle…

DCMM数据管理成熟度之数据治理-数据治理沟通

​01 标准原文 1 概述 数据治理沟通旨在确保组织内全部利益相关者都能及时了解相关政策、标准、流程、角色、职责、计划的最新情况,开展数据管理和应用相关的培训,掌握数据管理相关的知识和技能。数据治理沟通旨在建立与提升跨部门及部门内部数据管理能力,提升数据资产意识,…

读发布!设计与部署稳定的分布式系统(第2版)笔记31_版本问题

1. 在软件与外部环境之间的许多交汇点上&#xff0c;版本控制基本上处于混乱状态 1.1. 不应该为了更新自身系统的API&#xff0c;而让服务消费者被迫与你同时发布新版本 1.2. 多数服务新版本的发布应该具有兼容性 2. 分层的“约定”栈 2.1. 连接握手和持续时间 2.2. 请求组…

华为在ospf area 0单区域的情况下结合pbr对数据包的来回路径进行控制

配置思路&#xff1a; 两边去的包在R1上用mqc进行下一跳重定向 两边回程包在R4上用mqc进行下一跳重定向 最终让内网 192.168.10.0出去的数据包来回全走上面R-1-2-4 192.168.20.0出去的数据包来回全走 下面R1-3-4 R2和R3就是简单ospf配置和宣告&#xff0c;其它没有配置&#…

Python爬虫(十一)_案例:使用正则表达式的爬虫

本章将结合先前所学的爬虫和正则表达式知识&#xff0c;做一个简单的爬虫案例&#xff0c;更多内容请参考:Python学习指南 现在拥有了正则表达式这把神兵利器&#xff0c;我们就可以进行对爬取到的全部网页源代码进行筛选了。 下面我们一起尝试一下爬取内涵段子网站&#xff1…

《C语言深度解剖》.pdf

&#x1f407; &#x1f525;博客主页&#xff1a; 云曦 &#x1f4cb;系列专栏&#xff1a;深入理解C语言 &#x1f4a8;吾生也有涯&#xff0c;而知也无涯 &#x1f49b; 感谢大家&#x1f44d;点赞 &#x1f60b;关注&#x1f4dd;评论 C语言深度解剖.pdf 提取码:yunx

使用cloud-int部署nginx

参考 azure创建虚拟机,创建虚拟机注意入站端口规则开放80端口&#xff0c;高级中使用自定义数据&#xff0c;初始化虚拟机&#xff0c;安装nginx 连接CLI&#xff0c;验证是否安装成功 访问虚拟机IP查看是否部署成功 参考文档&#xff1a; https://learn.microsoft.com/zh-cn…

代码随想录算法训练营之JAVA|第二十八天|122. 买卖股票的最佳时机 II

今天是第28天刷leetcode&#xff0c;立个flag&#xff0c;打卡60天。 算法挑战链接 122. 买卖股票的最佳时机 IIhttps://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/ 第一想法 题目理解&#xff1a;找到一个升序的段&#xff0c;然后累加每一个升序的段头尾的…

ORCA优化器浅析——CXform base class for all transformations

CXform CXforml类作为所有transformation的基础类&#xff0c;其包含了pattern成员m_pexpr。主要是在exploration和implementation expression流程中使用&#xff0c;主要调用Transform函数。其还包含返回相关xforms的集合函数&#xff0c;比如PbsIndexJoinXforms等。 class …

Centos7多台服务器免密登录

准备四台服务器: docker0 docker1 docker2 docker3 在docker0服务器上生成公钥和私钥 [rootwww ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory /root/.ssh. Enter passp…

2023年03月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;字符长方形 给定一个字符&#xff0c;用它构造一个长为4个字符&#xff0c;宽为3个字符的长方形&#xff0c;可以参考样例输出。 时间限制&#xff1a;1000 内存限制&#xff1a;65536 输入 输入只有一行&#xff0c; 包含一个字符。 输出 该字符构成的长方形…

Mysql主从分离

一、前言 某个应用场景中&#xff0c;在操作数据库这部分&#xff0c;往往是数据库的读取往往大于数据库的写入&#xff0c;当读取数据达到数据库的瓶颈时&#xff0c;性能下滑&#xff0c;影响数据的写入&#xff0c;导致整个应用的不可用。为了解决这个问题&#xff0c;这时&…

java热插拔组件 SPI机制

文章目录 前言一、热插拔(spi机制)是什么&#xff1f;二、使用步骤1.利用java META-INF2.利用google spi3. 测试效果 总结 前言 在项目中,如果想要增加项目的灵活性,健壮性, 高逼格,那么你要对于java中的一些机制有了解; 例如: java中的spi机制spring中的spring.factories 等…

QtCreator ui设置界面 Layout 的属性 layoutStretch

layoutStretch 用于控制Layout在被用户进行缩放时。里面控件的缩放比例。如一个水平布局里面有两个控件 一个 QLineEdit 和 QPushButton。首先将两个控件的尺寸策列的水平策略都设置为Expanding。此时在将包含这两个控件的水平布局的 layoutStretch 进行如下设置。 运行程序就…

权衡与选择:如何巧妙管理项目需求的优先级

在项目管理领域&#xff0c;处理和管理需求可能是最具挑战性的环节之一。每一个项目都充满了各种需求&#xff0c;从业务需求到技术需求&#xff0c;从用户需求到系统需求。而如何有效地为这些需求排列优先级&#xff0c;不仅会影响项目的进度和资源分配&#xff0c;还会直接关…

Azure创建第一个虚拟机

首先&#xff0c;登录到 Azure 门户 (https://portal.azure.com/)。在 Azure 门户右上角&#xff0c;点击“虚拟机”按钮&#xff0c;并点击创建&#xff0c;创建Azure虚拟机。 在虚拟机创建页面中&#xff0c;选择所需的基本配置&#xff0c;包括虚拟机名称、操作系统类型和版…

threejs纹理的使用

实现地板的效果&#xff0c;需要导入3张图片&#xff0c;第一种样式&#xff0c;第二种&#xff0c;木板间的间隙&#xff0c;第三种&#xff0c;木板的粗细图片。先注册一个物体属性&#xff0c;在物体属性上加上图片&#xff0c;注册代码如下图&#xff1a; const floorMat …

乡村振兴指数与其30余个原始变量数据(2000-2022年)

乡村振兴是当下经济学研究的热点之一&#xff0c;对乡村振兴进行测度&#xff0c;是研究基础。测度乡村振兴水平的学术论文广泛发表在《数量经济技术经济研究》等顶刊上。整理了2000-2022年城市层面的乡村振兴指数与其30余个原始变量数据&#xff0c;供大家使用。 数据来源&…

大数据Flink(六十二):批处理的入门案例

文章目录 批处理的入门案例 一、示例 二、​​​​​​​开发步骤

Ae 效果:CC Environment

透视/CC Environment Perspective/CC Environment CC Environment&#xff08;CC 环境&#xff09;主要用于创建 3D 环境映射&#xff0c;可以将一个 2D 图像转换为 3D 空间的反射或折射。该效果通常用于模拟真实世界的全景相机镜头和环境反射。 在实际操作中&#xff0c;可将效…