You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确使用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报错,是函数不兼容+参数格式错误共同导致的:

  1. projectRaster()内部调用rgdal的CRS校验逻辑时,无法从SpatRaster对象中提取到合法的字符型CRS值,触发第一次报错
  2. 第二次传入的target_crs是sf包的crs类列表对象,不是字符型,参数类型不满足校验要求,触发相同报错

内容的提问来源于stack exchange,提问作者marine-ecologist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 07:39:19