RasterStack 数学和条件语句的局限性

Limitations with RasterStack math and conditional statements

我有一个大的 RasterStack(114 个 geotiff 图像),我已经在 R 中成功地进行了地理处理(屏蔽等),但是我很难让它对每个栅格应用一个简单的条件语句(所有栅格图层都是相同的程度,决议,并共同注册)。我想将所有小于每个栅格最大值 95% 的像素值设置为 NA。例如,如果图层的最大值为 85,则像素值 < 80.75 = NA。这是我的代码:

#Get max value from each raster layer
r_max <- maxValue(rstack)

#Set all values < 95% of max to NA
rstack[rstack < (r_max * 0.95)] = NA

当我 运行 整个光栅堆栈上的这段代码时,我得到 "Error in value[j, ] : incorrect number of dimensions." 但是,如果我 运行 它在较小的集(14 左右)上,它工作正常正如它应该。 因为我已经在整个堆栈上成功执行了一些类似的操作(其他条件语句、屏蔽等)而没有错误,所以我不确定为什么现在会抛出这个错误。有任何想法吗?

如果之前已经讨论过,我很抱歉,但我找不到这样的 post。如果确实存在,请指出那个方向。

谢谢

这是一个最小的可重现示例:

library(raster)
s <- stack(system.file("external/rlogo.grd", package="raster")) 
cutoff <- maxValue(s) * .95
cutoff
#[1] 242.25 242.25 242.25

现在您可以:

s[s < cutoff] = NA
s
#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)
#crs        : +proj=merc +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
#source     : memory
#names      : red, green, blue 
#min values : 243,   243,  243 
#max values : 255,   255,  255 

但是当 RasterStack 很大(并且需要写入文件)时会出现错误 --- 这就是您偶然发现的。我们可以用 rasterOptions(todisk=TRUE):

模拟这种情况
rasterOptions(todisk=TRUE)
s[s < cutoff] = NA
#Error in value[j, ] : incorrect number of dimensions

我会尽力解决这个问题。这是解决方法:

s <- stack(system.file("external/rlogo.grd", package="raster")) 
cutoff <- maxValue(s) * .95
x <- sapply(1:nlayers(s), function(i) reclassify(s[[i]], cbind(-Inf, cutoff[i], NA)))
x <- stack(x)