【发布时间】:2018-06-16 23:23:15
【问题描述】:
我有一个网格,其中包含要使用插值填充的间隙 (NA)。我的网格显示 x 和 y 维度的自相关,所以我想尝试双线性插值。我发现的大多数解决方案都集中在“上采样”(为了增加样本数量/网格大小而进行插值),但我不想/不需要更改网格大小。我只想使用插值填充 NA。其他潜在的解决方案do not seem to handle NAs for the input grid of values (the 'z matrix'),或者是neighborhood-based solutions,而不是双线性插值,或者只是have no answer。
我发现使用 raster 包,我可以输入一个包含 NA 的网格(作为光栅),并使用“resample”命令输出相同大小的网格。然而,结果看起来像最近邻插值而不是双线性插值。
我是否遗漏了一些东西,例如有一种方法可以使用光栅包进行双线性插值?或者有没有更好的方法来做双线性插值来填充 NA?
library(raster)
# raster containing gap
r <- raster(nrow=10, ncol=10)
r[] <- 1:ncell(r)
r[25] <- NA
# The s raster is the same size as the r raster
s <- raster(nrow=10, ncol=10)
s <- resample(r, s, method='bilinear')
plot(r)
plot(s)
s[25]
s[35]
# s[25] appears to have been filled with neighbor s[35]
更新
Akima 包似乎是上述光栅方法的一个有前途的替代方案,但如果输入值网格(Z 矩阵)中有 NA,我会遇到麻烦。这是一个与上面示例平行的示例来演示。 (同样,我正在插入一个与原始大小相同的网格)。
library(akima)
# Use bilinear interpolation (no NAs in input)
rmat<-matrix(seq(1,100,1), nrow = 10, ncol = 10, byrow = T)
x <- seq(1,10,1)
y <- seq(1,10,1)
smat <- bilinear.grid(x, y, rmat, nx = 10, ny = 10) # works
plot(raster(rmat), main = "original")
plot(raster(smat$z), main = "interpolated")
# Try using bilinear interpolation but with an NA
rmat<-matrix(seq(1,100,1), nrow = 10, ncol = 10, byrow = T)
rmat[3,5] <- NA
x <- seq(1,10,1)
y <- seq(1,10,1)
smat <- bilinear.grid(x, y, rmat, nx = 10, ny = 10) # Error about NAs
更新2
@Robert Hijmans 提出了一个很好的问题,即为什么不在 raster 包中的 focus() 命令中使用移动窗口平均值。原因是我想尝试双线性插值,我不认为移动窗口平均值总是给出与双线性插值相同的答案。但是,这在我发布的示例中并不清楚(在该示例中移动窗口和双线性插值 do 给出了相同的答案),因此我将在下面的新示例中进行演示。请注意,对于下面的示例 (here is a handy calculator for tests),双线性插值解应为 8。
library(raster)
r <- raster(nrow=10, ncol=10)
# Different grid values than earlier examples
values(r) <- c(rep(1:5, 4), rep(4:8, 4), rep(1:5, 4), rep(4:8, 4), rep(1:5, 4))
r[25] <- NA
plot(r)
# See what the mean of the moving window produces
f <- focal(r, w=matrix(1,nrow=3, ncol=3), fun=mean, NAonly=TRUE, na.rm=TRUE)
f[25] # Moving window gives 5 but bilinear interp gives 8
# Note that this seems to be how the moving window works with equal weights
window_test <- c(r[14:16], r[24:26], r[34:36])
mean(window_test, na.rm = T)
我在这里遗漏了什么吗?或许焦点()的权重参数有一些巧妙的方法可以产生双线性插值解决方案?
【问题讨论】:
-
我没有关注你的链接,但你检查过
akima包吗? -
@BenBolker 是的,akima 包似乎很有希望用于双线性插值,但我在填补空白方面没有成功。我用代码更新了我的问题来演示这个挑战。
标签: r interpolation geospatial