在R语言Terra包中对SpatRaster按像素求和合并的方法求助
解决terra包SpatRaster像素求和问题
问题场景
已有两个通过project()投影后的SpatRaster对象(来自ebirdst物种丰度数据集),需将对应位置的像素值求和,尝试多种方法均失败:
尝试的错误代码及报错
- 语法错误(缺少逗号):
abd_projected <- project(abd_Americas, crs, method = "near") abd2_projected <- project(abd2_Americas, crs, method = "near") # 确认对象类型 class(abd_projected) # [1] "SpatRaster" # attr(,"package") # [1] "terra" class(abd2_projected) # [1] "SpatRaster" # attr(,"package") # [1] "terra" # 错误写法:缺少逗号 merged_abd <- merge(abd_projected, abd2_projected fun = sum ) # Error: unexpected symbol in "merged_abd <- merge(abd_projected, abd2_projected fun"
- 误用
merge()函数参数:
merged_abd <- merge(abd_projected, abd2_projected, FUN = sum ) # Error: [sprc] list elements should be 'SpatRaster' # is of class: function
- 混用raster包函数:
mergedABD <- raster::merge(abd_projected, abd2_projected, tolerance=0.1)
- 未对齐栅格直接合并计算:
abdall_projected<- c(abd_projected, abd2_projected) rsum <- app(abdall_projected, sum)
错误原因解析
terra::merge()的作用是合并栅格空间范围(如拼接分散栅格为完整范围),而非像素级运算,因此FUN参数不支持传入求和函数。raster::merge()仅兼容raster包的Raster*对象,无法直接处理terra的SpatRaster。c()合并后调用app()失败,大概率是两个栅格的范围、分辨率或对齐方式不一致,导致无法逐像素匹配计算。
正确解决方案
1. 先确认栅格匹配性
首先验证两个栅格的CRS、范围、分辨率完全一致(投影后仍需检查):
# 检查CRS是否一致 crs(abd_projected) == crs(abd2_projected) # 检查范围是否一致 ext(abd_projected) == ext(abd2_projected) # 检查分辨率是否一致 res(abd_projected) == res(abd2_projected)
若存在不一致,以其中一个栅格为基准重采样对齐:
# 以abd_projected为基准,重采样abd2_projected abd2_projected_aligned <- resample(abd2_projected, abd_projected, method = "near")
2. 像素求和的直接方法
terra支持SpatRaster的元素级算术运算,直接用加法即可实现像素求和:
# 基础求和(保留NA值) sum_raster <- abd_projected + abd2_projected # 忽略NA值求和(处理缺失像素场景) sum_raster <- sum(abd_projected, abd2_projected, na.rm = TRUE)
3. 多栅格批量求和(扩展场景)
若后续需合并多个栅格,对齐后用c()合并,再调用app()或sum():
# 合并对齐后的栅格 all_abd <- c(abd_projected, abd2_projected_aligned) # 逐像素求和 sum_raster <- app(all_abd, sum, na.rm = TRUE) # 或直接使用sum函数 sum_raster <- sum(all_abd, na.rm = TRUE)
内容的提问来源于stack exchange,提问作者James JR
相关产品推荐
相关产品推荐

