前文 在介绍 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 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 <?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>