??本文介紹基于R語言中的raster包,遍歷讀取多個文件夾下的多張柵格遙感影像,分別批量對每一個文件夾中的多個柵格圖像計算平均值,并將所得各個結(jié)果柵格分別加以保存的方法。
??其中,本文是用R語言來進(jìn)行操作的;如果希望基于Python語言實現(xiàn)類似的平均值求取操作,大家可以參考ArcPy批量對多景多時相柵格圖像逐像元計算像素平均值(http://www.itdecent.cn/p/45c5b58eb1df)與Python whitebox對多時相柵格圖像忽略無效值NoData求取各像元平均(http://www.itdecent.cn/p/1f94e652fe9d)這兩篇文章。
??首先,來看一下本文所需實現(xiàn)的需求。如下圖所示,現(xiàn)有多個文件夾,其中每一個文件夾內(nèi)部都含有大量的柵格遙感影像。

??其中,上圖中的每一個文件夾的命名都是以遙感影像的分幅條帶號為依據(jù)的。例如,打開第一個名為47RMN的文件夾,其中均為條帶號為47RMN(即同一空間范圍)、不同成像時間的遙感影像,如下圖所示;其中,紫色框內(nèi)的遙感影像文件名即可看出,這些圖像是同一條帶號、不同時間的遙感影像數(shù)據(jù)。

??我們要做的,就是分別對每一個文件夾中的全部遙感影像計算平均值,從而得到不同條帶號遙感影像的平均值;最終我們將得到多張結(jié)果圖像,每一景結(jié)果圖像就是這一條帶號、不同成像時間對應(yīng)的遙感影像的平均值。同時為了方便區(qū)分,我們需要將每一景結(jié)果圖像文件的文件名設(shè)置為與條帶號有關(guān)的內(nèi)容。
??明確了需求,我們即可開始代碼的撰寫。本文所用到的代碼如下所示。
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)代碼,導(dǎo)入本文所需的R語言raster包;關(guān)于這一包的配置,大家可以參考R語言讀取柵格遙感影像數(shù)據(jù)的方法(http://www.itdecent.cn/p/675f2edb16c3)。接下來,我們需要指定結(jié)果存放的路徑,并將其放入變量result_path中。
??接下來,我們通過list.files()函數(shù),將包含有各個條帶號的小文件夾的大文件夾(也就是本文開頭第一張圖所示的文件夾)加以遍歷,將每一個小文件夾的路徑存入tif_folder。執(zhí)行上述前3行代碼后,得到的tif_folder結(jié)果如下圖所示。

??可以看到,tif_folder是一個字符串,其中每一個元素都是每一個小文件夾的路徑。
??接下來的for循環(huán),就是對tif_folder加以遍歷,即對每一個小文件夾進(jìn)行操作。其中,我們首先通過substr()函數(shù),獲取當(dāng)前操作的小文件夾名稱,并將其存放于folder_name中;隨后,對當(dāng)前對應(yīng)的小文件夾加以遍歷,取出其中的全部遙感影像文件,并存放于tif_file_name;接下來,就是讀取全部遙感影像,并計算其平均值;這里具體的代碼解釋大家可以參考文章R語言批量計算大量柵格圖像平均值、標(biāo)準(zhǔn)差(http://www.itdecent.cn/p/309c1beb656c)。此外需要注意的是,由于我這里每一景遙感影像原本沒有專門設(shè)置NoData值,而是用-10000作為其NoData值,因此需要通過NAvalue(tif_file_all) <- -10000這句代碼,將值為-10000的像元作為NoData值的像元,防止后期計算平均值時對結(jié)果加以干擾。
??接下來,我們通過file.path()函數(shù)配置一下輸出結(jié)果的路徑——其中,結(jié)果遙感影像文件的名稱就可以直接以其所對應(yīng)的條帶號來設(shè)置,并在條帶號后添加一個_mean后綴,表明這個是平均值的結(jié)果圖像;但此外,這個僅僅是文件的名字,還需要將文件名與路徑拼接在一起,才可以成為完整的保存路徑,因此需要用到file.path()函數(shù)。最后,將結(jié)果圖像通過writeRaster()函數(shù)加以保存即可,這句代碼的解釋大家同樣參考R語言批量計算大量柵格圖像平均值、標(biāo)準(zhǔn)差(http://www.itdecent.cn/p/309c1beb656c)這篇文章即可。
??最后,由于我們要處理的文件夾比較多,因此可以通過cat()函數(shù)輸出一下當(dāng)前代碼的運(yùn)行進(jìn)度。
??運(yùn)行上述代碼,我們將在指定的結(jié)果保存路徑中看到每一個條帶號對應(yīng)的平均值結(jié)果圖像,如下圖所示。

??至此,大功告成。