mirror of
https://github.com/felt/tippecanoe.git
synced 2026-10-02 08:25:40 +02:00
* Add an option to retain N times as many points as usual at each zoom * Tests for point multipler with specified and guessed maxzooms * Work in progress on inverse spatial ordering * Fix inverse spatial feature order * --reorder was depending on a feature index that wasn't being preserved * Separate ordering by feature_minzoom from ordering inverse-spatially * Add a test for the inverse spatial ordering * Store the basezoom/droprate/multiplier decisions in tileset metadata * Progress on adding filters to tippecanoe-overzoom * Type promotion for comparison * Look up the attribute value for ordering * Add test of thinning and ordering features * Plumb tippecanoe_decisions metadata through pmtiles * Be careful not to put infinities in JSON * Fix accidental dropping in what is meant to preserve sparse points * Start distinguishing true, false, and null in expressions * Most of the type conversions * Add boolean conversions * Literals and conjunctions * Add filtering to tippecanoe-overzoom * Add a test of filtering in overzoom * Fix boolean conjunctions * Handle the combination of cluster size and filtering * Rework dot dropping to reconcile density threshold and multiplier * Revert "Rework dot dropping to reconcile density threshold and multiplier" This reverts commitf253a66382. * Retain points by multiplier within each tile, not in global probability * Test that intends to verify that the multiplier is reversible * Get the test to detect the discrepancy * Mark the start of multiplier clusters with a magic attribute * Add string-contains * Add in and ni operators * Revert "Look up the attribute value for ordering" This reverts commit56bc73e49a. * Revert "Type promotion for comparison" This reverts commit6f3256f5af. * Make number formatting in tippecanoe_decisions consistent * Revert "Add a test for the inverse spatial ordering" This reverts commitc8047de9ab. * Revert "Separate ordering by feature_minzoom from ordering inverse-spatially" This reverts commit35b19a223c. * Revert "Fix inverse spatial feature order" This reverts commit5978ecdb44. * Revert "Work in progress on inverse spatial ordering" This reverts commitfdf230f632. * Somehow missed the tests associated with that last revert * Round-robin assign attributes to partials from across the multiplier * Count the multiplier separately in each layer * Fix distribution of accumulated attribute across multiplier features * Update changelog, version, and docs * Add "is null" and "isnt null" expressions * Update interpretation of FSL expressions to pass the tests * Test to assert that polygons are unaffected by the multiplier * Clean up and comment * Remove accidental unused case
117 lines
2.2 KiB
C++
117 lines
2.2 KiB
C++
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <getopt.h>
|
|
#include <string>
|
|
#include <set>
|
|
#include "errors.hpp"
|
|
#include "mvt.hpp"
|
|
#include "geometry.hpp"
|
|
#include "evaluator.hpp"
|
|
|
|
extern char *optarg;
|
|
extern int optind;
|
|
|
|
int detail = 12; // tippecanoe-style: mvt extent == 1 << detail
|
|
int buffer = 5; // tippecanoe-style: mvt buffer == extent * buffer / 256;
|
|
bool demultiply = false;
|
|
std::string filter;
|
|
|
|
std::set<std::string> keep;
|
|
|
|
void usage(char **argv) {
|
|
fprintf(stderr, "Usage: %s -o newtile.pbf.gz tile.pbf.gz oz/ox/oy nz/nx/ny\n", argv[0]);
|
|
fprintf(stderr, "to create tile nz/nx/ny from tile oz/ox/oy\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
int i;
|
|
const char *outfile = NULL;
|
|
|
|
while ((i = getopt(argc, argv, "y:d:b:o:mj:")) != -1) {
|
|
switch (i) {
|
|
case 'y':
|
|
keep.insert(optarg);
|
|
break;
|
|
|
|
case 'o':
|
|
outfile = optarg;
|
|
break;
|
|
|
|
case 'd':
|
|
detail = atoi(optarg);
|
|
break;
|
|
|
|
case 'b':
|
|
buffer = atoi(optarg);
|
|
break;
|
|
|
|
case 'm':
|
|
demultiply = true;
|
|
break;
|
|
|
|
case 'j':
|
|
filter = optarg;
|
|
break;
|
|
|
|
default:
|
|
fprintf(stderr, "Unrecognized flag -%c\n", i);
|
|
usage(argv);
|
|
}
|
|
}
|
|
|
|
if (argc - optind != 3) {
|
|
usage(argv);
|
|
}
|
|
|
|
if (outfile == NULL) {
|
|
usage(argv);
|
|
}
|
|
|
|
const char *infile = argv[optind + 0];
|
|
|
|
int oz, ox, oy;
|
|
if (sscanf(argv[optind + 1], "%d/%d/%d", &oz, &ox, &oy) != 3) {
|
|
fprintf(stderr, "%s: not in z/x/y form\n", argv[optind + 1]);
|
|
usage(argv);
|
|
}
|
|
|
|
int nz, nx, ny;
|
|
if (sscanf(argv[optind + 2], "%d/%d/%d", &nz, &nx, &ny) != 3) {
|
|
fprintf(stderr, "%s: not in z/x/y form\n", argv[optind + 2]);
|
|
usage(argv);
|
|
}
|
|
|
|
std::string tile;
|
|
char buf[1000];
|
|
int len;
|
|
|
|
FILE *f = fopen(infile, "rb");
|
|
if (f == NULL) {
|
|
perror(infile);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
while ((len = fread(buf, sizeof(char), 1000, f)) > 0) {
|
|
tile.append(std::string(buf, len));
|
|
}
|
|
fclose(f);
|
|
|
|
f = fopen(outfile, "wb");
|
|
if (f == NULL) {
|
|
perror(outfile);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
json_object *json_filter = NULL;
|
|
if (filter.size() > 0) {
|
|
json_filter = parse_filter(filter.c_str());
|
|
}
|
|
|
|
std::string out = overzoom(tile, oz, ox, oy, nz, nx, ny, detail, buffer, keep, true, NULL, demultiply, json_filter);
|
|
fwrite(out.c_str(), sizeof(char), out.size(), f);
|
|
fclose(f);
|
|
|
|
return 0;
|
|
}
|