使用terra将模型输出重采样至任意网格:resample/project仅返回子集问题
解决方案:用terra包将栅格下采样到指定自定义网格
问题原因
你遇到的核心问题是原始栅格与目标栅格的空间范围不匹配:
- 原始栅格
raw是全球范围(经度-0.56359.44,纬度-89.789.7) - 你定义的目标栅格
newgrid仅覆盖极小的局部范围(经度1128,纬度164)
因此resample()和project()只会处理两个栅格重叠的区域,自然返回的是子集而非完整的下采样结果。
针对两种常见需求的解决方案
需求1:下采样到与原始范围一致、指定分辨率的网格
这是最典型的下采样场景——保持原始数据的空间范围,仅将分辨率调整为指定的行数/列数:
library(terra) # 构建原始栅格 raw <- rast(ext(c(-0.5625, 359.4375, -89.70215791342, 89.70215791342)),nrow=160,ncol=320) values(raw) <- (1:ncell(raw))/10000+c(rep(1,ncell(raw)/4),rep(2,ncell(raw)/4),rep(1,ncell(raw)/4),rep(2,ncell(raw)/4)) # 创建与原始栅格范围、CRS一致,分辨率为64行128列的目标栅格 newgrid <- rast(ext(raw), nrow=64, ncol=128, crs=crs(raw)) # 执行下采样(用均值聚合更适合下采样场景,替代双线性插值) new_raster <- resample(raw, newgrid, method="average") # 查看结果 plot(new_raster)
注:如果聚合因子是整数(比如原始160行→目标80行,因子为2),也可以用aggregate(raw, fact=2, fun=mean)实现更高效的聚合下采样。
需求2:将原始栅格转换到自定义范围的指定网格
如果你确实需要将全球数据映射到自定义的局部范围(如经度1128、纬度164),可以直接使用resample(),但要明确这是将原始数据的重叠区域转换到目标网格,而非全局拉伸:
library(terra) # 构建原始栅格 raw <- rast(ext(c(-0.5625, 359.4375, -89.70215791342, 89.70215791342)),nrow=160,ncol=320) values(raw) <- (1:ncell(raw))/10000+c(rep(1,ncell(raw)/4),rep(2,ncell(raw)/4),rep(1,ncell(raw)/4),rep(2,ncell(raw)/4)) # 定义自定义范围的目标栅格 newgrid <- rast(xmin=1,xmax=128,ymin=1,ymax=64,nrow=64,ncol=128, crs=crs(raw)) # 重采样到目标网格 new_raster <- resample(raw, newgrid, method="bilinear") # 查看结果 plot(new_raster)
内容的提问来源于stack exchange,提问作者JFV
相关产品推荐
相关产品推荐

