// Protocol Version 1 package vector_tile; option optimize_for = LITE_RUNTIME; message Tile { enum GeomType { UNKNOWN = 0; POINT = 1; LINESTRING = 2; POLYGON = 3; } // Variant type encoding message Value { // Exactly one of these values may be present in a valid message optional string string_value = 1; optional float float_value = 2; optional double double_value = 3; optional int64 int_value = 4; optional uint64 uint_value = 5; optional sint64 sint_value = 6; optional bool bool_value = 7; extensions 8 to max; } message Feature { optional uint64 id = 1 [ default = 0 ]; // Tags of this feature are encoded as repeated pairs of // integers. Even indexed values (n, beginning with 0) are // themselves indexes into the layer's keys list. Odd indexed // values (n+1) are indexes into the layer's values list. // The first (n=0) tag of a feature, therefore, has a key of // layer.keys[feature.tags[0]] and a value of // layer.values[feature.tags[1]]. repeated uint32 tags = 2 [ packed = true ]; // The type of geometry stored in this feature. optional GeomType type = 3 [ default = UNKNOWN ]; // Contains a stream of commands and parameters (vertices). The // repeat count is shifted to the left by 3 bits. This means // that the command has 3 bits (0-7). The repeat count // indicates how often this command is to be repeated. Defined // commands are: // - MoveTo: 1 (2 parameters follow) // - LineTo: 2 (2 parameters follow) // - ClosePath: 7 (no parameters follow) // // Commands are encoded as uint32 varints. Vertex parameters // are encoded as deltas to the previous position and, as they // may be negative, are further "zigzag" encoded as unsigned // 32-bit ints: // // n = (n << 1) ^ (n >> 31) // // Ex.: MoveTo(3, 6), LineTo(8, 12), LineTo(20, 34), ClosePath // Encoded as: [ 9 6 12 18 10 12 24 44 15 ] // | | `> [00001 111] command type 7 (ClosePath), length 1 // | | ===== relative LineTo(+12, +22) == LineTo(20, 34) // | | ===== relative LineTo(+5, +6) == LineTo(8, 12) // | `> [00010 010] = command type 2 (LineTo), length 2 // | ==== relative MoveTo(+3, +6) // `> [00001 001] = command type 1 (MoveTo), length 1 // // The original position is (0,0). repeated uint32 geometry = 4 [ packed = true ]; } message Layer { // Any compliant implementation must first read the version // number encoded in this message and choose the correct // implementation for this version number before proceeding to // decode other parts of this message. required uint32 version = 15 [ default = 1 ]; required string name = 1; // The actual features in this tile. repeated Feature features = 2; // Dictionary encoding for keys repeated string keys = 3; // Dictionary encoding for values repeated Value values = 4; // The bounding box in this tile spans from 0..4095 units optional uint32 extent = 5 [ default = 4096 ]; extensions 16 to max; } repeated Layer layers = 3; extensions 16 to 8191; }