Make struct coalesce a serial_feature wrapper rather than its own thing

This commit is contained in:
Erica Fischer
2023-02-08 16:02:26 -08:00
parent 4cd40c72ea
commit fba86ebe24
+66 -76
View File
@@ -83,20 +83,11 @@ static int metacmp(const std::vector<long long> &keys1, const std::vector<long l
int coalindexcmp(const struct coalesce *c1, const struct coalesce *c2); int coalindexcmp(const struct coalesce *c1, const struct coalesce *c2);
struct coalesce { struct coalesce {
serial_feature sf;
char *stringpool = NULL; char *stringpool = NULL;
std::vector<long long> keys = std::vector<long long>();
std::vector<long long> values = std::vector<long long>();
std::vector<std::string> full_keys = std::vector<std::string>();
std::vector<serial_val> full_values = std::vector<serial_val>();
drawvec geom = drawvec();
unsigned long long index = 0;
long long original_seq = 0;
int type = 0;
bool coalesced = false; bool coalesced = false;
double spacing = 0; double spacing = 0;
bool has_id = false;
unsigned long long id = 0;
long long extent = 0;
bool operator<(const coalesce &o) const { bool operator<(const coalesce &o) const {
int cmp = coalindexcmp(this, &o); int cmp = coalindexcmp(this, &o);
@@ -110,7 +101,7 @@ struct coalesce {
struct preservecmp { struct preservecmp {
bool operator()(const struct coalesce &a, const struct coalesce &b) { 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; } preservecmp;
@@ -118,51 +109,51 @@ int coalcmp(const void *v1, const void *v2) {
const struct coalesce *c1 = (const struct coalesce *) v1; const struct coalesce *c1 = (const struct coalesce *) v1;
const struct coalesce *c2 = (const struct coalesce *) v2; 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) { if (cmp != 0) {
return cmp; return cmp;
} }
if (c1->has_id != c2->has_id) { if (c1->sf.has_id != c2->sf.has_id) {
return (int) c1->has_id - (int) c2->has_id; return (int) c1->sf.has_id - (int) c2->sf.has_id;
} }
if (c1->has_id && c2->has_id) { if (c1->sf.has_id && c2->sf.has_id) {
if (c1->id < c2->id) { if (c1->sf.id < c2->sf.id) {
return -1; return -1;
} }
if (c1->id > c2->id) { if (c1->sf.id > c2->sf.id) {
return 1; 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) { if (cmp != 0) {
return cmp; return cmp;
} }
if (c1->full_keys.size() < c2->full_keys.size()) { if (c1->sf.full_keys.size() < c2->sf.full_keys.size()) {
return -1; 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; return 1;
} }
for (size_t i = 0; i < c1->full_keys.size(); i++) { for (size_t i = 0; i < c1->sf.full_keys.size(); i++) {
if (c1->full_keys[i] < c2->full_keys[i]) { if (c1->sf.full_keys[i] < c2->sf.full_keys[i]) {
return -1; 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; 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; 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; 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; 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; 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); int cmp = coalcmp((const void *) c1, (const void *) c2);
if (cmp == 0) { if (cmp == 0) {
if (c1->index < c2->index) { if (c1->sf.index < c2->sf.index) {
return -1; return -1;
} else if (c1->index > c2->index) { } else if (c1->sf.index > c2->sf.index) {
return 1; return 1;
} }
if (c1->geom < c2->geom) { if (c1->sf.geometry < c2->sf.geometry) {
return -1; return -1;
} else if (c1->geom > c2->geom) { } else if (c1->sf.geometry > c2->sf.geometry) {
return 1; return 1;
} }
} }
@@ -258,7 +249,7 @@ static mvt_value find_attribute_value(const struct coalesce *c1, std::string key
if (key == ORDER_BY_SIZE) { if (key == ORDER_BY_SIZE) {
mvt_value v; mvt_value v;
v.type = mvt_double; v.type = mvt_double;
v.numeric_value.double_value = c1->extent; v.numeric_value.double_value = c1->sf.extent;
return v; return v;
} }
if (key == ORDER_BY_INTERESTINGNESS) { if (key == ORDER_BY_INTERESTINGNESS) {
@@ -268,8 +259,8 @@ static mvt_value find_attribute_value(const struct coalesce *c1, std::string key
return v; return v;
} }
const std::vector<long long> &keys1 = c1->keys; const std::vector<long long> &keys1 = c1->sf.keys;
const std::vector<long long> &values1 = c1->values; const std::vector<long long> &values1 = c1->sf.values;
const char *stringpool1 = c1->stringpool; const char *stringpool1 = c1->stringpool;
for (size_t i = 0; i < keys1.size(); i++) { 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++) { for (size_t i = 0; i < c1->sf.full_keys.size(); i++) {
if (c1->full_keys[i] == key) { if (c1->sf.full_keys[i] == key) {
return stringified_to_mvt_value(c1->full_values[i].type, c1->full_values[i].s.c_str()); 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 (prevent[P_INPUT_ORDER]) {
if (a.original_seq < b.original_seq) { if (a.sf.seq < b.sf.seq) {
return true; return true;
} else if (a.original_seq > b.original_seq) { } else if (a.sf.seq > b.sf.seq) {
return false; return false;
} // else they are equal, so continue to the index } // else they are equal, so continue to the index
} }
if (a.index < b.index) { if (a.sf.index < b.sf.index) {
return true; return true;
} }
@@ -2479,25 +2470,24 @@ long long write_tile(FILE *geoms, std::atomic<long long> *geompos_in, char *meta
for (size_t i = 0; i < partials.size(); i++) { for (size_t i = 0; i < partials.size(); i++) {
signed char t = partials[i].sf.t; 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)) { if (t == VT_POINT || draws_something(partials[i].sf.geometry)) {
struct coalesce c; struct coalesce c;
c.type = t; c.sf.t = t;
c.index = partials[i].sf.index; c.sf.index = partials[i].sf.index;
c.geom = partials[i].sf.geometry; c.sf.geometry = partials[i].sf.geometry;
c.coalesced = false; 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.stringpool = stringpool + pool_off[partials[i].sf.segment];
c.keys = partials[i].sf.keys; c.sf.keys = partials[i].sf.keys;
c.values = partials[i].sf.values; c.sf.values = partials[i].sf.values;
c.full_keys = partials[i].sf.full_keys; c.sf.full_keys = partials[i].sf.full_keys;
c.full_values = partials[i].sf.full_values; c.sf.full_values = partials[i].sf.full_values;
c.spacing = partials[i].spacing; c.spacing = partials[i].spacing;
c.id = partials[i].sf.id; c.sf.id = partials[i].sf.id;
c.has_id = partials[i].sf.has_id; c.sf.has_id = partials[i].sf.has_id;
c.extent = partials[i].sf.extent; 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()); // 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<long long> *geompos_in, char *meta
#endif #endif
if (additional[A_COALESCE] && out.size() > 0 && coalcmp(&layer_features[x], &out[y]) == 0) { 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++) { for (size_t g = 0; g < layer_features[x].sf.geometry.size(); g++) {
out[y].geom.push_back(layer_features[x].geom[g]); out[y].sf.geometry.push_back(layer_features[x].sf.geometry[g]);
} }
out[y].coalesced = true; out[y].coalesced = true;
} else { } else {
@@ -2561,21 +2551,21 @@ long long write_tile(FILE *geoms, std::atomic<long long> *geompos_in, char *meta
out.clear(); out.clear();
for (size_t x = 0; x < layer_features.size(); x++) { for (size_t x = 0; x < layer_features.size(); x++) {
if (layer_features[x].coalesced && layer_features[x].type == VT_LINE) { if (layer_features[x].coalesced && layer_features[x].sf.t == VT_LINE) {
layer_features[x].geom = remove_noop(layer_features[x].geom, layer_features[x].type, 0); layer_features[x].sf.geometry = remove_noop(layer_features[x].sf.geometry, layer_features[x].sf.t, 0);
layer_features[x].geom = simplify_lines(layer_features[x].geom, 32, 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].type == VT_POLYGON ? 4 : 0, shared_nodes); !(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) { 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]); out.push_back(layer_features[x]);
} }
} }
@@ -2613,27 +2603,27 @@ long long write_tile(FILE *geoms, std::atomic<long long> *geompos_in, char *meta
for (size_t x = 0; x < layer_features.size(); x++) { for (size_t x = 0; x < layer_features.size(); x++) {
mvt_feature feature; mvt_feature feature;
if (layer_features[x].type == VT_LINE || layer_features[x].type == VT_POLYGON) { if (layer_features[x].sf.t == VT_LINE || layer_features[x].sf.t == VT_POLYGON) {
layer_features[x].geom = remove_noop(layer_features[x].geom, layer_features[x].type, 0); 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; continue;
} }
feature.type = layer_features[x].type; feature.type = layer_features[x].sf.t;
feature.geometry = to_feature(layer_features[x].geom); feature.geometry = to_feature(layer_features[x].sf.geometry);
count += layer_features[x].geom.size(); count += layer_features[x].sf.geometry.size();
layer_features[x].geom.clear(); layer_features[x].sf.geometry.clear();
feature.id = layer_features[x].id; feature.id = layer_features[x].sf.id;
feature.has_id = layer_features[x].has_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); 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].full_keys.size(); a++) { for (size_t a = 0; a < layer_features[x].sf.full_keys.size(); a++) {
serial_val sv = layer_features[x].full_values[a]; serial_val sv = layer_features[x].sf.full_values[a];
mvt_value v = stringified_to_mvt_value(sv.type, sv.s.c_str()); 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]) { if (additional[A_CALCULATE_FEATURE_DENSITY]) {