代码之家  ›  专栏  ›  技术社区  ›  Hugo

带有调用矢量列表的函数的raster::overlay

  •  0
  • Hugo  · 技术社区  · 6 年前

    我想知道是否可以将光栅包的overlay函数与调用矢量列表以基于两个光栅执行某些计算的函数一起使用。到目前为止,我只看到一些函数在不调用外部数据的情况下执行一些光栅代数的示例。

    下面我将提供一些玩具代码来说明我想要做什么,但也可以提供一些关于我真正问题的上下文。具体来说,我需要将每个像素分为零(不存在)或一(存在)个外壳。房屋存在的可能性与覆盖像素的建筑面积百分比(下面的光栅r1)和土地覆盖类型(下面的光栅r2)有关。这种可能性是基于参考数据而知道的,参考数据存储在下面类似probs的列表中。

    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]))})
    

    错误是

    无法使用此公式,可能是因为它未矢量化

    除了上面的toy代码之外,我还想分别处理每个分类类,并使用函数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 回复  |  直到 6 年前
        1
  •  0
  •   mastefan    6 年前

    我最近也遇到了同样的错误。我的解决方案是将传递给overlay的函数“矢量化”。这将使用mapply创建函数的包装器,以便overlay可以使用它。我可以通过使用矢量化来运行您的代码(见下文)。

    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,size=1,prob=probs[[y]][x]):产生NAs

    我不确定这个错误是否会影响到你的真实数据。

    你也可以参考第二个答案 here 另一个成功的例子。