间隙填充时态栅格对象

Gap filling temporal raster objects

假设我有 4 个栅格图层,每个栅格图层属于一个月中的每隔一周。我想使用线性插值为每一天创建新图层。在这种情况下,前 2 个栅格属于 Feb 月份 29 days,第二个栅格属于 March 月份 31 days。我想知道如何创建可以填充时间段的每日栅格对象,并考虑到一个月中的天数(2 月 29 个栅格和 3 月 31 个栅格)。谢谢!

library(raster)
r1 <- raster(nrow=5, ncol=5)
feb15 <- setValues(r1, runif(ncell(r1)))
feb29 <- setValues(r1, runif(ncell(r1)))
mar15 <- setValues(r1, runif(ncell(r1)))
mar30 <- setValues(r1, runif(ncell(r1)))

关于 两周前被问到。这是您的示例的改编答案。

library(raster)
r1 <- raster(nrow=5, ncol=5)
feb15 <- setValues(r1, runif(ncell(r1)))
feb29 <- setValues(r1, runif(ncell(r1)))
mar15 <- setValues(r1, runif(ncell(r1)))
mar30 <- setValues(r1, runif(ncell(r1)))

s <- stack(feb15, feb29, mar15, mar30)
x <- calc(s, fun=function(y) approx(c(15,29,29+15,29+30), y, 1:59, rule=2)$y)
names(x) <- c(paste('feb', 1:29), paste('march', 1:30))

不幸的是,approx 仅获取 NA 值时失败。它"need at least two non-NA values to interpolate"。这是一个解决方法:

s[1:2] <- NA
# fail <- calc(s, fun=function(y) approx(c(15,29,29+15,29+30), y, 1:59, rule=2)$y)

f <- function(y) {
    if (sum(! is.na(y)) < 2) {
        return(rep(NA, 59))
    } else {
        approx(c(15,29,29+15,29+30), y, 1:59, rule=2)$y
    }
}

x <- calc(s, fun=f)