R语言terra/raster加载NetCDF后分辨率偏移,如何恢复原0.1×0.1分辨率?
问题解决:恢复GPM IMERG栅格的原始0.1×0.1分辨率
问题背景
我有GPM IMERG降水NetCDF文件,标称分辨率应为0.1×0.1(原图片底部红框标注显示像素尺寸接近0.1且宽高一致)。但使用terra::或raster::加载后,分辨率出现微小偏差:
class : SpatRaster dimensions : 185, 97, 1 (nrow, ncol, nlyr) resolution : 0.09999998, 0.1000001 (x, y) extent : 34.2, 43.9, 62.3, 80.80002 (xmin, xmax, ymin, ymax) coord. ref. : lon/lat WGS 84 source : _(1).nc:precipitationCal varname : precipitationCal (Daily accumulated precipitation (combined microwave-IR) estimate) name : precipitationCal unit : mm time (days) : 2000-06-04
需要解决:
- 如何将栅格恢复至原始0.1×0.1分辨率?
- 该偏差是否与R包的坐标舍入有关?
解决方案
1. 手动修正分辨率与范围
这种偏差是浮点运算精度限制导致的,并非数据本身问题。可以直接强制设置目标分辨率,并同步修正栅格范围:
使用terra包
library(terra) r <- rast("_(1).nc") # 设置目标分辨率 target_res <- c(0.1, 0.1) res(r) <- target_res # 重新计算匹配的栅格范围 new_extent <- c( xmin(r), xmin(r) + ncol(r)*target_res[1], ymin(r), ymin(r) + nrow(r)*target_res[2] ) ext(r) <- new_extent
使用raster包
library(raster) r <- raster("_(1).nc") target_res <- c(0.1, 0.1) res(r) <- target_res # 重新计算匹配的栅格范围 new_extent <- extent( xmin(r), xmin(r) + ncol(r)*target_res[1], ymin(r), ymin(r) + nrow(r)*target_res[2] ) extent(r) <- new_extent
2. 偏差原因说明
该问题不是R包主动舍入导致的,根源在于浮点数的存储特性:0.1这类十进制小数无法在二进制浮点系统中精确表示,NetCDF文件中的坐标信息经过加载时的浮点运算后,会出现极微小的精度误差,最终表现为分辨率的偏差。这种误差对数据分析无实质影响,但如果需要严格匹配标称分辨率,使用上述方法修正即可。
内容的提问来源于stack exchange,提问作者tabumis
相关产品推荐
相关产品推荐

