【问题标题】:Replacing values between rasters替换栅格之间的值
【发布时间】:2018-04-20 21:20:19
【问题描述】:

我正在简化我的问题,希望它是有道理的。

我正在使用三个栅格。

library(raster)
LC <- raster("finalRRaster2018.tif")
nativeAET <- raster('kohala_aet_mm_ann_int.tif')
nonnativeAET <- raster('pred_AET.tif`)

栅格LC 是一个栅格,其土地覆盖属性值 1 为原生土地覆盖,0 为非原生土地覆盖。

nativeAET 和 nonnativeAET 分别是本地物种和 nonnative 物种下蒸发蒸腾的栅格。两个栅格的属性都在 [0,15000]

之间

id 喜欢做的是将所有 1 的值替换为 nativeAET 值,并将所有 0 的值替换为 nonnativeAET 值。

我的想法是将土地覆盖栅格(值为 1 或 0)转换为 AET 栅格(值在 0 到 15000 之间)。

我使用了以下代码

native <- values(LC) == 1
nonative <- values(LC) ==0
LC[native] <- values(nativeAET)[native]
LC[nonnative] <- values(nonnativeAET)[nonnative]

但是当我绘制图表时,我收到警告 number of items to replace is not a multiple of replacement lengthnumber of items to replace is not a multiple of replacement length

情节看起来像这样,

我的问题是,我希望生成的情节看起来不会那么厚实。我觉得栅格没有正确对齐,但是当我检查栅格的范围和尺寸时,它们似乎都共享相同的投影。

非常感谢任何帮助!

【问题讨论】:

    标签: r raster


    【解决方案1】:

    如果您提供一些代码生成的示例数据,这个问题会更容易回答。

    示例数据:

    library(raster)
    nativeAET <- nonnativeAET <- LC <- raster(ncol=4, nrow=4)
    values(nativeAET) <- 1:16
    values(nonnativeAET) <- 21:36
    values(LC) <- c(rep(0,8), rep(1,8))
    

    方法一:

    AETnative <- mask(nativeAET, LC, maskvalue=1, updatevalue=0)
    AETnonnative <- mask(nonnativeAET, LC, maskvalue=0, updatevalue=0)
    AET <- AETnative + AETnonnative
    

    方法二:

    AET <- mask(nativeAET, LC, maskvalue=1)
    AET <- cover(AET, nonnativeAET)
    

    【讨论】:

    • 方法 1 效果很好!天才的反应。谢谢!
    【解决方案2】:

    假设nonative(一个"n")中的错字已得到纠正,您的代码应该可以工作(并且速度很快)。

    错误可能来自栅格空间分辨率的差异。因此,ncell(LC) != ncell(nativeAET) 和 ncell(LC) != ncell(nonnativeAET)。如果不是这种情况,您需要重新采样您的栅格,例如:

    nativeAET <- resample(LC, nativeAET, method='ngb')
    nonnativeAET <- resample(LC, nonnativeAET, method='ngb')
    

    如果您在 LC 栅格中只有两个值(0 和 1),您可以通过以下方式加速您的代码:

    AET <- nativeAET 
    AET[values(LC) == 0] <- values(nonnativeAET)[values(LC) == 0] 
    

    【讨论】:

    • 您的方法适用于小型数据集,但对于大型栅格可能会出现问题。最好避免使用values( ) 和/或[ ] 将所有值加载到内存中
    • @RobertHijmans 好点,谢谢你让我知道。我想这取决于应用程序、您的配置和栅格大小。无论如何,我 +1 你的答案,因为我不知道看起来很有趣的 cover 函数。我借此机会感谢您提供这个很棒的包裹:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    相关资源
    最近更新 更多