通过R

时间:2019-07-11 14:14:34

标签: r raster r-raster

我有一个34组栅格(.tif),每个大约10MB,分别存在和不存在桉树的值分别为1和0,这是同一区域和同一区域的有监督分类的产物。每个栅格代表从1985年到2018年的评估年(i)。我想找到三个图像组中的两种像素序列的总和:

  1. 稳定像素:像素值在(i),(i + 1)年为1 e(i-1)并对应于序列111。也就是说 连续几年是桉树。
  2. 不稳定的像素:1英寸     第i年,第i年+ 1和第i-1年的0(顺序010)。那是为了     说它是桉树,而在其他年份则不是,     这可能是分类错误。

在这两种情况下,目的都是为了验证分类是否稳健,超出了分类带来的高kappa指数。 我的问题是:

  1. 如何在R中实现此过程?
  2. 我读到,也许“ for”循环不是处理大型栅格的最佳选择,还有其他选择吗?因为我必须用相似的逻辑来实现其他过程。

我基于Function to sum each grid cells of raster stack using other rasters as an indicator或此处Conditionally calculating the difference between max(raster) and each raster layer of raster stack尝试了几种替代方法,但是我不太了解其逻辑。 我可以使用“字段计算器”使用QGIS解决相同的问题,它可以通过以下方式很好地工作(错误很繁琐且可行):

稳定像素=(“ img1985 @ 1” = 1 AND“ img1986 @ 1” = 1 AND“ img1987 @ 1” = 1)+ ... +(“ img2016 @ 1” = 1 AND“ img2017 @ 1” = 1 AND“ img2018 @ 1” = 1)

不稳定像素=(“ img1985 @ 1” = 0 AND“ img1986 @ 1” = 1 AND“ img1987 @ 1” = 0)+ ... +(“ img2016 @ 1” = 0 AND“ img2017 @ 1” = 1 AND“ img2018 @ 1” = 0)

在哪里imgYear:是每年的每个栅格; 1985 ... 2018:年

```
library(raster)
# Initial sample data + result
r1 <- r2 <- r3 <- r4 <- r5 <- rUns <- rSta <- raster(matrix(0, 10, 10))

# Create some "stable pixels" of example.
for (i in seq(from=10, to=50, by=10)) {
r1[(i+6):(i+10)] <- 1
r2[(i+6):(i+10)] <- 1
r3[(i+6):(i+10)] <- 1
r4[(i+6):(i+10)] <- 1
r5[(i+6):(i+10)] <- 1
}
# Create some "unstable pixels" of example.
r2 [c(60,70,80)] <- 1
r3 [1] <- 1
r4 [c(60,70,80)] <- 1
# Stack raster
r <- stack(r1, r2, r3, r4, r5)

# *** Expected results ***
# Sum of stable pixels (Sta)
for (i in 2:nlayers(r)) {
pixelSta <- ((r[[i-1]] == 1) * (r[[i]] == 1) * (r[[i+1]] == 1))* 1
}
# Don't work: Error in .local(x, ...) : not a valid subset
# *** Result Expected (rSta): sequence 111. Manually.
for (i in seq(from=10, to=50, by=10)) {
rSta[(i+6):(i+10)] <- 3
}
as.matrix(rSta)

# Sum of unstable pixels (Uns)
for (i in 2:nlayers(r)) {
pixelUns <- ((r[[i-1]] == 0) * (r[[i]] == 1) * (r[[i+1]] == 0))* 1
}
# Don't work: Error in .local(x, ...) : not a valid subset
# *** Result Expected (rUns): sequence 010. Manually.
rUns [c(60,70,80)] <- 2
rUns [1] <- 1
as.matrix(rUns)
```

预期结果在代码中(***预期结果,手动输入)。

非常感谢您,我希望我已经清楚了。

1 个答案:

答案 0 :(得分:0)

您需要一个简单的函数来计算(不稳定)稳定性。例如,函数f

f <- function(x) sum(diff(x)==0)

计算不从一种状态过渡到另一种状态的步骤数。

尝试

f(c(0,0,0,0,0,0))
#[1] 5
f(c(0,0,0,0,1,1))
#[1] 4
f(c(0,1,0,1,0,1))
#[1] 0

现在有了栅格数据

library(raster)
s <- stack(system.file("external/rlogo.grd", package="raster"))
s <- stack(s, s)
x <- calc(s, f)
plot(x)