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

时间:2019-04-15 07:41:43

标签: r loops r-raster

我正在尝试通过分成文件夹的GeoTIFF文件从R程序Raster应用一个简单的功能。

我的文件被组织在一个名为'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'。我还认为其余代码可能无法正常工作(应该使用替代功能除外),因此我很乐意提供有关如何执行此任务(可能非常简单)的建议。非常感谢。

1 个答案:

答案 0 :(得分:2)

您的文件没有包含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"