File Format
一个
pbf
文件通常包括一个文件头和一系列的文件体。这种设计是为了以后文件随机读取,并且跳过不理解或者不需要的数据。
文件格式由以下部分组成:
int4:
以网络字节顺序排列的
BlobHeader
长度
BlobHeader:
定义如下
message BlobHeader {
required string type
=
1
;
类型
optional bytes indexdata
=
2
;
索引信息(
OSM
中为
bounding box
)
required int32 datasize
=
3
;
Blob
消息的序列化大小
}
Blob
,通过未压缩或者以
zlib/deflat
进行压缩格式,存储数据
blob
信息
message Blob {
optional bytes raw
=
1
;
//
不压缩
optional int32 raw_size
=
2
;
//
压缩时解压大小
optional bytes zlib_data
=
3
;
//
数据压缩版本
optional bytes lzma_data
=
4
;
//LZMA
数据压缩特征
optional bytes OBSOLETE_bzip2_data
=
5
[deprecated
=
true
];
// Don’t reuse this tag number.
}
目前
OSM
数据有两种文件体类型,实际的类型信息存储在
BlobHeader
的
type
字段中:
OSMHeader
,包含了
HeaderBlock
信息。在首个
OSMData
前,每个文件体必须有这些中的一个。
OSMData
,包含了序列化之后的
PrimitiveBlock
信息,包含了实体信息。
这种设计便于用户根据自己的需要扩展类型信息,解析时应当忽略或者跳过无法识别的类型。
OSMHeader
文件块定义:
message HeaderBlock {
optional HeaderBBox bbox
=
1
;
//bounding box
/*
解析数据集附加标签说明
*/
repeated string required_features
=
4
;
repeated string optional_features
=
5
;
optional string writingprogram
=
16
;
optional string source
=
17
;
// From the bbox field.
/* Tags that allow continuing an Osmosis replication */
// replication timestamp, expressed in seconds since the epoch,
// otherwise the same value as in the “timestamp=…” field
// in the state.txt file used by Osmosis
optional int64 osmosis_replication_timestamp
=
32
;
// replication sequence number (sequenceNumber in state.txt)
optional int64 osmosis_replication_sequence_number
=
33
;
// replication base URL (from Osmosis’ configuration.txt file)
optional string osmosis_replication_base_url
=
34
;
}
为了提供前后兼容性,解析器需要知道文件能否被解析。判断能否被解析是通过
required features
(必须要素)实现的,如果一个文件的必须要素中包含了解析器无法识别字段,则该文件无法解析,返回错误信息,并报告无法解析字段。
目前已定义的要素有:
OsmSchema-V0.6
:
OSM v0.6
标准的数据
DenseNodes
:文件包含密集节点和密集信息
HistoricalInformation
:文件包含
OSM
历史信息
OSMData
文件块定义:
message PrimitiveBlock {
required StringTable stringtable
=
1
;
repeated PrimitiveGroup primitivegroup
=
2
;
optional int32 granularity
=
17
[
default
=100
];
//
坐标存储精度
optional int64 lat_offset
=
19
[
default
=0
];
//
坐标偏差
.
optional int64 lon_offset
=
20
[
default
=0
];
//
时间精度
optional int32 date_granularity
=
18
[
default
=1000
];
// Proposed extension:
//optional BBox bbox = XX;
}
创建
PBF
文件时,需要提取所有的字符串(
key
,
value
,
role
,
user
)到单独的
string table
中。
一个
PrimitiveGroup
不会包含不同种类的对象。可以包含
Node
、
DenseNode
、
Way
、
Relation
、
ChangeSet
信息,但是不能同时包含两种及以上。