R光栅封装中的波段交叉

R光栅封装中的波段交叉,r,image-processing,intersection,raster,R,Image Processing,Intersection,Raster,我的输入光栅由多个图层组成,每个图层的图像区域周围没有数据值。这些层没有完全重叠,我试图输出一个文件,该文件只包含所有带的交点(在任何层上都没有节点数据值的区域) 以下内容适用于一些图层,但不适用于我的真实文件中的50多个图层(至少3000x3000像素): 关于如何更有效地完成这项工作/使其与大量层一起工作,有什么想法吗?我首先提出: x我发现所有/任何都是执行逻辑AND/OR的方法。这里演示了在小光栅上实现目标的两个相同的图 #dummy data m1 = cbind(matrix(NA,

我的输入光栅由多个图层组成,每个图层的图像区域周围没有数据值。这些层没有完全重叠,我试图输出一个文件,该文件只包含所有带的交点(在任何层上都没有节点数据值的区域)

以下内容适用于一些图层,但不适用于我的真实文件中的50多个图层(至少3000x3000像素):

关于如何更有效地完成这项工作/使其与大量层一起工作,有什么想法吗?

我首先提出:


x我发现
所有
/
任何
都是执行逻辑AND/OR的方法。这里演示了在小光栅上实现目标的两个相同的图

#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)))

谢谢你的回答,他们给了我好主意。我想出了一个更快的办法:

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)

这是联盟,不是交叉点。。。它与我的原始文件相同。一个简单而简洁的解决方案,但我的大光栅堆栈内存不足…:(在哪一步内存不足?如果RasterStack指向磁盘上的文件,则不应发生这种情况。但如果仍然发生这种情况,则可以使用setOptions(chunksize=)来避免此问题。感谢您的回答,我将在周一尝试。我的另一个想法是使用extent()计算需要保留的最小范围,然后使用crop()最后,再应用类似于您的解决方案的东西。@Benjamin。我发布了一个更好的方法。但是,下面是do.call不起作用的原因。谢谢。还有一个.finite()可以防止额外的步骤。我认为使用光栅,我可以简单地使用all(光栅)来简化事情。
#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)))
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)