微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将三个值之一随机分配给给定约束的栅格单元

如何解决将三个值之一随机分配给给定约束的栅格单元

我正在对一个非常大的栅格(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 工作。

有什么想法吗?谢谢!

解决方法

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

library(terra)

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

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

即使我无法重现您的警告代码,我认为您的问题在于您对以下调用的解释:r2== 6 & r3>= 40 & r3 <= 60。这条线产生一个光栅:

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

因此进行此调用 r1[r2== 6 & r3>= 40 & r3 <= 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>

,

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

library(terra)
set.seed(123)
r1 <- rast(matrix(round(runif(400,20))
r2 <- rast(matrix(round(runif(400,20))

#1,使用 lapp

x <- c(r1,r2,r3)
z <- lapp(x,function(r1,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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?