将栅格函数应用于子文件夹中的文件

Applying raster function to files within subfolders

我正在尝试通过分为文件夹的 GeoTIFF 文件应用 R 程序光栅中的一个简单函数。

我的文件组织在名为 'GeoTIFFs' 的文件夹中,子文件夹名为 'a1'、'a2'...等。我的目标是遍历每个文件,并将 GeoTIFFs 文件夹中每个 .tif 文件的所有栅格值 3 更改为 1。

这是我目前编写的一些代码。它有很多问题。

我知道我应该提供示例数据,但我不知道如何在文件夹中模拟光栅文件,这是我问题的本质。

library(raster)

files = dir('./GeoTIFFs', pattern = '.tif', recursive = TRUE, full.names = TRUE))
nr <- vector("list", length(files))
names(nr) <- files

for (i in 1:length(files)) {
  tmp <- raster(files[i])
  df <- data.frame(id=3, v=1)
  nr[[i]] <- subs(tmp, df, subsWithNA=FALSE)}

此代码成功导入了我的所有文件 (n=370),但它立即停止在 for 循环并出现此错误:

Error in .rasterObjectFromFile(x, band = band, objecttype = "RasterLayer",  : 
  Cannot create a RasterLayer object from this file. (file does not exist)

我很确定这是因为 R 认为文件名是 'a1/geotiff_example.tif' 而不是 'geotiff_example.tif'。我还认为其余的代码可能不起作用(替换函数除外,它应该),所以我很乐意就如何完成这个(可以说非常简单的)任务提出建议。非常感谢。

您的文件没有包含 GeoTIFFs 部分的完整路径:

> files = dir('./GeoTIFFs', pattern = '.tif')
> files
[1] "bar.tif" "foo.tif"

使用full.names=TRUE:

> files = dir('./GeoTIFFs', pattern = '.tif', full.names=TRUE)
> files
[1] "./GeoTIFFs/bar.tif" "./GeoTIFFs/foo.tif"
> 

使用完整路径将 tif 加载到光栅中。

如果你想获取路径的最后一个文件名部分(如果我没看错你的代码,这就是你命名列表的方式)然后使用 basename:

> basename(files)
[1] "bar.tif" "foo.tif"