【问题标题】:resampled raster values out of range重新采样的栅格值超出范围
【发布时间】:2018-01-22 17:36:53
【问题描述】:

我想将高分辨率栅格重采样为更粗略的分辨率,但要为更粗略的网格单元保留单元的最大值。

由于 R 的 raster 包中的 resample 函数中没有 fun 参数,我整理了一个简单的自定义函数:

resampleCustom <- function(r1, r2) {

    resRatio <- as.integer(res(r2) / res(r1))
    ret <- aggregate(r1, fact = resRatio, fun = max)

    if (!compareRaster(ret, r2, stopiffalse = FALSE)) {
        ret <- resample(ret, r2, method = 'bilinear')
    }
    return(ret)
}

基本上,我使用聚合(可以提供自定义函数)来接近目标栅格,然后使用resample 进行一些最终调整。

我将此应用于表示一种鱼类的预计分布的栅格(其中像元值表示范围从 0 到 1 的适宜性分数),奇怪的是生成的栅格的值大于最大值原始栅格中的值。

这两个栅格可以下载herehere

library(raster)

# read in species raster and template
sp <- raster('Abalistes_filamentosus.tif')
template <- raster('rasterTemplate.tif')

> sp
class       : RasterLayer 
dimensions  : 360, 720, 259200  (nrow, ncol, ncell)
resolution  : 48243.14, 40790.17  (x, y)
extent      : -17367530, 17367530, -7342230, 7342230  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=cea +lon_0=0 +lat_ts=30 +x_0=0 +y_0=0 +ellps=WGS84 +units=m +no_defs 
data source : /Users/pascaltitle/Dropbox/Abalistes_filamentosus.tif 
names       : Abalistes_filamentosus 
values      : -5.684342e-14, 1  (min, max)

> template
class       : RasterLayer 
dimensions  : 49, 116, 5684  (nrow, ncol, ncell)
resolution  : 3e+05, 3e+05  (x, y)
extent      : -17367530, 17432470, -7357770, 7342230  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=cea +lon_0=0 +lat_ts=30 +x_0=0 +y_0=0 +ellps=WGS84 +units=m +no_defs 
data source : /Users/pascaltitle/Dropbox/rasterTemplate.tif 
names       : rasterTemplate 
values      : 1, 1  (min, max)

> resampleCustom(sp, template)
class       : RasterLayer 
dimensions  : 49, 116, 5684  (nrow, ncol, ncell)
resolution  : 3e+05, 3e+05  (x, y)
extent      : -17367530, 17432470, -7357770, 7342230  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=cea +lon_0=0 +lat_ts=30 +x_0=0 +y_0=0 +ellps=WGS84 +units=m +no_defs 
data source : in memory
names       : Abalistes_filamentosus 
values      : -0.2061382, 1.206138  (min, max)

最大值是 1.2,但是当双线性方法本质上应该取单元格值的平均值时,这怎么可能呢?我希望生成的栅格的所有值都在原始栅格值的范围内。

【问题讨论】:

  • 也许您正在寻找的是使用 method = 'ngb' 重新采样以避免双线性算法的任何外推问题
  • 这些是物种存在的栖息地适宜性分数,所以就我的目的而言,如果精细栅格中存在高度适宜的单元格,我希望将其反映在生成的粗略-缩放栅格,这就是为什么我一直在尝试实现一种采用单元格最大值的重采样方法。也许,正如您所建议的,“ngb”适合作为重采样的第二步。
  • 相反,这建议您应该使用与您想要聚合到的低分辨率栅格对齐的栅格数据来创建栖息地适宜性评分。

标签: r raster


【解决方案1】:

极值适用于栅格边缘的像元,其中值是外推的,因为一侧没有邻居。这显示了这些值的位置:

x <- resampleCustom(sp, template)
a <- xyFromCell(x, which.max(x))
b <- xyFromCell(x, which.min(x))
plot(x)
points(a)
points(b)

或者

plot(Which(x < 0))
plot(Which(round(x, 15) > 0))

要移除这些极值,您可以使用raster::clamp

xc <- clamp(x, 0, 1) 

顺便说一句,你所做的,首先聚合然后重新采样,也是在raster::resample 中所做的。

根本问题是您的高分辨率栅格数据与您正在寻找的低分辨率聚合不相符。这表明您的工作流程早期存在错误。避免此问题的最佳方法可能是使用与高分辨率栅格对齐的预测栅格数据进行栖息地适宜性预测。当您将预测变量投影到+proj=cea 时,您可能没有考虑到这一点?

【讨论】:

  • 我认为这不太对。 个极值在边缘。但在重采样栅格中也有大于 1 的值。例如。试试plot(x &gt; 1)
  • x[which(x[] &gt; 1)]; print(z[1:2], digits=18) 显示这些值为1:[1] 1.00000000000000002 1.00000000000000002(实际上讲;忽略浮点数精度的问题)
  • 这听起来一切正常,我可以调整这些值 > 1 并将它们设置为 1。
  • 我是这么认为的。我会使用clamp(请参阅更新的答案)
  • 我同意更好的解决方案是从一开始就以适当的分辨率和地图投影工作。在这种情况下,我正在处理现有的数据集。感谢您的建议和信息!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 2018-03-11
  • 1970-01-01
  • 2019-01-23
相关资源
最近更新 更多