如何使用 R 将栅格的单元格值移动到另一个目标单元格
How to move a cell value of a raster to another target cell using R
我有一个光栅,让我们假设它现在是 3*3(尽管它实际上要大得多)。每个栅格像元都有一个值,一个不同的值——即不同的 Z 值。我知道栅格中每个单元格的单元格编号(即它们是单元格编号 1 到 9,顶行有 1 到 3,中间行有 4 到 6,底行有 7 到 9。
我还有另一个栅格,每个单元格的单元格编号为 'target' - 例如,单元格编号 1、2、3、4、7、8、9 的目标单元格为 5(即目标单元格是除 5 和 6 之外的所有单元格的中间单元格,单元格 5 的目标单元格是单元格 6,单元格 6 没有目标单元格。
所以我想做的是编写代码,根据目标栅格将原始栅格的Z值移动到特定的目标像元中。事实上,单元格 5 应该是所有其他提要单元格的总和。有任何想法吗?我玩过 'extract' 和 'setValues'- 以及 'adjacent' ,但就是无法正确使用。
如有任何帮助,我们将不胜感激
安东尼
例如,此栅格具有 Z 值:
20 24 22
18 34 26
21 24 32
因此,单元格编号将如下所示:
1 2 3
4 5 6
7 8 9
目标栅格将如下所示:
5 5 5
5 6 Out
5 5 5
代码将在移动像元值后生成输出栅格:
0 0 0
0 161 34
0 0 0
在第二次迭代中,栅格将如下所示:
0 0 0
0 0 161
0 0 0
第三次迭代看起来像这样:
0 0 0
0 0 0
0 0 0
嗯,那很有趣。我猜的主要想法是我必须遍历 1:9 matrix/array.
> library(data.table)
> r1 <- matrix(c(20,18,21,24,34,24,22,26,32), nrow=3, ncol=3)
> r1
[,1] [,2] [,3]
[1,] 20 24 22
[2,] 18 34 26
[3,] 21 24 32
> r1.i <- as.integer(t(r1))
> rt <- matrix(c(5,5,5,5,6,5,5,0,5), nrow=3, ncol=3)
> rt
[,1] [,2] [,3]
[1,] 5 5 5
[2,] 5 6 0
[3,] 5 5 5
> rt.i <- as.integer(t(rt))
> r.sequence <- data.table(x = 1:9)
> r3 <- r1.i
> for (i in 1:3) {
+ r3 <- r.sequence[, sum(r3[which(rt.i == x)]), by=x]
+ r3 <- r3$V1
+ print(matrix(r3, nrow=3, ncol=3, byrow=T))
+ }
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 161 34
[3,] 0 0 0
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 0 161
[3,] 0 0 0
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 0 0
[3,] 0 0 0
我有一个光栅,让我们假设它现在是 3*3(尽管它实际上要大得多)。每个栅格像元都有一个值,一个不同的值——即不同的 Z 值。我知道栅格中每个单元格的单元格编号(即它们是单元格编号 1 到 9,顶行有 1 到 3,中间行有 4 到 6,底行有 7 到 9。
我还有另一个栅格,每个单元格的单元格编号为 'target' - 例如,单元格编号 1、2、3、4、7、8、9 的目标单元格为 5(即目标单元格是除 5 和 6 之外的所有单元格的中间单元格,单元格 5 的目标单元格是单元格 6,单元格 6 没有目标单元格。
所以我想做的是编写代码,根据目标栅格将原始栅格的Z值移动到特定的目标像元中。事实上,单元格 5 应该是所有其他提要单元格的总和。有任何想法吗?我玩过 'extract' 和 'setValues'- 以及 'adjacent' ,但就是无法正确使用。
如有任何帮助,我们将不胜感激
安东尼
例如,此栅格具有 Z 值:
20 24 22
18 34 26
21 24 32
因此,单元格编号将如下所示:
1 2 3
4 5 6
7 8 9
目标栅格将如下所示:
5 5 5
5 6 Out
5 5 5
代码将在移动像元值后生成输出栅格:
0 0 0
0 161 34
0 0 0
在第二次迭代中,栅格将如下所示:
0 0 0
0 0 161
0 0 0
第三次迭代看起来像这样:
0 0 0
0 0 0
0 0 0
嗯,那很有趣。我猜的主要想法是我必须遍历 1:9 matrix/array.
> library(data.table)
> r1 <- matrix(c(20,18,21,24,34,24,22,26,32), nrow=3, ncol=3)
> r1
[,1] [,2] [,3]
[1,] 20 24 22
[2,] 18 34 26
[3,] 21 24 32
> r1.i <- as.integer(t(r1))
> rt <- matrix(c(5,5,5,5,6,5,5,0,5), nrow=3, ncol=3)
> rt
[,1] [,2] [,3]
[1,] 5 5 5
[2,] 5 6 0
[3,] 5 5 5
> rt.i <- as.integer(t(rt))
> r.sequence <- data.table(x = 1:9)
> r3 <- r1.i
> for (i in 1:3) {
+ r3 <- r.sequence[, sum(r3[which(rt.i == x)]), by=x]
+ r3 <- r3$V1
+ print(matrix(r3, nrow=3, ncol=3, byrow=T))
+ }
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 161 34
[3,] 0 0 0
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 0 161
[3,] 0 0 0
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 0 0
[3,] 0 0 0