Terra与raster包栅格堆叠故障:无法生成含21层的RasterStack
问题描述
- 拥有21个栅格图层:19个WorldClim气候数据、euroDEM数字高程模型(DEM)、Corine土地覆盖(CLC)
- 已通过QGIS对齐栅格工具及R的
resample()确保所有图层的范围、分辨率、CRS完全一致 - 遇到的问题:
- 使用
raster::stack()合并SpatRaster对象时报错 - 使用
terra::c()合并得到3层SpatRaster,但该格式无法适配sdm包的sdmData()函数,报错信息:unable to find an inherited method for function ‘sdmData’ for signature ‘"formula", "SpatialPointsDataFrame", "SpatRaster"’ - 仅单独的WorldClim RasterStack能正常运行SDM建模
- 使用
解决方案
核心思路是统一所有图层为raster包的Raster类对象,再进行堆叠,因为sdm包目前仅原生支持raster包的栅格格式。
方法1:全程用raster包处理
直接用raster包加载、裁剪、重采样所有图层,确保所有对象都属于Raster类:
# 加载19个WorldClim气候图层为RasterStack files <- list.files(path = "Rasters/", pattern = ".tif$", full.names=TRUE, recursive=TRUE) climate <- raster::stack(files[3:21]) clim_crop <- raster::crop(climate, roi_extent) # 加载DEM和CLC为Raster对象 clc <- raster::raster('Rasters/final/clc_3.tif') dem <- raster::raster('Rasters/final/dem_1.tif') # 重采样对齐到裁剪后的气候图层 clc_resample <- raster::resample(clc, clim_crop, method="near") # 分类栅格用近邻法 dem_resample <- raster::resample(dem, clim_crop, method="bilinear") # 连续栅格用双线性法 # 堆叠所有图层 rast_stack <- raster::stack(clim_crop, dem_resample, clc_resample)
方法2:将已处理的SpatRaster转为RasterStack
如果已经用terra完成了重采样等操作,可直接将SpatRaster转换为raster包支持的格式:
# 假设已用terra合并得到SpatRaster terra_stack <- terra::c(clim_crop_terra, dem_resample, clc_resample) # 转换为RasterStack rast_stack <- raster::stack(terra_stack)
验证堆叠结果
执行以下代码确认堆叠是否成功:
# 查看总图层数(应为21) nlayers(rast_stack) # 查看所有图层名称 names(rast_stack) # 验证所有图层的范围、分辨率、CRS是否一致 compareRaster(rast_stack)
问题原因说明
raster::stack()不支持直接合并terra包的SpatRaster对象,两类对象分属不同包的类体系,因此报错sdm包的sdmData()函数目前未适配terra的SpatRaster类,仅支持raster包的RasterStack/RasterBrick对象
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

