[英]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.