ORAS5盐度数据的2D坐标与三极网格投影可视化问题
ORAS5三极网格盐度数据处理方案
一、处理2D经纬度坐标
ORAS5的三极网格采用不规则2D经纬度是设计特性,无需强行转成1D,直接基于原坐标处理即可:
1. 转换经度到0-360范围
import xarray as xr # 加载数据 salinity = xr.open_dataset('salinity_ORAS5.nc') sal = salinity['sosaline'] # 修正经度范围(将负经度转为0-360) sal = sal.assign_coords( nav_lon=xr.where(sal.nav_lon < 0, sal.nav_lon + 360, sal.nav_lon) )
2. 转换纬度到0-180范围
若确实需要将常规-9090的纬度转为0180,直接做偏移即可:
sal = sal.assign_coords(nav_lat=sal.nav_lat + 90)
注:多数海洋模型可视化默认用-90~90纬度,若无需特殊需求可跳过此步骤。
二、正常投影的地图可视化
plt.imshow仅适用于规则网格,三极网格需用pcolormesh配合地理投影库实现正确可视化:
import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cfeature # 创建带投影的画布(PlateCarree适用于全球视图,极地区域可换NorthPolarStereo) fig, ax = plt.subplots( figsize=(12, 8), subplot_kw={'projection': ccrs.PlateCarree()} ) # 绘制盐度数据(isel(time=0)取第一时间步) sal.isel(time=0).plot.pcolormesh( ax=ax, x='nav_lon', y='nav_lat', transform=ccrs.PlateCarree(), # 声明数据的地理坐标系统 cmap='viridis', shading='auto' ) # 添加地图边界与陆地特征 ax.add_feature(cfeature.COASTLINE, linewidth=0.8) ax.add_feature(cfeature.LAND, facecolor='lightgray') plt.title('ORAS5 Surface Salinity (Tripolar Grid)') plt.show()
如果重点关注北极区域,可切换为极地投影:
fig, ax = plt.subplots( figsize=(10, 10), subplot_kw={'projection': ccrs.NorthPolarStereo()} ) ax.set_extent([-180, 180, 60, 90], crs=ccrs.PlateCarree()) # 后续绘图代码同上
三、三极网格:直接处理还是插值?
- 优先直接处理原网格:三极网格的设计目的就是精准模拟极地环流,插值到规则网格会丢失极地区域的精细网格信息,还可能引入插值误差,无法保留原始数据的物理意义。
- 仅在必要时插值:如果必须适配规则网格的工具(如部分模式输入),可使用
xesmf库进行重网格化,或xarray内置的interp方法:# 示例:插值到1°×1°规则网格 target_lon = xr.arange(0, 360, 1) target_lat = xr.arange(-90, 91, 1) sal_interp = sal.interp(nav_lon=target_lon, nav_lat=target_lat)
内容的提问来源于stack exchange,提问作者smi
相关产品推荐
相关产品推荐

