计算每个像元的栅格等于所有相邻像元的平均值

时间:2018-12-05 17:11:36

标签: r raster r-raster

我正在研究一个生态问题,涉及物种分布模型。可以说,我有一个栅格,该栅格本质上是每个像元存在概率的风景。我想基于旧栅格计算一个新栅格,其中每个像元等于其自身以及所有8个相邻像元的平均值。这与平均聚合单元格不同,这会导致新聚合的单元格之间的边界计算不正确。

我可以使用提供的一些代码来执行此操作,但是我正在使用的栅格的方式太大了,无法运行此计算,因为它占用了太多内存。如果我细分栅格,则仍然需要几天的时间。有没有人有一个更有效的方法来计算这个?我创建了一个小版本的栅格作为示例,尽管有点笨拙:

require(raster)

## create raster called "ras" rather clumsily
## create raster called "ras" rather clumsily
# (UTM coordinates and a probability value for each cell, not really 
# important)
s.x = seq(249990, by = 30, length.out = 20)
s.y = seq(6189390, by = 30, length.out = 20)

x.l = lapply(1:20, function(x){
  rep(s.x[x], 20)
})

x.l2 = as.vector(c(x.l[[1]], x.l[[2]], x.l[[3]], x.l[[4]], x.l[[5]], 
x.l[[6]], x.l[[7]], x.l[[8]], x.l[[9]], x.l[[10]],
  x.l[[11]], x.l[[12]], x.l[[13]], x.l[[14]], x.l[[15]], 
x.l[[16]],x.l[[17]], x.l[[18]], x.l[[19]], x.l[[20]])) 

df = as.data.frame(cbind(x.l2, rep(s.y, 20), rnorm(20*20, 0.5, 0.2)))

colnames(df) = c("x", "y", "P")

coordinates(df) <- ~ x + y
gridded(df) <- TRUE
ras = raster(df)

# for each cell, make a vector of the values at 
# the cell and all <=8 adjacent cells:
vl = lapply(1:length(ras), function(x){
  extract(ras, 
          (c(x,(adjacent(ras, x, directions=8, pairs=F, sorted=F)))))
})

# find the mean for each cell
vm = sapply(1:length(ras), function(x){
  as.vector(mean(vl[[x]], na.rm = T))
})

# create raster template
templ = ras/ras

# multiply into template for new raster
ras = vm*templ

0 个答案:

没有答案