简介:GAMIT 10.71 是面向大地测量与地球物理研究的高精度 GNSS 数据处理软件套件,适合测绘、地震、地壳形变监测等领域的研究者与工程师。压缩包共75个文件,约109.47MB,涵盖核心程序包 gamit、kf 滤波模块、tables 参数表与 maps 区域配置,以及 relnote 版本说明、轨道/钟差文件、接收机天线文件等,可支持 GPS、GLONASS、Galileo、BeiDou 等多系统数据的 PPP、相对定位与时间序列分析。文件类型以 apr、gz、dat、atx、snx 为主,分别用于先验坐标、压缩源码、观测文件、天线相位中心与 SINEX 解算结果。已有 2546 人学习下载。通过安装与使用,读者可掌握从原始观测数据解析、质量控制、Kalman滤波到网络平差与结果解释的完整流程,并直接获得可运行的安装脚本、实时处理命令与版本更新说明,便于快速搭建处理环境并深入理解卫星定位数据处理的核心环节。 做GNSS数据处理的人,应该都知道GAMIT。那套来自MIT的高精度基线解算软件,几乎是大地测量、地壳形变、工程控制网这些方向的标配工具。最近我在几台不同的Linux机器上完整走了一遍GAMIT 10.71安装包的编译、配置、table数据更新和基线解算验证流程,中间踩了不少坑,也把整个流程理顺了。这篇就把10.71的安装过程、环境依赖、table数据处理以及常见报错整理出来,给正准备上手或者换新服务器的朋友一份能直接照抄的参考。
这篇文章适合谁看?刚接触GAMIT的研究生、需要在新服务器上部署GAMIT环境的课题组,以及以前装过旧版但被新版编译问题卡住的人。我尽量把每一步为什么这么做讲清楚,不光是给命令,而是把命令背后的逻辑也说透。
1. 项目概述:GAMIT 10.71 是什么,解决什么问题
1.1 从安装包到基线解算:GAMIT在大地测量里的角色
GAMIT全称是GPS Analysis at MIT,名字里带着GPS,但现在它早已不限于GPS了。10.7之后的多系统支持已经非常完整,GPS、GLONASS、Galileo、北斗都可以一起参与解算。它利用GNSS载波相位观测值做高精度静态或动态基线解算,最典型的产出是测站坐标、基线向量、站间模糊度参数这些结果。在地壳运动监测、板块运动研究、长距离工程控制网、高铁桥梁形变监测这些场景里,GAMIT配合GLOBK几乎是被默认采用的“标准方案”。
简单解释一下基线解算。用两台或多台GNSS接收机同步观测同一组卫星,接收机之间的天线位置相对向量就是基线。看起来好像就是坐标做差,但实际操作里要考虑整周模糊度固定、电离层延迟、对流层延迟、海潮负荷、固体潮改正,每一项都是精细活。GAMIT在长基线和短基线上都有很高的精度表现,这也是为什么很多学术文章会把GAMIT作为数据处理主引擎,审稿人看到GAMIT输出的结果,通常不会质疑软件层面的可靠性。
而GAMIT 10.71,就是10.7系列里的一个小版本更新。它最明显的变化是修了一堆编译兼容性问题,对新的Linux内核、新的gfortran编译器适配明显比10.6和早期10.7好了不少。如果你之前卡在旧版本编译不过去,或者想用一个更新更稳的基线解算工具,直接上10.71就行。
1.2 版本迭代带来的关键变化
10.6以前的GAMIT主要处理GPS单系统数据,做单系统解算时问题不大,但这两年很多观测站的高精度应用都在做多系统组合,尤其是BDS+GPS的联合解算。10.7开始加入了GLONASS、Galileo和BDS的支持,这才把多系统组合解算这条路打通了。
10.71在这个基础上,又修正了部分卫星天线相位中心改正参数的处理逻辑,同时把table目录里的文件结构整理得更清晰。它对新手来说还有一个好处:默认配置就更容易适配现代Linux发行版,不像老版本那样动不动就要手动改一堆Makefile。
还有一点,10.71的安装包体积不小,完整解压后包含gamit、kf、com、tables这几个核心模块。它不像普通装机软件那样双击exe就完事,而是需要自己编译、配置环境变量、维护table表文件,整个过程本身就是一次完整的大地测量数据处理知识体检。
2. 安装前准备:环境评估与安装包清单核对
2.1 系统与环境:Linux发行版、编译器与依赖库
先说结论:GAMIT 10.71可以运行在Ubuntu、Debian、CentOS以及常见的WSL Ubuntu上。从我的实际体验来看,Ubuntu 20.04和22.04适配度最高,踩坑最少;CentOS 7如果用了太老的编译器,有时候会遇到兼容性问题,需要额外折腾。
安装前先把基础工具准备好。Ubuntu或Debian系,一条命令搞定:
sudo apt update sudo apt install -y gcc gfortran make csh tcsh libx11-dev libncurses5-devCentOS或RHEL系,对应的是:
sudo yum install -y gcc gcc-gfortran make csh tcsh libX11-devel ncurses-devel有一个特别容易被忽略的点:csh和tcsh必须装。GAMIT自带的大量脚本,比如sh_gamit、sh_setup,都是用C Shell写的。少了csh,后面的流程基本跑不起来。
libx11-dev则是GAMIT里绘图工具(sh_plot、sh_graph底层的X11图形接口)在编译时要用的开发库。缺了它会直接报x11/xlib.h找不到,很多人第一次编译遇到这个错,一脸懵,其实源头就是少了这个库。
2.2 安装包目录结构:拿到手后先做什么
安装包解压之后,你会看到类似这样的目录结构:
gamit10.71/ ├── com/ # 公共脚本 ├── gamit/ # GAMIT主程序源码 ├── kf/ # GLOBK卡尔曼滤波相关 ├── tables/ # 默认表文件 ├── install_software # 自动安装脚本 └── README # 说明文件拿到压缩包后,我习惯先把tar包放到一个固定目录,比如/opt/gamit_dev,再解压。但这里有个关键操作:先不要急着改install_software里的路径,而是把整个解压出来的目录移动到最终安装路径,比如/opt/gamit。
原因是GAMIT的编译脚本会按当前目录来定位相对路径,如果路径里有中文、空格,或目录层级变化,会导致一系列奇怪错误。所以安装路径一定要全程英文、无空格,这是最基本的规范。
另外,README文件值得花几分钟看一遍,里面会写清支持的gfortran版本范围。我的建议是直接用系统较新的gfortran,比如Ubuntu 22.04自带的gfortran 11或12。10.71配新编译器有个坑,就是需要加一个fallow参数,这个问题我留到第6节单独讲。
3. 依赖安装与目录规划(实操)
3.1 依赖确认与安装目录权限规划
把上面第2节提到的依赖命令执行完后,再用以下命令确认编译器就位:
gfortran --version gcc --version如果两条命令都能正常输出版本号,基础编译环境就基本没问题了。如果你的机器上装了多个版本的gfortran,担心影响系统其他软件,可以单独指定编译器路径,但在GAMIT安装这个场景里,直接用系统默认就是最稳的选择。
依赖确认后,下一步是目录规划。我遇到不少次因为把GAMIT装在/home下的某个带权限限制的子目录里,导致table更新写不进去的情况。所以更推荐放在/opt或/usr/local下,并给当前用户做好读写权限:
sudo mkdir -p /opt/gamit sudo chown -R $USER:$USER /opt/gamit这样后面设置table、运行install_software时不需要频繁sudo,也避免生成一堆root所有的文件,导致后续执行自动更新脚本的时候写不进去、权限报错。
3.2 目录移动与环境变量配置
目录权限弄好后,把解压出来的内容整体移动到目标路径:
mv /opt/gamit_dev/gamit10.71/* /opt/gamit/接下来配置环境变量。GAMIT运行依赖PATH和HELP_DIR。假设你的默认shell是bash,就在~/.bashrc末尾追加这几行:
export GAMIT_PATH=/opt/gamit export PATH=$PATH:$GAMIT_PATH/gamit/bin:$GAMIT_PATH/kf/bin:$GAMIT_PATH/com export HELP_DIR=$GAMIT_PATH/gamit/help保存后执行source ~/.bashrc使其生效。这里有个容易混淆的点:HELP_DIR在有些教程里写的是$GAMIT_PATH/help,有些是$GAMIT_PATH/gamit/help,具体要看你解压后help目录落在哪里,直接ls确认就行,别照抄。
如果你所在实验室的服务器默认shell是csh或tcsh家族,那就要在~/.cshrc里用setenv语法:
setenv GAMIT_PATH /opt/gamit setenv PATH $GAMIT_PATH/gamit/bin:$GAMIT_PATH/kf/bin:$GAMIT_PATH/com:$PATH setenv HELP_DIR $GAMIT_PATH/gamit/helpshell环境弄错了,命令会找不到,这也是新手常踩的坑。
4. 编译安装全流程
4.1 使用 install_software 脚本编译
GAMIT提供了一条龙编译脚本,在解压根目录直接运行:
./install_software它会把gamit、kf、com三个目录分别编译,第一次编译大概需要10到20分钟,具体看机器性能。编译过程会输出大量log,等它跑完就好。
脚本跑完后,会在终端里打印提示,让你确认PATH和HELP_DIR是否配好。如果你漏装了csh之类的依赖,脚本会在第一步就停下来,并给出缺少的命令名称。所以前面那些依赖看似繁琐,其实能帮你省掉后面排查的大麻烦。
4.2 编译验证:sh_gamit 与基线解算试运行
编译完成后,最简单的验证方法是:
sh_gamit --version如果正常返回版本号,说明基础环境已经通了。但我个人推荐再做一步:完整跑一个小型基线解算来验证table路径和软件运行逻辑。
具体操作是在GAMIT安装目录外建一个测试工程目录,比如~/test_gamit。放入干净的RINEX观测文件、广播星历文件或精密星历文件,再配置好sestbl.和process.defaults。然后运行:
sh_gamit -expt test -d 2024 001当输出test.out、qtest.out、gdl文件这些结果时,基本就可以确定安装是成功的。这里有一个注意事项:第一次跑最好用自己熟悉的数据,别用陌生格式,否则解算失败时很难判断到底是软件问题还是数据问题。
5. table 数据下载与配置(核心环节)
5.1 为什么table数据是GAMIT的“灵魂”
GAMIT里最容易翻车的一步,就是table数据更新。很多人编译通过了,但解算结果一塌糊涂,或者程序运行到一半直接报错,问题往往出在table数据上。
table目录保存着地球定向参数、太阳和月亮星历、章动表、极移数据、海洋潮汐负荷参数、卫星天线相位中心修正等。这些参数很多是随时间变化的。以ut1.usno为例,它记录的是世界时与协调世界时的差异,必须不断从国际地球自转服务获取更新。如果使用安装包自带的过期文件,解算结果会出现毫米甚至厘米级的偏差。
打个比方:GAMIT本体是一台精密计算引擎,table数据是这台引擎的燃油配方。配方放久了会变质,必须定期换新的。装好软件只是第一步,想让长基线解算结果站得住脚,table数据的时效性必须重视。
5.2 常用表文件的更新周期与获取渠道
需要重点关注更新的表文件有:
| 表文件名 | 作用 | 更新建议 |
|---|---|---|
| ut1.usno | 世界时与协调世界时差异 | 每周或每两周更新一次 |
| pole.usno | 极移参数 | 每周或每两周更新一次 |
| soltab | 太阳星历表 | 每月或按需更新 |
| luntab | 月球星历表 | 每月或按需更新 |
| nutabl | 章动表 | 每月或按需更新 |
| otl_FES2004.grid | 海洋潮汐负荷网格 | 相对固定,安装包自带即可 |
| gpt.grid | 全球气压温度模型 | 相对固定,安装包自带即可 |
获取渠道,最正规的就是从IGS相关的数据服务器直接下载。很多高校和研究机构也有镜像,用wget或curl拉取即可。GAMIT社区也提供一些更新脚本,比如你可以在com目录下找到或从官方渠道获取sh_get_tables,它能根据你设定的日期自动从服务器拉取最新表。
5.3 配置table路径的完整步骤
table更新的具体做法,我习惯先把下载到的表文件放到一个独立目录,比如/opt/gamit/tables,然后以带日期的文件名保存。GAMIT在解算时会自动匹配当前工作目录或tables目录里带日期后缀的表文件,比如ut1.usno.20250110,并且会优先使用日期最近的文件。
实际处理时,不要把下载的新表直接覆盖成ut1.usno这个不带日期的名字,因为GAMIT的匹配逻辑会按日期后缀来选。如果你把旧文件覆盖掉,反而会破坏时间序列的完整性。正确做法是保留带日期的全套文件,让GAMIT自己去选。
安装完成后,我还建议检查一下当前tables里ut1.usno和pole.usno的日期,如果和当前日期差距超过一周,就先更新再跑算例。
还有一个第一次用非常容易掉坑的点:解算时,工程目录下需要有一个tables目录的软链接,指向安装目录里的tables。可以用:
ln -s /opt/gamit/tables ./tables如果工程目录里没有这个软链接,GAMIT会报一堆文件找不到的错误,看起来像table缺失,其实只是路径没链接过来。
6. 常见问题与排查技巧实录
6.1 编译期报错速查表
| 报错信息 | 原因 | 解决方法 |
|---|---|---|
| x11/xlib.h: No such file or directory | 缺少libx11-dev | apt install libx11-dev |
| gfortran: command not found | 缺少gfortran编译器 | 安装gfortran |
| make: command not found | 缺少构建环境 | 安装make或build-essential |
| csh: command not found | 缺少csh/tcsh解释器 | 安装csh和tcsh |
| libncurses.so: cannot open shared object file | 缺少ncurses库 | 安装libncurses5-dev |
| Error: Type mismatch / argument mismatch | gfortran版本过新 | 在FFLAGS或Makefile里加 -fallow-argument-mismatch |
最后这个报错是10.71在Ubuntu 22.04或24.04上最常见的坑。gfortran 10以上把参数类型不匹配从警告改成了默认错误,而GAMIT这种积累多年的Fortran代码里多多少少存在老式参数传递写法,于是编译直接中断。解决办法是在编译前找到相关的Makefile里的FFLAGS位置,加上-fallow-argument-mismatch,或者安装一个稍旧的编译器例如gfortran-10,用update-alternatives切过去。
6.2 运行期报错速查表
| 报错信息 | 原因 | 解决方法 |
|---|---|---|
| FATAL: cannot open /opt/gamit/tables/ut1.usno | table文件缺失或路径错误 | 检查tables目录、文件名及日期后缀 |
| No module files found for ... | 工程目录缺少tables软链接 | 执行ln -s /opt/gamit/tables ./tables |
| sh_gamit: command not found | PATH环境变量没配好 | 检查PATH是否包含gamit/bin、kf/bin、com |
| HELP_DIR undefined | 环境变量缺失 | 执行export HELP_DIR=/opt/gamit/gamit/help |
| sh_plot: cannot connect to X server | 无图形环境 | 在解算时加-rs参数关闭绘图输出 |
6.3 我踩过的3个坑
第一次装10.71是在Ubuntu 20.04上,当时我没装csh,install_software在检查环境时直接停下了。其实安装脚本里明明有检测逻辑,但我根本没仔细看它输出的第一段诊断信息,光顾着等后面编译了。这个教训是:装GAMIT遇到问题,先看脚本输出的前30行,别盯着最后几行发愁。
第二次是table更新踩坑。我把下载的ut1.usno直接覆盖到了tables里的旧文件上,结果GAMIT解算时仍然选择了旧日期的文件。后来才明白,GAMIT是依据文件名里的日期后缀来选表格的,不带日期的统一文件名会被忽略。从那次以后,我下载完所有表文件都会重命名成ut1.usno.20250110这类格式,放进tables目录。
第三个坑发生在WSL环境。我在WSL里装好10.71,跑基线解算没问题,但一到sh_plot画图就报X server错误。WSL默认没有图形界面,需要额外装VcXsrv或者直接跳过绘图。如果只是算结果,加个-rs参数把图形输出关掉就行,不用浪费时间去配X server。
GAMIT 10.71安装包本身并不复杂,难的是环境依赖匹配、table参数维护、编译器flag调整这些细碎活。装一次虽然麻烦,但装完之后,你对整套GNSS高精度数据处理的底层逻辑会清楚很多。最后分享一个我自己的习惯:每次在tables目录里更新完表文件,就整体打个压缩包归档。以后换机器或者帮同门配置环境时,直接把这个压缩包带过去解压,省掉重新下载的功夫,还能保证table文件的时效性统一。
本文还有配套的精品资源,点击获取