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("----------")