【问题标题】:R loop over raster objects objectsR循环光栅对象对象
【发布时间】:2020-03-22 09:40:15
【问题描述】:

我想使用循环修改一些栅格。

rasters<-list(rast1,rast2,rast3,rast4)

for(i in rasters){
  i[[1]]<-i[[1]]/10000
  i[[2]]<-(i[[2]]+100)/9000
}

堆栈的波段 1 需要将其值除以 10000,波段 2 需要是 (+100)/9000。目前,i 成为一个大型栅格对象。

这是一个用于测试的示例光栅堆栈

library(raster)

rast1<-stack(raster(matrix(runif(100),
                           ncol = 10, byrow = TRUE)),
             raster(matrix(runif(100),
                           ncol = 10, byrow = TRUE)))

【问题讨论】:

  • 不确定(而且我不是光栅专家)。你为什么不提供代码(从library 调用开始以加载任何需要的非基础包)构建一组小栅格,然后可以进行测试和演示。我的猜测是,将[[ 与栅格一起使用不会成功。 SO 都是关于代码的。
  • 我不知道您想如何修改栅格的值,但这不是您访问这些值的方式。您需要使用嵌入式功能。 getValues(raster) 访问你的值和 values(raster)
  • 另外,如果你想编辑一个列表,你可能会更喜欢 lapply。如果您更好地解释您希望对数据进行什么样的编辑,我们可以提出一个工作示例。您只想编辑所有值?

标签: r for-loop gis lapply raster


【解决方案1】:

我不确定这是否能正确解决您的所有目标,但我发现您现在所做的事情存在一个基本缺陷。当您在 R 中构建 for() 循环时,您可能需要迭代索引值而不是索引对象组件。当您对 i[[1]] 进行赋值时,它 (a) 不会更改 rasters 对象中任何内容的值,并且 (b) 它会更改迭代器 i 的值和类。

所以也许这会更接近你所尝试的(尽管你确实没有描述一个明确定义的过程):

rasters<-list(rast1,rast1)
for(i in seq_along(rasters) ) {
    rasters[[i]][1]<-rasters[[i]][1]/10000
    rasters[[i]][2]<-(rasters[[i]][2]+100)/9000
}

这导致rasters 的值与原始rasters 对象具有相同的大小和形状,即两个光栅堆栈的列表。

【讨论】:

  • 嗨,我希望修改栅格堆栈的各个波段。 Band 1 的范围为 0-10000,因此要更改 0-1 的范围,我除以 10000。我的符号在 for 循环外部有效,但在使用迭代器 i 时不在内部。不幸的是,您的符号不起作用,但感谢您的反馈。
猜你喜欢
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2021-11-06
  • 2023-03-04
  • 1970-01-01
相关资源
最近更新 更多