使用terra与raster包计算栅格栈累积和时结果异常的问题排查
问题:terra包rapp计算栅格累积和结果异常的原因
你手动计算的rr1是栅格栈s中每个像元从第1层到第6层的累积和最终值(即所有层的总和),raster包calc函数用法正确,因此rr3与rr1结果一致,但terra包rapp的用法存在两处关键错误,导致结果异常:
1. 对rapp函数的作用理解偏差
terra::rapp是层维度的滑动窗口运算函数,核心是对栅格栈的连续w层组成的滑动窗口应用自定义函数,而非对每个像元的所有层直接计算。比如w=3时,会依次处理第1-3层、第2-4层……直到最后一组连续层。
你需要的是每个像元从第1层到第6层的累积和最终值,这种场景应该用terra::app函数(对每个像元的所有层应用函数),而非rapp。
2. rapp的参数传递错误
你调用rapp时传入了s[[1]]作为第二个参数y,这完全多余:
- 当
y参数存在时,fun需要接收两个输入参数(分别对应x的滑动窗口层和y的对应层),但你的函数只定义了一个参数i,这会导致函数接收的输入不符合预期,计算逻辑彻底出错。 - 即使去掉
y参数,用rapp(s, w=6, function(i) max(cumsum(i)))也属于用错工具——虽然结果可能巧合一致,但rapp的设计目标并非处理全栈单像元计算,app才是正确选择。
正确的terra实现方式
如果要得到和rr1、rr3一致的结果,用app函数即可:
# 方式1:取累积和的最后一个值(即总和) rr2 <- app(s, function(x) cumsum(x)[6]) # 方式2:直接求和(因为累积和最后一步就是所有层的总和) rr2 <- sum(s)
内容的提问来源于stack exchange,提问作者jmutua
相关产品推荐
相关产品推荐

