【问题标题】:Confusion about the mask() function in the raster package关于 raster 包中的 mask() 函数的困惑
【发布时间】:2018-06-12 17:00:01
【问题描述】:

对于这个问题的基本性质,我提前道歉,但我对 mask() 函数在 R 中的 raster 包中的工作方式感到困惑。

如果这些单元格与掩码对象中的掩码值匹配(默认掩码值为 NA),则阅读该函数的文档时,听起来像栅格 x 中的单元格设置为 NA(默认值)。但是,Lovelace 等人的 Geocomputation with R 一书中对 mask() 函数的描述。 (https://geocompr.robinlovelace.net/spatial-operations.html#spatial-ras)(第 4.3.1 节)听起来好像栅格 x 中的单元格如果匹配掩码对象中的掩码值则为 KEPT,如果不匹配则设置为 NA。他们举了这个例子:

mask(elev, rmask, maskvalue = TRUE)

"we only want to keep those values of elev which are TRUE in rmask"

因此我感到困惑。如果有人能澄清哪种解释是正确的,我将不胜感激。

我想知道的原因是我想用来自包含数据质量代码的同一 MODIS 产品的栅格来掩盖包含百分比树覆盖率上的 MODIS 数据的栅格。我只想保留那些在“质量”栅格中具有“优质”质量代码的“树木覆盖”栅格中的值。澄清 mask() 函数的工作原理将帮助我确定是否需要使用代码 [1] 或代码 [2] 来实现我想要的:

[1]

good <- c(0,1,2,3,4,5...etc.)  # The codes in the quality raster that represent good quality data

tree_cover_masked <- mask(tree_cover, quality, maskvalue = good, inverse = TRUE)

# i.e. set cells in tree_cover to NA if they match any value OTHER THAN the "good" values in the quality raster.
# This is the code I would use based on my interpretation of the function documentation.

[2]

tree_cover_masked <- mask(tree_cover, quality, maskvalue = good)

# i.e. keep values in tree_cover that match "good" values in the quality raster, and set all others to NA
# This is the code I would use based on my interpretation of Lovelace et al.

如果这个问题过于简单,再次道歉,但我会感谢您的帮助!

【问题讨论】:

  • help(mask) 对此非常清楚:"创建一个新的 Raster* 对象,该对象具有与 x 相同的值,但 ' 中的单元格为 NA(或其他掩码值)除外掩码'。这些单元格变为 NA(或其他更新值)。“ - 混乱在哪里?
  • 是的,混淆只是因为我提到的书中对函数的描述似乎不同。我知道我可能应该只了解我对文档的理解,这可能只是书中的一个错字,但我不想在这本书是由学科专家写的时候就忽略它,以防我误解了以某种方式的文档。我是在 R 中处理地理空间数据的新手,我想我只是没有足够的信心自己在两者之间做出决定!

标签: r gis geospatial raster r-raster


【解决方案1】:

是什么阻止您制作一个小示例并测试哪种方法有效?在您的情况下, [1] 和 [2] 都不起作用,因为 maskvalue 是单个值(如果您提供更长的向量,则为第一个值)。您可能想先使用重新分类

示例数据

library(raster)
qual <- trees <- raster(nrow=4, ncol=4, xmn=0, xmx=1, ymn=0, ymx=1, crs='+proj=utm +zone=1')
values(trees) <- rep(1:4, 4)
values(qual) <- rep(1:8, 2)

创建一个具有好 (4 - 8) 和坏 (1 - 8) 值的 RasterLayer,然后使用 mask

good <- reclassify(qual, rbind(c(0, 4, NA), c(4, 9, 1)))
# this would also work
# good <- reclassify(qual, cbind(0, 4, NA))

x <- mask(trees, good)

或者:

good <- subs(qual, data.frame(from=c(5,6,7,8,9), 1))
x <- mask(trees, good)

【讨论】:

  • 感谢您的回答 - 我显然比我想象的更困惑!不幸的是,我拥有的质量值不是连续的(例如,前几个(219 个)“质量差”值是 7、11、13、14、15、19、21)。在这种情况下,我是否需要为 reclassify 函数提供带有列“is”和“becomes”的两列矩阵,正如它在文档中提到的那样,而不是三列“from”、“to”、“becomes “矩阵?
  • 如果它们是整数,您仍然可以使用 is-becomes。您也可以使用subs(参见扩展示例)
  • 非常感谢。 subs 方法效果很好。
猜你喜欢
  • 2018-04-26
  • 2015-04-08
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
相关资源
最近更新 更多