Мой входной растр состоит из нескольких слоев, каждый из которых содержит область изображения без значений данных.Эти слои не полностью перекрываются, и я пытаюсь вывести файл, который состоит только из пересечения всех полос (зона, в которой нет значений 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)
Любые идеи о том, как это сделатьболее эффективно / заставить работать с большим количеством слоев?