我正在尝试通过分成文件夹的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'
。我还认为其余代码可能无法正常工作(应该使用替代功能除外),因此我很乐意提供有关如何执行此任务(可能非常简单)的建议。非常感谢。
答案 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"