GFZRNX 文件头信息编辑功能详解

前文在介绍 GFZRNX 程序的文件编辑命令时,并没有提到其对 RINEX 格式文件的文件头信息的导出和编辑功能。相比 TEQC 程序,该程序的文件头信息编辑的功能更强大,但也更复杂。为协调各文章的篇幅,将其独立成此文。

首先需要说明的是,GFZRNX 支持对 RINEX 格式的观测文件(O-文件)、导航文件(N-文件)和气象文件(M-文件)的操作,但考虑到我们编辑得最多的还是观测文件,因此本文的示例以对 O-文件的操作为主。

信息导出

介绍信息编辑功能前,让我们先顺便了解一下 GFZRNX 程序文件头信息导出的功能。该功能可以将文件头中的信息提取出来,便于查看、归档。

信息导出功能使用 -meta 参数,支持 TXT、JSON、XML 等格式,使用起来非常简单。下面的命令以 TXT 格式导出观测信息:

1
$ gfzrnx -finp shao0420.16o -meta basic:txt > shao0420.txt

下面的命令以 JSON 格式导出观测信息:

1
$ gfzrnx -finp shao0420.16o -meta basic:json > shao0420.json

下面的命令以 XML 格式导出观测信息:

1
$ gfzrnx -finp shao0420.16o -meta basic:xml > shao0420.xml

限于篇幅,为保证行文流畅性,将导出的信息附在文末。

信息编辑

GFZRNX 程序的文件头信息编辑包括三种模式:更新/插入模式、替换模式和重命名模式。其中更新/插入模式主要用于修改文件头中的信息,替换模式用于编辑文件头标志,而重命名模式常用于重命名观测的卫星号和观测量。

使用该程序的信息编辑功能时,必须通过 -crux 参数引入一个配置文件。一份配置文件模板可以使用下面的命令获得:

1
$ gfzrnx -show_crux > example.txt

运行该命令后,得到示例文件 example.txt。但该文件几乎空无一物,并没有太大的演示价值,因此本文将以我的配置文件为例。

更新/插入模式

一份更新/插入模式的配置文件就像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
update_insert:
#-------------
O - SHAO.DAEJ:
"REC # / TYPE / VERS": { 1: "TRIMBLE NETG3" }
"ANT # / TYPE": { 1: "TRM59800.00", 2: "NONE" }

O - 2015209:00000 2016365:86399 - SHAO:
"APPROX POSITION XYZ": { 0: -3857167.6484, 1: 3108694.9138, 2: 4004041.6876 }
"ANTENNA: DELTA H/E/N" : { 0: 0.1209, 1: 0.0008, 2: 0.0007 }

O - SHAO:
"OBSERVER / AGENCY": { 0 : "SHAO", 1 : "SHAO CAS" }

O - DAEJ:
"OBSERVER / AGENCY" + 00000000:000000 20130126:235959: { 0: "KASI", 1: "KASI" }
"OBSERVER / AGENCY" + 20130127:000000 00000000:000000: { 0: "KASI", 1: "KASI KOREA" }

该文件首行的“update_insert”即声明了该配置为更新/插入模式。第 2 行为注释,以“#”号开头。

之后的三行作为一组。其中第 3 行的首个字符定义了要编辑的数据类型(O、M、N 分别代表 RINEX 格式的观测文件、气象文件和导航文件)。若省略该字符,则表示将设置应用到所有数据类型。连字符之后是要应用这些设置的目的站点列表,多个点名之间使用“.”号分隔。因此这里的配置指示:将这一组设置应用到 SHAO 和 DAEJ 两个站点。如果你希望将配置应用到所有输入的文件,可以在这里使用 “ALL”。

文件的第 4 行是一个配置项。如你所知,RINEX 文件头信息中包含“REC # / TYPE / VERS”的这一行有 3 个数据项,分别表示接收机编号、接收机类型和接收机版本。如果我们将这一行的数据项以 0 开始编号,那么三项对应的是:

  • 0 :接收机编号;
  • 1 :接收机类型;
  • 2 :接收机版本。

因此,这个配置项意为:更新“REC # / TYPE / VERS”这一行的信息,将其中编号为 1 的项目(即接收机类型)修改为“TRIMBLE NETG3”。

