ODC库使用:ODB-2数据格式介绍
用好ODC库的前提是对ODB-2数据格式有一定了解。
ODB-2是专门为气象观测数据设计的一种数据格式,具有(自描述)元数据、紧凑特点。
ODB-2不是一种文件格式,更应该看作是一种消息格式。ODB-2数据流不一定存储在文件中,可以存放在内存中,甚至可以通过网格传输ODB-2数据流。
ODB-2数据是(二维)表格型数据格式,可以类比excel表格来理解。
frame概念
在ODB-2数据格式中,引入了frame概念,可以类比excel中的sheet。
ODB-2数据由一串frames构成,每个frame都是独立、自描述的,frames之间不需要拥有相同的结构,就像excel表格中每个sheet之间是独立的一样。
每个frame是由元数据header和数据表组成。header部分定义columns(列)属性、编码codecs及其他元数据信息。数据部分存储了对应的数据。
表格每一行(row)代表一条观测记录,行与行(即观测记录之间)是独立的。
表格每一列(column)代表观测资料的一种属性,比如观测日期、站点号、观测值等等。每一个column附带着名称(name)/数据类型(type)等属性。
Column type
列名称可以使用字符串表示,而描述数据类型通过ODB-2定义的几种数据类型指定。其中ODB-2支持的数据类型如下表所示:
对应ODC API,type参数是一个整型值,可以通过函数转换为可读的字符串描述。
需要注意的是编码存储数据的类型与API使用的类型是不完全一样。比如BITFIELD
数据类型在API中表示为整型(64位整型),REAL
和DOUBLE
数据在API中都表示为64位双精度,即使他们编码精度不同。
上面说的BITFIELD
类型是什么?
实际上BITFIELD
类型是描述数据flags属性的紧凑bit类型,使用它而不是使用一个32位整数好处是节省存储空间,因为flags需要表示的整数范围不大。
上图是一个Bitfield示例。我们以flag_c
为例介绍如何理解。这里我们使用一个32位的整数保存多个flags(flag_a/b/c/d)。每个flag占用的位数可以不一样(即表示的值范围可以变化,如果只用1位,代表0和1)。每个flag通过offset(位偏移量)和size参数确定。
对于flag_c,其offset是3,size为3,它的bitmask是0x38
(转换为二进制即0b111000
),即只有offset=3~5位有效,其二进制值为101
,转换位十进制为5,即flag_c值为5。
Compatible
ODB-2数据兼容性概念指的是两个frames拥有相同的列(columnar)结构,即相同的列数、每列名称和数据类型都相同情况,此时可以称它们是兼容的。否则不兼容。
odc库会将这些连续的兼容frames当做一个大的聚合(aggregated)frame处理,在解码时性能更好。
小结
通过上面的介绍,我们对ODB-2数据格式有了一定了解,后面介绍编码和解码数据实操时使用对应ODC API会更容易理解。
最后感谢WH对本文发表的支持。

