Рассчитать растр, где каждая ячейка равна среднему значению всех соседних ячеек - PullRequest
0 голосов
/ 05 декабря 2018

Я работаю над экологической проблемой, связанной с моделями распространения видов.У меня есть растр, который, по сути, представляет собой ландшафт вероятностей присутствия на ячейку.Я хочу рассчитать новый растр на основе старого, где каждая ячейка равна среднему значению самой себя и всех 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...