From becb04693d18358bc20d192f7dd3aba6670c1ece Mon Sep 17 00:00:00 2001 From: Erica Fischer Date: Thu, 20 Oct 2022 12:09:04 -0700 Subject: [PATCH] Track desired feature count and geometry size in strategies --- mbtiles.cpp | 12 ++++++++++ ...-z0_-O200_--cluster-densest-as-needed.json | 2 +- .../-z0_-O200_--drop-densest-as-needed.json | 2 +- .../-z0_-O200_--drop-fraction-as-needed.json | 2 +- ...z13_-O100_--cluster-densest-as-needed.json | 2 +- ...ometry_5000_--drop-smallest-as-needed.json | 2 +- tile-join.cpp | 4 ++++ tile.cpp | 22 ++++++++++++++++++- tile.hpp | 6 ++++- 9 files changed, 47 insertions(+), 7 deletions(-) diff --git a/mbtiles.cpp b/mbtiles.cpp index e437ff06..9005c6e0 100644 --- a/mbtiles.cpp +++ b/mbtiles.cpp @@ -319,6 +319,18 @@ std::string stringify_strategies(std::vector 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(); diff --git a/tests/loop/out/-z0_-O200_--cluster-densest-as-needed.json b/tests/loop/out/-z0_-O200_--cluster-densest-as-needed.json index 42199d0c..26c24397 100644 --- a/tests/loop/out/-z0_-O200_--cluster-densest-as-needed.json +++ b/tests/loop/out/-z0_-O200_--cluster-densest-as-needed.json @@ -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": [ diff --git a/tests/loop/out/-z0_-O200_--drop-densest-as-needed.json b/tests/loop/out/-z0_-O200_--drop-densest-as-needed.json index e053786e..e73a5d14 100644 --- a/tests/loop/out/-z0_-O200_--drop-densest-as-needed.json +++ b/tests/loop/out/-z0_-O200_--drop-densest-as-needed.json @@ -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": [ diff --git a/tests/loop/out/-z0_-O200_--drop-fraction-as-needed.json b/tests/loop/out/-z0_-O200_--drop-fraction-as-needed.json index 1eaeffc9..9770e408 100644 --- a/tests/loop/out/-z0_-O200_--drop-fraction-as-needed.json +++ b/tests/loop/out/-z0_-O200_--drop-fraction-as-needed.json @@ -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": [ diff --git a/tests/muni/out/-Z11_-z13_-O100_--cluster-densest-as-needed.json b/tests/muni/out/-Z11_-z13_-O100_--cluster-densest-as-needed.json index 0349cce6..82d67014 100644 --- a/tests/muni/out/-Z11_-z13_-O100_--cluster-densest-as-needed.json +++ b/tests/muni/out/-Z11_-z13_-O100_--cluster-densest-as-needed.json @@ -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": [ diff --git a/tests/ne_110m_admin_0_countries/out/-ae_-zg_--maximum-tile-geometry_5000_--drop-smallest-as-needed.json b/tests/ne_110m_admin_0_countries/out/-ae_-zg_--maximum-tile-geometry_5000_--drop-smallest-as-needed.json index 637cdc82..bff86677 100644 --- a/tests/ne_110m_admin_0_countries/out/-ae_-zg_--maximum-tile-geometry_5000_--drop-smallest-as-needed.json +++ b/tests/ne_110m_admin_0_countries/out/-ae_-zg_--maximum-tile-geometry_5000_--drop-smallest-as-needed.json @@ -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": [ diff --git a/tile-join.cpp b/tile-join.cpp index a9aedcff..f41ce31e 100644 --- a/tile-join.cpp +++ b/tile-join.cpp @@ -619,6 +619,10 @@ void handle_strategies(const unsigned char *s, std::vector *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; } } } diff --git a/tile.cpp b/tile.cpp index a85b78a5..631d87b7 100644 --- a/tile.cpp +++ b/tile.cpp @@ -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 const *attribute_accum = NULL; @@ -2483,6 +2485,10 @@ long long write_tile(FILE *geoms, std::atomic *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 *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; } diff --git a/tile.hpp b/tile.hpp index 73dd0d3c..2663658a 100644 --- a/tile.hpp +++ b/tile.hpp @@ -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; }