【问题标题】:R focal (raster package): how to apply filter to subsets of background data?R焦点(光栅包):如何将过滤器应用于背景数据的子集?
【发布时间】:2015-03-10 11:06:14
【问题描述】:

我想知道你们中是否有人可以帮助我完成以下处理 R raster 包中的 focus() 函数的任务。

默认情况下,focus() 函数将遍历给定栅格(以下称为“背景”栅格)的每个像元,并将给定函数应用于用户定义的移动窗口定义的相邻值。为了优化和加快我在大型栅格/研究区域上的计算,我想仅在“背景”栅格在“移动”覆盖的范围内具有某些值(例如大于零)时应用此功能(过滤器)窗口”并跳过所有其他焦点单元格。这样,过滤器就不会花时间计算任何不需要的焦点值。

下面是一个可重现的小示例和内嵌 cmets:

library(raster)

x <- matrix(1:25, ncol=5)
x[c(1,2,3,6,7,8,11,12,13)] <- 0
r <- raster(x)

#Apply filter to focal cells and return values using a 3x3 moving window...ONLY IF 
#ALL values found within the window are > 0. Skip focal cell otherwise.

r3 <- focal(r, w=matrix(1/9,nrow=3,ncol=3), FUN=sum)

我应该如何更改此功能以获得所需的结果?

【问题讨论】:

    标签: r optimization r-raster


    【解决方案1】:

    窗口幻灯片在所有焦点像素位置运行。跳过/跳跃位置是不可能的。但是,您可以检查所有元素/矩阵单元是否满足您的 阈值 条件,如下所示:

    myfunc = function (x){
      if(all(x > threshold)){
        print(x)
        x = sum(x)
      }else{
        x = 0}
    }
    r3 <- focal(x=r>1, w=matrix(1/9,nrow=3,ncol=3), fun=sum)
    

    【讨论】:

      【解决方案2】:

      我不确定它是否会更快,但您也可以检查中心单元格是否符合某些标准(例如 NA 或 >0)。这样,焦点计算只有在满足这些条件时才会运行。

      w=matrix(1,5,5)
      
      skipNA_avgFunc <- function(x) {
      
        # general definition of center cell for weight matrices with odd dims
        center <- x[ceiling(length(x)/2)]
      
        if (is.na(center)) { # handle NA values
          return(center)
        }
      
        else if (center >= 0) { # calculate mean
          mean(x, na.rm=TRUE)
        }
      }
      r3 <- focal(r, w=w, fun=skipNA_avgFunc, pad=TRUE, padValue=NA)
      

      【讨论】:

        猜你喜欢
        • 2021-11-11
        相关资源
        最近更新 更多