文件第 5 行与上一行类似,更新天线类型为“TRM59800.00”,更新天线罩为“NONE”。

第 7 行与第 3 行类似,但在文件类型和站点名之间插入了一段字符“2015209:00000 2016365:86399”。这段字符指明,以下的配置仅应用于观测时间在该时间段之内的数据。其中的起止时刻以年、年积日和秒数的方式指定。之后的两行配置分别更新了观测信息中的先验坐标和天线偏移。

第 10 行和第 11 行配置将 SHAO 站的观测者和观测机构分别修改为“SHAO”和“SHAO CAS”。这里省略了应用配置的起止时刻,因此默认将此配置应用到所有时间段的观测数据。

最后的 3 行对 DAEJ 站的观测者和观测机构进行配置,但在配置项中插入了以“+”号开始的一个起止时刻。这表示,在 2013 年 1 月 26 日 23 点 59 分 59 秒之前的观测数据,其观测者和观测机构修改为“KASI”,在 2013 年 1 月 27 日 0 点 0 分 0 秒之后的观测数据,其观测者和观测机构分别修改为“KASI”和“KASI KOREA”。这里的时刻是以年月日、时分秒的形式指定的。事实上,该配置文件中的日期和时刻的格式分别各有两种,即年积日、年月日和时分秒、日积秒。

要应用该配置文件,可以将配置文件保存为 updist_crux.txt。然后执行类似如下的命令:

1
2
$ gfzrnx -finp daej0420.16o -crux updist_crux.txt -kv > temp/dnew0420.16o
$ gfzrnx -finp shao0420.16o -crux updist_crux.txt -kv > temp/snew0420.16o

以上两个命令将分别得到修改后的文件 dnew0420.16o 和 snew0420.16o。

替换模式

替换模式的配置于之前的更新/插入模式的配置方式有许多相同之处。一份替换模式的配置文件如下所示:

1
2
3
4
5
6
7
8
replace:
#-------
ALL:
string_from: "PGM/RUN BY/DATE"
string_to: "PGM / RUN BY / DATE"
DAEJ.SHAO:
regexp_from: "^(.{60})PGM\s*/\s*RUN\s*BY\s*/\s*DATE\s*$"
regexp_to: "$1PGM / RUN BY / DATE"

首行声明配置为替换模式,之后以“#”号开头的一行为注释。第 3 行和第 6 行各指出了配置项的应用到哪些站点。

对于设置将被替换的项目和替换后的内容,既可以使用字符串指定,如第 4 到 5 行;也可以使用正则表达式指定,如第 7 到 8行。只需分别以“string”和“regexp”作为配置项的前缀。

对于配置项的后缀,“from”指定要被替换的内容,而“to”指定替换后的内容。

与之前类似,要应用该配置文件,可以将配置文件保存为 repl_crux.txt。然后执行类似如下的命令:

1
2
$ gfzrnx -finp daej0420.16o -crux repl_crux.txt -kv > temp/dnew0420.16o
$ gfzrnx -finp shao0420.16o -crux repl_crux.txt -kv > temp/snew0420.16o

重命名模式

重命名模式常用来修改观测卫星号和观测类型标志。实际上,该模式也只有这两个功能。并且在声明时需要明确指明要重命名的是卫星号还是观测类型。

一份修改卫星号的配置文件如下:

1
2
3
4
5
rename: prn
#----------
ON - 20140105:000000 20150101:000000 - E51 - E01: ALL
ON - 20140105:000000 00000000:000000 - E52 - E02: DAEJ.SHAO
E53 - E03: ALL

首行声明配置为重命名卫星编号,之后的一行为注释。

第 3 行一开始的“ON”指定将配置应用于观测文件与导航文件,然后的两个时刻指定应用配置的时间。之后指定将卫星“E51”重命名为“E01”,应用的站点为所有站点。第 4 行与上一行类似,但限制将配置应用到 DAEJ 和 SHAO 两个站点。最后一行没有指定设置要应用的文件类型和时段,因此该设置将应用到所有时段的所有文件。

一份重命名观测类型的配置文件如下所示:

