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


前言:通常对遥感数据按照月和年或者季节进行分析,我们需要对我们下载的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("----------")
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等待着冬天的风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值