From 8348ffcea9cea2498b3c2a2f715b0d5a7884f2bb Mon Sep 17 00:00:00 2001 From: Erica Fischer Date: Fri, 15 Dec 2023 13:10:41 -0800 Subject: [PATCH] Add an option to retain N times as many points as usual at each zoom --- main.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/main.cpp b/main.cpp index cb6060a9..d2133c1d 100644 --- a/main.cpp +++ b/main.cpp @@ -93,6 +93,7 @@ unsigned int drop_denser = 0; std::map set_attributes; unsigned long long preserve_point_density_threshold = 0; long long extend_zooms_max = 0; +double retain_points_multiplier = 1; std::vector order_by; bool order_reverse; @@ -1058,7 +1059,10 @@ void prep_drop_states(struct drop_state *ds, int maxzoom, int basezoom, double d ds[i].interval = 0; if (i < basezoom) { - ds[i].interval = std::exp(std::log(droprate) * (basezoom - i)); + ds[i].interval = std::exp(std::log(droprate) * (basezoom - i)) / retain_points_multiplier; + if (ds[i].interval < 1) { + ds[i].interval = 1; + } } ds[i].seq = 0; @@ -2705,7 +2709,10 @@ std::pair read_input(std::vector &sources, char *fname, i size_t i = 0; for (int z = 0; z <= basezoom; z++) { - double keep_fraction = 1.0 / std::exp(std::log(droprate) * (basezoom - z)); + double keep_fraction = 1.0 / std::exp(std::log(droprate) * (basezoom - z)) / retain_points_multiplier; + if (keep_fraction > 1) { + keep_fraction = 1; + } size_t keep_count = ddv.size() * keep_fraction; for (; i < keep_count && i < ddv.size(); i++) { @@ -3150,6 +3157,7 @@ int main(int argc, char **argv) { {"Dropping a fixed fraction of features by zoom level", 0, 0, 0}, {"drop-rate", required_argument, 0, 'r'}, + {"retain-points-multiplier", required_argument, 0, '~'}, {"base-zoom", required_argument, 0, 'B'}, {"drop-denser", required_argument, 0, '~'}, {"limit-base-zoom-to-maximum-zoom", no_argument, &prevent[P_BASEZOOM_ABOVE_MAXZOOM], 1}, @@ -3370,6 +3378,8 @@ int main(int argc, char **argv) { preserve_point_density_threshold = atoll_require(optarg, "Preserve point density threshold"); } else if (strcmp(opt, "extend-zooms-if-still-dropping-maximum") == 0) { extend_zooms_max = atoll_require(optarg, "Maximum number by which to extend zooms"); + } else if (strcmp(opt, "retain-points-multiplier") == 0) { + retain_points_multiplier = atof_require(optarg, "Multiply the fraction of points retained by zoom level"); } else { fprintf(stderr, "%s: Unrecognized option --%s\n", argv[0], opt); exit(EXIT_ARGS);