diff --git a/geojson.cpp b/geojson.cpp index 01bbe2ac..c5b8e938 100644 --- a/geojson.cpp +++ b/geojson.cpp @@ -397,7 +397,6 @@ int serialize_geometry(json_object *geometry, json_object *properties, json_obje serial_feature sf; sf.layer = layer; sf.segment = segment; - sf.seq = *layer_seq; sf.t = mb_geometry[t]; sf.has_id = has_id; sf.id = id_value; @@ -410,6 +409,12 @@ int serialize_geometry(json_object *geometry, json_object *properties, json_obje sf.feature_minzoom = 0; // Will be filled in during index merging sf.extent = (long long) extent; + if (prevent[P_INPUT_ORDER]) { + sf.seq = *layer_seq; + } else { + sf.seq = 0; + } + // Calculate the center even if off the edge of the plane, // and then mask to bring it back into the addressable area long long midx = (bbox[0] / 2 + bbox[2] / 2) & ((1LL << 32) - 1); diff --git a/serial.cpp b/serial.cpp index c23882cd..6d13b8c1 100644 --- a/serial.cpp +++ b/serial.cpp @@ -176,10 +176,10 @@ static void write_geometry(drawvec const &dv, long long *fpos, FILE *out, const void serialize_feature(FILE *geomfile, serial_feature *sf, long long *geompos, const char *fname, long long wx, long long wy, bool include_minzoom) { serialize_byte(geomfile, sf->t, geompos, fname); - serialize_long_long(geomfile, sf->seq, geompos, fname); long long layer = 0; - layer |= sf->layer << 5; + layer |= sf->layer << 6; + layer |= (sf->seq != 0) << 5; layer |= (sf->index != 0) << 4; layer |= (sf->extent != 0) << 3; layer |= sf->has_id << 2; @@ -187,6 +187,9 @@ void serialize_feature(FILE *geomfile, serial_feature *sf, long long *geompos, c layer |= sf->has_tippecanoe_maxzoom << 0; serialize_long_long(geomfile, layer, geompos, fname); + if (sf->seq != 0) { + serialize_long_long(geomfile, sf->seq, geompos, fname); + } if (sf->has_tippecanoe_minzoom) { serialize_int(geomfile, sf->tippecanoe_minzoom, geompos, fname); } diff --git a/tile.cpp b/tile.cpp index cb2f1ba7..fcd2ead6 100644 --- a/tile.cpp +++ b/tile.cpp @@ -1299,11 +1299,14 @@ long long write_tile(FILE *geoms, long long *geompos_in, char *metabase, char *s break; } - long long original_seq; - deserialize_long_long_io(geoms, &original_seq, geompos_in); - long long xlayer; deserialize_long_long_io(geoms, &xlayer, geompos_in); + + long long original_seq = 0; + if (xlayer & (1 << 5)) { + deserialize_long_long_io(geoms, &original_seq, geompos_in); + } + int tippecanoe_minzoom = -1, tippecanoe_maxzoom = -1; unsigned long long id = 0; bool has_id = false; @@ -1317,7 +1320,7 @@ long long write_tile(FILE *geoms, long long *geompos_in, char *metabase, char *s has_id = true; deserialize_ulong_long_io(geoms, &id, geompos_in); } - long long layer = xlayer >> 5; + long long layer = xlayer >> 6; int segment; deserialize_int_io(geoms, &segment, geompos_in);