0

我有 3 个栅格,我想在表达式中使用它们,但我可以在 3 个栅格中找到不同的na值。例如:我可以在 2 个栅格中有一个值,但在 3 个中我有na,那么在这种情况下我不能应用我的表达式。

按照我的代码:

for(i in 1:length(name_BSA)){

i <- 1

if(days_BSA[i] == days_WSA[i] & days_WSA[i] == days_FDS[i]){

BSA <- raster(list_BSA[i])
WSA <- raster(list_WSA[i])
FDS <- raster(list_FDS[i])

brick <- brick(BSA, WSA, FDS)

  if(!is.na(BSA[,]) & !is.na(WSA[,]) & !is.na(FDS[,])){

       BLSA <- ((1-FDS[i])*BSA[i]) + (FDS[i] * WSA[i])

  }

  name_BLSA <- paste0("BLSA_",days_BSA[i])
  writeRaster(BLSA, file.path(main,output_folder, name_BLSA), format = "GTiff", overwrite = T)

    }

  }

我的问题是这部分:!is.na(BSA[,]) & !is.na(WSA[,]) & !is.na(FDS[,])

这部分不起作用。

有人可以帮助我吗?

4

1 回答 1

0

如果您提供一些代码生成的示例数据,并省略不相关的细节,例如 for 循环和 if 子句,那么会更容易提供帮助。

据我所知,没有必要使用!is.na. 如果其中一个值是NA,结果也将是NA。我认为这就是您想要的,尽管您没有else子句。您不应该在具有算术运算的 RasterLayers 上使用索引。您还可以在不使用的情况下创建 RasterBrick。

library(raster)
# example data
output_folder = "."
f <- system.file("external/rlogo.grd", package="raster")
BSA <- raster(f, 1)
WSA <- raster(f, 2)
FDS <- raster(f, 3)

# improved code
BLSA <- (1-FDS)*BSA + FDS * WSA
name_BLSA <- file.path(output_folder, paste0("BLSA_", ".tif"))
writeRaster(BLSA, name_BLSA, overwrite = TRUE)

或者,你可以做

BLSA <- overlay(FDS, BSA, WSA, fun=function(x,y,z) { (1-x)*y + x*z }, filename=name_BLSA )
于 2018-04-17T19:01:48.247 回答