我想计算栅格堆栈中高于阈值(> 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。
答案 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