From 7217923f3c819284a7509e02d361a47464e944e5 Mon Sep 17 00:00:00 2001 From: Blake Thompson Date: Fri, 20 Jul 2018 14:33:44 -0500 Subject: [PATCH 01/11] Example complex value setup to perhaps increase compression of properties --- 3.0/vector_tile.proto | 48 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/3.0/vector_tile.proto b/3.0/vector_tile.proto index ef3d870..fc14238 100644 --- a/3.0/vector_tile.proto +++ b/3.0/vector_tile.proto @@ -44,6 +44,46 @@ message Tile { // A detailed description on geometry encoding is located in // section 4.3 of the specification. repeated uint32 geometry = 4 [ packed = true ]; + + // Properties replace existing tags field and + // uses the properties field instead. This would only be used if version + // for a layer is 3 or greater and tags should not be used at that point + // + // The properties field is much like the tags value in the it is two integers + // pairs that reference key and value pairs however, it is broken out into a + // "key_index" and an "complex_value". + // + // The "key_index" is much like the key index in the use for tags, but instead + // of pointing to "keys" field in the Layers, it points to the "string_values". + // This is the same value store as strings for use in values, so duplicates here + // will be pointing to the same indexed position. + // + // An complex value has two parts, the first 4 bits are the type bits + // and the remaining bits are the parameter bits. What is stored in the parameter + // bits is dependant on what the type bit is selected. For example for inline values, + // the parameter field is not an index but simply a value. For other types it might + // be an index position into a value storage of the layer. + // + // uint64t type = complex_value & 0xF; // First 4 Bits + // uint64t parameter = complex_value >> 4; + // + // Type | Id | Parameter + // --------------------------------- + // inline int | 0 | value of integer ( values between -2^59+1 to 2^59-1 ) + // inline uint | 1 | value of unsigned integer ( values between 0 to 2^60-1 ) + // bool/null | 2 | value of 0 = false, 1 = true, 2 = null + // float | 3 | index to float_values in layer + // double | 4 | index to double_values in layer + // string | 5 | index to string_values in layer + // int | 6 | index to int_values in layer + // uint | 7 | index to uint_values in layer + // list / map | 8 | (if 5th bit is 0 is list) + // | | remaining bits are length of the list where + // | | each item in the list is a complex value + // | | (if 5th bit is 1 is map) + // | | remaining bits are the number of key_index and + // | | complex_value pairs to follow (same as properties) + repeated uint64 properties = 5 [ packed = true ]; } // Layers are described in section 4.1 of the specification @@ -69,6 +109,14 @@ message Tile { // See https://github.com/mapbox/vector-tile-spec/issues/47 optional uint32 extent = 5 [ default = 4096 ]; + // + // An inline value is an integer + repeated string string_values = 7; + repeated double double_values = 8 [ packed = true ]; + repeated float float_values = 9 [ packed = true ]; + repeated int64 int64_values = 10 [ packed = true ]; + repeated uint64 uint64_values = 11 [ packed = true ]; + extensions 16 to max; } From fe9139a8893f7fcae207d39c167f7e7fe27ef098 Mon Sep 17 00:00:00 2001 From: Blake Thompson Date: Fri, 20 Jul 2018 14:41:25 -0500 Subject: [PATCH 02/11] Small fixes to properties wording --- 3.0/vector_tile.proto | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/3.0/vector_tile.proto b/3.0/vector_tile.proto index fc14238..be9bf15 100644 --- a/3.0/vector_tile.proto +++ b/3.0/vector_tile.proto @@ -58,19 +58,19 @@ message Tile { // This is the same value store as strings for use in values, so duplicates here // will be pointing to the same indexed position. // - // An complex value has two parts, the first 4 bits are the type bits + // An complex value has two parts, the first 3 bits are the type bits // and the remaining bits are the parameter bits. What is stored in the parameter // bits is dependant on what the type bit is selected. For example for inline values, // the parameter field is not an index but simply a value. For other types it might // be an index position into a value storage of the layer. // - // uint64t type = complex_value & 0xF; // First 4 Bits - // uint64t parameter = complex_value >> 4; + // uint64t type = complex_value & 0x7; // First 3 Bits + // uint64t parameter = complex_value >> 3; // // Type | Id | Parameter // --------------------------------- - // inline int | 0 | value of integer ( values between -2^59+1 to 2^59-1 ) - // inline uint | 1 | value of unsigned integer ( values between 0 to 2^60-1 ) + // inline int | 0 | value of integer ( values between -2^60+1 to 2^60-1 ) + // inline uint | 1 | value of unsigned integer ( values between 0 to 2^61-1 ) // bool/null | 2 | value of 0 = false, 1 = true, 2 = null // float | 3 | index to float_values in layer // double | 4 | index to double_values in layer @@ -109,8 +109,6 @@ message Tile { // See https://github.com/mapbox/vector-tile-spec/issues/47 optional uint32 extent = 5 [ default = 4096 ]; - // - // An inline value is an integer repeated string string_values = 7; repeated double double_values = 8 [ packed = true ]; repeated float float_values = 9 [ packed = true ]; From 736b0ec7aa78c1a2304949995dcdaa354b052961 Mon Sep 17 00:00:00 2001 From: Blake Thompson Date: Fri, 20 Jul 2018 14:44:16 -0500 Subject: [PATCH 03/11] Fix wording yet again --- 3.0/vector_tile.proto | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/3.0/vector_tile.proto b/3.0/vector_tile.proto index be9bf15..bcdc895 100644 --- a/3.0/vector_tile.proto +++ b/3.0/vector_tile.proto @@ -77,10 +77,10 @@ message Tile { // string | 5 | index to string_values in layer // int | 6 | index to int_values in layer // uint | 7 | index to uint_values in layer - // list / map | 8 | (if 5th bit is 0 is list) + // list / map | 8 | (if 4th bit is 0 is list) // | | remaining bits are length of the list where // | | each item in the list is a complex value - // | | (if 5th bit is 1 is map) + // | | (if 4th bit is 1 is map) // | | remaining bits are the number of key_index and // | | complex_value pairs to follow (same as properties) repeated uint64 properties = 5 [ packed = true ]; From 5f954d6342be33243f7172a2e0040c4f654d0a4e Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Tue, 24 Jul 2018 12:53:14 -0700 Subject: [PATCH 04/11] 4 bits are needed for value types. Use sint64 instead of int64. --- 3.0/vector_tile.proto | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/3.0/vector_tile.proto b/3.0/vector_tile.proto index bcdc895..6fcb215 100644 --- a/3.0/vector_tile.proto +++ b/3.0/vector_tile.proto @@ -58,19 +58,19 @@ message Tile { // This is the same value store as strings for use in values, so duplicates here // will be pointing to the same indexed position. // - // An complex value has two parts, the first 3 bits are the type bits + // An complex value has two parts, the first 4 bits are the type bits // and the remaining bits are the parameter bits. What is stored in the parameter // bits is dependant on what the type bit is selected. For example for inline values, // the parameter field is not an index but simply a value. For other types it might // be an index position into a value storage of the layer. // - // uint64t type = complex_value & 0x7; // First 3 Bits - // uint64t parameter = complex_value >> 3; + // uint64t type = complex_value & 0x0F; // First 4 Bits + // uint64t parameter = complex_value >> 4; // // Type | Id | Parameter // --------------------------------- - // inline int | 0 | value of integer ( values between -2^60+1 to 2^60-1 ) - // inline uint | 1 | value of unsigned integer ( values between 0 to 2^61-1 ) + // inline sint | 0 | value of integer ( values between -2^59+1 to 2^59-1 ) + // inline uint | 1 | value of unsigned integer ( values between 0 to 2^60-1 ) // bool/null | 2 | value of 0 = false, 1 = true, 2 = null // float | 3 | index to float_values in layer // double | 4 | index to double_values in layer @@ -112,7 +112,7 @@ message Tile { repeated string string_values = 7; repeated double double_values = 8 [ packed = true ]; repeated float float_values = 9 [ packed = true ]; - repeated int64 int64_values = 10 [ packed = true ]; + repeated sint64 sint64_values = 10 [ packed = true ]; repeated uint64 uint64_values = 11 [ packed = true ]; extensions 16 to max; From 66e465cdb655d5a5fa7984dee502883af4b663f8 Mon Sep 17 00:00:00 2001 From: Blake Thompson Date: Fri, 27 Jul 2018 09:42:47 -0500 Subject: [PATCH 05/11] Correct grammar --- 3.0/vector_tile.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3.0/vector_tile.proto b/3.0/vector_tile.proto index 6fcb215..29cc8cf 100644 --- a/3.0/vector_tile.proto +++ b/3.0/vector_tile.proto @@ -49,7 +49,7 @@ message Tile { // uses the properties field instead. This would only be used if version // for a layer is 3 or greater and tags should not be used at that point // - // The properties field is much like the tags value in the it is two integers + // The properties field is much like the tags value in that it is two integers // pairs that reference key and value pairs however, it is broken out into a // "key_index" and an "complex_value". // From 5bd6daa3fb67505030e5c9d9e6bc63e760767006 Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Thu, 16 Aug 2018 11:08:16 -0700 Subject: [PATCH 06/11] Change tables of integers by reference to be fixed-size --- 3.0/vector_tile.proto | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/3.0/vector_tile.proto b/3.0/vector_tile.proto index 6fcb215..ee0e0ea 100644 --- a/3.0/vector_tile.proto +++ b/3.0/vector_tile.proto @@ -45,38 +45,41 @@ message Tile { // section 4.3 of the specification. repeated uint32 geometry = 4 [ packed = true ]; - // Properties replace existing tags field and - // uses the properties field instead. This would only be used if version - // for a layer is 3 or greater and tags should not be used at that point + // Additional tags (or all the tags) of this feature may be + // encoded as repeated pairs of 32-bit integers, to take + // advantage of inline encoding of small values and of + // improved compression from use of repeated values. // - // The properties field is much like the tags value in the it is two integers - // pairs that reference key and value pairs however, it is broken out into a - // "key_index" and an "complex_value". + // This message may only be used if the layer version is >= 3. + // + // The properties field is much like the tags value in that it is a pair of + // integers that reference key and value pairs. However, the value reference + // is a "complex_value" that combines a type and an index. // // The "key_index" is much like the key index in the use for tags, but instead // of pointing to "keys" field in the Layers, it points to the "string_values". // This is the same value store as strings for use in values, so duplicates here // will be pointing to the same indexed position. // - // An complex value has two parts, the first 4 bits are the type bits + // An complex value has two parts: the lowest 4 bits are the type bits, // and the remaining bits are the parameter bits. What is stored in the parameter - // bits is dependant on what the type bit is selected. For example for inline values, - // the parameter field is not an index but simply a value. For other types it might - // be an index position into a value storage of the layer. + // bits is dependent on the contents of the type bits. For example for inline values, + // the parameter field is not an index but simply a value. For other types it is + // an index position into a value storage of the layer. // // uint64t type = complex_value & 0x0F; // First 4 Bits // uint64t parameter = complex_value >> 4; // // Type | Id | Parameter // --------------------------------- - // inline sint | 0 | value of integer ( values between -2^59+1 to 2^59-1 ) - // inline uint | 1 | value of unsigned integer ( values between 0 to 2^60-1 ) + // inline sint | 0 | value of zigzag-encoded integer (values between -2^59 to 2^59-1) + // inline uint | 1 | value of unsigned integer (values between 0 to 2^60-1) // bool/null | 2 | value of 0 = false, 1 = true, 2 = null // float | 3 | index to float_values in layer // double | 4 | index to double_values in layer // string | 5 | index to string_values in layer - // int | 6 | index to int_values in layer - // uint | 7 | index to uint_values in layer + // int | 6 | index to sfixed64_values in layer + // uint | 7 | index to fixed64_values in layer // list / map | 8 | (if 4th bit is 0 is list) // | | remaining bits are length of the list where // | | each item in the list is a complex value @@ -112,8 +115,8 @@ message Tile { repeated string string_values = 7; repeated double double_values = 8 [ packed = true ]; repeated float float_values = 9 [ packed = true ]; - repeated sint64 sint64_values = 10 [ packed = true ]; - repeated uint64 uint64_values = 11 [ packed = true ]; + repeated sfixed64 sfixed64_values = 10 [ packed = true ]; + repeated fixed64 fixed64_values = 11 [ packed = true ]; extensions 16 to max; } From af1d5d9b25310bc08ed4270aad5e38d202afcb1b Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Fri, 17 Aug 2018 10:44:10 -0700 Subject: [PATCH 07/11] Reword and reorder for consistency. Add separate attribute pool message. --- 3.0/vector_tile.proto | 70 +++++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/3.0/vector_tile.proto b/3.0/vector_tile.proto index ee0e0ea..89900d9 100644 --- a/3.0/vector_tile.proto +++ b/3.0/vector_tile.proto @@ -31,11 +31,11 @@ message Tile { message Feature { optional uint64 id = 1 [ default = 0 ]; - // Tags of this feature are encoded as repeated pairs of + // Attributes of this feature are encoded as repeated pairs of // integers. - // A detailed description of tags is located in sections + // A detailed description of attributes is located in sections // 4.2 and 4.4 of the specification - repeated uint32 tags = 2 [ packed = true ]; + repeated uint32 attributes = 2 [ packed = true ]; // The type of geometry stored in this feature. optional GeomType type = 3 [ default = UNKNOWN ]; @@ -45,21 +45,20 @@ message Tile { // section 4.3 of the specification. repeated uint32 geometry = 4 [ packed = true ]; - // Additional tags (or all the tags) of this feature may be - // encoded as repeated pairs of 32-bit integers, to take - // advantage of inline encoding of small values and of - // improved compression from use of repeated values. + // Additional attributes (or all the attributes) of this feature may be + // encoded as repeated pairs of 64-bit integers, to take + // advantage of inline encoding of small values, + // improved compression from use of repeated values, + // and support for list and map values. // // This message may only be used if the layer version is >= 3. // - // The properties field is much like the tags value in that it is a pair of + // The inline_attributes field is much like the attributes field in that it is a pair of // integers that reference key and value pairs. However, the value reference // is a "complex_value" that combines a type and an index. // - // The "key_index" is much like the key index in the use for tags, but instead - // of pointing to "keys" field in the Layers, it points to the "string_values". - // This is the same value store as strings for use in values, so duplicates here - // will be pointing to the same indexed position. + // The "key_index" is much like the key index in the use for attributes, but instead + // of pointing into layer.keys, it points into layer.attribute_pool.keys. // // An complex value has two parts: the lowest 4 bits are the type bits, // and the remaining bits are the parameter bits. What is stored in the parameter @@ -67,26 +66,35 @@ message Tile { // the parameter field is not an index but simply a value. For other types it is // an index position into a value storage of the layer. // - // uint64t type = complex_value & 0x0F; // First 4 Bits - // uint64t parameter = complex_value >> 4; + // uint64_t type = complex_value & 0x0F; // Bottom 4 bits + // uint64_t parameter = complex_value >> 4; // // Type | Id | Parameter // --------------------------------- - // inline sint | 0 | value of zigzag-encoded integer (values between -2^59 to 2^59-1) - // inline uint | 1 | value of unsigned integer (values between 0 to 2^60-1) - // bool/null | 2 | value of 0 = false, 1 = true, 2 = null - // float | 3 | index to float_values in layer - // double | 4 | index to double_values in layer - // string | 5 | index to string_values in layer - // int | 6 | index to sfixed64_values in layer - // uint | 7 | index to fixed64_values in layer - // list / map | 8 | (if 4th bit is 0 is list) - // | | remaining bits are length of the list where + // string | 0 | index into layer.attribute_pool.string_values + // float | 1 | index into layer.attribute_pool.float_values + // double | 2 | index into layer.attribute_pool.double_values + // int | 3 | index into layer.attribute_pool.signed_integer_values + // uint | 4 | index into layer.attribute_pool.unsigned_integer_values + // inline uint | 5 | value of unsigned integer (values between 0 to 2^60-1) + // inline sint | 6 | value of zigzag-encoded integer (values between -2^59 to 2^59-1) + // bool/null | 7 | value of 0 = false, 1 = true, 2 = null + // list | 8 | value is the number of sub-attributes to follow: // | | each item in the list is a complex value - // | | (if 4th bit is 1 is map) - // | | remaining bits are the number of key_index and - // | | complex_value pairs to follow (same as properties) - repeated uint64 properties = 5 [ packed = true ]; + // map | 9 | value is the number of sub-attributes to follow: + // | | each item is an index into layer.attribute_pool.keys + // | | followed by a complex_value for the value + repeated uint64 inline_attributes = 5 [ packed = true ]; + } + + message AttributePool { + repeated string keys = 1; + + repeated string string_values = 2; + repeated float float_values = 3 [ packed = true ]; + repeated double double_values = 4 [ packed = true ]; + repeated sfixed64 signed_integer_values = 5 [ packed = true ]; + repeated fixed64 unsigned_integer_values = 6 [ packed = true ]; } // Layers are described in section 4.1 of the specification @@ -112,11 +120,7 @@ message Tile { // See https://github.com/mapbox/vector-tile-spec/issues/47 optional uint32 extent = 5 [ default = 4096 ]; - repeated string string_values = 7; - repeated double double_values = 8 [ packed = true ]; - repeated float float_values = 9 [ packed = true ]; - repeated sfixed64 sfixed64_values = 10 [ packed = true ]; - repeated fixed64 fixed64_values = 11 [ packed = true ]; + optional AttributePool attribute_pool = 7; extensions 16 to max; } From 3f262a47ec1e6e837c3c1aa906eb23f9dbb9516f Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Fri, 17 Aug 2018 10:55:00 -0700 Subject: [PATCH 08/11] Be clear about undefined types 10 through 15 --- 3.0/vector_tile.proto | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/3.0/vector_tile.proto b/3.0/vector_tile.proto index 89900d9..83672b9 100644 --- a/3.0/vector_tile.proto +++ b/3.0/vector_tile.proto @@ -84,6 +84,12 @@ message Tile { // map | 9 | value is the number of sub-attributes to follow: // | | each item is an index into layer.attribute_pool.keys // | | followed by a complex_value for the value + // + // Value types 10 through 15 are reserved for definition in future versions + // of this specification. Implementations MUST treat complex_values of these + // types as opaque values that are not followed by additional sub-attributes. + // In the future they may refer to additional inline types or additional + // reference types. repeated uint64 inline_attributes = 5 [ packed = true ]; } From 522bca8cf5282b638326874f4fb8cbaeb5ceddca Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Fri, 17 Aug 2018 11:36:37 -0700 Subject: [PATCH 09/11] Be clear that the count for a map refers to the number of pairs --- 3.0/vector_tile.proto | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/3.0/vector_tile.proto b/3.0/vector_tile.proto index 83672b9..92a5523 100644 --- a/3.0/vector_tile.proto +++ b/3.0/vector_tile.proto @@ -81,8 +81,8 @@ message Tile { // bool/null | 7 | value of 0 = false, 1 = true, 2 = null // list | 8 | value is the number of sub-attributes to follow: // | | each item in the list is a complex value - // map | 9 | value is the number of sub-attributes to follow: - // | | each item is an index into layer.attribute_pool.keys + // map | 9 | value is the number of pairs of sub-attributes to follow: + // | | each pair is an index into layer.attribute_pool.keys // | | followed by a complex_value for the value // // Value types 10 through 15 are reserved for definition in future versions From 001e3ed88c4e45d455aa29a640bbf56de5ba2018 Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Tue, 4 Sep 2018 16:12:57 -0700 Subject: [PATCH 10/11] Revise to match https://github.com/mapbox/vector-tile-spec/pull/123 --- 3.0/vector_tile.proto | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/3.0/vector_tile.proto b/3.0/vector_tile.proto index 92a5523..baaecfb 100644 --- a/3.0/vector_tile.proto +++ b/3.0/vector_tile.proto @@ -66,23 +66,23 @@ message Tile { // the parameter field is not an index but simply a value. For other types it is // an index position into a value storage of the layer. // - // uint64_t type = complex_value & 0x0F; // Bottom 4 bits + // uint64_t type = complex_value & 0x0F; // least significant 4 bits // uint64_t parameter = complex_value >> 4; // // Type | Id | Parameter // --------------------------------- - // string | 0 | index into layer.attribute_pool.string_values - // float | 1 | index into layer.attribute_pool.float_values - // double | 2 | index into layer.attribute_pool.double_values - // int | 3 | index into layer.attribute_pool.signed_integer_values - // uint | 4 | index into layer.attribute_pool.unsigned_integer_values + // string | 0 | index into layer string_values + // float | 1 | index into layer float_values + // double | 2 | index into layer double_values + // uint | 3 | index into layer int_values + // sint | 4 | index into layer int_values (values are zigzag encoded) // inline uint | 5 | value of unsigned integer (values between 0 to 2^60-1) // inline sint | 6 | value of zigzag-encoded integer (values between -2^59 to 2^59-1) // bool/null | 7 | value of 0 = false, 1 = true, 2 = null - // list | 8 | value is the number of sub-attributes to follow: + // list | 8 | value is the number of elements to follow: // | | each item in the list is a complex value - // map | 9 | value is the number of pairs of sub-attributes to follow: - // | | each pair is an index into layer.attribute_pool.keys + // map | 9 | value is the number of pairs of elements to follow: + // | | each pair is an index into layer keys // | | followed by a complex_value for the value // // Value types 10 through 15 are reserved for definition in future versions @@ -93,14 +93,8 @@ message Tile { repeated uint64 inline_attributes = 5 [ packed = true ]; } - message AttributePool { + message StringValues { repeated string keys = 1; - - repeated string string_values = 2; - repeated float float_values = 3 [ packed = true ]; - repeated double double_values = 4 [ packed = true ]; - repeated sfixed64 signed_integer_values = 5 [ packed = true ]; - repeated fixed64 unsigned_integer_values = 6 [ packed = true ]; } // Layers are described in section 4.1 of the specification @@ -126,7 +120,10 @@ message Tile { // See https://github.com/mapbox/vector-tile-spec/issues/47 optional uint32 extent = 5 [ default = 4096 ]; - optional AttributePool attribute_pool = 7; + optional StringValues attribute_pool = 6; + repeated float float_values = 7 [ packed = true ]; + repeated double double_values = 8 [ packed = true ]; + repeated fixed64 int_values = 9 [ packed = true ]; extensions 16 to max; } From 2f95642e10629b0ed3d3f3d30d50da7e83325851 Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Wed, 12 Sep 2018 13:30:56 -0700 Subject: [PATCH 11/11] Move string values back to the top level of the layer --- 3.0/vector_tile.proto | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/3.0/vector_tile.proto b/3.0/vector_tile.proto index baaecfb..2ca460f 100644 --- a/3.0/vector_tile.proto +++ b/3.0/vector_tile.proto @@ -35,7 +35,7 @@ message Tile { // integers. // A detailed description of attributes is located in sections // 4.2 and 4.4 of the specification - repeated uint32 attributes = 2 [ packed = true ]; + repeated uint32 tags = 2 [ packed = true ]; // The type of geometry stored in this feature. optional GeomType type = 3 [ default = UNKNOWN ]; @@ -93,10 +93,6 @@ message Tile { repeated uint64 inline_attributes = 5 [ packed = true ]; } - message StringValues { - repeated string keys = 1; - } - // Layers are described in section 4.1 of the specification message Layer { // Any compliant implementation must first read the version @@ -120,7 +116,7 @@ message Tile { // See https://github.com/mapbox/vector-tile-spec/issues/47 optional uint32 extent = 5 [ default = 4096 ]; - optional StringValues attribute_pool = 6; + repeated string string_values = 6; repeated float float_values = 7 [ packed = true ]; repeated double double_values = 8 [ packed = true ]; repeated fixed64 int_values = 9 [ packed = true ];