r - 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 个)上运行它,它会完全正常工作。因为我已经成功地在整个堆栈上执行了许多类似的操作(其他条件语句、屏蔽等)而没有错误,所以我不确定它为什么现在会抛出这个错误。有任何想法吗?
如果之前已经讨论过这个问题,我很抱歉,但我找不到这样的帖子。如果确实存在,请指出我的方向。
谢谢
解决方案
这是一个最小的可重现示例:
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)
推荐阅读
- java - Java 8 Stream.findFirst() 仅在排序后才有意义?
- html - 将 css 类应用于我的 ngx-gallery-9 数组中的第一个图像
- java - 在 Spring 源代码中,一个方法两个变量 Generic 类型不同
- mysql - 如何使 SQL UPDATE 过程在计算中使用多于 1 个表?这样做会给我错误 1054
- scala - 为什么不同名称的案例类和对象出现在同一个scala文件中?
- sql - 拆分要在 IN 运算符中使用的字符串
- excel - 循环以将工作表保存在新工作簿中
- scala - 如何在 Scala 中创建不可变的双链表?
- r - ans[npos] <- rep(no, length.out = len)[npos] 中的错误:替换的长度为零
- r - For循环对r中数据框列中的值求和