【问题标题】:Limitations with RasterStack math and conditional statementsRasterStack 数学和条件语句的限制
【发布时间】:2020-07-06 08:57:57
【问题描述】:

我有一个大的 RasterStack(114 个 geotiff 图像),我已经在 R 中成功地进行了地理处理(屏蔽等),但是我很难让它对每个光栅应用一个简单的条件语句(所有光栅层都是相同的范围、分辨率和共同注册)。我想将小于每个栅格最大值 95% 的所有像素值设置为 NA。例如,如果图层的最大值为 85,则像素值

#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 个左右)上运行它,它会完全按照它应该的方式运行。 因为我已经成功地在整个堆栈上执行了许多类似的操作(其他条件语句、屏蔽等)而没有错误,所以我不确定它为什么现在会抛出这个错误。有任何想法吗?

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

谢谢

【问题讨论】:

    标签: r raster


    【解决方案1】:

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

    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)
    

    【讨论】:

      猜你喜欢
      • 2013-10-14
      • 2022-01-05
      • 2016-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-05
      • 2016-10-09
      相关资源
      最近更新 更多