使用后续图层填充光栅堆栈中的空白

Fill the gaps in raster stack using subsequent layers

假设我有一个光栅堆栈,每一层都有数据间隙。我想使用堆栈中接下来的两层来填充每一层的间隙:

library(raster)
r1 <- raster(ncol=20,nrow=20, xmn=0, xmx=20, ymn=0,ymx=20)
r1[] <- 1:20
r2 <- r3 <- r4 <- r5 <- r1
set.seed(0)
r1[sample(1:ncell(r1), size = 20)] <- NA
r2[sample(1:ncell(r2), size = 30)] <- NA
r3[sample(1:ncell(r3), size = 10)] <- NA
r4[sample(1:ncell(r4), size = 18)] <- NA
r5[sample(1:ncell(r5), size = 18)] <- NA

s <- stack(r1, r2, r3, r4, r5)

在这种情况下,r2 和 r3 将用于填充 r1 中的空白,依此类推。

不确定这是否是您想要的,但它会给您一个开始。我还是 R 的新手,所以可能还有另一种方法。

library(raster)
r1 <- raster(ncol=20,nrow=20, xmn=0, xmx=20, ymn=0,ymx=20)
r1[] <- 1:20
r2 <- r3 <- r4 <- r5 <- r1
set.seed(0)
r1[sample(1:ncell(r1), size = 20)] <- NA
r2[sample(1:ncell(r2), size = 30)] <- NA
r3[sample(1:ncell(r3), size = 10)] <- NA
r4[sample(1:ncell(r4), size = 18)] <- NA
r5[sample(1:ncell(r5), size = 18)] <- NA

s <- stack(r1, r2, r3, r4, r5)

for(i in 1:(nlayers(s) - 2) ){
    s[[i]] <- merge( s[[i]], mask( s[[(i+1)]], s[[i]], inverse = TRUE))
    s[[i]] <- merge( s[[i]], mask( s[[(i+2)]], s[[i]], inverse = TRUE))
}

MikeJewski 的解决方案可能有效,但 cover 函数专为此而设计,而且更直接。不清楚如何使用接下来的两层。均值:

for(i in 1:(nlayers(s) - 2) ){
    s[[i]] <- cover( s[[i]], mean( s[[(i+1):(i+2)]], na.rm=TRUE))
}

或第一个最接近的(正如 MikeJewski 假设的那样):

for(i in 1:(nlayers(s) - 2) ){
    s[[i]] <- cover( s[[i]], s[[(i+1)]])
    s[[i]] <- cover( s[[i]], s[[(i+2)]])
}

这将是另一种但可能效率低下的方法:

f <- function(x) {
    for(i in 1:((ncol(x)-2)) ){
        x[is.na(x[,i]),i]  <- x[is.na(x[,i]),i+1]  
        x[is.na(x[,i]),i]  <- x[is.na(x[,i]),i+2]  
    }
    x
}

ss <- calc(s, f)