add osmpbf package

master
Oliver Tonnhofer 2013-05-06 07:29:43 +02:00
parent 39d889bf9e
commit 0cf5b90120
6 changed files with 857 additions and 2 deletions

97
osmpbf/fileformat.pb.go Normal file
View File

@ -0,0 +1,97 @@
// Code generated by protoc-gen-go.
// source: fileformat.proto
// DO NOT EDIT!
package osmpbf
import proto "code.google.com/p/goprotobuf/proto"
import json "encoding/json"
import math "math"
// Reference proto, json, and math imports to suppress error if they are not otherwise used.
var _ = proto.Marshal
var _ = &json.SyntaxError{}
var _ = math.Inf
type Blob struct {
Raw []byte `protobuf:"bytes,1,opt,name=raw" json:"raw,omitempty"`
RawSize *int32 `protobuf:"varint,2,opt,name=raw_size" json:"raw_size,omitempty"`
ZlibData []byte `protobuf:"bytes,3,opt,name=zlib_data" json:"zlib_data,omitempty"`
LzmaData []byte `protobuf:"bytes,4,opt,name=lzma_data" json:"lzma_data,omitempty"`
OBSOLETEBzip2Data []byte `protobuf:"bytes,5,opt,name=OBSOLETE_bzip2_data" json:"OBSOLETE_bzip2_data,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (this *Blob) Reset() { *this = Blob{} }
func (this *Blob) String() string { return proto.CompactTextString(this) }
func (*Blob) ProtoMessage() {}
func (this *Blob) GetRaw() []byte {
if this != nil {
return this.Raw
}
return nil
}
func (this *Blob) GetRawSize() int32 {
if this != nil && this.RawSize != nil {
return *this.RawSize
}
return 0
}
func (this *Blob) GetZlibData() []byte {
if this != nil {
return this.ZlibData
}
return nil
}
func (this *Blob) GetLzmaData() []byte {
if this != nil {
return this.LzmaData
}
return nil
}
func (this *Blob) GetOBSOLETEBzip2Data() []byte {
if this != nil {
return this.OBSOLETEBzip2Data
}
return nil
}
type BlobHeader struct {
Type *string `protobuf:"bytes,1,req,name=type" json:"type,omitempty"`
Indexdata []byte `protobuf:"bytes,2,opt,name=indexdata" json:"indexdata,omitempty"`
Datasize *int32 `protobuf:"varint,3,req,name=datasize" json:"datasize,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (this *BlobHeader) Reset() { *this = BlobHeader{} }
func (this *BlobHeader) String() string { return proto.CompactTextString(this) }
func (*BlobHeader) ProtoMessage() {}
func (this *BlobHeader) GetType() string {
if this != nil && this.Type != nil {
return *this.Type
}
return ""
}
func (this *BlobHeader) GetIndexdata() []byte {
if this != nil {
return this.Indexdata
}
return nil
}
func (this *BlobHeader) GetDatasize() int32 {
if this != nil && this.Datasize != nil {
return *this.Datasize
}
return 0
}
func init() {
}

54
osmpbf/fileformat.proto Normal file
View File

@ -0,0 +1,54 @@
/** Copyright (c) 2010 Scott A. Crosby. <scott@sacrosby.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
option optimize_for = LITE_RUNTIME;
option java_package = "crosby.binary";
package osmpbf;
//protoc --java_out=../.. fileformat.proto
//
// STORAGE LAYER: Storing primitives.
//
message Blob {
optional bytes raw = 1; // No compression
optional int32 raw_size = 2; // When compressed, the uncompressed size
// Possible compressed versions of the data.
optional bytes zlib_data = 3;
// PROPOSED feature for LZMA compressed data. SUPPORT IS NOT REQUIRED.
optional bytes lzma_data = 4;
// Formerly used for bzip2 compressed data. Depreciated in 2010.
optional bytes OBSOLETE_bzip2_data = 5 [deprecated=true]; // Don't reuse this tag number.
}
/* A file contains an sequence of fileblock headers, each prefixed by
their length in network byte order, followed by a data block
containing the actual data. types staring with a "_" are reserved.
*/
message BlobHeader {
required string type = 1;
optional bytes indexdata = 2;
required int32 datasize = 3;
}

444
osmpbf/osmformat.pb.go Normal file
View File

@ -0,0 +1,444 @@
// Code generated by protoc-gen-go.
// source: osmformat.proto
// DO NOT EDIT!
package osmpbf
import proto "code.google.com/p/goprotobuf/proto"
import json "encoding/json"
import math "math"
// Reference proto, json, and math imports to suppress error if they are not otherwise used.
var _ = proto.Marshal
var _ = &json.SyntaxError{}
var _ = math.Inf
type Relation_MemberType int32
const (
Relation_NODE Relation_MemberType = 0
Relation_WAY Relation_MemberType = 1
Relation_RELATION Relation_MemberType = 2
)
var Relation_MemberType_name = map[int32]string{
0: "NODE",
1: "WAY",
2: "RELATION",
}
var Relation_MemberType_value = map[string]int32{
"NODE": 0,
"WAY": 1,
"RELATION": 2,
}
func (x Relation_MemberType) Enum() *Relation_MemberType {
p := new(Relation_MemberType)
*p = x
return p
}
func (x Relation_MemberType) String() string {
return proto.EnumName(Relation_MemberType_name, int32(x))
}
func (x Relation_MemberType) MarshalJSON() ([]byte, error) {
return json.Marshal(x.String())
}
func (x *Relation_MemberType) UnmarshalJSON(data []byte) error {
value, err := proto.UnmarshalJSONEnum(Relation_MemberType_value, data, "Relation_MemberType")
if err != nil {
return err
}
*x = Relation_MemberType(value)
return nil
}
type HeaderBlock struct {
Bbox *HeaderBBox `protobuf:"bytes,1,opt,name=bbox" json:"bbox,omitempty"`
RequiredFeatures []string `protobuf:"bytes,4,rep,name=required_features" json:"required_features,omitempty"`
OptionalFeatures []string `protobuf:"bytes,5,rep,name=optional_features" json:"optional_features,omitempty"`
Writingprogram *string `protobuf:"bytes,16,opt,name=writingprogram" json:"writingprogram,omitempty"`
Source *string `protobuf:"bytes,17,opt,name=source" json:"source,omitempty"`
OsmosisReplicationTimestamp *int64 `protobuf:"varint,32,opt,name=osmosis_replication_timestamp" json:"osmosis_replication_timestamp,omitempty"`
OsmosisReplicationSequenceNumber *int64 `protobuf:"varint,33,opt,name=osmosis_replication_sequence_number" json:"osmosis_replication_sequence_number,omitempty"`
OsmosisReplicationBaseUrl *string `protobuf:"bytes,34,opt,name=osmosis_replication_base_url" json:"osmosis_replication_base_url,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (this *HeaderBlock) Reset() { *this = HeaderBlock{} }
func (this *HeaderBlock) String() string { return proto.CompactTextString(this) }
func (*HeaderBlock) ProtoMessage() {}
func (this *HeaderBlock) GetBbox() *HeaderBBox {
if this != nil {
return this.Bbox
}
return nil
}
func (this *HeaderBlock) GetWritingprogram() string {
if this != nil && this.Writingprogram != nil {
return *this.Writingprogram
}
return ""
}
func (this *HeaderBlock) GetSource() string {
if this != nil && this.Source != nil {
return *this.Source
}
return ""
}
func (this *HeaderBlock) GetOsmosisReplicationTimestamp() int64 {
if this != nil && this.OsmosisReplicationTimestamp != nil {
return *this.OsmosisReplicationTimestamp
}
return 0
}
func (this *HeaderBlock) GetOsmosisReplicationSequenceNumber() int64 {
if this != nil && this.OsmosisReplicationSequenceNumber != nil {
return *this.OsmosisReplicationSequenceNumber
}
return 0
}
func (this *HeaderBlock) GetOsmosisReplicationBaseUrl() string {
if this != nil && this.OsmosisReplicationBaseUrl != nil {
return *this.OsmosisReplicationBaseUrl
}
return ""
}
type HeaderBBox struct {
Left *int64 `protobuf:"zigzag64,1,req,name=left" json:"left,omitempty"`
Right *int64 `protobuf:"zigzag64,2,req,name=right" json:"right,omitempty"`
Top *int64 `protobuf:"zigzag64,3,req,name=top" json:"top,omitempty"`
Bottom *int64 `protobuf:"zigzag64,4,req,name=bottom" json:"bottom,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (this *HeaderBBox) Reset() { *this = HeaderBBox{} }
func (this *HeaderBBox) String() string { return proto.CompactTextString(this) }
func (*HeaderBBox) ProtoMessage() {}
func (this *HeaderBBox) GetLeft() int64 {
if this != nil && this.Left != nil {
return *this.Left
}
return 0
}
func (this *HeaderBBox) GetRight() int64 {
if this != nil && this.Right != nil {
return *this.Right
}
return 0
}
func (this *HeaderBBox) GetTop() int64 {
if this != nil && this.Top != nil {
return *this.Top
}
return 0
}
func (this *HeaderBBox) GetBottom() int64 {
if this != nil && this.Bottom != nil {
return *this.Bottom
}
return 0
}
type PrimitiveBlock struct {
Stringtable *StringTable `protobuf:"bytes,1,req,name=stringtable" json:"stringtable,omitempty"`
Primitivegroup []*PrimitiveGroup `protobuf:"bytes,2,rep,name=primitivegroup" json:"primitivegroup,omitempty"`
Granularity *int32 `protobuf:"varint,17,opt,name=granularity,def=100" json:"granularity,omitempty"`
LatOffset *int64 `protobuf:"varint,19,opt,name=lat_offset,def=0" json:"lat_offset,omitempty"`
LonOffset *int64 `protobuf:"varint,20,opt,name=lon_offset,def=0" json:"lon_offset,omitempty"`
DateGranularity *int32 `protobuf:"varint,18,opt,name=date_granularity,def=1000" json:"date_granularity,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (this *PrimitiveBlock) Reset() { *this = PrimitiveBlock{} }
func (this *PrimitiveBlock) String() string { return proto.CompactTextString(this) }
func (*PrimitiveBlock) ProtoMessage() {}
const Default_PrimitiveBlock_Granularity int32 = 100
const Default_PrimitiveBlock_LatOffset int64 = 0
const Default_PrimitiveBlock_LonOffset int64 = 0
const Default_PrimitiveBlock_DateGranularity int32 = 1000
func (this *PrimitiveBlock) GetStringtable() *StringTable {
if this != nil {
return this.Stringtable
}
return nil
}
func (this *PrimitiveBlock) GetGranularity() int32 {
if this != nil && this.Granularity != nil {
return *this.Granularity
}
return Default_PrimitiveBlock_Granularity
}
func (this *PrimitiveBlock) GetLatOffset() int64 {
if this != nil && this.LatOffset != nil {
return *this.LatOffset
}
return Default_PrimitiveBlock_LatOffset
}
func (this *PrimitiveBlock) GetLonOffset() int64 {
if this != nil && this.LonOffset != nil {
return *this.LonOffset
}
return Default_PrimitiveBlock_LonOffset
}
func (this *PrimitiveBlock) GetDateGranularity() int32 {
if this != nil && this.DateGranularity != nil {
return *this.DateGranularity
}
return Default_PrimitiveBlock_DateGranularity
}
type PrimitiveGroup struct {
Nodes []*Node `protobuf:"bytes,1,rep,name=nodes" json:"nodes,omitempty"`
Dense *DenseNodes `protobuf:"bytes,2,opt,name=dense" json:"dense,omitempty"`
Ways []*Way `protobuf:"bytes,3,rep,name=ways" json:"ways,omitempty"`
Relations []*Relation `protobuf:"bytes,4,rep,name=relations" json:"relations,omitempty"`
Changesets []*ChangeSet `protobuf:"bytes,5,rep,name=changesets" json:"changesets,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (this *PrimitiveGroup) Reset() { *this = PrimitiveGroup{} }
func (this *PrimitiveGroup) String() string { return proto.CompactTextString(this) }
func (*PrimitiveGroup) ProtoMessage() {}
func (this *PrimitiveGroup) GetDense() *DenseNodes {
if this != nil {
return this.Dense
}
return nil
}
type StringTable struct {
S [][]byte `protobuf:"bytes,1,rep,name=s" json:"s,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (this *StringTable) Reset() { *this = StringTable{} }
func (this *StringTable) String() string { return proto.CompactTextString(this) }
func (*StringTable) ProtoMessage() {}
type Info struct {
Version *int32 `protobuf:"varint,1,opt,name=version,def=-1" json:"version,omitempty"`
Timestamp *int64 `protobuf:"varint,2,opt,name=timestamp" json:"timestamp,omitempty"`
Changeset *int64 `protobuf:"varint,3,opt,name=changeset" json:"changeset,omitempty"`
Uid *int32 `protobuf:"varint,4,opt,name=uid" json:"uid,omitempty"`
UserSid *uint32 `protobuf:"varint,5,opt,name=user_sid" json:"user_sid,omitempty"`
Visible *bool `protobuf:"varint,6,opt,name=visible" json:"visible,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (this *Info) Reset() { *this = Info{} }
func (this *Info) String() string { return proto.CompactTextString(this) }
func (*Info) ProtoMessage() {}
const Default_Info_Version int32 = -1
func (this *Info) GetVersion() int32 {
if this != nil && this.Version != nil {
return *this.Version
}
return Default_Info_Version
}
func (this *Info) GetTimestamp() int64 {
if this != nil && this.Timestamp != nil {
return *this.Timestamp
}
return 0
}
func (this *Info) GetChangeset() int64 {
if this != nil && this.Changeset != nil {
return *this.Changeset
}
return 0
}
func (this *Info) GetUid() int32 {
if this != nil && this.Uid != nil {
return *this.Uid
}
return 0
}
func (this *Info) GetUserSid() uint32 {
if this != nil && this.UserSid != nil {
return *this.UserSid
}
return 0
}
func (this *Info) GetVisible() bool {
if this != nil && this.Visible != nil {
return *this.Visible
}
return false
}
type DenseInfo struct {
Version []int32 `protobuf:"varint,1,rep,packed,name=version" json:"version,omitempty"`
Timestamp []int64 `protobuf:"zigzag64,2,rep,packed,name=timestamp" json:"timestamp,omitempty"`
Changeset []int64 `protobuf:"zigzag64,3,rep,packed,name=changeset" json:"changeset,omitempty"`
Uid []int32 `protobuf:"zigzag32,4,rep,packed,name=uid" json:"uid,omitempty"`
UserSid []int32 `protobuf:"zigzag32,5,rep,packed,name=user_sid" json:"user_sid,omitempty"`
Visible []bool `protobuf:"varint,6,rep,packed,name=visible" json:"visible,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (this *DenseInfo) Reset() { *this = DenseInfo{} }
func (this *DenseInfo) String() string { return proto.CompactTextString(this) }
func (*DenseInfo) ProtoMessage() {}
type ChangeSet struct {
Id *int64 `protobuf:"varint,1,req,name=id" json:"id,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (this *ChangeSet) Reset() { *this = ChangeSet{} }
func (this *ChangeSet) String() string { return proto.CompactTextString(this) }
func (*ChangeSet) ProtoMessage() {}
func (this *ChangeSet) GetId() int64 {
if this != nil && this.Id != nil {
return *this.Id
}
return 0
}
type Node struct {
Id *int64 `protobuf:"zigzag64,1,req,name=id" json:"id,omitempty"`
Keys []uint32 `protobuf:"varint,2,rep,packed,name=keys" json:"keys,omitempty"`
Vals []uint32 `protobuf:"varint,3,rep,packed,name=vals" json:"vals,omitempty"`
Info *Info `protobuf:"bytes,4,opt,name=info" json:"info,omitempty"`
Lat *int64 `protobuf:"zigzag64,8,req,name=lat" json:"lat,omitempty"`
Lon *int64 `protobuf:"zigzag64,9,req,name=lon" json:"lon,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (this *Node) Reset() { *this = Node{} }
func (this *Node) String() string { return proto.CompactTextString(this) }
func (*Node) ProtoMessage() {}
func (this *Node) GetId() int64 {
if this != nil && this.Id != nil {
return *this.Id
}
return 0
}
func (this *Node) GetInfo() *Info {
if this != nil {
return this.Info
}
return nil
}
func (this *Node) GetLat() int64 {
if this != nil && this.Lat != nil {
return *this.Lat
}
return 0
}
func (this *Node) GetLon() int64 {
if this != nil && this.Lon != nil {
return *this.Lon
}
return 0
}
type DenseNodes struct {
Id []int64 `protobuf:"zigzag64,1,rep,packed,name=id" json:"id,omitempty"`
Denseinfo *DenseInfo `protobuf:"bytes,5,opt,name=denseinfo" json:"denseinfo,omitempty"`
Lat []int64 `protobuf:"zigzag64,8,rep,packed,name=lat" json:"lat,omitempty"`
Lon []int64 `protobuf:"zigzag64,9,rep,packed,name=lon" json:"lon,omitempty"`
KeysVals []int32 `protobuf:"varint,10,rep,packed,name=keys_vals" json:"keys_vals,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (this *DenseNodes) Reset() { *this = DenseNodes{} }
func (this *DenseNodes) String() string { return proto.CompactTextString(this) }
func (*DenseNodes) ProtoMessage() {}
func (this *DenseNodes) GetDenseinfo() *DenseInfo {
if this != nil {
return this.Denseinfo
}
return nil
}
type Way struct {
Id *int64 `protobuf:"varint,1,req,name=id" json:"id,omitempty"`
Keys []uint32 `protobuf:"varint,2,rep,packed,name=keys" json:"keys,omitempty"`
Vals []uint32 `protobuf:"varint,3,rep,packed,name=vals" json:"vals,omitempty"`
Info *Info `protobuf:"bytes,4,opt,name=info" json:"info,omitempty"`
Refs []int64 `protobuf:"zigzag64,8,rep,packed,name=refs" json:"refs,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (this *Way) Reset() { *this = Way{} }
func (this *Way) String() string { return proto.CompactTextString(this) }
func (*Way) ProtoMessage() {}
func (this *Way) GetId() int64 {
if this != nil && this.Id != nil {
return *this.Id
}
return 0
}
func (this *Way) GetInfo() *Info {
if this != nil {
return this.Info
}
return nil
}
type Relation struct {
Id *int64 `protobuf:"varint,1,req,name=id" json:"id,omitempty"`
Keys []uint32 `protobuf:"varint,2,rep,packed,name=keys" json:"keys,omitempty"`
Vals []uint32 `protobuf:"varint,3,rep,packed,name=vals" json:"vals,omitempty"`
Info *Info `protobuf:"bytes,4,opt,name=info" json:"info,omitempty"`
RolesSid []int32 `protobuf:"varint,8,rep,packed,name=roles_sid" json:"roles_sid,omitempty"`
Memids []int64 `protobuf:"zigzag64,9,rep,packed,name=memids" json:"memids,omitempty"`
Types []Relation_MemberType `protobuf:"varint,10,rep,packed,name=types,enum=goposm.Relation_MemberType" json:"types,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (this *Relation) Reset() { *this = Relation{} }
func (this *Relation) String() string { return proto.CompactTextString(this) }
func (*Relation) ProtoMessage() {}
func (this *Relation) GetId() int64 {
if this != nil && this.Id != nil {
return *this.Id
}
return 0
}
func (this *Relation) GetInfo() *Info {
if this != nil {
return this.Info
}
return nil
}
func init() {
proto.RegisterEnum("goposm.Relation_MemberType", Relation_MemberType_name, Relation_MemberType_value)
}

260
osmpbf/osmformat.proto Normal file
View File

@ -0,0 +1,260 @@
/** Copyright (c) 2010 Scott A. Crosby. <scott@sacrosby.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
option optimize_for = LITE_RUNTIME;
option java_package = "crosby.binary";
package osmpbf;
/* OSM Binary file format
This is the master schema file of the OSM binary file format. This
file is designed to support limited random-access and future
extendability.
A binary OSM file consists of a sequence of FileBlocks (please see
fileformat.proto). The first fileblock contains a serialized instance
of HeaderBlock, followed by a sequence of PrimitiveBlock blocks that
contain the primitives.
Each primitiveblock is designed to be independently parsable. It
contains a string table storing all strings in that block (keys and
values in tags, roles in relations, usernames, etc.) as well as
metadata containing the precision of coordinates or timestamps in that
block.
A primitiveblock contains a sequence of primitive groups, each
containing primitives of the same type (nodes, densenodes, ways,
relations). Coordinates are stored in signed 64-bit integers. Lat&lon
are measured in units <granularity> nanodegrees. The default of
granularity of 100 nanodegrees corresponds to about 1cm on the ground,
and a full lat or lon fits into 32 bits.
Converting an integer to a lattitude or longitude uses the formula:
$OUT = IN * granularity / 10**9$. Many encoding schemes use delta
coding when representing nodes and relations.
*/
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
/* Contains the file header. */
message HeaderBlock {
optional HeaderBBox bbox = 1;
/* Additional tags to aid in parsing this dataset */
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;
}
/** The bounding box field in the OSM header. BBOX, as used in the OSM
header. Units are always in nanodegrees -- they do not obey
granularity rules. */
message HeaderBBox {
required sint64 left = 1;
required sint64 right = 2;
required sint64 top = 3;
required sint64 bottom = 4;
}
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
message PrimitiveBlock {
required StringTable stringtable = 1;
repeated PrimitiveGroup primitivegroup = 2;
// Granularity, units of nanodegrees, used to store coordinates in this block
optional int32 granularity = 17 [default=100];
// Offset value between the output coordinates coordinates and the granularity grid in unites of nanodegrees.
optional int64 lat_offset = 19 [default=0];
optional int64 lon_offset = 20 [default=0];
// Granularity of dates, normally represented in units of milliseconds since the 1970 epoch.
optional int32 date_granularity = 18 [default=1000];
// Proposed extension:
//optional BBox bbox = XX;
}
// Group of OSMPrimitives. All primitives in a group must be the same type.
message PrimitiveGroup {
repeated Node nodes = 1;
optional DenseNodes dense = 2;
repeated Way ways = 3;
repeated Relation relations = 4;
repeated ChangeSet changesets = 5;
}
/** String table, contains the common strings in each block.
Note that we reserve index '0' as a delimiter, so the entry at that
index in the table is ALWAYS blank and unused.
*/
message StringTable {
repeated bytes s = 1;
}
/* Optional metadata that may be included into each primitive. */
message Info {
optional int32 version = 1 [default = -1];
optional int64 timestamp = 2;
optional int64 changeset = 3;
optional int32 uid = 4;
optional uint32 user_sid = 5; // String IDs
// The visible flag is used to store history information. It indicates that
// the current object version has been created by a delete operation on the
// OSM API.
// When a writer sets this flag, it MUST add a required_features tag with
// value "HistoricalInformation" to the HeaderBlock.
// If this flag is not available for some object it MUST be assumed to be
// true if the file has the required_features tag "HistoricalInformation"
// set.
optional bool visible = 6;
}
/** Optional metadata that may be included into each primitive. Special dense format used in DenseNodes. */
message DenseInfo {
repeated int32 version = 1 [packed = true];
repeated sint64 timestamp = 2 [packed = true]; // DELTA coded
repeated sint64 changeset = 3 [packed = true]; // DELTA coded
repeated sint32 uid = 4 [packed = true]; // DELTA coded
repeated sint32 user_sid = 5 [packed = true]; // String IDs for usernames. DELTA coded
// The visible flag is used to store history information. It indicates that
// the current object version has been created by a delete operation on the
// OSM API.
// When a writer sets this flag, it MUST add a required_features tag with
// value "HistoricalInformation" to the HeaderBlock.
// If this flag is not available for some object it MUST be assumed to be
// true if the file has the required_features tag "HistoricalInformation"
// set.
repeated bool visible = 6 [packed = true];
}
// THIS IS STUB DESIGN FOR CHANGESETS. NOT USED RIGHT NOW.
// TODO: REMOVE THIS?
message ChangeSet {
required int64 id = 1;
//
// // Parallel arrays.
// repeated uint32 keys = 2 [packed = true]; // String IDs.
// repeated uint32 vals = 3 [packed = true]; // String IDs.
//
// optional Info info = 4;
// optional int64 created_at = 8;
// optional int64 closetime_delta = 9;
// optional bool open = 10;
// optional HeaderBBox bbox = 11;
}
message Node {
required sint64 id = 1;
// Parallel arrays.
repeated uint32 keys = 2 [packed = true]; // String IDs.
repeated uint32 vals = 3 [packed = true]; // String IDs.
optional Info info = 4; // May be omitted in omitmeta
required sint64 lat = 8;
required sint64 lon = 9;
}
/* Used to densly represent a sequence of nodes that do not have any tags.
We represent these nodes columnwise as five columns: ID's, lats, and
lons, all delta coded. When metadata is not omitted,
We encode keys & vals for all nodes as a single array of integers
containing key-stringid and val-stringid, using a stringid of 0 as a
delimiter between nodes.
( (<keyid> <valid>)* '0' )*
*/
message DenseNodes {
repeated sint64 id = 1 [packed = true]; // DELTA coded
//repeated Info info = 4;
optional DenseInfo denseinfo = 5;
repeated sint64 lat = 8 [packed = true]; // DELTA coded
repeated sint64 lon = 9 [packed = true]; // DELTA coded
// Special packing of keys and vals into one array. May be empty if all nodes in this block are tagless.
repeated int32 keys_vals = 10 [packed = true];
}
message Way {
required int64 id = 1;
// Parallel arrays.
repeated uint32 keys = 2 [packed = true];
repeated uint32 vals = 3 [packed = true];
optional Info info = 4;
repeated sint64 refs = 8 [packed = true]; // DELTA coded
}
message Relation {
enum MemberType {
NODE = 0;
WAY = 1;
RELATION = 2;
}
required int64 id = 1;
// Parallel arrays.
repeated uint32 keys = 2 [packed = true];
repeated uint32 vals = 3 [packed = true];
optional Info info = 4;
// Parallel arrays
repeated int32 roles_sid = 8 [packed = true];
repeated sint64 memids = 9 [packed = true]; // DELTA encoded
repeated MemberType types = 10 [packed = true];
}

View File

@ -5,10 +5,10 @@ import (
"code.google.com/p/goprotobuf/proto"
"compress/zlib"
structs "encoding/binary"
"goposm/osmpbf"
"io"
"log"
"os"
"osmpbf"
)
func ReadPrimitiveBlock(pos BlockPosition) *osmpbf.PrimitiveBlock {

View File

@ -3,9 +3,9 @@ package parser
import (
"fmt"
"goposm/element"
"goposm/osmpbf"
"log"
"os"
"osmpbf"
)
type PBF struct {