【问题标题】:raster calculation with condition of each cell by layers in R在R中逐层计算每个单元格的条件
【发布时间】:2018-09-22 16:32:53
【问题描述】:

我有几个图层的堆栈栅格数据集,但是,我想计算每个单元格的总和以进行不同的图层选择,最后生成一个新图层,任何人都可以通过使用 calc 或 overlay 或其他一些栅格来提供一些好的建议R中的计算? 我可以通过循环进行计算,但是当我有很多层时它会消耗很多次,并且还使用很多存储,我的脚本如下,

## library(raster)
make_calc <- function(rr, start, end) {
  rr <- as.array(rr)
  start <- as.array(start)
  end <- as.array(end)
  dms <- dim(raster)
  tmp <- array(NA, dim = dms[1:2])
  for (i in 1:dms[1]) {
    for (j in 1:dms[2]) {
      tmp[i,j] <- sum(raster[i,j,start[i,j,1]:end[i,j,1]], na.rm = TRUE)
    }
  }
  return(tmp)
}

rr <- raster(res = 10)
rr[] <- 1
rr <- stack(rr, rr, rr, rr)
start <- raster(res = 10)
start[] <- sample(1:2, ncell(start), replace = TRUE)
end <- raster(res = 10)
end[] <- sample(3:4, ncell(end), replace = TRUE)
result <- make_calc(rr, start, end)

【问题讨论】:

  • 也许您正在寻找 stackSelect 或 stackApply?

标签: r stack r-raster calc


【解决方案1】:

你为什么要强制进入数组?您可以轻松地将栅格折叠为矢量,但在这里似乎没有必要。今后,请尽量明确您的预期结果。

根据您的代码,我真的不知道您在做什么。我将对堆栈中的指定栅格求和,抽取随机样本,跨要求和的栅格,最后绘制要求和的随机单元样本进行一些猜测。

对于堆栈中指定栅格的总和,您可以使用双括号对堆栈中的内容进行索引。在这种情况下,堆栈中的栅格 1 和 3 将是唯一的总和。

library(raster)
rr <- raster(res = 10)
rr[] <- 1
rr <- stack(rr, rr, rr, rr)

( sum_1_3 <- calc(rr[[c(1,3)]], sum) )

如果您想要跨栅格的值的随机样本,对于每个单元格,您可以编写一个传递给calc 的函数。这是一个示例,它在栅格图层值中抓取一个大小为 n 的随机样本并将它们相加。

rs.sum <- function(x, n=2) {sum( x[sample(1:length(x),n)], na.rm=TRUE)} 
rs.sum.raster <- calc(rr, rs.sum)

如果您想将函数应用于有限的随机选择的像元,您可以创建栅格的随机样本,用作索引。在这里,我们创建一个随机的像元样本,创建一个空栅格并根据随机样本像元索引管道栅格 1 和 2(在堆栈中)的总和。堆栈中的栅格使用双括号进行索引,而栅格值使用单括号进行索引,因此,对于堆栈中的栅格 1,您将使用的随机样本中的值受到限制:rr[[1]][rs]

rs <- sample(1:ncell(rr[[1]]), 300)
r.sum <- rr[[1]]
r.sum[] <- NA
r.sum[rs] <- rr[[1]][rs] + rr[[2]][rs] 
  plot(r.sum)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 2017-06-13
    • 2015-11-12
    • 1970-01-01
    • 2015-12-29
    • 2019-05-09
    相关资源
    最近更新 更多