【问题标题】:Change cell value in one raster based on another raster根据另一个栅格更改一个栅格中的像元值
【发布时间】:2018-11-10 20:34:20
【问题描述】:

我有两个时间点(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)
})

但它返回一个错误(因为我使用带有栅格的 if 语句?):

(函数 (x, fun, filename = "", recycle = TRUE, forcefun = FALSE, : 不能用这个公式,可能是没有向量化的原因

我想知道是否有一种简单的方法来实现与栅格类似的东西?提前谢谢你。

【问题讨论】:

    标签: r if-statement raster


    【解决方案1】:

    你真的很亲密,

    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] &amp; y[y == 1] 返回一个矩阵,而if 只需要一个逻辑输入。另一方面,子集可以处理逻辑矩阵,这正是 x[x == 2 &amp; y == 1] 中发生的事情。

    【讨论】:

    • 如果 Y 中有一个范围可以满足条件怎么办?怎么写?我在想 overlay(r, r2, fun = function(x, y) {x[x == 2 & y >= 1 & y
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    相关资源
    最近更新 更多