如何设置SpatRaster的分辨率与范围精度以匹配NetCDF文件?
问题描述
我需要创建一个与现有NetCDF文件匹配的SpatRaster。该NetCDF的网格参数如下:
gridtype = lonlat gridsize = 8100 xsize = 90 ysize = 90 xname = lon xlongname = "longitude" xunits = "degrees_east" yname = lat ylongname = "latitude" yunits = "degrees_north" xfirst = -1.04443359375 xinc = 0.0111083984375 yfirst = 51.5055541992188 yinc = 0.0111122131347656
使用rast()读取该文件时,分辨率与范围被四舍五入(注:xmin与xfirst不同是因为xfirst为像元中心,此为正常情况),读取结果如下:
class : SpatRaster dimensions : 90, 90, 1 (nrow, ncol, nlyr) resolution : 0.0111084, 0.01111221 (x, y) extent : -1.049988, -0.05023193, 51.5, 52.5001 (xmin, xmax, ymin, ymax) coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) source : EMEP4UK_emep-ctm-rv5.0_wrf4.4.2_Defrag_moreLC_trend2021_emiss2021_BD_2021_day_PS.nc varname : PS (PS) name : PS unit : hPa time (days) : 2021-01-01
请问是否有方法强制提升分辨率与范围的精度?我已尝试terraOptions(datatype = "FLT8S"),以及手动创建覆盖欧洲更大范围的SpatRaster:
res_x <- 0.0111083984375 res_y <- 0.0111122131347656 r_ref <- rast(ext(-24.994140625, 35.990966796875, 34.003818511963, 72.9965744018555), res = c(res_x,res_y)) > r_ref class : SpatRaster dimensions : 3509, 5490, 1 (nrow, ncol, nlyr) resolution : 0.0111084, 0.01111221 (x, y) extent : -24.99414, 35.99097, 34.00382, 72.99657 (xmin, xmax, ymin, ymax) coord. ref. : lon/lat WGS 84 > res(r_ref) [1] 0.01110840 0.01111221
解决方案
1. 手动计算精确范围创建匹配图层
根据NetCDF给出的像元中心坐标、分辨率和行列数,可精确计算图层范围,再构建SpatRaster:
# 提取NetCDF的网格参数 x_first <- -1.04443359375 x_inc <- 0.0111083984375 x_cols <- 90 y_first <- 51.5055541992188 y_inc <- 0.0111122131347656 y_rows <- 90 # 计算精确范围:像元左边界=中心坐标-分辨率/2;右边界=左边界+分辨率*列数 x_min <- x_first - x_inc/2 x_max <- x_min + x_inc * x_cols y_min <- y_first - y_inc/2 y_max <- y_min + y_inc * y_rows # 创建精确匹配的SpatRaster r_precise <- rast(ext(x_min, x_max, y_min, y_max), res = c(x_inc, y_inc), crs = "OGC:CRS84")
注意:terra控制台输出默认会四舍五入数值,但内部存储的是精确值,可通过以下命令验证:
# 查看精确分辨率 dput(res(r_precise)) # 查看精确范围 dput(ext(r_precise))
2. 调整控制台输出精度
如果只是希望在打印时显示更高精度的数值,可设置全局数字显示位数:
# 设置显示15位有效数字 options(digits = 15)
之后再查看SpatRaster信息,就能看到完整精度的分辨率和范围。
3. 基于原文件生成匹配模板
直接读取原NetCDF文件作为模板,创建空图层,可完全匹配原文件参数:
# 读取原文件获取模板 r_template <- rast("EMEP4UK_emep-ctm-rv5.0_wrf4.4.2_Defrag_moreLC_trend2021_emiss2021_BD_2021_day_PS.nc") # 创建空的匹配SpatRaster r_matched <- setValues(r_template, NA)
这种方式无需手动计算,能确保网格参数与原文件完全一致。
内容的提问来源于stack exchange,提问作者user8330904
相关产品推荐
相关产品推荐

