网站首页 > 技术文章 正文
本文介绍基于R语言中的raster包,遍历读取多个文件夹下的多张栅格遥感影像,分别批量对每一个文件夹中的多个栅格图像计算平均值,并将所得各个结果栅格分别加以保存的方法。
其中,本文是用R语言来进行操作的;如果希望基于Python语言实现类似的平均值求取操作,大家可以参考ArcPy对多张长时间序列栅格影像逐像元批量求取像素平均值与Python中whitebox忽略无效值NoData求取多时相栅格图像像素平均值这两篇文章。
首先,来看一下本文所需实现的需求。如下图所示,现有多个文件夹,其中每一个文件夹内部都含有大量的栅格遥感影像。
其中,上图中的每一个文件夹的命名都是以遥感影像的分幅条带号为依据的。例如,打开第一个名为47RMN的文件夹,其中均为条带号为47RMN(即同一空间范围)、不同成像时间的遥感影像,如下图所示;其中,紫色框内的遥感影像文件名即可看出,这些图像是同一条带号、不同时间的遥感影像数据。
我们要做的,就是分别对每一个文件夹中的全部遥感影像计算平均值,从而得到不同条带号遥感影像的平均值;最终我们将得到多张结果图像,每一景结果图像就是这一条带号、不同成像时间对应的遥感影像的平均值。同时为了方便区分,我们需要将每一景结果图像文件的文件名设置为与条带号有关的内容。
明确了需求,我们即可开始代码的撰写。本文所用到的代码如下所示。
library(raster)
result_path <- r"(E:\02_Project\01_Chlorophyll\Select\Result)"
tif_folder <- list.files(path = r"(E:\02_Project\01_Chlorophyll\Select)", pattern = NULL, all.files = FALSE, full.names = TRUE)
for (folder in tif_folder){
folder_name <- substr(folder, nchar(folder) - 4, nchar(folder))
tif_file_name <- list.files(path = folder, pattern = ".tif#34;, full.names = TRUE, ignore.case = TRUE)
tif_file_all <- stack(tif_file_name)
NAvalue(tif_file_all) <- -10000
tif_mean <- calc(tif_file_all, fun = mean, na.rm = TRUE)
tif_mean_new <- tif_mean / 100
# plot(tif_mean_new)
result_file_name <- file.path(result_path, paste(folder_name, "_mean.tif", sep = ""))
rf <- writeRaster(tif_mean_new, filename = result_file_name, overwrite = TRUE)
cat(folder_name, "is completed!", "\n")
}
首先,需要通过library(raster)代码,导入本文所需的R语言raster包;关于这一包的配置,大家可以参考R语言读取栅格遥感影像数据的方法。接下来,我们需要指定结果存放的路径,并将其放入变量result_path中。
接下来,我们通过list.files()函数,将包含有各个条带号的小文件夹的大文件夹(也就是本文开头第一张图所示的文件夹)加以遍历,将每一个小文件夹的路径存入tif_folder。执行上述前3行代码后,得到的tif_folder结果如下图所示。
可以看到,tif_folder是一个字符串,其中每一个元素都是每一个小文件夹的路径。
接下来的for循环,就是对tif_folder加以遍历,即对每一个小文件夹进行操作。其中,我们首先通过substr()函数,获取当前操作的小文件夹名称,并将其存放于folder_name中;随后,对当前对应的小文件夹加以遍历,取出其中的全部遥感影像文件,并存放于tif_file_name;接下来,就是读取全部遥感影像,并计算其平均值;这里具体的代码解释大家可以参考文章R语言计算遥感影像的平均值、标准差。此外需要注意的是,由于我这里每一景遥感影像原本没有专门设置NoData值,而是用-10000作为其NoData值,因此需要通过NAvalue(tif_file_all) <- -10000这句代码,将值为-10000的像元作为NoData值的像元,防止后期计算平均值时对结果加以干扰。
接下来,我们通过file.path()函数配置一下输出结果的路径——其中,结果遥感影像文件的名称就可以直接以其所对应的条带号来设置,并在条带号后添加一个_mean后缀,表明这个是平均值的结果图像;但此外,这个仅仅是文件的名字,还需要将文件名与路径拼接在一起,才可以成为完整的保存路径,因此需要用到file.path()函数。最后,将结果图像通过writeRaster()函数加以保存即可,这句代码的解释大家同样参考R语言计算遥感影像的平均值、标准差这篇文章即可。
最后,由于我们要处理的文件夹比较多,因此可以通过cat()函数输出一下当前代码的运行进度。
运行上述代码,我们将在指定的结果保存路径中看到每一个条带号对应的平均值结果图像,如下图所示。
至此,大功告成。
欢迎关注:疯狂学习GIS
猜你喜欢
- 2025-05-16 实用主义 Python 一行命令走天涯
- 2025-05-16 Python的random模块常用方法
- 2025-05-16 python入门-day21-周末复习
- 2025-05-16 Python算法:4.寻找两个正序数组的中位数
- 2025-05-16 今天我学习了Python数据统计分析教程,把笔记分享出来
- 2025-05-16 零基础入门 Python 内置函数:从基础到进阶的实用指南
- 2025-05-16 交互式操作 Excel,所见即所得:Python xlwings 库详解
- 2025-05-16 Python入门-Day 18:Pandas 基础
- 2025-05-16 Python数据分析(四)
- 2025-05-16 Python函数实用教程
- 05-25Python 3.14 t-string 要来了,它与 f-string 有何不同?
- 05-25Python基础元素语法总结
- 05-25Python中的变量是什么东西?
- 05-25新手常见的python报错及解决方案
- 05-2511-Python变量
- 05-2510个每个人都是需要知道Python问题
- 05-25Python编程:轻松掌握函数定义、类型及其参数传递方式
- 05-25Python基础语法
- 257℃Python短文,Python中的嵌套条件语句(六)
- 257℃python笔记:for循环嵌套。end=""的作用,图形打印
- 256℃PythonNet:实现Python与.Net代码相互调用!
- 251℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 251℃Python实现字符串小写转大写并写入文件
- 106℃原来2025是完美的平方年,一起探索六种平方的算吧
- 91℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 81℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)