【问题标题】:Assign one of three values at random to a raster cell given constraints将三个值之一随机分配给给定约束的栅格单元
【发布时间】:2021-04-12 14:44:02
【问题描述】:

我正在对一个非常大的栅格(437760000 个像元)进行一些后期处理,使用相同范围/crs 的其他栅格图层进行约束。代码大部分都在工作,但我遇到了问题。

r1[r2== 6 & r3>= 40 & r3<= 60] <- sample(2:4, length(r1[r2== 6 & r3>= 40 & r3 <= 60]), replace = T)

其中 r1、r2 和 r3 是唯一的栅格图层。 r1 正在根据约束进行更新,旨在改进地图。

此代码执行没有问题,但在完成时会引发以下警告:

Warning message:
In .local(x, i, j = j, ..., value) :
  the first replacement value is used for all cells

我想确保所有三个值都是随机选取的(最终我想使用 sample 中的 prob 参数来加权其中一个值)。我尝试了许多修复程序,它们都抛出了相同的警告消息,我认为这意味着只有三个值中的一个被应用于整个栅格。我正在 terra 中为此工作。

有什么想法吗?谢谢!

【问题讨论】:

  • 我知道您是新用户。欢迎!现在,如果您想最大限度地提高获得答案的机会,请尝试创建一个可重现的示例。在这种情况下,创建一个大小约为 20x20 的虚假栅格并将您的代码应用到它会产生错误。在我们这边,您的目标会更容易理解,我们只需将您的代码复制粘贴到我们的 R 会话中。

标签: gis geospatial raster terra


【解决方案1】:

这是您问题的可重现示例:

library(terra)

set.seed(123)
r1 <- rast(matrix(round(runif(400, 0, 100)), 20, 20))
plot(r1)

r2 <- rast(matrix(round(runif(400, 0, 10)), 20, 20))
r3 <- rast(matrix(round(runif(400, 30, 70)), 20, 20))

即使我无法重现您的警告代码,我认为您的问题在于您对此调用的解释:r2== 6 &amp; r3&gt;= 40 &amp; r3 &lt;= 60。此行生成一个栅格:

r2== 6 & r3>= 40 & r3 <= 60
class       : SpatRaster 
dimensions  : 20, 20, 1  (nrow, ncol, nlyr)
resolution  : 0.05, 0.05  (x, y)
extent      : 0, 1, 0, 1  (xmin, xmax, ymin, ymax)
coord. ref. :  
source      : memory 
name        : lyr.1 
min value   :     0 
max value   :     1 

因此调用r1[r2== 6 &amp; r3&gt;= 40 &amp; r3 &lt;= 60] 会产生一个数据帧:

str(r1[r2== 6 & r3>= 40 & r3 <= 60])
'data.frame':   17 obs. of  1 variable:
 $ lyr.1: num  2 2 2 2 2 2 2 2 2 2 ...

您不希望这样,因为 1 列 data.frame = 1 的 length 并且因为您不能用 data.frame 进行值替换。

试试这个:

pixel_to_change <- values(r2== 6 & r3>= 40 & r3<= 60) == 1
r1[pixel_to_change] <- sample(2:4, sum(pixel_to_change), replace = T)  

这可能是您正在寻找的。​​p>

【讨论】:

    【解决方案2】:

    以下是 Bastien 的两种替代(但相似)解决方案。他们避免使用values,这对于非常大的数据集可能会出现问题。

    library(terra)
    set.seed(123)
    r1 <- rast(matrix(round(runif(400, 0, 100)), 20, 20))
    r2 <- rast(matrix(round(runif(400, 0, 10)), 20, 20))
    r3 <- rast(matrix(round(runif(400, 30, 70)), 20, 20))
    

    #1,使用lapp

    x <- c(r1, r2, r3)
    z <- lapp(x, function(r1, r2, r3) {
        i <- r2== 6 & r3>= 40 & r3<= 60
        r1[i] <- sample(2:4, sum(i), replace = T)
        r1
    })
    

    #2,使用global(而不是长度,取栅格的全局总和与TRUE/FALSE值)

    i <- r2== 6 & r3>= 40 & r3<= 60
    n <- unlist(global(i, "sum"))
    r1[i] <- sample(2:4, n, replace = T)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-05
      • 2020-11-15
      • 2015-02-26
      • 1970-01-01
      • 2017-08-20
      • 1970-01-01
      • 2022-07-13
      • 1970-01-01
      相关资源
      最近更新 更多