2014-10-29 56 views
4

我有兩個希望合併爲一個的柵格圖層。我們稱之爲mask(值爲1NA)和vrs組合兩個柵格圖層,將非遮罩圖層中的NA值設置爲0,其中遮罩圖層不是NA

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

我會使用cover()

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

enter image description here

+0

非常好!謝謝@Josh O'Brien!事實證明,在我的數據和計算機上這是更快的,所以看起來至少有三種方法,而且這個答案中的一個是最快的版本。接下來是@jbaums:'system.time(vrs_big_again2 <-cover(vrs_big,mask_big-1,filename =「〜/ savetest2」))'給出了響應:用戶系統已過期 90.17 7.19 129.00 和'相同(值(ny_ips90_1),值(ny_ips90_1_igen2))' [1]真 – MariaCSa 2014-10-29 09:32:20

+0

@MariaCSa - 令人印象深刻的是,您的手寫功能對於上面的簡單調用來說非常貼心,性能卓越!做得很好。此外,謝謝你提供這樣一個很好的重現性的例子。 – 2014-10-29 13:31:05

0

你可以用overlay做到這一點,還有:

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

enter image description here

+0

謝謝@jbaums!這給出了和我的函數相同的結果,但是我好奇地在我的大柵格上使用'system.time()'我計時了兩個版本:'system.time(vrs_big < - zero.for.NA(mask_big,vrs_big,filename =「〜/vrs_big「))' user system elapsed 90.21 10.53 105.68 'system.time(vrs_big_igen <-overlay(mask_big,vrs_big,fun = function(x,y)ifelse(x == 1&is.na(y) ,0,y),filename =「〜/ savetest」))' 用戶系統已用完 169.59 24.46 197.73 'identical(values(vrs_big),values(vrs_big_igen))' [1] TRUE – MariaCSa 2014-10-29 01:29:37