簡體   English   中英

R柵格包中的帶交集

[英]Intersection of bands in R raster package

我的輸入柵格包含多個圖層,每個圖層的圖像區域均不包含任何數據值。 這些層並不完全重疊,我正在嘗試輸出僅由所有波段的交集(在任何層上都沒有NoData值的區域)組成的文件。

以下內容適用於幾層,但不適用於真實文件中的50層以上(至少3000x3000像素):

library(raster)

fin = "D:\\temp\\all_modes.pix"
fout = "D:\\temp\\test.pix"

inbands = stack(fin, bands = c(3:20))
NAvalue(inbands) = 0

# Not great:
#out = all(is.na(inbands) == FALSE) * inbands
#writeRaster(out, filename=fout, format="PCIDSK", dtype="INT2U", overwrite=TRUE, NAflag=0)

# A little better:
#mymask = all(as.logical(inbands))
#mask(inbands, mymask, filename=fout, format="PCIDSK", dtype="INT2U", overwrite=TRUE, NAflag=0)

# Even better, don't need to keep everything (but still not efficient):
#trim(all(as.logical(inbands)) * inbands, filename=fout, format="PCIDSK", dtype="INT2U", overwrite=TRUE, NAflag=0)

# Even better, calculations get smaller as we progress (is it possible to do even better?)
for(i in 1:nlayers(inbands)){
 band_i = subset(inbands, i)
 inbands = trim(as.logical(band_i) * inbands)
}
writeRaster(inbands, filename=fout, format="PCIDSK", dtype="INT2U", overwrite=TRUE, NAflag=0)

關於如何更有效地執行此操作/使其在大量圖層上工作的任何想法?

我首先提出了這一點:

x <- trim(inband, filename='fout')

但是我現在意識到這並不能滿足您的需求,因為它將返回至少一層的值不為NA的區域(行/列); 而不是所有值都不為NA的區域。

以下可能是有效的。 具有至少一個NA值的所有單元格將變為具有和的NA(默認情況下,na.rm = FALSE)。

x <- sum(inband)
x <- trim(x)
r <- crop(inband, x)

也許之后

r <- mask(r, x)

將x中的所有像元設置為r中的所有像元

感謝您的回答,他們給了我很好的主意。 我想出了這個,速度更快:

myraster = stack(fn, bands) # You get the idea
NAvalue(myraster) = 0

# Tranform to 1 where there is data    
logical_raster = as.logical(myraster)

# Make a raster with 1 in the zone of intersection
a = subset(myraster, 1)
values(a) = TRUE
for(i in 1:nlayers(myraster)) {
  a = a & logical_raster[[i]]
}

# Apply the "mask" and trim to intersection extent
myraster = myraster * a
intersect_only = trim(myraster)

我發現all / any都做邏輯和/或一長串的方式。 這里展示了兩個相同的繪圖,它們可以在小型柵格上實現您的目標。

#dummy data
m1 = cbind(matrix(NA, nrow = 4, ncol = 2), matrix(1, nrow = 4, ncol = 2))
m2 = t(m1)
m3 = matrix(rep(c(1, NA), 8), nrow = 4)
inbands = stack(lapply(list(m1, m2, m3), raster))

# first method, using & operator 
plot(inbands[[1]] & inbands[[2]] & inbands[[3]])

# second method, using `all`
plot(all(inbands))

在我的系統上,存在將數字強制轉換為邏輯的警告。 以下兩種方法可避免出現警告,但可能會更慢? 它們在邏輯上是等效的,但是您可以將它們彼此相對並與上面的第二種方法相對應。

plot(all(!is.na(inbands)))
plot(!any(is.na(inbands)))

暫無
暫無

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

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