You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:55:25