如何在R中将栅格文件经度从20-380转换为-180-180?
解决GLODAP栅格经度从20-380转换为-180-180的问题
问题背景
处理GLODAP项目的NetCDF栅格文件时,读取后的栅格经度范围为20至380度,需要转换为-180至180度的常规经度范围。尝试直接修改NetCDF的经度值会破坏间距导致读取错误,也不清楚如何修改栅格对象的经度值后再用rotate函数。
读取数据的代码如下:
library(raster) library(ncdf4) raspH <- raster('~/Downloads/GLODAPv2.2016b_MappedClimatologies/GLODAPv2.2016b.pHts25p0.nc', varname = 'pHts25p0', band = 1) # 栅格信息输出: # class : RasterLayer # band : 1 (of 33 bands) # dimensions : 180, 360, 64800 (nrow, ncol, ncell) # resolution : 1, 1 (x, y) # extent : 20, 380, -90, 90 (xmin, xmax, ymin, ymax) # crs : +proj=longlat +datum=WGS84 +no_defs # source : GLODAPv2.2016b.pHts25p0.nc # names : seawater.ph.reported.on.total.scale.at.standard.temperature..25C..and.pressure..0dbar. # z-value : 1 # zvar : pHts25p0 plot(raspH)
解决方案
方法一:调整范围后使用rotate()函数(推荐)
rotate()函数是raster包专门为0-360经度范围的栅格设计的转换工具,能自动将其转为-180-180范围并调整数据顺序。我们只需先把原栅格的经度范围修正为0-360即可:
# 复制原栅格避免修改原始数据 raspH_adj <- raspH # 将栅格经度范围修改为0-360(原380度等价于20度,刚好覆盖完整全球范围) extent(raspH_adj) <- c(0, 360, -90, 90) # 执行经度转换 raspH_rotated <- rotate(raspH_adj) # 查看转换后的栅格信息 raspH_rotated # 绘图验证结果 plot(raspH_rotated)
方法二:手动拆分重组栅格数据
如果内置函数不适用,可手动拆分数据并调整经度范围:
# 将栅格转为矩阵格式 pH_data <- as.matrix(raspH) # 拆分数据:原栅格中180-380度的部分(对应第161至360列)转为-180-20度,20-180度的部分(第1至160列)保留 pH_part1 <- pH_data[, 161:360] # 对应转换后的-180到20度区域 pH_part2 <- pH_data[, 1:160] # 对应20到180度区域 # 合并数据:将-180-20度的部分放在前面 pH_combined <- cbind(pH_part1, pH_part2) # 创建新的栅格对象,设置目标经度范围 raspH_new <- raster(pH_combined, xmn=-180, xmx=180, ymn=-90, ymx=90, crs=crs(raspH)) # 保留原变量名 names(raspH_new) <- names(raspH) # 查看结果 raspH_new plot(raspH_new)
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

