【问题标题】:subassignment of selected layers in raster brick栅格砖中选定图层的子分配
【发布时间】:2017-01-13 17:13:40
【问题描述】:

我想通过将这些图层与另一个栅格相乘来修改栅格砖中的一部分图层。

例如,如果我们有一个名为“r.brick”的栅格砖,我们尝试将其层 2:4 乘以具有相同行和列尺寸的栅格“r.mult”:

  • r.brick[[2:4]] 按预期返回层 2:4

  • r.brick[[2:4]] * r.mult 按预期成功地增加了这些层

但是,如果我尝试将结果分配回子集层,则会出现错误

r.brick[[2:4]] = r.brick[[2:4]] * r.mult
# Error in value[] <- val : 
#   incompatible types (from S4 to double) in subassignment type fix

错误消息表明分配正在尝试分配栅格,而不是栅格本身。但是如果我尝试使用getValues 分配,我会得到一个不同的错误:

r.brick[[2:4]] = getValues(r.brick[[2:4]] * r.mult)
# Error in .local(x, values, ...) : length(values) is not equal to ncell(x)

这样做的正确方法是什么?

一些可重现的数据:

library(raster)
r.list = vector("list", 20)
set.seed(123)
for (i in 1:20) {
  r.list[[i]] = raster(vals=runif(100), nrows=10, ncols=10, ext=extent(c(0,25,0,25)))
}
r.brick = brick(r.list)
r.mult = raster(vals=sample(2,100,T), nrows=10, ncols=10, ext=extent(c(0,25,0,25)))

【问题讨论】:

  • 您尝试过使用 setValues 吗? (不知道它是否允许在多个层上分配,虽然...)
  • @LorenzoBusetto setValues 似乎只适用于单层,据我所知。

标签: r r-raster


【解决方案1】:

那么我只为你找到了一个解决方法(使用循环):

layers <- 2:4
for(i in layers) {
  r.brick[[i]]  <- r.brick[[i]] * r.mult
}

注意:显然带有[] 子集的赋值仅适用于单层。

【讨论】:

  • 对。因为我在路上,所以没有测试它。我有另一个解决方法给你。也许@RobertH 可以更好地帮助你。 :)
  • 谢谢 - 我已经在使用循环解决方法 - 希望有更好的解决方案。
【解决方案2】:

我认为这是一个缺失的功能。感谢您指出了这一点。我会在 maRtin 之后使用循环(也许在创建 RasterStack 之后,这可能更有效)。如果数据集不是太大,你可以这样做

# example data
library(raster)
b <- brick(nrows=2, ncols=2, nl=6)
values(b) <- rep(1:4, 6) 
r.mult <- raster(vals=10, nrows=2, ncols=2)


values(b)[,3:4] <- values(b[[3:4]] * r.mult)
# values(b)

【讨论】:

    【解决方案3】:

    以下代码包含 r.mult 值的 r.brick 栅格值的多个层 2-4,并将结果分配给 r.brick 层 2-4。

    attr(attr(r.brick, 'data'), 'values')[,2:4] = attr(attr(r.brick, 'data'), 'values')[,2:4] * attr(attr(r.mult, 'data'), 'values')
    

    attr(attr(r.brick, 'data'), 'values')[,2:4] = getValues(r.brick[[2:4]] * r.mult)
    

    【讨论】:

    • 这不是一个好的解决方案。它只适用于某些情况(小数据集)并且操作系统不必要地晦涩。
    猜你喜欢
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 2015-07-31
    • 1970-01-01
    相关资源
    最近更新 更多