簡體   English   中英

將單個柵格設置為NA,其中柵格堆棧的值為NA

[英]Set single raster to NA where values of raster stack are NA

我有兩個30米x 30米的光柵文件,我想從中采樣點。 在采樣之前,我想從圖像中去除混濁區域。 我轉向R和Hijman的Raster包來完成任務。

使用drawPoly(sp = TRUE)命令,我繪制了18個不同的多邊形。 該函數似乎不允許18個多邊形作為一個sp對象,所以我將它們全部分開繪制。 然后我給多邊形一個與光柵匹配的proj4string,並將它們設置為一個列表。 我通過一個lapply函數運行列表,將它們轉換為柵格(Hijman包中的柵格化函數),多邊形區域設置為NA,圖像的其余部分設置為1。

我的最終目標是一個柵格圖層,其中18個區域設置為NA。 我已經嘗試堆疊光柵化多邊形列表,並將其子集化以將新柵格設置為相同區域中的NA。 我的可重現代碼如下。

library(raster)
r1 <- raster(nrow=50, ncol = 50)
r1[] <- 1
r1[4:10,] <- NA
r2 <- raster(nrow=50, ncol = 50)
r2[] <- 1
r2[9:15,] <- NA
r3 <- raster(nrow=50, ncol = 50)
r3[] <- 1
r3[24:39,] <- NA

r4 <- raster(nrow=50, ncol = 50)
r4[] <- 1

s <- stack(r1, r2, r3)

test.a.cool <- calc(s, function(x){r4[is.na(x)==1] <- NA})

無論出於何種原因,darn testacool都是一個空白圖,我的目標是將它作為一個柵格,除了堆棧中的NA(s)等於1之外的所有值。

有小費嗎?

謝謝。

執行sum(s)將起作用,因為sum()為堆棧中甚至一個NA值的任何網格單元返回NA

要查看它是否有效,請比較以下產生的數字:

plot(s)
plot(sum(s))

我也在R-Sig-Geo論壇上發布了這個問題,並收到了包裹作者的回復。 兩個最簡單的解決方案:

使用sp包將我的多邊形轉換為一個,然后柵格化多邊形。

p <- rbind(p1, p2, p3...etc., makeUniqueIDs = TRUE)

r4 <- raster(nrow=50, ncol = 50)
r4[] <- 1
mask <- rasterize(p, r4)
mask[mask %in% 1:18] <- 1
#The above code produces a single raster file with 
#my polygons as unique values, ready for masking.

第二個簡單的解決方案,正如Josh O'Brien所指出的那樣:

m <- sum(s)
test <- mask(r4, m)

R社區搖滾。 問題在一小時內解決了(兩次)。 謝謝。

我不熟悉您正在使用的軟件包,但是查看代碼中的最后一行,我認為問題可能出在這里:

 function(x){r4[is.na(x)==1] <- NA})

看起來calc不會對此有很大幫助。 它設置由xNA s索引的r4的值並將其設置為NA

然后怎樣呢? 如果有的話,也許:

 function(x){r4[is.na(x)==1] <- NA; return(r4) })

雖然,目前尚不清楚這是否是你所追求的。

你走在正確的軌道上。 [運算符是為柵格和柵格堆棧定義的,因此您可以使用單行:

r4[ any(is.na(s) ) ] <- NA
plot(r4)

如果你想使用calc你可以像這樣使用它:

r4 <- calc( s, function(x){ ( ! any( is.na(x) ) ) } )
r4[is.na(r4)] <- NA
plot(r4)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM