如何正确使用terra包res与projectRaster修改SpatRast分辨率
问题根源
- 核心错误是函数调用不匹配:
projectRaster()是raster包针对RasterLayer/RasterStack类对象设计的函数,不是terra包的原生函数。你传入的hadISST_mean是terra包生成的SpatRaster类对象,函数无法正确识别SpatRaster的内部结构,才会触发CRS参数校验报错。 - 操作逻辑偏差:你要实现的是同经纬度坐标系下的分辨率重采样(从1°到0.5°,和CDO的
remapbil,global_0.5操作等价),不需要做坐标投影变换,不需要调用投影类函数。 - 参数格式错误:你第二次传入的
target_crs是sf::st_crs()返回的列表类S3对象,不是空间栅格函数要求的字符型CRS定义(proj4字符串/EPSG编码),即使函数用对也会触发参数类型报错。
正确实现代码
等价于CDO双线性重网格的方案
和你之前用CDO做的0.5°全局重网格效果完全一致,用terra原生的重采样函数实现,运行效率更高:
library(terra) # 如果你的HadISST栅格经度范围是原生的0~360,先转成通用的-180~180范围 hadISST_mean <- rotate(hadISST_mean) # 生成和CDO global_0.5完全对齐的目标栅格模板 target_grid <- rast( xmin = -180, xmax = 180, ymin = -90, ymax = 90, res = 0.5, crs = "EPSG:4326" # WGS84经纬度坐标系 ) # 双线性重采样 hadISST_0.5deg <- resample( x = hadISST_mean, y = target_grid, method = "bilinear" )
需要做投影变换时的写法
如果你后续需要把栅格转到其他投影坐标系,用terra原生的project()函数,不要调用raster包的projectRaster():
# 示例:转为对应分辨率的Web墨卡托投影 hadISST_proj <- project( x = hadISST_mean, y = "EPSG:3857", # 直接传字符型的EPSG编码或proj4字符串 res = 50000, # 投影坐标系下分辨率单位为米 method = "bilinear" )
报错补充说明
你之前两次触发is.character(SRS_string) is not TRUE报错,是函数不兼容+参数格式错误共同导致的:
projectRaster()内部调用rgdal的CRS校验逻辑时,无法从SpatRaster对象中提取到合法的字符型CRS值,触发第一次报错- 第二次传入的
target_crs是sf包的crs类列表对象,不是字符型,参数类型不满足校验要求,触发相同报错
内容的提问来源于stack exchange,提问作者marine-ecologist
相关产品推荐
相关产品推荐

