CMEMS全球海洋产品数据–超级详细下载教程【python】
从零开始,手把手教你获取全球海洋数据
经过作者的反复调试,已经成功实现脚本定时获取数据,这些经验整理成一份完整的操作指南,涵盖平台介绍、数据集清单、下载步骤、完整脚本和测试验证,喜欢请收藏关注方便你日后查阅和批量使用。

📌 一、什么是 Copernicus Marine Service?
Copernicus Marine Service(简称CMEMS)是欧盟哥白尼地球观测计划的海洋专项,提供全球及区域海洋环境的免费、开放、高质量数据。数据来源包括:
-
多源卫星观测(测高、海温、海色等)
-
现场观测(浮标、船测、Argo剖面浮标)
-
数值模型再分析与预报
平台目前提供近400种数据产品,覆盖物理海洋、生物地球化学、海冰和波浪等,所有数据对注册用户完全免费。
🌐 官网:https://data.marine.copernicus.eu

🗂️ 二、常用数据集清单(含中文解释)
CMEMS的数据集ID已全面迁移到以 cmems_obs- 或 cmems_mod- 开头的新命名体系。以下是最常用的海面高度相关数据集,均已实测可用。
🌊 海面高度(Sea Level)—— 核心产品
|
|
|
|
|
|
|
|---|---|---|---|---|---|
cmems_obs-sl_glo_phy-ssh_my_allsat-l4-duacs-0.125deg_P1M-m |
|
|
|
|
|
cmems_obs-sl_glo_phy-ssh_my_allsat-l4-duacs-0.25deg_P1M-m |
|
|
|
|
|
cmems_obs-sl_glo_phy-ssh_nrt_allsat-l4-duacs-0.125deg_P1D |
|
|
|
|
支持subset
|
cmems_obs-sl_glo_phy-ssh_nrt_allsat-l4-duacs-0.25deg_P1D |
|
|
|
|
|
✅ 变量说明:以上数据集通常包含
sla(海面高度异常)、ugos/vgos(地转流分量)、madt(平均动力地形)。
🌡️ 海表温度(SST)
|
|
|
|
|
|---|---|---|---|
cmems_obs-sst_glo_phy-ostia_realtime-l4_0.05deg_P1D |
|
|
|
cmems_obs-sst_glo_phy-ostia_reanalysis-l4_0.05deg_P1D |
|
|
|
🧪 海洋物理模型(温度、盐度、海流)
|
|
|
|
|
|
|---|---|---|---|---|
cmems_mod_glo_phy_my_0.083deg_P1D-m |
|
|
|
thetao
so, uo, vo |
cmems_mod_glo_phy_anfc_0.083deg_PT1H-m |
|
|
|
|
cmems_mod_med_phy_my_4.2km_P1D-m |
|
|
|
|
📌 变量代码:
thetao=温度,so=盐度,uo/vo=海流分量,zos=海面高度。
🚀 三、数据下载步骤(完整流程)
步骤1:注册账号
访问 CMEMS官网 完成注册(免费)。注册后邮箱会收到激活链接,点击激活即可。

步骤2:安装 Copernicus Marine Toolbox
pip install copernicusmarine --upgrade
步骤3:登录(两种方式任选)
方式A:命令行交互登录(推荐,安全)
copernicusmarine login# 按提示输入用户名和密码
# 搜索海面高度相关数据集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 = 110, 120LAT_MIN, LAT_MAX = 10, 20VARIABLES = ["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 subsetsubset(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 Trueexcept 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 Falsefile_size = os.path.getsize(file_path) / 1024print(f"\n✅ 文件已保存: {file_path}")print(f" 文件大小: {file_size:.2f} KB")try:import xarray as xrds = 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 |
|
describe --contains 查找新ID |
No such variable: sla |
|
describe --dataset-id <ID> 查看可用变量 |
|
|
|
2024-01-01)或使用MY数据集 |
|
|
|
login 并确认账号已激活 |
|
|
|
|
请在微信客户端打开
夜雨聆风