繁体   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