Как вычислить только подмножество ячеек в getValuesFocal?

Я хочу вычислить фокальные окна на растре, но я хочу вычислить фокальное окно только для определенных ячеек (черные ячейки на рисунке ниже). Я знаю, что могу вычислить фокальное окно для всех ячеек и потом отфильтровать вывод (см. пример ниже). Но чтобы сократить время вычислений, есть ли способ замаскировать вычисляемые ячейки (например, с помощью второго растра)?

Пример:

library(raster)
r <- raster(ncol=20, nrow=20, xmn=0, xmx=20, ymn=0, ymx=20)
r[]<-c(1:400)
r.compute.focal<-raster(ncol=20, nrow=20, xmn=0, xmx=20, ymn=0, ymx=20) # raster for which focal window shall be calculated
r.compute.focal[sample(r[],5)]<-1
plot(r)
plot(r.compute.focal,add=T,col="black",legend=F)

черные ячейки обозначают ячейки, для которых должно быть вычислено фокальное окно

#focal computation
normal.output<-getValuesFocal(r,ngb=5) 

###filtered (desired) output####
normal.output[which(!is.na(r.compute.focal[])),]

person burbot    schedule 15.12.2015    source источник
comment
Вы уже видели focal(..., NAonly=TRUE)?   -  person Josh O'Brien    schedule 15.12.2015
comment
К сожалению, аргумент NAonly не подходит, потому что я не хочу терять значение центральной ячейки фокального окна. Также кажется, что даже с аргументом NAonly вычисляются все фокальные окна. По крайней мере, getValuesFocal ведет себя именно так.   -  person burbot    schedule 15.12.2015


Ответы (1)


Для этого вы можете использовать функцию adjacent:

# example data
library(raster)
r <- raster(ncol=20, nrow=20, xmn=0, xmx=20, ymn=0, ymx=20)
r[] <- 1:400
set.seed(0)
cells <- sample(r[], 5)

# create 5 x 5 neighborhood matrix for use with adjacent
m <- matrix(1, 5, 5)
# central cell in matrix
m[3,3] <- 0
# find adjacent cells
a <- adjacent(r, cells, m)
# add the focal cells
a <- rbind(a, cbind(cells, cells))

#extract values
b <- extract(r, a[,2])

x <- cbind(a, value=b)

# first column is the focal cell, third column the values
head(x)
#     from  to value
#[1,]  359 317   317
#[2,]  359 337   337
#[3,]  359 357   357
#[4,]  359 377   377
#[5,]  359 397   397
#[6,]  359 318   318

tapply(x[,3], x[,1], mean)
#  106   149   228   359   360 
# 106.0 149.0 228.0 358.5 359.0 
person Robert Hijmans    schedule 16.12.2015