使用调用向量列表的函数进行raster :: overlay

时间:2018-08-09 09:00:20

标签: r raster

我想知道是否可以将栅格数据包的叠加功能与调用向量列表以基于两个栅格进行一些计算的函数一起使用。到目前为止,我只看到了一些函数的示例,这些函数无需调用外部数据即可执行某些栅格代数。

此后,我提供了一些玩具代码来说明我要执行的操作,但也可以提供一些有关我的实际问题的上下文。具体来说,我需要将每个像素归类为零(不存在)或一个(存在)外壳。住房存在的可能性与覆盖像素的建筑面积百分比(下面的栅格“ r1”)和土地覆盖类型(下面的栅格“ r2”)有关。根据参考数据可以知道这种可能性,参考数据存储在下面的“问题”之类的列表中。

library(raster)

# continuous and categorical maps
r1<-r2<-raster()
r1[]<-round(runif(ncell(r1))*100)
r2[]<-1
r2[1:30000]<-2

# probability of housing presence in each stratum
prob1<-1:100/100 
prob2<-log(1:100)/max(log(1:100))

# list of probabilities to be used in overlay
probs<-list(prob1,prob2)

# overlay - not working
o<-overlay(r1,r2,fun=function(x,y,...){return(rbinom(n=1, size=1, prob=probs[[y]][x]))})

错误是

  

不能使用此公式,可能是因为它没有向量化

除了上面的玩具代码,我还想分别处理每个类别,并使用函数calc而不是函数overlay(请参见下文)。但是,对于大型栅格来说,这非常慢(如果不是不可能的话),因此尽管覆盖会更好。

# alternative: loop across categorical classes (extremely slow for large rasters)
r<-list()
for(i in 1:2){
  stratum<-r2
  stratum[Which(stratum !=i)]<-NA
  r[[i]]<-calc(r1, fun=function(x,...){return(rbinom(n=1, size=1, prob=probs[[i]][x]))})
  r[[i]]<-mask(r[[i]],stratum)
}

r<-stack(r)
r<-sum(r,na.rm=T)

par(mfrow=c(1,3))
plot(r1)
plot(r2)
plot(r)

1 个答案:

答案 0 :(得分:0)

我最近也遇到了同样的错误。我的解决方案是“向量化”传递给叠加层的功能。这将使用mapply创建函数的包装,以便覆盖可以使用它。我可以使用Vectorize来使您的代码运行(见下文)。

library(raster)
# continuous and categorical maps
r1<-r2<-raster()
r1[]<-round(runif(ncell(r1))*100)
r2[]<-1
r2[1:30000]<-2

# probability of housing presence in each stratum
prob1<-1:100/100 
prob2<-log(1:100)/max(log(1:100))

# list of probabilities to be used in overlay
probs<-list(prob1,prob2)

## edits below
# define function
f <- function(x,y,...){return(rbinom(n=1, size=1, prob=probs[[y]][x]))}

# run function using overlay with Vectorize
o <- overlay(r1,r2,fun=Vectorize(f))

这产生了一个概率栅格层。它还产生了以下错误:

  

在rbinom中(n = 1,大小= 1,概率=概率[[y]] [x]):产生的NAs

我不确定此错误是否会影响您的真实数据。

您也可以参考第二个答案here来获得另一个可行的示例。