1
2
3
4
5
6
7
rename: obs
#----------
20140105:000000 20150101:000000 - L2X - L2L - G : DAEJ.SHAO
20140105:000000 20150101:000000 - L2L - L2X - G : DAEJ
20140105:000000 20150101:000000 - **X - **L - C : ALL
20140105:000000 20150101:000000 - *2 - *1 - G04.G08 : ALL
*2 - *1 - C : ALL

首行声明配置为重命名观测类型,之后的一行为注释。

第 3 行与第 4 行,指定了应用配置的时间段、需重命名的观测类型、重命名后的类型、卫星系统和应用的站点。第 4 行以通配符的方式指定了要重命名的观测类型与重命名后的类型。第 5 行与上一行类似,但限制了应用范围为 G4 和 G8 卫星。最后一行省略了时段,因此该配置将应用于所有观测时段的数据。

应用重命名模式的命令方式与之前的两个模式一致,这里不在赘述。

导出信息样例

TXT 格式导出的观测信息

以下为上文导出的 shao0420.txt 文件的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
antenna:
height:
x = 0
y = 0
z = 0
name = AOAD/M_T
number = 429
radome = JPLA
data:
epoch:
first = 2016 02 11 00 00 00.0000000
interval = 30.000
last = 2016 02 11 23 59 30.0000000
file:
md5 = c8ad2534683bf037c7a9e77eab2ef0a3
system = G
type = O
version = 2.11
receiver:
firmware = CQ00
name = ASHTECH UZ-12
number = UC2200524020
site:
agency = SHANGHAI OBSERVATORY
name = SHAO
number = 21605M002
observer = GGN
position:
x = -2831733.5830
y = 4675665.9580
z = 3275369.4100

JSON 格式导出的观测信息

以下为上文导出的 shao0420.json 文件的内容(为增加可读性,手动添加了缩进)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
{
"receiver":{
"number":"UC2200524020",
"name":"ASHTECH UZ-12",
"firmware":"CQ00"
},
"site":{
"number":"21605M002",
"position":{
"y":"4675665.9580",
"x":"-2831733.5830",
"z":"3275369.4100"
},
"name":"SHAO",
"agency":"SHANGHAI OBSERVATORY",
"observer":"GGN"
},
"file":{
"system":"G",
"version":"2.11",
"type":"O",
"md5":"c8ad2534683bf037c7a9e77eab2ef0a3"
},
"data":{
"epoch":{
"first":"2016 02 11 00 00 00.0000000",
"last":"2016 02 11 23 59 30.0000000",
"interval":"30.000"
}
},
"antenna":{
"number":"429",
"name":"AOAD/M_T",
"height":{
"y":0,
"x":0,
"z":0
},
"radome":"JPLA"
}
}

XML 格式导出的观测信息

以下为上文导出的 shao0420.xml 文件的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<meta_info>
<antenna>
<height>
<x><![CDATA[0]]></x>
<y><![CDATA[0]]></y>
<z><![CDATA[0]]></z>
</height>
<name><![CDATA[AOAD/M_T]]></name>
<number><![CDATA[429]]></number>
<radome><![CDATA[JPLA]]></radome>
</antenna>
<data>
<epoch>
<first><![CDATA[2016 02 11 00 00 00.0000000]]></first>
<interval><![CDATA[30.000]]></interval>
<last><![CDATA[2016 02 11 23 59 30.0000000]]></last>
</epoch>
</data>
<file>
<md5><![CDATA[c8ad2534683bf037c7a9e77eab2ef0a3]]></md5>
<system><![CDATA[G]]></system>
<type><![CDATA[O]]></type>
<version><![CDATA[2.11]]></version>
</file>
<receiver>
<firmware><![CDATA[CQ00]]></firmware>
<name><![CDATA[ASHTECH UZ-12]]></name>
<number><![CDATA[UC2200524020]]></number>
</receiver>
<site>
<agency><![CDATA[SHANGHAI OBSERVATORY]]></agency>
<name><![CDATA[SHAO]]></name>
<number><![CDATA[21605M002]]></number>
<observer><![CDATA[GGN]]></observer>
<position>
<x><![CDATA[-2831733.5830]]></x>
<y><![CDATA[4675665.9580]]></y>
<z><![CDATA[3275369.4100]]></z>
</position>
</site>
</meta_info>