RasterBrick或RasterStack的3D聚合

时间:2017-04-27 17:12:52

标签: r aggregate resampling rescale

我在由简单的i,j,k位置标识的3D网格中有一些数据(没有真实的空间信息)。这些数据现在都在RasterStack中。

b <- stack(system.file("external/rlogo.grd", package="raster"))
# add more layers
b <- stack(b,b)
# dimensions
dim(b)
[1]  77 101   6

产生77行,101列, 6层。

# upscale by 2
up <- aggregate(b,fact=2)
dim(up)
[1] 39 51  6

产生39行,51列, 6层。

Hoped-for行为:3层。

除了目前的行为之外,我还在寻找一种聚合各层的方法,这种方法是在每一层内进行聚合。我对其他数据结构开放,但更喜欢现有的升级/重采样/聚合算法,而不是我自己编写的算法。

潜在相关的是http://quantitative-advice.gg.mq.edu.au/t/fast-way-to-grid-and-sum-coordinates/110/5spacetime包,它假定图层是时间而非空间,增加了更多的复杂性。

2 个答案:

答案 0 :(得分:0)

我没有正确阅读文档。致aggregate across layers

  

例如,fact=2将生成一个新的Raster *对象,其中2 * 2 = 4个单元格。如果提供两个数字,例如fact=c(2,3),则第一个将用于在水平方向聚合,第二个用于在垂直方向聚合,并且返回的对象将具有2 * 3 = 6个更少的单元格。同样,fact=c(2,3,4)聚合2个(行),3个(列)和4个(层)组的单元格。

可能需要使用expand=TRUE vs expand=FALSE来使其发挥作用,但这似乎不一致(我有reported it作为错误)。

答案 1 :(得分:0)

您可以定义agg.fact变量来表示值2:

agg.fact  <- 2
up <- aggregate(b, fact = agg.fact)
dim(up)
[1] 39 51  6

现在我们生成一个表格,指出哪些图层将使用agg.fact与其他人聚合:

positions <- matrix(1:nlayers(b), nrow = nlayers(b)/agg.fact, byrow = TRUE)

     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6

并为每对图层应用一个函数(在这种情况下为mean,但可能是max``, sum`或另一个...)

up2 <- stack(apply(positions, 1, function(x){
  mean(b[[x[1]]], b[[x[2]]])
}))

dim(up2)
[1]  77 101   3

或者如果想要在3个维度聚合(选择是否需要聚合1-2d,然后是3d或者副词):

up3 <- stack(apply(positions, 1, function(x){
  aggregate(mean(b[[x[1]]], b[[x[2]]]), fact = agg.fact) #first 3d
  #mean(aggregate(b[[x[1]]], fact = agg.fact), aggregate(b[[x[2]]]), fact = agg.fact) ##first 1d-2d
}))
dim(up3)
[1] 39 51  3