R言语遍历文件夹求取其间一切栅格文件的平均值
本文介绍根据R言语中的raster
包,遍历读取多个文件夹下的多张栅格遥感印象,别离批量对每一个文件夹中的多个栅格图画核算平均值,并将所得各个成果栅格别离加以保存的办法。
其间,本文是用R言语来进行操作的;假如期望根据Python言语完成相似的平均值求取操作,咱们能够参阅Python ArcPy批量核算多时相遥感印象的各像元平均值与Python疏忽NoData核算多张遥感印象的像元平均值:whitebox库这两篇文章。
首要,来看一下本文所需完成的需求。如下图所示,现有多个文件夹,其间每一个文件夹内部都含有很多的栅格遥感印象。
其间,上图中的每一个文件夹的命名都是以遥感印象的分幅条带号为根据的。例如,翻开第一个名为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$", 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言语的raster包读取遥感印象。接下来,咱们需求指定成果寄存的途径,并将其放入变量result_path
中。
接下来,咱们经过list.files()
函数,将包括有各个条带号的小文件夹的大文件夹(也便是本文最初第一张图所示的文件夹)加以遍历,将每一个小文件夹的途径存入tif_folder
。履行上述前3
行代码后,得到的tif_folder
成果如下图所示。
能够看到,tif_folder
是一个字符串,其间每一个元素都是每一个小文件夹的途径。
接下来的for
循环,便是对tif_folder
加以遍历,即对每一个小文件夹进行操作。其间,咱们首要经过substr()
函数,获取当时操作的小文件夹称号,并将其寄存于folder_name
中;随后,对当时对应的小文件夹加以遍历,取出其间的悉数遥感印象文件,并寄存于tif_file_name
;接下来,便是读取悉数遥感印象,并核算其平均值;这儿详细的代码解说咱们能够参阅文章R言语求取很多遥感印象的平均值、标准差:raster库。此外需求留意的是,因为我这儿每一景遥感印象本来没有专门设置NoData值,而是用-10000
作为其NoData值,因而需求经过NAvalue(tif_file_all) <- -10000
这句代码,将值为-10000
的像元作为NoData值的像元,避免后期核算平均值时对成果加以搅扰。
接下来,咱们经过file.path()
函数装备一下输出成果的途径——其间,成果遥感印象文件的称号就能够直接以其所对应的条带号来设置,并在条带号后增加一个_mean
后缀,标明这个是平均值的成果图画;但此外,这个仅仅是文件的姓名,还需求将文件名与途径拼接在一起,才能够成为完好的保存途径,因而需求用到file.path()
函数。最终,将成果图画经过writeRaster()
函数加以保存即可,这句代码的解说咱们相同参阅R言语求取很多遥感印象的平均值、标准差:raster库这篇文章即可。
最终,因为咱们要处理的文件夹比较多,因而能够经过cat()
函数输出一下当时代码的运转进展。
运转上述代码,咱们将在指定的成果保存途径中看到每一个条带号对应的平均值成果图画,如下图所示。
至此,功德圆满。