Изменить значение ячейки в одном растре на основе другого растра - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть две растровые карты из двух моментов времени (t1 и t2) с двумя категориями растительного покрова в каждой (LC1, LC2). Я хочу наложить правило, что ячейка LC2 в t1 не может измениться на ячейку LC1 в t2, то есть только LC1 может измениться на LC2 во времени, но не наоборот. Мне трудно придумать правило для этого в R. То, что я имел в виду, было что-то вроде этого:

#create test rasters
r <- raster(nrows=25, ncols=25, vals=round(rnorm(625, 3), 0)) #land-use/cover raster
r[ r > 2 ] <- 2
r[ r < 1 ] <- 1
r2 <- r
plot(r2) #r2 is t2

r <- raster(nrows=25, ncols=25, vals=round(rnorm(625, 3), 0)) #land-use/cover raster
r[ r > 2 ] <- 2
r[ r < 1 ] <- 1
plot(r) #r is t1

r_fix <- overlay(r, r2, fun = function(x, y) {
  if (x[ x==2 ] & y[ y==1 ]) { #1 is LC1, 2 is LC2
    x[ x==2 ] <- 1 }
  return(x)
})

Но он возвращает ошибку (из-за того, как я использую оператор if с растрами?):

Error in (function (x, fun, filename = "", recycle = TRUE, forcefun = FALSE,  : 
  cannot use this formula, probably because it is not vectorized

Интересно, есть ли простой способ реализовать нечто подобное тому, что работает с растрами? Заранее спасибо.

1 Ответ

0 голосов
/ 10 ноября 2018

Вы были действительно близки,

overlay(r, r2, fun = function(x, y) {x[x == 2 & y == 1] <- 1; x})

, кажется, делает работу.

С точки зрения вашего решения,

x[x == 2] <- 1

не вызывает никаких ошибок, хотя это не совсем то, что вы хотите использовать в вашем случае.Однако

if (x[x == 2] & y[y == 1])

является проблемой, поскольку x[x == 2] & y[y == 1] возвращает матрицу, а if требует только один логический вход.Подмножество, с другой стороны, может обрабатывать логические матрицы, что и происходит в x[x == 2 & y == 1].

...