
简介针对GRACE卫星重力数据反演陆地水储量变化的Matlab程序包面向从事地下水储量变化、陆地质量变化研究的研究生与科研人员。程序基于水平衡方程将GRACE数据转化为陆地质量变化结果是计算地下水储量变化的关键一步。压缩包共152个文件包含132个gfc格式的GRACE球谐系数数据、13个m格式Matlab脚本、5个txt说明文件及示例图片与mat数据整体大小15.85MB并配有测试数据可在Matlab 2019上直接运行。程序实现从数据读取、处理到反演输出的完整流程便于新手快速上手与二次开发。配套系列博文提供理论讲解用户可按需参考。已有485人学习下载适合需要开展GRACE数据处理与陆地水储量反演的研究人员使用。 做水文和气候变化研究的朋友应该都有同感GRACE陆地质量变化数据的处理是个让人头疼的环节。这套Matlab程序以GRACE/GRACE Follow-On卫星的球谐系数产品为输入一键完成等效水高反演、滤波去噪和绘图输出并且自带测试数据下载解压后直接运行主程序就能看到完整结果不需要手动下载数据、不依赖任何付费工具箱。对于想快速入门GRACE数据处理或者做区域水储量变化研究的同学这是个能直接上手的完整工具。我这次借整理程序的机会把整个处理流程里最常踩的坑、最容易忽略的细节、需要重点关注的计算环节一并写出来。文章不会只停留在“按钮能跑”的程度而是把每个关键步骤背后为什么这样做讲清楚方便你在实际研究中按需调整。1. 内容整体设计与思路拆解1.1 这套程序到底帮你做了什么事GRACE和GRACE Follow-On的原始产品并不是一张现成的水储量变化图而是以球谐系数形式给出的重力场模型。从球谐系数到一张能放进论文里的陆地水储量时空变化图中间要经历读取格式、扣除平均场、等效水高换算、低阶项处理、滤波去噪、网格化、可视化好几大步。任何一个环节处理不当轻则图像花屏、条带密布重则数值完全失真。这套Matlab程序的核心目标就是把上述这些步骤固化成一个标准流程并且提供两类能力。第一类是完整的处理管线只需提供球谐系数文件就能得到全球或区域的等效水高时空变化第二类是可灵活调整的调参能力滤波半径、截断阶数、是否做去相关滤波都可以修改适合不同研究场景。测试数据是事先从公开GRACE产品中截取的一段序列压缩包内已经按程序要求的目录摆放好在Matlab中打开并运行主程序脚本即可直观看到处理效果。很多刚接触GRACE数据的人拿到GSM文件后会愣住因为文件里是上百阶的C、S系数矩阵完全不知道从哪下手。这套程序把抽象的系数换算成了实际的空间变化量相当于给了一个“翻译器”把重力场异常翻译成“哪些地方在变干、哪些地方在变湿”以及“每年变化了多少毫米”。程序内部把常见的数据产品差异也做了兼容处理CSR、JPL、GSFC三个处理中心的文件都能读取这个细节在长期使用中非常省心。1.2 为什么选择Matlab路线而不是换成Python倒不是说Python做不了这个事事实上有不少开源项目用Python也在做GRACE处理但就我个人的实际体验来看Matlab在几个点上仍然有不可替代的优势。第一球谐系数天然是二维矩阵Matlab的矩阵运算语法和数组操作在做阶次展开、循环累加时非常顺手代码可读性也高。第二GRACE数据处理的经典算法比如高斯滤波、P4M6去相关最早基本都是用Matlab或Fortran实现的资料和参考代码多遇到问题容易找到出处。第三Matlab的绘图交互性更强出图后可以直接旋转视角、缩放查看区域细节这在调试数据时非常方便。第四很多高校和科研单位本身就部署了Matlab正版授权学生直接用校园版就能跑不需要额外搭建Python科学计算环境。当然如果你所在的团队强依赖Python生态也可以用这套程序的算法逻辑作为参考移植过去核心换算公式我在后文会完整列出移植难度并不大。这套程序本身没有使用任何Matlab加密或编译步骤所有M函数都是可读源码方便理解、修改和二次开发。2. 核心数据处理原理与算法选型2.1 球谐系数转等效水高的完整换算逻辑GRACE反演水储量变化本质上是通过重力场的变化反推地球表面质量迁移。地球表面某个位置的质量变化会引起重力场变化这个变化用球谐系数增量ΔC_lm和ΔS_lm描述。将球谐系数转成等效水高公式里最关键的是对负荷勒夫数k_l的修正。Δh(θ, λ) (a · ρ_avg) / (3 · ρ_w) × ΣΣ [(2l 1) / (1 k_l)] · P_lm(cosθ) · (ΔC_lm·cos(mλ) ΔS_lm·sin(mλ))公式里a是地球平均半径ρ_avg是地球平均密度ρ_w是水的密度P_lm是归一化的缔合勒让德函数。之所以要乘(2l1)/(1k_l)是因为弹性地球在表面负荷作用下会发生形变实际观测到的重力变化包含了负荷本身的重力效应和地球形变效应k_l就是用来修正形变影响的关键项。程序内部内置了一份Farrell负荷勒夫数表按阶数l插值得到对应值实际使用中不需要自己去查这套数。程序里对应这一步的函数是calc_ewh.m输入是球谐系数的异常值输出是经纬度网格上的等效水高序列单位是毫米。写这个函数时有两个细节容易出错一是勒让德函数的归一化方式要和GRACE产品说明保持一致否则结果会整体差一个倍数二是经纬度网格要用球坐标构建不能直接用简单的线性网格替代否则高纬度地区会出现明显的扭曲变形。2.2 低阶项替换、去相关滤波和高斯平滑为什么缺一不可拿到GRACE的球谐系数之后不能直接套公式计算。实际的GRACE产品在低阶项和高阶项上都存在精度问题必须做专门处理。低阶项中C20项对应地球动力学扁率受GRACE轨道误差影响较大业内约定俗成的做法是用SLR卫星激光测距反演的C20序列进行替换一阶项C10、C11、S11对应地心运动也需要特殊处理程序里提供了两种来源选项供不同数据版本选择。这一步如果跳过后续计算的陆地水储量变化会出现明显的系统性偏差尤其在高纬度区域会非常明显。去相关滤波针对的是GRACE知名的“条带噪声”问题。由于GRACE轨道呈南北向球谐系数高阶项存在强烈的相关误差直接做空间成图会看到南北向的条带条纹严重干扰真实信号的判读。程序内置了P4M6去相关滤波方法对阶数大于等于6的项沿次数方向用4阶多项式拟合并剔除拟合残差。这个方法在GRACE数据处理里应用极广能在不严重损失信号的前提下有效压制条带。高斯平滑是最后一层空间滤波。球谐系数截断到60阶空间分辨率大概在330公里左右但实际噪声仍然偏大。高斯滤波通过给不同阶数的球谐系数施加衰减权重来降低高阶噪声的影响。滤波半径300km和500km是两种常用配置300km保留更多空间细节500km冲得更平但也更干净。程序默认300km可以在主脚本里直接修改。3. 实操过程与程序运行3.1 测试数据构成与运行环境准备程序压缩包内包含的主要目录和文件包括code存放全部M函数、data存放测试球谐系数文件、result存放输出图件和.mat中间结果以及README.txt。测试数据选自某时间段内公开GRACE产品的一个子集覆盖全球范围按月份组织成多个文件方便演示时间序列处理。运行环境要求不高Matlab R2019b及以上版本即可不需要额外安装工具箱。如果你用的是R2023b等新版本运行会更流畅。把压缩包解压到本地路径后在Matlab里将code目录设为当前文件夹或者在命令行里执行addpath(genpath(你的路径/code))即可开始运行。这里有个实际操作层面的建议不要直接从压缩包内双击运行M文件先解压到完整路径且路径中避免出现中文和空格。Matlab对含中文的路径偶尔会有编码兼容问题一旦报错比较难排查提前用纯英文路径能省不少时间。3.2 主函数入口与运行流程、关键参数含义程序的主入口是main_grace_lwe.m运行后会自动按以下顺序执行读取data目录下的全部球谐系数文件计算相对于平均场的球谐系数异常替换C20项、处理一阶项调用calc_ewh.m计算等效水高对每个时间点的球谐系数做去相关滤波和高斯平滑将结果网格化并绘制全球变化图、区域时间序列图。核心流程的骨架代码大致是这样的% main_grace_lwe.m 主流程示例 datapath ./data; filelist dir(fullfile(datapath, *.gfc)); for i 1:length(filelist) [C, S, info] read_gfc(fullfile(datapath, filelist(i).name)); C_anom C - C_mean; S_anom S - S_mean; C_anom(2, 1) C20_slr(i); % 替换C20项 [C_f, S_f] gauss_spectral_filter(C_anom, S_anom, radius); EWH(:, :, i) calc_ewh(C_f, S_f); end主脚本顶部的几个参数经常需要修改。max_degree默认设为60也就是截断到60阶对应约330公里的空间分辨率gauss_radius默认300单位是公里destripe_switch默认true表示启用P4M6去相关region参数可以选择global或指定经纬度范围。这些参数都带有注释说明即便是第一次使用也能快速理解每个量控制的是什么。运行结束后result目录下会生成两个核心输出lwe_grid.mat保存了全球等效水高网格单位mm及对应的时间和经纬度信息lwe_map.png是全球变化分布图。如果你继续在命令窗口调用plot_region_time.m还可以选择区域平均的时间序列并导出.csv表格方便做后续统计分析。3.3 结果图如何解读与常见形态跑通测试数据后你会看到一张以月份为时间序列的全球陆地水储量变化图。正常的结果呈现出的规律是季风区、高纬度地区的变化幅度明显大于干旱区海洋区域因为本身信号弱、处理后数值接近零程序默认对海洋做了掩膜陆地上的强信号区基本与主要流域、冰川覆盖区对应。如果你看到的是满屏条带或者一片混沌不需要怀疑程序坏了多半是去相关滤波或者高斯平滑没被正确调用。程序在每次滤波调用后会打印一行调试信息包含当前月份的条带噪声残余量可以借此快速判断哪个环节出了问题。这里建议先用测试数据把程序跑通再替换自己的数据这样能准确区分是程序问题还是数据问题。4. 常见问题与排查技巧实录4.1 程序运行报错速查报错现象常见原因解决办法Index exceeds matrix dimensions数据文件格式不匹配或阶数设置超过文件实际阶数检查GSM文件版本将max_degree设为不超过文件最大阶数结果全为NaN或Inf文件读取不完整或网格化时存在除零重新解压测试数据检查data目录文件是否齐全内存不足网格过细或同时加载过多月份数据将网格分辨率调粗到1度或0.5度按月循环处理图形空白绘图函数未设置colormap范围或数据全部为0检查低阶项处理函数是否被注释排查数据值是否过小中文路径报错文件夹含中文或特殊字符改到纯英文路径运行注意遇到报错时先把测试数据完整跑通确认程序本身没问题再逐步替换自己的数据这是排查效率最高的方式。4.2 结果异常的排查思路如果你把程序换成自己的GRACE数据后发现结果异常首先确认数据格式是否兼容。GRACE Level-2数据有CSR、JPL、GSFC等多个处理中心的发布版本虽然都是球谐系数但文件头格式、系数排列顺序可能有差异。先用测试数据跑通再逐步替换是效率最高的排查方式。区域时间序列出现突然跳变时要检查对应月份的文件是否被正确处理因为部分时段GRACE任务存在数据缺失。对于GRACE与GRACE Follow-On之间的数据空白时段需要额外补充替代数据或者在时间轴上做标注不要直接拼接否则曲线会产生虚假跳变。另外如果处理的是区域内的点位数据还要确认网格点是否落在有效的陆地区域内避免把海洋噪声点计算进区域平均序列里。4.3 几个提升效率的避坑建议在处理大规模长序列数据时建议先把max_degree临时降低到40快速跑通全流程确认参数无误后再升回60阶正式计算这样能节省大量调试时间。处理多月份数据时建议边算边保存中间结果避免某一步报错后从头再来。另外球谐系数的存储结构在Matlab中是按阶次顺序排列的代码里用的是C_lm(m1, l1)、S_lm(m1, l1)的索引方式如果你后续要扩展功能保持这个索引约定可以减少很多麻烦。根据我个人经验GRACE数据处理的坑绝大多数不在公式本身——公式都是公开的也不在程序运行速度——Matlab处理几十个文件完全够用。真正的坑全在细节单位换算是否一致、勒让德归一化是否匹配、文件头参数是否读取正确、海洋掩膜是否成功。这套程序把最容易出问题的细节都封装好了拿到手先跑通测试数据再替换成自己的数据整个过程会顺畅很多。后续如果想进一步扩展可以考虑接入GRACE Follow-On的最新数据、增加冰川均衡调整GIA改正或者把区域序列导出后做干旱指数分析都是不错的延伸方向。本文还有配套的精品资源点击获取