根据另一个栅格更改一个栅格中的像元值

Change cell value in one raster based on another raster

我有两张来自两个时间点(t1 和 t2)的栅格地图,每个地图都有两个土地覆盖类别(LC1、LC2)。我想强加一条规则,即 t1 中的 LC2 单元不能更改为 t2 中的 LC1 单元,即,只有 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)
})

但它 returns 是一个错误(因为我使用带栅格的 if 语句的方式?):

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

我想知道是否有一种简单的方法可以实现类似于处理栅格的方法?提前谢谢你。

你们真的很亲密,

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] returns 是一个矩阵,而 if 只需要一个逻辑输入。另一方面,子集可以处理逻辑矩阵,这正是 x[x == 2 & y == 1].

中发生的事情