R语言遍历文件夹求取其中所有栅格文件的平均值
<p> 本文介绍基于<strong>R</strong>语言中的<code>raster</code>包,遍历读取<strong>多个文件夹</strong>下的<strong>多张栅格遥感影像</strong>,分别批量对<strong>每一个文件夹</strong>中的<strong>多个栅格图像</strong>计算<strong>平均值</strong>,并将所得<strong>各个结果栅格</strong>分别加以保存的方法。</p><p> 其中,本文是用<strong>R</strong>语言来进行操作的;如果希望基于<strong>Python</strong>语言实现类似的平均值求取操作,大家可以参考Python ArcPy批量计算多时相遥感影像的各像元平均值与Python忽略NoData计算多张遥感影像的像元平均值:whitebox库这两篇文章。</p>
<p> 首先,来看一下本文所需实现的需求。如下图所示,现有多个文件夹,其中每一个文件夹内部都含有大量的栅格遥感影像。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202406/3080295-20240628132320283-131925328.png"></p>
<p> 其中,上图中的每一个文件夹的命名都是以遥感影像的<strong>分幅条带号</strong>为依据的。例如,打开第一个名为<code>47RMN</code>的文件夹,其中均为条带号为<code>47RMN</code>(即同一空间范围)、<strong>不同成像时间</strong>的遥感影像,如下图所示;其中,紫色框内的遥感影像文件名即可看出,这些图像是<strong>同一条带号</strong>、<strong>不同时间</strong>的遥感影像数据。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202406/3080295-20240628132316904-635580591.png"></p>
<p> 我们要做的,就是分别对每一个文件夹中的全部遥感影像计算平均值,从而得到<strong>不同条带号</strong>遥感影像的平均值;最终我们将得到<strong>多张</strong>结果图像,每一景结果图像就是<strong>这一条带号</strong>、<strong>不同成像时间</strong>对应的遥感影像的平均值。同时为了方便区分,我们需要将每一景结果图像文件的文件名设置为与<strong>条带号</strong>有关的内容。</p>
<p> 明确了需求,我们即可开始代码的撰写。本文所用到的代码如下所示。</p>
<pre><code class="language-r">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")
}
</code></pre>
<p> 首先,需要通过<code>library(raster)</code>代码,导入本文所需的<strong>R</strong>语言<code>raster</code>包;关于这一包的配置,大家可以参考基于R语言的raster包读取遥感影像。接下来,我们需要指定结果存放的路径,并将其放入变量<code>result_path</code>中。</p>
<p> 接下来,我们通过<code>list.files()</code>函数,将包含有各个条带号的<strong>小文件夹</strong>的<strong>大文件夹</strong>(也就是本文开头第一张图所示的文件夹)加以遍历,将每一个<strong>小文件夹</strong>的路径存入<code>tif_folder</code>。执行上述前<code>3</code>行代码后,得到的<code>tif_folder</code>结果如下图所示。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202406/3080295-20240628132317165-2009320689.png"></p>
<p> 可以看到,<code>tif_folder</code>是一个字符串,其中每一个元素都是每一个<strong>小文件夹</strong>的路径。</p>
<p> 接下来的<code>for</code>循环,就是对<code>tif_folder</code>加以遍历,即对每一个<strong>小文件夹</strong>进行操作。其中,我们首先通过<code>substr()</code>函数,获取当前操作的<strong>小文件夹</strong>名称,并将其存放于<code>folder_name</code>中;随后,对当前对应的<strong>小文件夹</strong>加以遍历,取出其中的全部<strong>遥感影像文件</strong>,并存放于<code>tif_file_name</code>;接下来,就是读取<strong>全部遥感影像</strong>,并计算其平均值;这里具体的代码解释大家可以参考文章R语言求取大量遥感影像的平均值、标准差:raster库。此外需要注意的是,由于我这里每一景遥感影像原本没有专门设置<strong>NoData</strong>值,而是用<code>-10000</code>作为其<strong>NoData</strong>值,因此需要通过<code>NAvalue(tif_file_all) <- -10000</code>这句代码,将值为<code>-10000</code>的像元作为<strong>NoData</strong>值的像元,防止后期计算平均值时对结果加以干扰。</p>
<p> 接下来,我们通过<code>file.path()</code>函数配置一下输出结果的路径——其中,结果遥感影像文件的名称就可以直接以其所对应的<strong>条带号</strong>来设置,并在条带号后添加一个<code>_mean</code>后缀,表明这个是平均值的结果图像;但此外,这个仅仅是文件的名字,还需要将文件名与路径拼接在一起,才可以成为完整的保存路径,因此需要用到<code>file.path()</code>函数。最后,将结果图像通过<code>writeRaster()</code>函数加以保存即可,这句代码的解释大家同样参考R语言求取大量遥感影像的平均值、标准差:raster库这篇文章即可。</p>
<p> 最后,由于我们要处理的文件夹比较多,因此可以通过<code>cat()</code>函数输出一下当前代码的运行进度。</p>
<p> 运行上述代码,我们将在指定的结果保存路径中看到<strong>每一个条带号</strong>对应的平均值结果图像,如下图所示。</p>
<p><img src="https://img2024.cnblogs.com/blog/3080295/202406/3080295-20240628132316822-1710158647.png"></p>
<p> 至此,大功告成。</p><br><br>
来源:https://www.cnblogs.com/fkxxgis/p/18273020
頁:
[1]