Open-Meteo OM-File 格式专为高效存储和分发多维环境数据而设计。 通过对数据进行分块、压缩和索引,OM-Files 能够实现云原生随机读取,同时最大限度地减小文件大小。 该格式支持类似于 NetCDF 或 HDF5 的分层数据结构。
此库以 C 语言实现该格式,并将高级 Swift 抽象直接集成到 Open-Meteo 天气 API 中。 计划未来支持 Python、TypeScript 和 Rust 的绑定。
注意: 此库正处于高度实验阶段。 虽然 Open-Meteo 多年来一直使用该格式,但此独立库于 2024 年 10 月启动,旨在提供 Python 绑定。 我们的目标是提供一个强大的 Python 库,以便通过 AWS 开放数据赞助访问 S3 上的 Open-Meteo 天气数据库。
Swift 代码可以在 ./Swift 中找到,测试代码可以在 ./Tests 中找到
TODO:记录函数 + 示例
C 代码位于 /c 中
TODO 记录 C 函数
Variable
的位置Variable
都有一个数据类型和有效负载。 例如,Int16 的有效负载为 2 字节的数字。 数组存储查找表位置和数组维度信息。 实际压缩的数组数据存储在文件的开头。Variable
都有一个名称Variable
都有 0...N 个变量 -> 变量类似于键值存储,其中每个值可以有 N 个子项。Variable
可以是不同的类型
None
:不包含任何值。 用于定义组Scalar
或类型 Int8、Int16、Int32、Int64、Float、Double 等Array
,带有维度、块和压缩类型信息String
String Array
以下示例演示了如何将带有属性的数据编码为 OM-File 格式
示例 1:OM-File 内的普通数组
Root: Name="temperature_2m" Type=Float32-Array Dimensions=[720,1400,24] Chunks=[1,50,24]
示例 2:带有属性的数组
Root: Name="temperature_2m" Type=Float32-Array Dimensions=[720,1400,24] Chunks=[1,50,24]
|- Name="dimension_names" Type=String-Array Dimensions=[3]
|- Name="long_name" Type=String Value="Temperature 2 metres above ground"
|- Name="unit" Type=String Value="Celsius"
|- Name="height" Type=Int32 Value=2
示例 3:带有属性的多个数组
Root: Type=None
|- Name="temperature_2m" Type=Float32-Array Dimensions=[720,1400,24] Chunks=[1,50,24]
|- Name="dimension_names" Type=String-Array Dimensions=[3]
|- Name="long_name" Type=String Value="Temperature 2 metres above ground"
|- Name="unit" Type=String Value="Celsius"
|- Name="height" Type=Int32 Value=2
|- Name="relative_humidity_2m" Type=Float32-Array Dimensions=[720,1400,24] Chunks=[1,50,24]
|- Name="dimension_names" Type=String-Array Dimensions=[3]
|- Name="long_name" Type=String Value="Relative Humidity 2 metres above ground"
|- Name="unit" Type=String Value="Percentage"
|- Name="height" Type=Int32 Value=2
classDiagram
Variable <|-- Variable
Variable --|> Int8
Variable --|> Int16
Variable --|>String
Variable --|> Array
Trailer --|> Variable
Variable : +String_name
Variable : +Variable[]_children
Variable : +Enum_data_type
Variable : +Enum_compression_type
Variable: +number_of_childen()
Variable: +get_child(int n)
Variable: +get_name()
class Trailer {
+version
+root_variable
}
class Int8{
+Int8 value
+read()
}
class Int16{
+Int16 value
+read()
}
class String{
+String_value
+read()
}
class Array{
+Int64[]_dimensions
+Int64[]_chunks
+Int64_look_up_table_offset
+Int64_look_up_table_size
+read(offset:Int64[],count:Int64[])
}
旧版二进制格式
新的二进制格式
二进制表示
标头消息
字节 1 | 字节 2 | 字节 3 | 字节 4 | 字节 5 | 字节 6 | 字节 7 | 字节 8 |
---|---|---|---|---|---|---|---|
魔数“OM” | 版本 |
尾部消息
字节 1 | 字节 2 | 字节 3 | 字节 4 | 字节 5 | 字节 6 | 字节 7 | 字节 8 |
---|---|---|---|---|---|---|---|
魔数“OM” | 版本 | 保留 | 保留 | ||||
根变量的大小 | |||||||
根变量的偏移量 |
变量消息
字节 1 | 字节 2 | 字节 3 | 字节 4 | 字节 5 | 字节 6 | 字节 7 | 字节 8 |
---|---|---|---|---|---|---|---|
数据类型 | 压缩类型 | 名称大小 | 子项数量 | ||||
值/LUT 的大小(仅数组和字符串) | |||||||
值/LUT 的偏移量(仅数组) | |||||||
维度数量(仅数组) | |||||||
比例因子(浮点数,仅数组) | 添加偏移量(浮点数,仅数组) | ||||||
N * 子项大小 | |||||||
N * 子项偏移量 | |||||||
N * 维度长度(仅数组) | |||||||
N * 块维度长度(仅数组) | |||||||
值的字节数(标量、字符串,非数组) | |||||||
名称的字节 |