如何使用lapply批处理R中的geoTIFF

时间:2017-12-01 10:44:28

标签: r lapply r-raster

我有一些大的geoTIFF,现在我想把它们转换成ASCII文件,在做了一些搜索后,我写了这些代码:

library(raster)

f <- list.files("inputFolder", pattern = "*.tif", full.names = TRUE)
r <- lapply(f, raster)
a <- lapply(r, writeRaster, filename = "output", format = "ascii")

让我感到困惑的是,如何根据原始名称分别命名输出文件?

我试过了:

a <- lapply(r, writeRaster, filename = "outputFolder" + f, format = "ascii")

但我收到了错误:

  

二元运算符的非数字参数

然后我尝试了:

a <- lapply(r, writeRaster, filename = paste0(f, ".asc"), format = "ascii")

但我收到了:

  

文件错误(文件名,“w”):无效的'description'参数In   另外:警告消息:1:在if(filename ==“”){:   条件的长度> 1,只使用第一个元素2:In   if(!file.exists(dirname(filename))){:条件有长度&gt;   1,只使用第一个元素3:在if中   (toupper(x @ file @ name)== toupper(filename)){:条件有   长度> 1,只使用第一个元素4:在if中   (trim(filename)==“”){:条件有长度&gt; 1而且只有   第一个元素将被使用5:在if(!file.exists(dirname(filename)))   {:条件长度> 1,只有第一个元素   used 6:in if(filename ==“”){:条件长度&gt; 1和   只使用第一个元素7:In if(!overwrite&amp;   file.exists(filename)){:条件有长度&gt; 1而且只有   将使用第一个元素

2 个答案:

答案 0 :(得分:2)

我认为你基本上就在那里,有两处更正:

首先,您正在调用writeRaster的副作用(即将文件写入文件系统的能力),因此您无需分配{{1}的输出循环到一个对象。所以,删除lapply()我们有:

a <-

接下来,lapply(r, writeRaster, filename = paste0(f, ".asc"), format = "ascii") 参数不会以这种方式循环遍历filename。您有两个选项,其中最简单的可能是使用匿名函数将f @file@name插槽传递给r参数:

filename

您的另一个选择是并行lapply(r, function(x) { writeRaster(x, filename = x@file@name, format = "ascii", overwrite = TRUE) }) r,就像使用f的python一样,可以使用for r, f in...完成:

purrr

我们在这里使用library("purrr") walk2(r, f, function(x, y) { writeRaster(x = x, filename = y, format = "ascii") }) 而不是walk2(),因为我们需要为副作用调用该函数。这会一起遍历map2()r,因此您可以传递一个作为要写入的对象,一个作为文件名。

编辑:这是我用来重现问题的代码

f

答案 1 :(得分:1)

要测试如何使用小文件执行此操作:

library(raster)
s <- stack(system.file("external/rlogo.grd", package="raster")) 
writeRaster(s, file='testtif', format='GTiff', bylayer=T, overwrite=T)
f <- list.files(pattern="testtif_..tif")

现在,您可以将f与Phil的好例子结合使用。您还可以将所有步骤合并到一起:

f <- list.files("inputFolder", pattern = "*.tif", full.names = TRUE)
r <- lapply(f, function(i) { writeRaster(raster(i), filename=extension(i, '.asc'), overwrite=TRUE)} )

但是如果你有lapply的麻烦,写一个循环(没关系!):

for (i in 1:length(f)) {
   r <- raster(f[i])
   ff <- extension(f[i], '.asc')
   writeRaster(r, ff)
}

或者像这样

for (file in f) {
   r <- raster(file)
   ff <- extension(file, '.asc')
   writeRaster(r, ff)
}