syntax = "proto2"; option optimize_for = LITE_RUNTIME; message Data { repeated string keys = 1; // global arrays of unique keys optional uint32 dimensions = 2 [default = 2]; // max coordinate dimensions optional uint32 precision = 3 [default = 6]; // number of digits after decimal point for coordinates oneof data_type { FeatureCollection feature_collection = 4; Feature feature = 5; Geometry geometry = 6; } message Feature { required Geometry geometry = 1; oneof id_type { string id = 11; sint64 int_id = 12; } repeated Value values = 13; // unique values repeated uint32 properties = 14 [packed = true]; // pairs of key/value indexes repeated uint32 custom_properties = 15 [packed = true]; // arbitrary properties } message Geometry { required Type type = 1; repeated uint32 lengths = 2 [packed = true]; // coordinate structure in lengths repeated sint64 coords = 3 [packed = true]; // delta-encoded integer values repeated Geometry geometries = 4; repeated Value values = 13; repeated uint32 custom_properties = 15 [packed = true]; enum Type { POINT = 0; MULTIPOINT = 1; LINESTRING = 2; MULTILINESTRING = 3; POLYGON = 4; MULTIPOLYGON = 5; GEOMETRYCOLLECTION = 6; } } message FeatureCollection { repeated Feature features = 1; repeated Value values = 13; repeated uint32 custom_properties = 15 [packed = true]; } message Value { oneof value_type { string string_value = 1; double double_value = 2; uint64 pos_int_value = 3; uint64 neg_int_value = 4; bool bool_value = 5; string json_value = 6; } } }