簡體   English   中英

通過R中的柵格堆棧調節的總和

[英]Sum conditioned through raster stack in R

我有一組34的柵格(.tif),每個柵格大約10MB,分別存在和不存在桉樹的值分別為1和0,這是同一區域和相同區域的有監督分類的乘積。 每個柵格代表從1985年到2018年的評估年(i)。我想找到三個圖像組中的兩種像素序列之和:

  1. 穩定像素:像素值在(i)年,(i +1)e(i-1)中為1,對應於序列111。也就是說,連續幾年是桉樹。
  2. 不穩定像素:i年為1,i + 1年和i-1年為0(序列010)。 也就是說,它是桉樹,而在其他年份則不是,這可能是分類錯誤。

在這兩種情況下,目的都是為了驗證分類是否穩健,超出了分類帶來的高kappa指數。 我的問題是:

  1. 如何在R中實現此過程?
  2. 我讀到也許“ for”循環不是處理大型柵格的最佳選擇,還有其他選擇嗎? 因為我必須用類似的邏輯來實現其他過程。

我基於以下方法嘗試了幾種替代方法: 使用其他柵格作為指標對柵格堆棧的每個柵格像元求和的函數,或者在此處有條件地計算max(raster)與柵格堆棧的每個柵格層之間的差,但是我不太了解其邏輯。 我可以使用“字段計算器”使用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)
```

預期結果在代碼中(***預期結果,手動)。

預先非常感謝您,我希望我已經清楚了。

您需要一個計算穩定性的簡單函數。 例如,函數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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM