【问题标题】:Applying raster function to files within subfolders将栅格函数应用于子文件夹中的文件
【发布时间】:2019-04-15 07:41:42
【问题描述】:

我正在尝试通过划分为文件夹的 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'。我还认为其余的代码可能不起作用(替换函数除外,它应该),所以我喜欢关于如何执行这个(可以说非常简单)任务的建议。非常感谢。

【问题讨论】:

    标签: r loops r-raster


    【解决方案1】:

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

    【讨论】:

    • 谢谢。我明白你在这里得到什么,所以我能够让我的代码工作。
    猜你喜欢
    • 2013-04-19
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    相关资源
    最近更新 更多