【问题标题】:Combine two raster layers, setting NA values in non-mask layer to 0 where mask layer is not NA合并两个栅格图层,将非蒙版层中的 NA 值设置为 0,其中蒙版层不是 NA
【发布时间】:2014-12-24 14:12:10
【问题描述】:

我有两个想要合并为一个的栅格图层。我们称它们为mask(值1NA)和vrs

library(raster)
mask <- raster(ncol=10, nrow=10)
mask[] <- c(rep(0, 50), rep(1, 50))
mask[mask < 0.5] <- NA
vrs <-raster(ncol=10, nrow=10)
vrs[] <- rpois(100, 2)
vrs[vrs >= 4] <- NA

我希望合并两个大的层,但是为了便于理解,这些小例子是可以的。对于mask 层为1vrs 层为NA 的像素,我希望将输出层的像素值设置为零。所有其他像素应保持原始vrs 的值。

这是我唯一的想法:

zero.for.NA <- function(x, y, filename){
  out <- raster(y)
  if(canProcessInMemory(out, n = 4)) { #wild guess..
    val <- getValues(y) #values
    NA.pos <- which(is.na(val)) #positiones for all NA-values in values-layer
    NA.t.noll.pos<-which(x[NA.pos]==1) #Positions where mask is 1 within the 
                                       #vector of positions of NA values in vrs
    val[NA.pos[NA.t.noll.pos]] <- 0 #set values layer to 0 where condition met
    out <- setValues(out, val)
    return(out)
  } else { #for large rasters the same thing by chunks
    bs <- blockSize(out)
    out <- writeStart(out, filename, overwrite=TRUE)
    for (i in 1:bs$n) {
      v <- getValues(y, row=bs$row[i], nrows=bs$nrows[i])
      xv <- getValues(x, row=bs$row[i], nrows=bs$nrows[i])
      NA.pos <- which(is.na(v))
      NA.t.noll.pos <- which(xv[NA.pos]==1)
      v[NA.pos[NA.t.noll.pos]] <- 0
      out <- writeValues(out, v, bs$row[i])
    }
    out <- writeStop(out)
    return(out)
  }
}

这个功能确实适用于小例子,似乎也适用于更大的例子。有没有更快/更好的方法来做到这一点?某种方式对较大的文件更好?我将不得不在多组图层上使用它,我将不胜感激任何有助于使该过程更安全或更快的帮助!

【问题讨论】:

    标签: r raster


    【解决方案1】:

    我会使用cover():

    r <- cover(vrs, mask-1)
    plot(r)
    

    【讨论】:

    • 太棒了!谢谢@Josh O'Brien!事实证明,这在我的数据和计算机上更快,所以似乎至少有三种方法,而这个答案中的一种是最快的版本。继续@jbaums 对上一篇文章的评论:system.time(vrs_big_again2&lt;-cover(vrs_big,mask_big-1,filename="~/savetest2"))给出了响应:用户系统已过 90.17 7.19 129.00 和identical(values(ny_ips90_1),values(ny_ips90_1_igen2)) [1] TRUE
    • @MariaCSa -- 令人印象深刻的是,您的手写函数在性能方面与上面的简单调用非常接近!做得很好。另外,感谢您提供了如此可重复的示例。
    【解决方案2】:

    您也可以使用overlay 执行此操作:

    r <- overlay(mask, vrs, fun=function(x, y) ifelse(x==1 & is.na(y), 0, y))
    

    【讨论】:

    • 谢谢@jbaums!这给出了与我的函数相同的结果,但奇怪的是在我的大光栅上使用system.time() 我为两个版本计时:system.time(vrs_big &lt;- zero.for.NA(mask_big,vrs_big,filename="~/vrs_big")) 用户系统已过 90.21 10.53 105.68 system.time(vrs_big_igen&lt;-overlay(mask_big,vrs_big,fun=function(x,y)ifelse(x==1 &amp; is.na(y), 0 , y ),filename="~/savetest")) 用户系统已过 169.59 24.46 197.73 identical(values(vrs_big),values(vrs_big_igen)) [1] TRUE
    猜你喜欢
    • 2012-06-16
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多