合并两个栅格图层,将非遮罩层中的NA值设置为0,其中遮罩层不是NA

时间:2014-10-29 00:17:19

标签: r raster

我有两个栅格图层,我希望合并为一个。我们称他们为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)
  }
}

这个函数确实适用于小例子,似乎适用于较大的例子。有更快/更好的方法吗?某种方式对大文件更好?我将不得不在许多层上使用它,我将非常感谢帮助使这个过程更安全或更快!

2 个答案:

答案 0 :(得分:2)

我会使用cover()

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

enter image description here

答案 1 :(得分:0)

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

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

enter image description here