【发布时间】:2017-06-16 15:39:05
【问题描述】:
我有一个 RasterStack s1 由 400 层组成,其中包含来自岛屿的数据。栅格的范围被裁剪为岛屿的范围,但由于其形状不规则,只有大约 20% 的像素实际上是陆地面积并具有数据值;其他 80% 是水和NA。
我还有一个水陆掩码 lwm (RasterLayer),其中土地编码为 1,水编码为 NA。
我想在s1 上进行不同类型的基于单元格的计算,但注意到这些需要很长时间才能完成。为了加快速度,计算应该只对陆地区域进行,而水域应该总是NA。在伪代码中:
for each cell:
if cell is land
do calculation
if cell is water
return(NA)
要求是memory-safety。
这里有一些示例数据来说明问题:
library(raster)
# generate data
lwm <- raster(nrow = 5, ncol = 5)
lwm[] <- c(rep(NA, 10), rep(1, 5), rep(NA, 10))
r1 <- raster(nrow = 5, ncol = 5)
r1[] <- runif(ncell(r1)) * 10
r2 <- raster(nrow = 5, ncol = 5)
r2[] <- runif(ncell(r2)) * 10
s1 <- stack(r1, r2)
s1 <- mask(s1, lwm)
# this works, but all NA-values on water are also unnecessarily evaluated
calc(s1, function(x) {sum(!is.na(x))})
【问题讨论】:
-
在这种情况下,识别非 NA 像元的索引可能会更好,只从栅格中提取那些像素,进行计算,然后将结果“返回”到新的光栅。
-
这种方法是内存安全的吗?在我看来,对于一个非常大的
RasterStack来说,情况并非如此,不是吗? -
不,这对于非常大的栅格来说不利于内存(除非您的“好数据”区域非常小)。
标签: r if-statement r-raster