Track desired feature count and geometry size in strategies

This commit is contained in:
Erica Fischer
2022-10-20 12:09:04 -07:00
parent 71b9fd9226
commit becb04693d
9 changed files with 47 additions and 7 deletions
+12
View File
@@ -319,6 +319,18 @@ std::string stringify_strategies(std::vector<strategy> const &strategies) {
any = true;
}
if (strategies[i].feature_count > 0) {
state.json_write_string("feature_count_desired");
state.json_write_number(strategies[i].feature_count);
any = true;
}
if (strategies[i].geometry_size > 0) {
state.json_write_string("geometry_size_desired");
state.json_write_number(strategies[i].geometry_size);
any = true;
}
state.json_end_hash();
}
state.json_end_array();
@@ -8,7 +8,7 @@
"maxzoom": "0",
"minzoom": "0",
"name": "tests/loop/out/-z0_-O200_--cluster-densest-as-needed.json.check.mbtiles",
"strategies": "[ { \"coalesced_as_needed\": 999 } ]",
"strategies": "[ { \"coalesced_as_needed\": 999, \"feature_count_desired\": 1000 } ]",
"type": "overlay",
"version": "2"
}, "features": [
@@ -8,7 +8,7 @@
"maxzoom": "0",
"minzoom": "0",
"name": "tests/loop/out/-z0_-O200_--drop-densest-as-needed.json.check.mbtiles",
"strategies": "[ { \"dropped_as_needed\": 999 } ]",
"strategies": "[ { \"dropped_as_needed\": 999, \"feature_count_desired\": 1000 } ]",
"type": "overlay",
"version": "2"
}, "features": [
@@ -8,7 +8,7 @@
"maxzoom": "0",
"minzoom": "0",
"name": "tests/loop/out/-z0_-O200_--drop-fraction-as-needed.json.check.mbtiles",
"strategies": "[ { \"dropped_as_needed\": 811 } ]",
"strategies": "[ { \"dropped_as_needed\": 811, \"feature_count_desired\": 1000 } ]",
"type": "overlay",
"version": "2"
}, "features": [
@@ -8,7 +8,7 @@
"maxzoom": "13",
"minzoom": "11",
"name": "tests/muni/out/-Z11_-z13_-O100_--cluster-densest-as-needed.json.check.mbtiles",
"strategies": "[ { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { \"dropped_by_rate\": 4080, \"coalesced_as_needed\": 662 }, { \"dropped_by_rate\": 2973, \"coalesced_as_needed\": 1747 }, { \"coalesced_as_needed\": 4342 } ]",
"strategies": "[ { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, { \"dropped_by_rate\": 4080, \"coalesced_as_needed\": 662, \"feature_count_desired\": 687 }, { \"dropped_by_rate\": 2973, \"coalesced_as_needed\": 1747, \"feature_count_desired\": 755 }, { \"coalesced_as_needed\": 4342, \"feature_count_desired\": 856 } ]",
"type": "overlay",
"version": "2"
}, "features": [
@@ -8,7 +8,7 @@
"maxzoom": "2",
"minzoom": "0",
"name": "tests/ne_110m_admin_0_countries/out/-ae_-zg_--maximum-tile-geometry_5000_--drop-smallest-as-needed.json.check.mbtiles",
"strategies": "[ { \"dropped_as_needed\": 149 }, { \"dropped_as_needed\": 60, \"tiny_polygons\": 2 }, { \"tiny_polygons\": 3 } ]",
"strategies": "[ { \"dropped_as_needed\": 149, \"geometry_size_desired\": 9145 }, { \"dropped_as_needed\": 60, \"tiny_polygons\": 2, \"geometry_size_desired\": 5047 }, { \"tiny_polygons\": 3 } ]",
"type": "overlay",
"version": "2"
}, "features": [
+4
View File
@@ -619,6 +619,10 @@ void handle_strategies(const unsigned char *s, std::vector<strategy> *st) {
(*st)[i].tiny_polygons += v->value.number.number;
} else if (strcmp(k->value.string.string, "tile_size_desired") == 0) {
(*st)[i].tile_size += v->value.number.number;
} else if (strcmp(k->value.string.string, "feature_count_desired") == 0) {
(*st)[i].feature_count += v->value.number.number;
} else if (strcmp(k->value.string.string, "geometry_size_desired") == 0) {
(*st)[i].geometry_size += v->value.number.number;
}
}
}
+21 -1
View File
@@ -1295,6 +1295,8 @@ struct write_tile_args {
double fraction = 0;
double fraction_out = 0;
size_t tile_size_out = 0;
size_t feature_count_out = 0;
size_t geometry_size_out = 0;
const char *prefilter = NULL;
const char *postfilter = NULL;
std::map<std::string, attribute_op> const *attribute_accum = NULL;
@@ -2483,6 +2485,10 @@ long long write_tile(FILE *geoms, std::atomic<long long> *geompos_in, char *meta
if (totalsize > 0 && tile.layers.size() > 0) {
if (max_geometry_size > 0 && (size_t) total_geom_size > max_geometry_size) {
if ((size_t) total_geom_size > arg->geometry_size_out) {
arg->geometry_size_out = total_geom_size;
}
if (!quiet) {
fprintf(stderr, "tile %d/%u/%u has %lld vertices, >%zu \n", z, tx, ty, total_geom_size, max_geometry_size);
}
@@ -2569,6 +2575,10 @@ long long write_tile(FILE *geoms, std::atomic<long long> *geompos_in, char *meta
}
if (totalsize > max_tile_features && !prevent[P_FEATURE_LIMIT]) {
if (totalsize > arg->feature_count_out) {
arg->feature_count_out = totalsize;
}
if (!quiet) {
fprintf(stderr, "tile %d/%u/%u has %zu features, >%zu \n", z, tx, ty, totalsize, max_tile_features);
}
@@ -3043,6 +3053,8 @@ int traverse_zooms(int *geomfd, off_t *geom_size, char *metabase, char *stringpo
long long zoom_minextent = 0;
double zoom_fraction = 1;
size_t zoom_tile_size = 0;
size_t zoom_feature_count = 0;
size_t zoom_geometry_size = 0;
for (size_t pass = start; pass < 2; pass++) {
pthread_t pthreads[threads];
@@ -3072,6 +3084,8 @@ int traverse_zooms(int *geomfd, off_t *geom_size, char *metabase, char *stringpo
args[thread].fraction = zoom_fraction;
args[thread].fraction_out = zoom_fraction;
args[thread].tile_size_out = 0;
args[thread].feature_count_out = 0;
args[thread].geometry_size_out = 0;
args[thread].child_shards = TEMP_FILES / threads;
if (i == maxzoom && maxzoom_simplification > 0) {
@@ -3141,6 +3155,12 @@ int traverse_zooms(int *geomfd, off_t *geom_size, char *metabase, char *stringpo
if (args[thread].tile_size_out > zoom_tile_size) {
zoom_tile_size = args[thread].tile_size_out;
}
if (args[thread].feature_count_out > zoom_feature_count) {
zoom_feature_count = args[thread].feature_count_out;
}
if (args[thread].geometry_size_out > zoom_geometry_size) {
zoom_geometry_size = args[thread].geometry_size_out;
}
// Zoom counter might be lower than reality if zooms are being skipped
if (args[thread].wrote_zoom > i) {
@@ -3155,7 +3175,7 @@ int traverse_zooms(int *geomfd, off_t *geom_size, char *metabase, char *stringpo
if ((size_t) i >= strategies.size()) {
strategies.resize(i + 1);
}
struct strategy s(strategy, zoom_tile_size);
struct strategy s(strategy, zoom_tile_size, zoom_feature_count, zoom_geometry_size);
strategies[i] = s;
}
+5 -1
View File
@@ -44,15 +44,19 @@ struct strategy {
size_t coalesced_as_needed = 0;
size_t detail_reduced = 0;
size_t tile_size = 0;
size_t feature_count = 0;
size_t geometry_size = 0;
size_t tiny_polygons = 0;
strategy(const atomic_strategy &s, size_t ts) {
strategy(const atomic_strategy &s, size_t ts, size_t fc, size_t gs) {
dropped_by_rate = s.dropped_by_rate;
dropped_by_gamma = s.dropped_by_gamma;
dropped_as_needed = s.dropped_as_needed;
coalesced_as_needed = s.coalesced_as_needed;
detail_reduced = s.detail_reduced;
tile_size = ts;
feature_count = fc;
geometry_size = gs;
tiny_polygons = s.tiny_polygons;
}