Python遥感开发之批量对TIF数据合并

news2024/11/26 0:54:14

Python遥感开发之批量对TIF数据合并

  • 1 原始数据展示
  • 2 按照年份合成春夏秋冬季节数据
  • 3 完整代码实现

前言:通常对遥感数据按照月和年或者季节进行分析,我们需要对我们下载的8天或者16天数据按照需求进行合并,对数据的合并一般可以采取均值法、最大值法等。本篇博客以月数据为基础,按照春夏秋冬的季节对月数据进行合并。

1 原始数据展示

2001年到2023年的月数据
在这里插入图片描述

2 按照年份合成春夏秋冬季节数据

实现思路:1. 首先获取所有数据的文件路径,然后编写函数get_year_list获取每一年的list,然后再获取每一个季节的list。
2. 编写合成函数,对一个季节(3个数据)的数据进行拼接,得到一个3D数组 (时间, 行, 列),然后对3D数组进行求均值,切记需要对NAN数据进行排除。
3. 注意如果TIF数据缺失比较多,请先对TIF数据完成插值处理,请参考博客《Python遥感开发之时序数据的线性插值》

3 完整代码实现

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

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

"""
通过传入文件夹的路径,输出文件的完整路径
通过传入文件夹的路径,传入输出的路径和名字,输出传出文件的完整路径
"""
def get_data_list(file_path, out = "", out_name = ""):
    list1 = []  # 文件的完整路径
    if os.path.isdir(file_path):
        fileList = os.listdir(file_path)
        if out_name != "" and out != "":
            for f in fileList:
                file_name = "".join(list(filter(str.isdigit, f))) + ".tif"
                out_data = out + "\\" + out_name + file_name
                list1.append(out_data)
        else:
            for f in fileList:
                pre_data = file_path + '\\' + f  # 文件的完整路径
                list1.append(pre_data)
        return list1

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_Float32)#保存的数据类型
    dataset.SetGeoTransform(ds.GetGeoTransform())
    dataset.SetProjection(ds.GetProjection())
    dataset.GetRasterBand(1).WriteArray(data)

def get_year_list(year,rsei_file_path_list):
    list1 = []
    for rsei_file in rsei_file_path_list:
        if year in rsei_file:
            list1.append(rsei_file)
    return list1

def get_four_cate(year_file_list):
    spring_list = []
    summer_list = []
    autumn_list = []
    winter_list = []
    # print(year_file_list)
    for m in year_file_list:
        # print(m)
        if "-03.tif" in m or "-04.tif" in m or "-05.tif" in m:
            spring_list.append(m)
        if "-06.tif" in m or "-07.tif" in m or "-08.tif" in m:
            summer_list.append(m)
        if "-09.tif" in m or "-10.tif" in m or "-11.tif" in m:
            autumn_list.append(m)
        if "-12.tif" in m or "-01.tif" in m or "-02.tif" in m:
            winter_list.append(m)
    return spring_list,summer_list,autumn_list,winter_list

def merge_tif(output, name, file_list):
    data_list = []
    for tif_file in file_list:
        data = read_tif02(tif_file)
        data_list.append(data)
    # 转换为3D数组 (时间, 行, 列)
    data_array = np.array(data_list)
    new_data = np.nanmean(data_array, axis=0)
    save_tif(new_data, file_list[0], output+"//"+name)
    print("TIFF文件已合并到 %s,采用均值法。" % name)

if __name__ == '__main__':
    rsei_file_path = r"E:\AAWORK\work\研究方向\rsei\data\月-new\rsei-1km"
    rsei_file_path_list = get_data_list(rsei_file_path)
    for i in range(2001,2024):
        year_file_list = get_year_list(str(i),rsei_file_path_list)
        spring_list,summer_list,autumn_list,winter_list = get_four_cate(year_file_list)
        merge_tif(r"E:\AAWORK\work\研究方向\rsei\data\月-new\rsei-spring-new",str(i)+"-spring.tif",spring_list)
        merge_tif(r"E:\AAWORK\work\研究方向\rsei\data\月-new\rsei-summer-new",str(i)+"-summer.tif",summer_list)
        merge_tif(r"E:\AAWORK\work\研究方向\rsei\data\月-new\rsei-autum-new",str(i)+"-autum.tif",autumn_list)
        merge_tif(r"E:\AAWORK\work\研究方向\rsei\data\月-new\rsei-winter-new",str(i)+"-winter.tif",winter_list)
        print("----------")

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

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

相关文章

移动校园(5):课程表数据获取及展示

首先写下静态页面,起初打算做成一周的课表,由于是以小程序的形式展现,所以显示一周的话会很拥挤,所以放弃下面的方案,改作一次显示一天 改后结果如下,后期还会进行外观优化 真正困难的部分是数据获取 大家大…

高德地图 key 和安全密钥使用

参考高德地图:JS API 安全密钥使用 高德地图 key 和安全密钥使用 一、通过明文方式设置参数查看如下成功后返回的信息 二、通过代理服务器转发实验:通过本地地址转发返回错的错误信息,如下通过正确的项目的的服务地址,返回正常参数…

Flink,spark对比

三:az 如何调度Spark、Flink,MR 任务 首先,使用java编写一个spark任务,定义一个类,它有main方法,里面写好逻辑,sparkConf 和JavaSparkContext 获取上下文,然后打成一个jar包&#xf…

深度学习之网络构建

目标 选择合适的神经网络 卷积神经网络(CNN):我们处理图片、视频一般选择CNN 循环神经网络(RNN):我们处理时序数据一般选择RNN 超参数的设置 为什么训练的模型的错误率居高不下 如何调测出最优的超参数 …

