【问题标题】:Error when using do.call to merge multi-band satellite image raster bricks in RStudio在 RStudio 中使用 do.call 合并多波段卫星图像栅格砖时出错
【发布时间】:2018-05-21 01:26:37
【问题描述】:

我正在尝试在 R 中合并一些多波段卫星图像(不幸的是,由于版权问题,我无法分享这些图像)。它们具有相同的大小和分辨率,它们之间有轻微的重叠。当我单独导入每个图像并合并它们时,没有问题:

library(raster)

raster1 <- brick("path/multi-band-raster1")
raster2 <- brick("path/multi-band-raster2")
raster3 <- brick("path/multi-band-raster3")
raster4 <- brick("path/multi-band-raster4")
raster5 <- brick("path/multi-band-raster5")

merged_scene <- merge(raster1, raster2, raster3, raster4, raster5)

但是,我的目标是使我的代码尽可能灵活,以便我可以将其重新应用于不同的图像集。为此,我将栅格加载为列表,然后使用 do.call() 函数,以便 merge 函数获取表示列表中栅格砖的所有参数:

folder <- paste0(getwd(),"/Images-folder/")
list.filenames <- list.files(folder, pattern=".tif$", full.names=FALSE)
list.data <- list()

for (i in 1:length(list.filenames)){
  list.data[[i]] <- brick(paste0(folder,list.filenames[i]))
}

names(list.data) <- list.filenames

merged_scene <- do.call(merge, list.data)

但是,当我运行它时,我得到:

Error in as.data.frame(x) : argument "x" is missing, with no default

如果您能看出我哪里出错了,请告诉我。非常感谢。

【问题讨论】:

  • 列表中有多少个数据框?如果超过 2 则您正在寻找 Reduce 而不是 do.call
  • 我有 5 个。Reduce 只能迭代地应用二进制函数来应用函数。 do.call 应该能够同时接受两个以上的参数。例如do.call("complex", list(imag = 1:3)) 所以我不明白为什么我必须使用reduce
  • Reduce 给出以下内存错误:Error in base::rowSums(x, na.rm = na.rm, dims = dims, ...) : 'Calloc' could not allocate memory (25000000 of 16 bytes)

标签: r gis raster r-raster


【解决方案1】:

不要把names 给你的砖头。

require(raster)

names(rlist) <- c("foo", "bar", "baz")
merged_scene <- do.call(merge, rlist)
# Error in as.data.frame(x) : argument "x" is missing, with no default

rlist <- list(raster1, raster2, raster3) # no names()
merged_scene <- do.call(merge, rlist)

merged_scene
class       : RasterBrick 
dimensions  : 77, 101, 7777, 3  (nrow, ncol, ncell, nlayers)
resolution  : 1, 1  (x, y)
extent      : 0, 101, 0, 77  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=merc +datum=WGS84 
data source : in memory
names       : layer.1, layer.2, layer.3 
min values  :       0,       0,       0 
max values  :     255,     255,     255 

数据:

raster1 <- brick(system.file("external/rlogo.grd", package="raster"))
raster2 <- brick(system.file("external/rlogo.grd", package="raster"))
raster3 <- brick(system.file("external/rlogo.grd", package="raster"))

rlist <- list(raster1, raster2, raster3)

【讨论】:

  • 感谢安德鲁,没有给砖块起名字解决了这个问题。 (- 实际上并没有出现在我的代码中,只是我的问题中的一个错字)
  • 不客气。更新了我的答案以忽略错字。
  • 或者更确切地说,将前两个列表元素命名为xy。即names(rlist)[1:2] &lt;- c('x', 'y'),使其与合并的参数匹配。
  • 我发现列表周围的 unname 只是让它起作用。 do.call(merge, unname(rlist))
猜你喜欢
  • 2018-11-27
  • 2013-03-16
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
相关资源
最近更新 更多