使用R语言terra包计算不同空间范围栅格差值,如何让结果匹配较小栅格的空间范围?
使用R语言terra包计算不同空间范围栅格差值,如何让结果匹配较小栅格的空间范围?
我明白你的问题了——你希望差值计算的结果只保留pa_rast对应的小范围,而不是继承原栅格r的大范围。当前代码得到大范围结果的原因很直接:你是基于完整的r(大范围栅格)进行减法运算的,所以运算结果自然会继承r的空间范围。下面给你几种简单的解决方法:
方法一:直接基于已裁剪的pa_rast计算(最推荐)
既然pa_rast已经是r裁剪并掩码到目标区域的结果,那我们直接用它来做差值计算就好,结果自然会和pa_rast的范围一致:
# 直接使用pa_rast进行运算,避免处理大范围栅格 diff_pa <- sum(pa_rast - unlist(m_pa))
这样得到的diff_pa会自动继承pa_rast的空间范围、分辨率和掩码设置,完全符合你的需求。
方法二:先裁剪原栅格,再计算差值
如果你需要保留原r的完整数据,也可以先把r裁剪到pa的范围,再进行运算:
# 将r裁剪并掩码到pa的范围,得到和pa_rast一致的栅格 r_cropped <- crop(r, pa, mask = TRUE) # 计算差值之和 diff_pa <- sum(r_cropped - unlist(m_pa))
这个方法和方法一效果一致,只是多了一步裁剪(不过你已经生成过pa_rast,所以方法一更高效)。
方法三:对已有大范围结果进行后处理
如果你已经得到了大范围的diff_pa,也可以在它的基础上裁剪并掩码到目标区域:
# 基于你原来的代码得到diff_pa后,裁剪到pa的范围 diff_pa_cropped <- crop(diff_pa, pa, mask = TRUE)
这样diff_pa_cropped就是你需要的小范围结果。
验证结果
你可以用ext(diff_pa)来查看结果的空间范围,它应该和ext(pa_rast)完全一致:
ext(diff_pa) ext(pa_rast)
另外补充一句:你计算各图层均值的逻辑是对的,global(pa_rast, "mean", na.rm=T)能正确得到每个图层的有效均值,unlist(m_pa)也能正确匹配图层顺序,问题只是出在运算时的栅格范围选择上。
内容来源于stack exchange




