GAMIT 分步进行基线解算

使用 GAMIT/GLOBK 软件进行 GNSS 数据处理时,我们习惯将处理方式分为两种——分步操作和批处理。你或许已经发现,GAMIT/GLOBK 软件是一个没有图形界面的程序,只能在终端中使用它。其中,GAMIT 主要进行基线解算,而 GLOBK 用来对基线解算成果进行网平差。但实际上这套程序并不是只由这两个软件组成的,GAMIT/GLOBK 将整个数据处理划分为很多小的过程,每个过程对应一个小程序,每个小程序实现一个小功能。我们使用这套程序进行数据处理就是按照数据处理的流程依次操作这些小程序,最终得到需要的成果。

所谓分步处理,就是按照数据处理流程利用 GAMIT/GLOBK 所提供的小程序逐步完成整个数据处理流程。但是分布处理使用得多了你会发现:大多数时候所做的处理流程都是相同的,后来便发展出了两个脚本 sh_gamitsh_glred,将基线解算和网平差中重复的操作封装起来。我们将使用这两个脚本进行数据处理的过程称为 “批处理”。

现在的 GAMIT/GLOBK 程序包含许多的脚本,可以提供丰富的功能。这些脚本程序保存在程序安装目录的 com/ 文件夹中。但本文专注于介绍分步基线解算的流程。

文件组织

在使用 GAMIT 进行数据处理时,我们习惯于这样组织文件:

1
2
3
4
5
6
· work/
|—— <doy>/
|—— brdc/
|—— igs/
|—— rinex/
|—— tables/

我们首先创建一个文件夹作为工作目录,工作目录命名可以是任意的,只要容易记忆即可(这里以 work 为例)。在工作目录下平行地创建上面的 5 个文件夹。其中在年积日文件夹中进行数据处理操作,而 brdc 文件夹存放广播星历文件,igs 文件夹存放精密星历文件,rinex 文件夹存放观测数据,tables 文件夹存放解算时所需的一些配置文件和解算需引入的共用表文件。

例如,我要处理 2016 年 2 月 19 日几个 IGS 测站(BJFS,CHAN,DAEJ,SHAO,SUWN)的观测数据。这一天对应的年积日是 050,对应的 GPS 周是 1884。这样具体的文件结构变成:

1
2
3
4
5
6
7
8
9
10
11
12
13
· work/
|—— 050/
|—— brdc/
|—— brdc0500.16n
|—— igs/
|—— igs18845.sp3
|—— rinex/
|—— bjfs0500.16o
|—— chan0500.16o
|—— daej0500.16o
|—— shao0500.16o
|—— suwn0500.16o
|—— tables/

参数配置

表文件更新

准备好参与解算的所需文件之后,现在把 GAMIT 解算所要用到的共用表文件和解算配置文件链接到工作目录的 tables 文件夹中。此时需要先检查一下,GAMIT 安装目录的 tables 目录里是否有对应观测数据日期的共用表文件。

对于例子中的 2016 年 2 月 19 日的观测数据,我需要的这 3 个文件应该是 soltab.2016.J2000、luntab.2016.J2000 和 nutabl.2016。详细的共用表文件更新方法可以查看本站和 GAMIT/GLOBK 程序更新相关的博文。

所有的这些文件都可以在 SOPAC 的 GAMIT 页面下载,下载之后直接放在 GAMIT/GLOBK 安装目录的 tables 文件夹内。

链接表文件

确保所需表文件都已齐备之后,可以进行链接表文件的操作。这里需要使用一个批处理命令:sh_setup,它的详细用法是这样的:

1
$ sh_setup -yr <year> -doy <doy>

这里的 <year><doy> 即数据观测的年与年积日。具体到本次任务,需要执行的应该是(在工作目录下执行):

1
$ sh_setup -yr 2016 -doy 050

参数配置

执行过上面的表文件链接之后,查看 tables 文件夹,会发现里面多了一些文件,其中有些是实体文件,而有些是快捷方式链接。其中就有包含解算配置的两个文件:sestbl.和 sittbl.。

如果你对其中的各项配置参数不熟悉,那么使用默认配置也可以。只是需要检查一个地方,在 sestbl. 文件中:

Use otl.list = Y &nbsp; &nbsp; &nbsp; &nbsp; ; Ocean tidal loading list file from OSO
Use otl.grid = N &nbsp; &nbsp; &nbsp; &nbsp; ; Ocean tidal loading grid file, GAMIT-format converted from OSO

这两项是 GAMIT 基线解算中所需的海潮改正文件的配置。如果你的文件中这两项的配置不是这样的,你可以直接修改文件成上面这样。因为我要处理的是 IGS 站的观测数据,直接引入 otl.list 文件就够了。

初始文件生成

生成 station.info

station.info(测站信息)文件是要处理的观测站点的信息,如测站的接收机、天线等。

SOPAC 网站上提供的这个文件里,已经包含了所有 IGS 测站的信息。因为我处理的都是 IGS 测站的观测数据,所以直接使用下载的 station.info 文件就可以了。如果你要处理的观测数据中包含 IGS 测站之外的数据,那么可以在工作目录的 tables 目录中使用有希望命令对现有的 station.info 文件进行更新:

1
$ sh_upd_stnfo -files <RinexOfilePath>   # <RinexOfilePath> 为观测文件路径,如 ../rinex/*o

关于 sh_upd_stnfo 脚本的详细使用说明,可以参考博文站点信息文件的创建与更新

