Add an option to retain N times as many points as usual at each zoom

This commit is contained in:
Erica Fischer
2023-12-15 13:10:41 -08:00
parent 15a3e313ff
commit 8348ffcea9
+12 -2
View File
@@ -93,6 +93,7 @@ unsigned int drop_denser = 0;
std::map<std::string, serial_val> set_attributes; std::map<std::string, serial_val> set_attributes;
unsigned long long preserve_point_density_threshold = 0; unsigned long long preserve_point_density_threshold = 0;
long long extend_zooms_max = 0; long long extend_zooms_max = 0;
double retain_points_multiplier = 1;
std::vector<order_field> order_by; std::vector<order_field> order_by;
bool order_reverse; 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; ds[i].interval = 0;
if (i < basezoom) { 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; ds[i].seq = 0;
@@ -2705,7 +2709,10 @@ std::pair<int, metadata> read_input(std::vector<source> &sources, char *fname, i
size_t i = 0; size_t i = 0;
for (int z = 0; z <= basezoom; z++) { 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; size_t keep_count = ddv.size() * keep_fraction;
for (; i < keep_count && i < ddv.size(); i++) { 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}, {"Dropping a fixed fraction of features by zoom level", 0, 0, 0},
{"drop-rate", required_argument, 0, 'r'}, {"drop-rate", required_argument, 0, 'r'},
{"retain-points-multiplier", required_argument, 0, '~'},
{"base-zoom", required_argument, 0, 'B'}, {"base-zoom", required_argument, 0, 'B'},
{"drop-denser", required_argument, 0, '~'}, {"drop-denser", required_argument, 0, '~'},
{"limit-base-zoom-to-maximum-zoom", no_argument, &prevent[P_BASEZOOM_ABOVE_MAXZOOM], 1}, {"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"); preserve_point_density_threshold = atoll_require(optarg, "Preserve point density threshold");
} else if (strcmp(opt, "extend-zooms-if-still-dropping-maximum") == 0) { } else if (strcmp(opt, "extend-zooms-if-still-dropping-maximum") == 0) {
extend_zooms_max = atoll_require(optarg, "Maximum number by which to extend zooms"); 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 { } else {
fprintf(stderr, "%s: Unrecognized option --%s\n", argv[0], opt); fprintf(stderr, "%s: Unrecognized option --%s\n", argv[0], opt);
exit(EXIT_ARGS); exit(EXIT_ARGS);