使用邻域分析填充栅格中NA值的间隙(例如,不是单个像元)

B. *_*vis 3 gis r raster r-raster

随着下面的栅格,NA值数量增加

library(raster)
filename <- system.file("external/test.grd", package="raster")
r <- raster(filename)
r[r<300] <- NA
summary(getValues(r))
Run Code Online (Sandbox Code Playgroud)

是否可以仅“填充” NA细胞?我一直在使用此有用的帖子,但如下所示,NA值保留在最终产品中。

fill.na <- function(x, i=5) {
  if( is.na(x)[i] ) {
    return( round(mean(x, na.rm=TRUE),0) )
  } else {
    return( round(x[i],0) )
  }
}  

r2 <- focal(r, w = matrix(1,3,3), fun = fill.na, 
            pad = TRUE, na.rm = FALSE )
summary(getValues(r2))
Run Code Online (Sandbox Code Playgroud)

我怀疑问题在于具有NA值的连续区域,并且想知道是否还有其他选择可以“填补”缺失数据的空白。

lbu*_*ett 5

一种方法是扩大焦点窗口。您可以通过修改“ fill.NA”函数以接受width参数并动态计算中心像素的位置来实现:

fill.na <- function(x) {
  center = 0.5 + (width*width/2) 
  if( is.na(x)[center] ) {
    return( round(mean(x, na.rm=TRUE),0) )
  } else {
    return( round(x[center],0) )
  }
}  
Run Code Online (Sandbox Code Playgroud)

然后:

width = 9
r2 <- focal(r, w = matrix(1,width,width), fun = fill.na, 
            pad = TRUE, na.rm = FALSE)
summary(getValues(r2))

Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
300.0   339.0   408.0   488.7   574.5  1806.0    4661 
Run Code Online (Sandbox Code Playgroud)

您会看到NA的数量正在减少。

但是,请注意,由于您的“孔”共享栅格外部区域的相同NA值,因此这也会在外侧扩展栅格,使您得到虚假的值。参见例如:

width = 15
r2 <- focal(r, w = matrix(1,width,width), fun = fill.na, 
            pad = TRUE, na.rm = FALSE)
plot(rast)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

因此,您必须找到一种方法来区分“真实” NA值和数据集范围之外的值。

HTH。

  • 您好,您可以使用“focal”最近添加的“NAonly = TRUE”参数来更新您的出色答案。 (2认同)