【问题标题】:Querying rasters to create result raster查询栅格以创建结果栅格
【发布时间】:2016-12-03 05:24:26
【问题描述】:

我有两个相同范围的环境栅格等,以及模型结果的数据框(其中包含 env1 和 env2 的所有可能组合)。我正在尝试创建第三个栅格,其中填充了每个单元格的模型结果。

library(raster)
## Mock env rasters
env.param1 <- seq(1:100)
env.param2 <- seq(101:200)

ext <- extent(1,10,1,10)
env1 <- raster(ext,nrow=10,ncol=10)
values(env1) <- env.param1
env2 <- raster(ext,nrow=10,ncol=10)
values(env2) <- env.param2

## Mock model results
param.set <- expand.grid(env.param1,env.param2)
res.v <- seq(10001:20000)
res <- cbind(param.set, res.v)
res.rast <- raster(ext, nrow=10, ncol=10)
## 
for(i in 1:ncell(env1)){
  res.rast[i] <- res[which(res$Var1==env1[i] & res$Var2==env2[i]),"res.v"]  
}

这似乎可行,但是当env* 中的值没有出现在res 中时它会失败,这将发生在我的实际数据集中。我想出了一个解决方案,但它似乎很慢。

for(i in 1:ncell(env1)){

  res.rast[i] <-res[which(ifelse(abs(res$Var1-env1[i])==min(abs(res$Var1-env1[i])),TRUE,FALSE)
            & ifelse(abs(res$Var2-env2[i])==min(abs(res$Var2-env2[i])),TRUE,FALSE)),"res.v"]  
}

有没有办法将其优化为 A)在我使用更高分辨率 env* 栅格时提高速度(我有一个新数据集,其分辨率比旧数据集高 225 倍)? B) 当我开始在我的分析中包含更多参数时,我该如何扩展。

【问题讨论】:

    标签: r performance logical-operators r-raster


    【解决方案1】:

    这应该有效:

    for(env1ind in unique(param.set$Var1)) {
      for(env2ind in unique(param.set$Var2)) {
    
        cells           <- which(env.param1 == env1ind &  env.param2 == env2ind)
        res.rast[cells] <- as.numeric(res[which(res$Var1 == env1ind & res$Var2 == env2ind),][3])
    
      }
    }
    

    并且应该比在像素上循环更快,但我无法测试,因为你的“工作”解决方案给了我一个错误。

    然而,这根本不是有效的,也不是优化的。如果你有大图像,必须事先通过values 将所有数据加载到内存中可能会有问题。

    如果您的“模型”并不复杂(即计算成本高),我会考虑通过 raster::stack 将所有输入栅格放在一起,然后使用 calc 应用模型。 这将允许您通过“图像块”工作,并在需要时使用并行处理。

    HTH

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      • 2013-02-23
      • 2018-06-14
      • 2015-09-13
      • 1970-01-01
      相关资源
      最近更新 更多