OSM PBF 文件格式说明

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数据有两种文件体类型,实际的类型信息存储在BlobHeadertype字段中:

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.6OSM 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文件时,需要提取所有的字符串(keyvalueroleuser)到单独的string table中。

一个PrimitiveGroup不会包含不同种类的对象。可以包含NodeDenseNodeWayRelationChangeSet信息,但是不能同时包含两种及以上。


版权声明:本文为haochajin原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。