首页 > 解决方案 > RasterStack 数学和条件语句的限制

问题描述

我有一个大的 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

当我在整个光栅堆栈上运行此代码时,我得到“值错误 [j, ] :不正确的维数。” 但是,如果我在较小的集合(大约 14 个)上运行它,它会完全正常工作。因为我已经成功地在整个堆栈上执行了许多类似的操作(其他条件语句、屏蔽等)而没有错误,所以我不确定它为什么现在会抛出这个错误。有任何想法吗?

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

谢谢

标签: rraster

解决方案


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

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)

推荐阅读