0

我在 3D 网格中有一些数据,这些数据由简单的 i、j、k 位置标识(没有真实世界的空间信息)。这些数据现在在 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 层。

希望的行为:3 层。

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

可能相关的是http://quantitative-advice.gg.mq.edu.au/t/fast-way-to-grid-and-sum-coordinates/110/5时空包,它假设层是时间的而不是比空间,增加了更多的复杂性。

4

2 回答 2

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,但可以是sum` 或另一个......)max``,

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
于 2017-04-27T18:24:06.850 回答
0

我没有正确阅读文档。跨层聚合:

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

可能需要使用expand=TRUEvsexpand=FALSE才能使其正常工作,但这似乎不一致(我已将其报告为错误)。

于 2017-04-27T18:16:47.620 回答