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
    
    
     信息,但是不能同时包含两种及以上。
    
   
 
