乐于分享
好东西不私藏

CMEMS全球海洋产品数据–超级详细下载教程【python】

CMEMS全球海洋产品数据–超级详细下载教程【python】

从零开始,手把手教你获取全球海洋数据

经过作者的反复调试,已经成功实现脚本定时获取数据,这些经验整理成一份完整的操作指南,涵盖平台介绍、数据集清单、下载步骤、完整脚本和测试验证,喜欢请收藏关注方便你日后查阅和批量使用。

📌 一、什么是 Copernicus Marine Service?

Copernicus Marine Service(简称CMEMS)是欧盟哥白尼地球观测计划的海洋专项,提供全球及区域海洋环境的免费、开放、高质量数据。数据来源包括:

  • 多源卫星观测(测高、海温、海色等)

  • 现场观测(浮标、船测、Argo剖面浮标)

  • 数值模型再分析与预报

平台目前提供近400种数据产品,覆盖物理海洋、生物地球化学、海冰和波浪等,所有数据对注册用户完全免费

🌐 官网:https://data.marine.copernicus.eu

🗂️ 二、常用数据集清单(含中文解释)

CMEMS的数据集ID已全面迁移到以 cmems_obs- 或 cmems_mod- 开头的新命名体系。以下是最常用的海面高度相关数据集,均已实测可用。

🌊 海面高度(Sea Level)—— 核心产品

数据集ID
中文名称
时间范围
分辨率
更新频率
特点
cmems_obs-sl_glo_phy-ssh_my_allsat-l4-duacs-0.125deg_P1M-m
全球海面高度再分析(月平均)
1993年至今
0.125°
每月
长期气候研究,不支持subset
cmems_obs-sl_glo_phy-ssh_my_allsat-l4-duacs-0.25deg_P1M-m
全球海面高度再分析(粗分辨率)
1993年至今
0.25°
每月
文件更小,适合大范围趋势分析
cmems_obs-sl_glo_phy-ssh_nrt_allsat-l4-duacs-0.125deg_P1D
全球海面高度近实时(日平均)
近几天
0.125°
每日
支持subset

,适合小样本测试
cmems_obs-sl_glo_phy-ssh_nrt_allsat-l4-duacs-0.25deg_P1D
全球海面高度近实时(粗分辨率)
近几天
0.25°
每日
支持subset,数据量更小

✅ 变量说明:以上数据集通常包含 sla(海面高度异常)、ugos/vgos(地转流分量)、madt(平均动力地形)。

🌡️ 海表温度(SST)

数据集ID
中文名称
分辨率
更新频率
cmems_obs-sst_glo_phy-ostia_realtime-l4_0.05deg_P1D
全球海表温度近实时
0.05°
每日
cmems_obs-sst_glo_phy-ostia_reanalysis-l4_0.05deg_P1D
全球海表温度再分析
0.05°
每日

🧪 海洋物理模型(温度、盐度、海流)

数据集ID
中文名称
覆盖区域
分辨率
变量
cmems_mod_glo_phy_my_0.083deg_P1D-m
全球物理再分析(日平均)
全球
0.083°
thetao

souovo
cmems_mod_glo_phy_anfc_0.083deg_PT1H-m
全球物理分析与预报(逐小时)
全球
0.083°
同上,含预报
cmems_mod_med_phy_my_4.2km_P1D-m
地中海物理再分析
地中海
4.2km
同上

📌 变量代码:thetao=温度,so=盐度,uo/vo=海流分量,zos=海面高度。

🚀 三、数据下载步骤(完整流程)

步骤1:注册账号

访问 CMEMS官网 完成注册(免费)。注册后邮箱会收到激活链接,点击激活即可。

步骤2:安装 Copernicus Marine Toolbox

pip install copernicusmarine --upgrade

步骤3:登录(两种方式任选)

方式A:命令行交互登录(推荐,安全)

copernicusmarine login# 按提示输入用户名和密码
方式B:命令行直接传入密码(适合脚本)
# 搜索海面高度相关数据集copernicusmarine describe --contains "sea level" | grep dataset_id

步骤5:下载数据

小样本测试(推荐首次使用)

copernicusmarine subset \  --dataset-id cmems_obs-sl_glo_phy-ssh_nrt_allsat-l4-duacs-0.125deg_P1D \  --variable sla \  --start-datetime 2026-04-15 \  --end-datetime 2026-04-15 \  --minimum-longitude 110 \  --maximum-longitude 120 \  --minimum-latitude 10 \  --maximum-latitude 20 \  --output-directory ./test_data

📜 四、完整测试脚本(自动登录+下载)

