如何在x、y轴上交换netCDF数据的纬度与经度?
问题:netCDF数据转栅格后绘图轴颠倒(经度/纬度交换)
问题描述
我已将数据上传至GitHub仓库(仓库名:Benguela_Chla_Danielle_Schmidt),该数据为非洲东海岸26年的chl a数据。我尝试按月份拆分数据并对比月内方差,这是首次处理netCDF文件,目前核心问题是生成的图像中x轴为经度、y轴为纬度,需要交换二者位置。
已执行的代码:
nc_chla_file <- "cmems_mod_glo_bgc_my_0.25_P1M-m_1673881119174.nc" nc <- nc_open(nc_chla_file)
chl数据维度为经度、纬度、深度、月份,仅需最接近海面的第1层深度数据:
dim(ncvar_get(nc,varid="chl"))
提取1月chl数据并转换为栅格:
chl_jan <- ncvar_get(nc,varid="chl")[,,1,seq(1,312,12)] chl_jan_rast <- rast(chl_jan)
计算方差并绘图:
variance_chl_jan <- terra::app(chl_jan_rast, fun = "var") plot(variance_chl_jan, main = "Variance in chl a in January")

解决方法
问题根源是netCDF数据的维度顺序(经度→纬度)与terra::rast默认的栅格维度顺序(行/纬度→列/经度)不匹配,导致轴对应关系颠倒。以下两种方法可解决:
方法1:转置数据后创建栅格
直接对提取的二维数组进行转置,交换经度和纬度的维度顺序:
chl_jan <- ncvar_get(nc,varid="chl")[,,1,seq(1,312,12)] # 转置数组,交换经度(第一维)与纬度(第二维) chl_jan_transposed <- t(chl_jan) chl_jan_rast <- rast(chl_jan_transposed)
方法2:手动指定栅格坐标(更严谨)
从netCDF中读取经纬度的实际数值,手动绑定栅格的轴范围,确保对应关系准确:
# 读取netCDF中的经度、纬度变量 lon <- ncvar_get(nc, varid = "longitude") lat <- ncvar_get(nc, varid = "latitude") chl_jan <- ncvar_get(nc,varid="chl")[,,1,seq(1,312,12)] # 创建栅格时指定经纬度范围与维度 chl_jan_rast <- rast( chl_jan, xmin = min(lon), xmax = max(lon), ymin = min(lat), ymax = max(lat), ncol = length(lon), nrow = length(lat) ) # 转置栅格交换轴顺序 chl_jan_rast <- t(chl_jan_rast)
完成上述操作后,重新计算方差并绘图,即可得到x轴为纬度、y轴为经度的正确图像。
内容的提问来源于stack exchange,提问作者dan_confused
相关产品推荐
相关产品推荐

