Сумма обусловлена ​​через стек растров в R - PullRequest
0 голосов
/ 11 июля 2019

У меня есть растр группы 34 (.tif), размером примерно 10 МБ каждая, со значениями 1 и 0 присутствия или отсутствия эвкалипта, соответственно, продукта контролируемой классификации той же области и идентичной.Каждый растр представляет год оценки (i) с 1985 по 2018. Я хочу найти сумму двух типов последовательностей пикселей в группах из трех изображений:

  1. стабильных пикселей: значение пикселяравно 1 в году (i), (i + 1) e (i-1) и соответствует последовательности 111. То есть, для последовательных лет это эвкалипт.
  2. нестабильные пиксели: это 1 в год i и 0 в год i + 1 и год i-1 (последовательность 010).То есть это поочередно эвкалипт, а в другие годы это не так, что может быть ошибкой классификации.

В обоих случаях цель состоит в том, чтобы проверить, является ли классификация устойчивой, за пределамивысокие показатели каппа в результате классификации.Мои вопросы:

  1. Как я могу реализовать этот процесс в R?
  2. Я читал, что, возможно, цикл с "for" не лучший вариант для работы с большими растрами, этоесть другая альтернатива?Потому что мне приходится реализовывать другие процессы с похожей логикой.

Я попробовал несколько альтернатив на основе: Функция для суммирования каждой ячейки сетки стека растра с использованием других растров в качестве индикатора или здесь Условно вычисляя разницу между макс (растром) и каждым растровым слоем растрового стека , но я не очень хорошо понимаю его логику.Та же проблема, которую я мог решить с помощью QGIS с помощью «Калькулятора полей», и он работает хорошо (это утомительно и возможно с ошибками) следующим образом:

Стабильный пиксель = ("img1985 @ 1" = 1 И"img1986 @ 1" = 1 И "img1987 @ 1" = 1) + ... + ("img2016 @ 1" = 1 И "img2017 @ 1" = 1 И "img2018 @ 1" = 1)

Нестабильный пиксель = ("img1985 @ 1" = 0 И "img1986 @ 1" = 1 И "img1987 @ 1" = 0) + ... + ("img2016 @ 1" = 0 И "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 голосов
/ 11 июля 2019

Вам нужна простая функция, которая вычисляет (не) стабильность. Например, функция 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...