生成 lfile.

lfile.(测站概略坐标)文件包含待处理的站点的概略坐标。GAMIT 安装目录的 tables 文件夹里自带的 lfile. 已经包含了所有 IGS 站点的概略坐标,并且你会看到该文件已经被 sh_setup 命令复制到了工作目录的 tables 文件夹里了。对于只处理 IGS 站的观测数据而言,这样就足够了。但是如果你还有其他的观测数据,获取它们的概略坐标将是一个值得探讨的过程。这里只简单地给出一个方案,因为该方案使用 RINEX 文件头中的概略坐标制作 lfile.,所以不一定适用于所有情况。在工作目录的 tables 目录执行:

1
2
3
$ grep "APPROX POSITION XYZ"$ ../rinex/*o > lfile.rnx    # 提取观测文件中的概略坐标
$ rx2apr lfile.rnx <year> <doy> # 生成 lfile.rnx.apr 文件
$ mv lfile.rnx.apr lfile. # 重命名为 lfile. 文件

详细的概略坐标获取方法,请移步获取站点概略坐标的几种方法

开始解算

链接文件

经过前文的操作,我们已经完成了所有的文件准备,终于可以开始进行数据处理。

我们之前已经创建了一个以年积日命名的文件夹,之后的所有的数据处理操作都将在这个文件夹中进行。

首先,把前文准备的所有文件都链接到年积日文件夹内。这里使用了 Linux 系统的命令 ln -s 来创建软链接。

1
2
3
4
$ ln -s ../rinex/*o ./    # 将观测数据链接到年积日文件夹
$ ln -s ../brdc/*n ./ # 将广播星历链接到年积日文件夹
$ ln -s ../igs/*sp3 ./ # 将精密星历链接到年积日文件夹
$ ln -s ../tables/* ./ # 将配置文件和表文件链接到年积日文件夹

开始解算

依次执行下面的命令完成基线解算过程。

首先执行 makexp 命令。该命令进行解算前的预处理工作,用以生成后续命令的输入控制文件:

1
$ makexp

执行该命令后,系统将引导你完成数据的预处理并生成 session.info 文件,只需按照提示键入项目名(4 位字符)、精密星历类型(4 位字符:igsf 表示最终星历、igsr 表示快速星历、 igsu 表示超快星历)、GNSS 系统代号(1 位字符:G 表示 GPS、R 表示 GLONASS、C 表示 BDS)、数据观测日期年(4 位数字)、年积日(3 位数字)、任务编号(2 位数字,99 表示所有任务)、测站概略坐标文件名、广播星历文件名、采样信息(采样间隔,开始时间、历元数)。

具体到本次使用的 2016 年 2 月 19 日的观测数据,输入依次为:

1
2
3
4
5
6
7
8
9
$ test      # 项目名
$ igsf # 星历类型
$ g # GNSS 系统代号
$ 2016 # 数据观测日期的年
$ 050 # 数据观测日期的年积日
$ 99 # 任务编号
$ lfile. # 测站概略坐标文件名
$ brdc0500.16n # 广播星历文件名
$ 30 00 00 2880 # 采样间隔,开始时间(时、分),历元数

需要注意的是,在 GAMIT/GLOBK 10.7 中,makexp 程序生成的 session.info 文件有错误:其中缺失了所有待处理的卫星 PRN 号。该版本的用户可以使用如下命令生成 session.info 文件:

1
$ sh_makexp -expt test -orbt igsf -yr 2018 -doy 152 -sess 99 -nav brdc0500.16n -sp3file igs18845.sp3 -jclock sp3 -apr lfile. -sinfo 30 00 00 2880

现在链接精密星历,生成轨道初值(G-文件):

1
$ sh_sp3fit -f <sp3file> -o <name> -d <year> <doy>

这里的 <sp3file> 为 sp3 文件名,<name> 为 4 个字符的轨道名,该值将被包括在生成的 G-文件的文件名中,因此最好能够体现出轨道信息的来源或类型。具体到本次任务:

1
$ sh_sp3fit -f igs18845.sp3 -o igsf -d 2016 050

生成卫星钟文件:

1
$ makej <navfile> jbrdc<y>.<doy>

这里的 <navfile> 为输入的广播星历文件,<y> 代表一位数字表示的观测年(即最后一位),<doy> 为年积日。具体到本次任务:

1
$ makej brdc0500.16n jbrdc6.050

现在生成双差观测文件(X-文件):

1
$ makex <expt>.makex.batch

这里的 <expt> 表示项目名,具体到本次任务:

1
$ makex test.makex.batch

现在运行 fixdrv 命令,该程序根据解算控制文件生成一系列的批处理脚本:

1
$ fixdrv d<expt><y>.<doy>

具体到本次任务:

1
$ fixdrv dtest6.050

最后启动数据解算脚本

1
$ csh b<expt><y>.bat

具体到本次任务:

1
$ csh btest6.bat

之后静待数据解算完成即可。

成果查看

若解算成功,最终的数据处理成果主要在 3 个文件中,即 O-文件,Q-文件和 H-文件。如果你在 sestbl. 文件中设置了

Output met = Y

那么你还可以得到包含对流层参数解算结果的 Z-文件。可以由这个文件进一步处理得到可降水汽 PWV 的值。

若解算过程中出现错误,则会产生 GAMIT.fatal 文件,其中保存了错误原因,可以根据其中提示对解算过程进行调整。