GNSS 数据批量标准化脚本

在处理大量的 GNSS 数据时,我们常常需要编辑大量的 RINEX 观测文件(Obs)。有些测站由于观测人员的设置等原因,导致观测数据的文件头信息不标准或不正确。也有些观测数据的采样间隔、观测卫星系统或观测量等不一致。这就需要对数据进行标准化工作。

TEQC 或 GFZRNX 程序可以做到这一点,但这些程序比较适合处理单个或单个测站的观测文件,对于处理大量的数据时显得略不便。本文将介绍 Pinot 中实现的批量标准化程序 unificate.py。该脚本以多线程的方式执行,运行快速。

运行环境

本脚本使用 Python 3 语言编写,依赖于 TEQC 程序和 PyYAML 模块。要使用此脚本,需保证系统已配置 TEQC 程序和 PyYAML 程序。TEQC 程序配置请参考本站 TEQC 程序配置及其数据转换功能的使用,PyYAML 配置请参考本站 PyYAML 安装与使用演示

脚本在 Windows XP、Windows Server 2008 R2 以及 Windows 10 等操作系统测试通过。由于程序的文件编辑操作依赖于 TEQC 程序,需注意的是:对于 Windows 10 操作系统,只需将 TEQC 程序放入系统能搜索到的路径下,即在任意目录中启动命令提示符执行 teqc 命令能显示 TEQC 程序的提示信息;但对于更低版本的 Windows 系统,若出现 “’teqc’ 不是内部或外部命令,也不是可运行的程序或批处理文件。” 的错误,此时需保证运行脚本的文件夹内有 TEQC 程序。

此外,最新的程序实现了进度条显示功能。该功能使用了 tqdm 模块,要安装该模块,在 “命令提示符” 窗口执行:

1
$ pip install tqdm

参数说明

该脚本可接受以下参数:

1
$ python unificate.py <file> [<file> ...] -out <directory> -cfg <config> [-r] [-v] [-h]

参数释义:

  • <file>输入的待处理文件,你可以使用文件名,也可以使用通配符 ;
  • -out <directory> 处理结果的输出路径,默认为当前路径下的 unificated 文件夹;
  • -cfg <config> 配置文件路径,该文件使用 YAML 语言编写,默认为当前目录下的 _sitesinfo.yml 文件;
  • -k、--keep 标准化成功后是否保留源文件,不加该参数时默认为不保留;
  • -r--recursive 指定 “**/” 的通配符前缀表示递归搜索子文件夹的内容,不加该参数默认为不递归;
  • -v--version 显示版本信息;
  • -h--help 显示帮助。

配置文件

配置文件使用 YAML 语言编写。目前支持的编辑项目有:

  • agency: 观测机构;
  • antenna: 天线类型;
  • delta: 天线相位中心偏移;
  • interval: 数据采样间隔;
  • obs_type: 保留的观测类型;
  • observer: 观测者;
  • position: 站点概略坐标;
  • receiver: 接收机类型;
  • rm_sys: 要删掉的卫星系统。

这些配置项既可以写在各站点的配置内,也可以放在 “all” 项目中作为默认配置项目。若 “all” 和站点内都设置了某一项信息,则使用站点中的配置。

配置文件示例

配置文件中的站点名,需使用小写字母。下面是一个配置文件示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
all:
observer: sdust
agency: sdust
rm_sys:
- C
- R
obs_type: ['C1', 'C2', 'P1', 'P2', 'L1', 'L2']
interval: 30
delta: "0.0000 0.0000 0.0000"

bjfs:
receiver: "TRIMBLE NETR8"
antenna: "TRM59900.00 SCIS"
position: "-2148744.8407 4426642.9605 4044657.8518"
delta: "0.0465 0.0000 0.0000"

chan:
receiver: "ASHTECH UZ-12"
antenna: "ASH701945E_M NONE"
position: "-2674431.9143 3757145.2969 4391528.8732"

在该配置文件中,通过 “all” 配置了全局的观测者、观测机构、删掉的卫星系统、保留的观测类型、采样间隔和天线中心偏移量。

在 “bjfs” 中,配置了该站点使用的接收机类型、天线类型、概略坐标位置和天线中心偏移。在 “chan” 中,配置了该站点的接收机类型、天线类型和概略坐标。其中未配置的项目,将使用 “all” 中的信息。

使用示例

处理 rinex/ 文件夹中所有的 RINEX O-文件,其中使用的配置文件为当前目录中的 _sitesinfo.yml,将最终的处理成果输入到当前路径的 unificated 文件夹:

1
$ python unificate.py rinex/*[Oo] -out unificated -cfg _sitesinfo.yml

处理 rinex/ 文件夹中观测年为 2016,年积日为 042 至 045 的 RINEX O-文件,其中配置文件为当前目录中的 _sitesinfo.yml,将最终的处理成果输入到当前路径的 unificated 文件夹:

1
$ python unificate.py rinex/*04[2-5]0.16[Oo] -out unificated -cfg _sitesinfo.yml

处理 rinex/ 文件夹中 BJFS 站观测于 2016 年的 RINEX O-文件,其中配置文件使用当前目录的 _sitesinfo.yml,将最终的处理成果输入到当前路径的 unificated 文件夹:

1
$ python unificate.py rinex/bjfs*.16[Oo] -cfg _sitesinfo.yml -out unificated

处理 rinex/ 文件夹中的 001,002,003 文件夹中的文件,其中配置文件使用当前目录的 _sitesinfo.yml,将最终的处理成果保存至 unificated 文件夹:

1
$ python unificate.py rinex/00[1-3]/*[Oo] -cfg _sitesinfo.yml -out unificated

下载地址

该脚本及同一工具包的其他脚本均放在 Github 网站上:purpleskyfall/pinot

修改记录

  • 2017-09-10,版本 0.5.0:
    • 去掉 -dir-glob 参数,使用位置参数指定输入文件;
    • 支持多个输入文件或通配符;
    • 添加进度条显示;
    • 基于 concurrent.futures 的多线程支持。
  • 2018-03-14,版本 0.5.1:
    • 优化在 UNIX/Linux 中的输出信息显示。