【问题标题】:Set single raster to NA where values of raster stack are NA将单个栅格设置为 NA,其中栅格堆栈的值为 NA
【发布时间】:2013-04-22 15:58:09
【问题描述】:

我有两个 30m x 30m 的栅格文件,我想从中采样点。在采样之前,我想从图像中删除云区域。我求助于 R 和 Hijman 的 Raster 包来完成这项任务。

使用 drawPoly(sp=TRUE) 命令,我绘制了 18 个不同的多边形。该函数似乎不允许将 18 个多边形作为一个 sp 对象,因此我将它们全部单独绘制。然后我给多边形一个与栅格匹配的 proj4string,并将它们设置为一个列表。我通过 lapply 函数运行列表,将它们转换为栅格(Hijman 包中的栅格化函数),多边形区域设置为 NA,图像的其余部分设置为 1。

我的最终目标是一个栅格图层,其中 18 个区域设置为 NA。我尝试堆叠栅格化多边形列表,并将其设置为子集以在相同区域将新栅格设置为 NA。我的可重现代码如下。

library(raster)
r1 <- raster(nrow=50, ncol = 50)
r1[] <- 1
r1[4:10,] <- NA
r2 <- raster(nrow=50, ncol = 50)
r2[] <- 1
r2[9:15,] <- NA
r3 <- raster(nrow=50, ncol = 50)
r3[] <- 1
r3[24:39,] <- NA

r4 <- raster(nrow=50, ncol = 50)
r4[] <- 1

s <- stack(r1, r2, r3)

test.a.cool <- calc(s, function(x){r4[is.na(x)==1] <- NA})

无论出于何种原因,该死的 testacool 是一个空白图,我的目标是将它作为一个栅格,其中除了堆栈中的 NA s 之外的所有值都等于 1。

有什么建议吗?

谢谢。

【问题讨论】:

    标签: r gis raster


    【解决方案1】:

    执行sum(s) 将起作用,因为sum() 会为堆栈中包含一个NA 值的任何网格单元返回NA

    要查看它是否有效,请比较以下生成的数字:

    plot(s)
    plot(sum(s))
    

    【讨论】:

      【解决方案2】:

      我也在 R-Sig-Geo 论坛上发布了这个问题,并收到了包作者的回复。两种最简单的解决方案:

      使用 sp 包将我的多边形合并为一个,然后光栅化多边形。

      p <- rbind(p1, p2, p3...etc., makeUniqueIDs = TRUE)
      
      r4 <- raster(nrow=50, ncol = 50)
      r4[] <- 1
      mask <- rasterize(p, r4)
      mask[mask %in% 1:18] <- 1
      #The above code produces a single raster file with 
      #my polygons as unique values, ready for masking.
      

      第二个简单的解决方案,正如 Josh O'Brien 刚刚指出的那样:

      m <- sum(s)
      test <- mask(r4, m)
      

      R 社区摇摇欲坠。问题在一小时内解决(两次)。谢谢。

      【讨论】:

      • 感谢您发布此信息。我现在正在编辑我的答案,以指出这个更远的上游解决方案实际上是解决您的问题的更好方法,但您为我节省了努力!
      • 当我仔细查看响应和打包 PDF 时,甚至不需要栅格化多边形。您可以将栅格包中的掩码功能与空间多边形一起使用。
      • 没有问题。顺便说一句,如果您已经绘制了 一堆 多边形并将它们全部放在一个列表中(作为这样做的结果,比如说x &lt;- lapply(1:40, drawPoly)),以下将是一个等效但更清洁的方法将它们组合成一个 SpatialPolygons 对象:do.call(rbind, c(x, makeUniqueIDs=TRUE))。也就是说,这将比输入 rbind(x[[1]], x[[2]], x[[3]], ..., x[[40]], makeUniqueIDs=TRUE) 更容易且不易出错。
      【解决方案3】:

      我不熟悉您正在使用的包,但是查看代码中的最后一行,我认为问题可能出在此处:

       function(x){r4[is.na(x)==1] <- NA})
      

      看起来calc 不会做太多事情。它正在设置由xNAs 索引的r4 的值,并将其设置为NA

      然后呢?如果有的话,也许:

       function(x){r4[is.na(x)==1] <- NA; return(r4) })
      

      不过,尚不清楚这是否就是您所追求的。

      【讨论】:

      • 当然,有道理。那是我的第一个代码,它产生了这个错误“setValues(out, x) 中的错误:值必须是数字、整数、逻辑或因子”,如果我没记错的话,这是从 raster 包派生的错误。
      • 如果r4raster 对象,是否可以为其分配逻辑NA 值?除此之外,没有任何意义的函数仅仅因为它给你一个错误就什么都不做;)
      • 无论出于何种原因,这都有效:r4[is.na(r2)==1]
      • 好吧,首先确定r2s 之间的差异,我相信这会引导您找到答案。有用的工具是str(.)dput()is()
      【解决方案4】:

      你在正确的轨道上。 [ 运算符是为栅格和栅格堆栈定义的,因此您可以只使用单行:

      r4[ any(is.na(s) ) ] <- NA
      plot(r4)
      

      如果你想使用calc,你可以这样使用它:

      r4 <- calc( s, function(x){ ( ! any( is.na(x) ) ) } )
      r4[is.na(r4)] <- NA
      plot(r4)
      

      【讨论】:

      • 谢谢,西蒙。 Calc 将是正确的选择,因为我在每个栅格图层中有 12,000,000 个像元,对吧?我想我读到算术运算符可以冻结在大型数据集上。
      • 是的 calc 是要走的路,因为它将以块的形式对大型数据集进行操作。我很好奇,sum 能在这么大的栅格图层上工作吗?
      • 它在不到一分钟的时间内将 nlayers=12, ncell = 12,072,775 的堆栈相加。令人印象深刻。
      • calc 中使用 sum 还是仅使用 sum(s)?很高兴知道,因为我经常使用大型栅格,而且我通常会为 calc 丰满,但在这种情况下,我看不出为什么它比 Josh 建议的简单调用 sum 表现更好。
      • 根据 Josh 的建议,这只是使用 sum() 函数。
      猜你喜欢
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多