【问题标题】:Find which cells in raster brick contain data in any layer查找栅格砖中的哪些单元格包含任何图层中的数据
【发布时间】:2017-01-12 07:56:46
【问题描述】:

我有一些网格化全局数据的大型栅格砖。我想逐个单元格地执行一些计算要求很高的计算。为了减少计算负载,我只想在至少包含砖层之一的栅格单元上运行模型。但是我如何有效地找到包含一些数据的单元格呢?我知道我可以用循环来做到这一点。像这样:

第一个可重复的数据:

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

现在我们循环遍历砖块的每一层以找出哪些单元格有一些数据:

has.data.list = vector("list", 20)
for (i in 1:20) {
  has.data.list[[i]] = which(!is.na(values(raster(r.brick, layer=i))))
}
has.data = sort(unique(unlist(has.data.list)))

但这是相当不雅的。是否有一种规范/有效的方法来获取包含一些数据的单元格向量?

【问题讨论】:

    标签: r r-raster


    【解决方案1】:

    一个可能的技巧是利用max() 仅在其所有输入值为NA 时返回NA 的事实,如果您指定na.rm = TRUE。

    因此,您可以计算光栅砖的最大值,并检查它与 NA 不同的地方。类似的东西:

    has.data = which(!is.na(getValues(max(r.brick, na.rm=TRUE))))
    

    有数据

    1 2 4 5 6 7 8 9 10 11 12 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 33 34 35 37 38 39 40 41 42 44 46 47 48 49 50 51 52 53 54 55 56 57 59 60 61 62 64 66 67 68 69 70 71 74 75 76 77 78 79 80 82 83 85 86 87 89 90 91 92 93 95 96 97 98 99 100

    【讨论】:

    • 谢谢。 +1 用于整洁的矢量化解决方案。不幸的是,正如您所说,拒绝仅包含零的单元格可能是一个问题。所以,最好使用max,而不是sum
    • 我冒昧地使用我之前评论中的改进版本编辑了您的答案。这样我就可以接受它作为正确的解决方案。
    猜你喜欢
    • 2018-06-14
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多