diff --git a/tile.cpp b/tile.cpp index dfacc465..fd6fbeeb 100644 --- a/tile.cpp +++ b/tile.cpp @@ -83,20 +83,11 @@ static int metacmp(const std::vector &keys1, const std::vector keys = std::vector(); - std::vector values = std::vector(); - std::vector full_keys = std::vector(); - std::vector full_values = std::vector(); - drawvec geom = drawvec(); - unsigned long long index = 0; - long long original_seq = 0; - int type = 0; bool coalesced = false; double spacing = 0; - bool has_id = false; - unsigned long long id = 0; - long long extent = 0; bool operator<(const coalesce &o) const { int cmp = coalindexcmp(this, &o); @@ -110,7 +101,7 @@ struct coalesce { struct preservecmp { bool operator()(const struct coalesce &a, const struct coalesce &b) { - return a.original_seq < b.original_seq; + return a.sf.seq < b.sf.seq; } } preservecmp; @@ -118,51 +109,51 @@ int coalcmp(const void *v1, const void *v2) { const struct coalesce *c1 = (const struct coalesce *) v1; const struct coalesce *c2 = (const struct coalesce *) v2; - int cmp = c1->type - c2->type; + int cmp = c1->sf.t - c2->sf.t; if (cmp != 0) { return cmp; } - if (c1->has_id != c2->has_id) { - return (int) c1->has_id - (int) c2->has_id; + if (c1->sf.has_id != c2->sf.has_id) { + return (int) c1->sf.has_id - (int) c2->sf.has_id; } - if (c1->has_id && c2->has_id) { - if (c1->id < c2->id) { + if (c1->sf.has_id && c2->sf.has_id) { + if (c1->sf.id < c2->sf.id) { return -1; } - if (c1->id > c2->id) { + if (c1->sf.id > c2->sf.id) { return 1; } } - cmp = metacmp(c1->keys, c1->values, c1->stringpool, c2->keys, c2->values, c2->stringpool); + cmp = metacmp(c1->sf.keys, c1->sf.values, c1->stringpool, c2->sf.keys, c2->sf.values, c2->stringpool); if (cmp != 0) { return cmp; } - if (c1->full_keys.size() < c2->full_keys.size()) { + if (c1->sf.full_keys.size() < c2->sf.full_keys.size()) { return -1; - } else if (c1->full_keys.size() > c2->full_keys.size()) { + } else if (c1->sf.full_keys.size() > c2->sf.full_keys.size()) { return 1; } - for (size_t i = 0; i < c1->full_keys.size(); i++) { - if (c1->full_keys[i] < c2->full_keys[i]) { + for (size_t i = 0; i < c1->sf.full_keys.size(); i++) { + if (c1->sf.full_keys[i] < c2->sf.full_keys[i]) { return -1; - } else if (c1->full_keys[i] > c2->full_keys[i]) { + } else if (c1->sf.full_keys[i] > c2->sf.full_keys[i]) { return 1; } - if (c1->full_values[i].type < c2->full_values[i].type) { + if (c1->sf.full_values[i].type < c2->sf.full_values[i].type) { return -1; - } else if (c1->full_values[i].type > c2->full_values[i].type) { + } else if (c1->sf.full_values[i].type > c2->sf.full_values[i].type) { return 1; } - if (c1->full_values[i].s < c2->full_values[i].s) { + if (c1->sf.full_values[i].s < c2->sf.full_values[i].s) { return -1; - } else if (c1->full_values[i].s > c2->full_values[i].s) { + } else if (c1->sf.full_values[i].s > c2->sf.full_values[i].s) { return 1; } } @@ -174,15 +165,15 @@ int coalindexcmp(const struct coalesce *c1, const struct coalesce *c2) { int cmp = coalcmp((const void *) c1, (const void *) c2); if (cmp == 0) { - if (c1->index < c2->index) { + if (c1->sf.index < c2->sf.index) { return -1; - } else if (c1->index > c2->index) { + } else if (c1->sf.index > c2->sf.index) { return 1; } - if (c1->geom < c2->geom) { + if (c1->sf.geometry < c2->sf.geometry) { return -1; - } else if (c1->geom > c2->geom) { + } else if (c1->sf.geometry > c2->sf.geometry) { return 1; } } @@ -258,7 +249,7 @@ static mvt_value find_attribute_value(const struct coalesce *c1, std::string key if (key == ORDER_BY_SIZE) { mvt_value v; v.type = mvt_double; - v.numeric_value.double_value = c1->extent; + v.numeric_value.double_value = c1->sf.extent; return v; } if (key == ORDER_BY_INTERESTINGNESS) { @@ -268,8 +259,8 @@ static mvt_value find_attribute_value(const struct coalesce *c1, std::string key return v; } - const std::vector &keys1 = c1->keys; - const std::vector &values1 = c1->values; + const std::vector &keys1 = c1->sf.keys; + const std::vector &values1 = c1->sf.values; const char *stringpool1 = c1->stringpool; for (size_t i = 0; i < keys1.size(); i++) { @@ -279,9 +270,9 @@ static mvt_value find_attribute_value(const struct coalesce *c1, std::string key } } - for (size_t i = 0; i < c1->full_keys.size(); i++) { - if (c1->full_keys[i] == key) { - return stringified_to_mvt_value(c1->full_values[i].type, c1->full_values[i].s.c_str()); + for (size_t i = 0; i < c1->sf.full_keys.size(); i++) { + if (c1->sf.full_keys[i] == key) { + return stringified_to_mvt_value(c1->sf.full_values[i].type, c1->sf.full_values[i].s.c_str()); } } @@ -331,14 +322,14 @@ struct ordercmp { } if (prevent[P_INPUT_ORDER]) { - if (a.original_seq < b.original_seq) { + if (a.sf.seq < b.sf.seq) { return true; - } else if (a.original_seq > b.original_seq) { + } else if (a.sf.seq > b.sf.seq) { return false; } // else they are equal, so continue to the index } - if (a.index < b.index) { + if (a.sf.index < b.sf.index) { return true; } @@ -2479,25 +2470,24 @@ long long write_tile(FILE *geoms, std::atomic *geompos_in, char *meta for (size_t i = 0; i < partials.size(); i++) { signed char t = partials[i].sf.t; - long long original_seq = partials[i].sf.seq; if (t == VT_POINT || draws_something(partials[i].sf.geometry)) { struct coalesce c; - c.type = t; - c.index = partials[i].sf.index; - c.geom = partials[i].sf.geometry; + c.sf.t = t; + c.sf.index = partials[i].sf.index; + c.sf.geometry = partials[i].sf.geometry; c.coalesced = false; - c.original_seq = partials[i].sf.seq; + c.sf.seq = partials[i].sf.seq; c.stringpool = stringpool + pool_off[partials[i].sf.segment]; - c.keys = partials[i].sf.keys; - c.values = partials[i].sf.values; - c.full_keys = partials[i].sf.full_keys; - c.full_values = partials[i].sf.full_values; + c.sf.keys = partials[i].sf.keys; + c.sf.values = partials[i].sf.values; + c.sf.full_keys = partials[i].sf.full_keys; + c.sf.full_values = partials[i].sf.full_values; c.spacing = partials[i].spacing; - c.id = partials[i].sf.id; - c.has_id = partials[i].sf.has_id; - c.extent = partials[i].sf.extent; + c.sf.id = partials[i].sf.id; + c.sf.has_id = partials[i].sf.has_id; + c.sf.extent = partials[i].sf.extent; // printf("segment %d layer %lld is %s\n", partials[i].segment, partials[i].layer, (*layer_unmaps)[partials[i].segment][partials[i].layer].c_str()); @@ -2548,8 +2538,8 @@ long long write_tile(FILE *geoms, std::atomic *geompos_in, char *meta #endif if (additional[A_COALESCE] && out.size() > 0 && coalcmp(&layer_features[x], &out[y]) == 0) { - for (size_t g = 0; g < layer_features[x].geom.size(); g++) { - out[y].geom.push_back(layer_features[x].geom[g]); + for (size_t g = 0; g < layer_features[x].sf.geometry.size(); g++) { + out[y].sf.geometry.push_back(layer_features[x].sf.geometry[g]); } out[y].coalesced = true; } else { @@ -2561,21 +2551,21 @@ long long write_tile(FILE *geoms, std::atomic *geompos_in, char *meta out.clear(); for (size_t x = 0; x < layer_features.size(); x++) { - if (layer_features[x].coalesced && layer_features[x].type == VT_LINE) { - layer_features[x].geom = remove_noop(layer_features[x].geom, layer_features[x].type, 0); - layer_features[x].geom = simplify_lines(layer_features[x].geom, 32, 0, - !(prevent[P_CLIPPING] || prevent[P_DUPLICATION]), simplification, layer_features[x].type == VT_POLYGON ? 4 : 0, shared_nodes); + if (layer_features[x].coalesced && layer_features[x].sf.t == VT_LINE) { + layer_features[x].sf.geometry = remove_noop(layer_features[x].sf.geometry, layer_features[x].sf.t, 0); + layer_features[x].sf.geometry = simplify_lines(layer_features[x].sf.geometry , 32, 0, + !(prevent[P_CLIPPING] || prevent[P_DUPLICATION]), simplification, layer_features[x].sf.t == VT_POLYGON ? 4 : 0, shared_nodes); } - if (layer_features[x].type == VT_POLYGON) { + if (layer_features[x].sf.t == VT_POLYGON) { if (layer_features[x].coalesced) { - layer_features[x].geom = clean_or_clip_poly(layer_features[x].geom, 0, 0, false); + layer_features[x].sf.geometry = clean_or_clip_poly(layer_features[x].sf.geometry, 0, 0, false); } - layer_features[x].geom = close_poly(layer_features[x].geom); + layer_features[x].sf.geometry = close_poly(layer_features[x].sf.geometry); } - if (layer_features[x].geom.size() > 0) { + if (layer_features[x].sf.geometry.size() > 0) { out.push_back(layer_features[x]); } } @@ -2613,27 +2603,27 @@ long long write_tile(FILE *geoms, std::atomic *geompos_in, char *meta for (size_t x = 0; x < layer_features.size(); x++) { mvt_feature feature; - if (layer_features[x].type == VT_LINE || layer_features[x].type == VT_POLYGON) { - layer_features[x].geom = remove_noop(layer_features[x].geom, layer_features[x].type, 0); + if (layer_features[x].sf.t == VT_LINE || layer_features[x].sf.t == VT_POLYGON) { + layer_features[x].sf.geometry = remove_noop(layer_features[x].sf.geometry, layer_features[x].sf.t, 0); } - if (layer_features[x].geom.size() == 0) { + if (layer_features[x].sf.geometry.size() == 0) { continue; } - feature.type = layer_features[x].type; - feature.geometry = to_feature(layer_features[x].geom); - count += layer_features[x].geom.size(); - layer_features[x].geom.clear(); + feature.type = layer_features[x].sf.t; + feature.geometry = to_feature(layer_features[x].sf.geometry); + count += layer_features[x].sf.geometry.size(); + layer_features[x].sf.geometry.clear(); - feature.id = layer_features[x].id; - feature.has_id = layer_features[x].has_id; + feature.id = layer_features[x].sf.id; + feature.has_id = layer_features[x].sf.has_id; - decode_meta(layer_features[x].keys, layer_features[x].values, layer_features[x].stringpool, layer, feature); - for (size_t a = 0; a < layer_features[x].full_keys.size(); a++) { - serial_val sv = layer_features[x].full_values[a]; + decode_meta(layer_features[x].sf.keys, layer_features[x].sf.values, layer_features[x].stringpool, layer, feature); + for (size_t a = 0; a < layer_features[x].sf.full_keys.size(); a++) { + serial_val sv = layer_features[x].sf.full_values[a]; mvt_value v = stringified_to_mvt_value(sv.type, sv.s.c_str()); - layer.tag(feature, layer_features[x].full_keys[a], v); + layer.tag(feature, layer_features[x].sf.full_keys[a], v); } if (additional[A_CALCULATE_FEATURE_DENSITY]) {