#!/usr/bin/env python3"""CMEMS 数据下载测试脚本(自动登录版)内置账号密码,一键运行"""import osimport sysimport subprocessfrom datetime import datetime, timedelta# ==================== 账号配置(直接写入)====================USERNAME = "183@qq.com"PASSWORD = "."   # 密码# ==================== 下载参数 ====================DATASET_ID = "cmems_obs-sl_glo_phy-ssh_nrt_allsat-l4-duacs-0.125deg_P1D"# 下载日期(取3天前,确保数据已发布)TARGET_DATE = (datetime.utcnow() - timedelta(days=3)).strftime("%Y-%m-%d")# 若上述日期无数据,可手动指定:TARGET_DATE = "2026-04-15"LON_MIN, LON_MAX = 110120LAT_MIN, LAT_MAX = 1020VARIABLES = ["sla"]OUTPUT_DIR = "./cmems_test_output"OUTPUT_FILENAME = f"sla_test_{TARGET_DATE}.nc"# ==================== 函数定义 ====================def auto_login():    """自动登录 CMEMS"""    print("🔐 正在自动登录 CMEMS...")    login_cmd = [        "copernicusmarine""login",        "--username", USERNAME,        "--password", PASSWORD,        "--force-overwrite"    ]    try:        subprocess.run(login_cmd, check=True, capture_output=True, text=True)        print("✅ 登录成功")    except subprocess.CalledProcessError as e:        print(f"❌ 登录失败: {e.stderr}")        sys.exit(1)def download_test_data():    """执行数据下载"""    print(f"\n📥 开始下载测试数据...")    print(f"   数据集: {DATASET_ID}")    print(f"   日期: {TARGET_DATE}")    print(f"   区域: 经度 {LON_MIN}~{LON_MAX}, 纬度 {LAT_MIN}~{LAT_MAX}")    print(f"   变量: {VARIABLES}")    print(f"   输出目录: {OUTPUT_DIR}")    os.makedirs(OUTPUT_DIR, exist_ok=True)    try:        from copernicusmarine import subset        subset(            dataset_id=DATASET_ID,            start_datetime=TARGET_DATE,            end_datetime=TARGET_DATE,            minimum_longitude=LON_MIN,            maximum_longitude=LON_MAX,            minimum_latitude=LAT_MIN,            maximum_latitude=LAT_MAX,            variables=VARIABLES,            output_directory=OUTPUT_DIR,            output_filename=OUTPUT_FILENAME,        )        return True    except Exception as e:        print(f"\n❌ 下载失败: {e}")        return Falsedef verify_file():    """验证下载的文件"""    file_path = os.path.join(OUTPUT_DIR, OUTPUT_FILENAME)    if not os.path.exists(file_path):        print("❌ 文件未生成")        return False    file_size = os.path.getsize(file_path) / 1024    print(f"\n✅ 文件已保存: {file_path}")    print(f"   文件大小: {file_size:.2f} KB")    try:        import xarray as xr        ds = xr.open_dataset(file_path)        print(f"   变量: {list(ds.data_vars.keys())}")        print(f"   时间维度: {ds.time.values}")        ds.close()        print("✅ 文件格式验证通过")    except ImportError:        print("⚠️ 未安装 xarray,跳过格式验证")    except Exception as e:        print(f"⚠️ 读取文件时出错: {e}")    return True# ==================== 主程序 ====================def main():    print("="*60)    print("   CMEMS 数据下载测试脚本(自动登录版)")    print("="*60)    auto_login()    if download_test_data():        verify_file()        print("\n🎉 测试完成!环境配置正确,可以正常下载数据。")    else:        print("\n⚠️ 测试失败,请检查网络或数据集ID")if __name__ == "__main__":    main()
测试成功
python download_cmems_test.py
打开数据

常见问题及解决方案

问题
原因
解决方法
Dataset not found
数据集ID已废弃
用 describe --contains 查找新ID
No such variable: sla
变量名不正确
用 describe --dataset-id <ID> 查看可用变量
下载的文件为0字节
指定日期无数据
改用更早的日期(如 2024-01-01)或使用MY数据集
登录凭证无效
密码错误或未激活
重新运行 login 并确认账号已激活
下载速度极慢
网络问题
缩小区域或改用0.25°分辨率数据集
GPM IMERG 全球降水数据(NASA)完整下载教程
Python下载NOAA GFS全球预报数据实战教程
预警!超级厄尔尼诺即将登场:2026-2027年全球气候或迎“极端狂暴模式”
全国雷达拼图下的SCIT风暴识别python实战
太平洋上演罕见“双子风暴”——超强台风森拉克与南太平洋迈拉的气象奇观

请在微信客户端打开