Raster::focal 函数用 NA 值替换边缘单元格

Raster::focal function replaces edge cells with NA values

我正在尝试使用 raster::focal 来找出每个栅格像元有多少个值为 1 的邻居。但是,我注意到在生成的栅格中,边缘单元已被 NA 值替换。如何获取栅格外边缘的邻居数?

这是一个可重现的例子:

#create raster and add 1's and 0's
land <- raster(matrix(0, 8, 10), xmn=408027.5, xmx=413027.5, ymn=4370000, 
ymx=4374000)
land[4:8, 2:5] <- 1
land[2:3, 8:9] <- 1
land[1,0:10] <- 1
land[is.na(land[])] <- 0
#plot the raster
plot(land)

#create window for focal function
w <- matrix(1,3,3)
#run raster::focal
land.foc <- focal(land, w=w, fun=sum)
#plot resulting focal raster
plot(land.foc)

#plot NA values in land.foc
plot(is.na(land.foc))

但是,正如您在比较两个栅格时所看到的,焦点栅格中最外层的像元已被 NA 替换。

你只需要设置pad=TRUEpadValue=0。这个 'extends' 您的光栅并添加虚拟行和列 padValue,在本例中为 0.

land.foc <- focal(land, w=w, fun=sum,pad=T,padValue=0)

plot(land.foc)

plot(is.na(land.foc))

编辑:

另一种看待它的方式是虚拟单元格没有 任何 值,它们是 NA.

因此,不要将 0 分配为 padValue,只需将 na.rm=TRUE 添加到您的呼叫中即可。

如果您确实需要对虚拟单元格执行其他操作,您可以创建自己的函数来更具体地处理 NA 单元格,然后将其传递给焦点。