计算栅格堆栈中超过特定​​阈值的连续几天的最大长度

时间:2019-05-22 11:11:00

标签: r raster

我想计算栅格堆栈中高于阈值(> 90)的连续几天的最大长度

给出如下所示的栅格堆栈s

x1 <- raster(nrows=10, ncols=10)
 x2=x3=x4=x5=x6=x1
 x1[]= runif(ncell(x1))
 x2[]= runif(ncell(x1))
 x3[]= runif(ncell(x1))
 x4[]= runif(ncell(x1))
 x5[]= runif(ncell(x1))
 x6[]= runif(ncell(x1))
 s=stack(x1,x2,x3,x4,x5,x6)*56

这是我当前的职能。

cd <- function(x) {
  seq <- rle(as.numeric(x) > as.numeric(x)[[nlayers(s)]])
  n = max(length(seq$values >= 90.0))
  return(n)

我希望将栅格图层作为输出,其值范围为0-6。

1 个答案:

答案 0 :(得分:1)

首先,如果您在示例数据中使用随机值,请同时设置随机种子,以便其可重现。

var componentModel = (IComponentModel)serviceProvider.GetService(typeof(SComponentModel));

_myWorkspace = componentModel.GetService<VisualStudioWorkspace>();

关于您的问题,您唯一需要的是一个简单的函数,可以将其传递到library(raster) set.seed(42) x1 <- raster(nrows=10, ncols=10) s <- do.call(stack,lapply(1:6,function(x) setValues(x1,runif(ncell(x1)))*56)) 中以获得所需的结果:

calc

此函数使用cd <- function(x,t){ y <- rle((x > t)*1) z <- y$lengths[y$values==1] return(max(z,0)) } (或游程长度编码)来计算向量中的连续游程数。在这种情况下,我要寻找连续rle的最大数量,这是通过将TRUE值(值高于阈值1)乘以1来实现的。

最后,您要返回最大游程值1,其中t为备用,以防万一没有发生(注:1表示单个,非连续发生)。

最后,可以将0传递到cd,在这种情况下,阈值为40:

calc

enter image description here