Node.js介绍 , 安装与使用

1.Node.js 1 什么是Node.js 官网:https://nodejs.org/zh-cn/ 中文学习网:http://nodejs.cn/learn1.Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。 2.前端的底层 html…

C++、QT企业管理系统

目录 一、项目介绍 二、项目展示 三、源码获取 一、项目介绍 人事端: 1、【产品中心】产品案列、新闻动态的发布; 2、【员工管理】新增、修改、删除、搜索功能;合同以图片的方式上传 3、【考勤总览】根据日期显示所有员工上班、下班时间…

下载nvm 管理多个node版本并切换

nvm管理多个node版本并切换 安装nvm时不能安装任何node版本(先删除node再安装nvm),保证系统无任何node.js残留 1. 卸载node 控制面板中卸载nodejs 删除以下文件夹: C:\Program Files (x86)\Nodejs C:\Program Files\Nodejs C…

聚类分析方法(一)

目录 一、聚类分析原理(一)聚类分析概述(二)聚类的数学定义(三)簇的常见类型(四)聚类框架及性能要求(五)簇的距离 二、划分聚类算法(一&#xff0…

【matlab】状态空间模型与传递函数模型的建立与转换

目录 SISO系统 MIMO系统 状态空间模型 状态空间模型到传递函数模型的转换 传递函数模型到状态空间模型的转换 (1) 转换函数ss() (2) 规范形转换函数canon() (3) 常微分方程(传递函数)转换为状态空间模型函数dif2ss() 状态空间模型的变换 特征值、特征向量与广义特征向量的计算…

进程控制-wait和waitpid进程回收

wait 阻塞函数 函数作用: 1. 阻塞并等待子进程退出 2. 回收子进程残留资源 3. 获取子进程结束状态(退出原因) pid_t wait(int *wstatus); 返回值: ‐1 : 回收失败,已经没有子进程了 >0 : 回收子进程对应的…

线上问题---反思与回顾

线上问题一:麦哲伦2.0 人群配置不生效 发现背景:产品发现三层模型部分计划个别测试计划圈选人群特征与数仓统计数据的人群不一致,向值班人员反馈 根因定位: (1)用户配置三层模型计划时,配置单…

文心一言 VS 讯飞星火 VS chatgpt (297)-- 算法导论22.1 1题

一、给定有向图的邻接链表,需要多长时间才能计算出每个结点的出度(发出的边的条数)?多长时间才能计算出每个结点的入度(进入的边的条数)?如果要写代码,请用go语言。 文心一言: 计算出度 对于有向图的邻接链表表示&a…

rufus-4.5 制作 Clonezilla(再生龙)启动盘报syslinux-6.04下载错误

1、官网下载rufus 官网下载rufus-4.5,下载地址:https://rufus.ie/downloads/ 2、下载再生龙(Clonezilla) 下载最新版本: Clonezilla live 版本: 3.1.2-22:https://sourceforge.net/projects/clonezill…

在 Docker 容器中运行 Vite 开发环境,有这两个问题要注意

容器化开发给我们带来了很多便捷,但是在开发环境下也有一些问题要注意,如果不解决这些问题,你的开发体验不会很好。 容器启动正常,却无法访问 我们用 Docker 启动一个 Vite Vue3 项目的开发环境后,发现端口日志一切…

Springboot使用WebSocket发送消息

1. 创建springboot项目&#xff0c;引入spring-boot-starter-websocket依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>完整项目依赖 <?xml ver…

【游戏客户端】大话版本slg玩法正式上线~~

【游戏客户端】制作率土之滨Like玩法 大家好&#xff0c;我是Lampard家杰~~ 好久好久没有更新博客了&#xff0c;有不少大佬都在后台私信我催更&#xff0c;但是很悲伤这段时间都忙的不行QAQ 那在忙什么呢&#xff1f;就是在制作一个SLG类的玩法【帮派纷争】啦 &#xff0c;布…

RNN、LSTM与GRU循环神经网络的深度探索与实战

循环神经网络RNN、LSTM、GRU 一、引言1.1 序列数据的迷宫探索者&#xff1a;循环神经网络&#xff08;RNN&#xff09;概览1.2 深度探索的阶梯&#xff1a;LSTM与GRU的崛起1.3 撰写本博客的目的与意义 二、循环神经网络&#xff08;RNN&#xff09;基础2.1 定义与原理2.1.1 RNN…

java 闭锁(CountDownLatch)

闭锁&#xff08;CountDownLatch&#xff09;是Java中的一个同步辅助类&#xff0c;用于协调多个线程之间的协作。它允许一个或多个线程等待&#xff0c;直到在其他线程中执行的一组操作完成。闭锁非常适用于需要等待一组事件发生之后再执行某些操作的场景。 import java.uti…

【Java】垃圾回收学习笔记(二):分代假说与垃圾回收算法

文章目录 0. 分代收集理论分代假说分代GC定义 1. 垃圾回收算法1.1 标记清除&#xff08;Mark-Sweep&#xff09;算法优点缺点 1.2 标记复制算法优点缺点为什么是8:1:1&#xff1f; 1.3 标记整理算法优点缺点 2. 是否移动&#xff1f; 0. 分代收集理论 分代假说 现在多数JVM G…

Python编程学习笔记(2)--- 列表简介

1、列表是什么 列表由一系列按特定顺序排列的元素组成。可以创建包含字母表中所有字母、数字、0~9或所有家庭成员姓名的列表&#xff1b;也可以将任何东西加入列表中&#xff0c;其中的元素之间可以没有任何关系。列表通常包含多个元素&#xff0c;因此给列表指定一个表示复数…