mirror of
https://github.com/felt/tippecanoe.git
synced 2026-10-05 09:55:41 +02:00
Add an option to retain N times as many points as usual at each zoom
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user