From 6387a92b2ec4a1d0e709f856abf14bee727ab5ea Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 5 Aug 2026 16:25:55 +0000 Subject: [PATCH 1/2] Distinguish duplicate feature locations during the index sort Tippecanoe's behavior with as-needed dropping or coalescing has been to treat features that share a representative point with some other feature as having infinite density, therefore being the first to be dropped or coalesced when the tile size needs to be reduced. That interacts badly with datasets that intentionally repeat geometries with different sets of attributes, expecting the client to filter for one set or another, since only the first instance of each location survives. The new --distinguish-duplicates option defers the features that share a location to later passes through the feature sequence: all the distinct locations are written first, then the first duplicate of each location, then the second, and so on, so that each duplicate is dropped or coalesced within its own pass instead of into its twin. The deferral happens where the features are already being put into index order, in radix1()/merge(), rather than in tile.cpp: the duplicates are set aside in a temporary file per pass and appended to the sorted geometry once the rest of it has been written. The index stays in index order, with the records for the deferred features corrected once their geometry has been placed, so the maxzoom, base zoom, and drop rate guessing that reads the index afterward is unaffected. Up to 50 duplicates of each location are distinguished. Beyond that, they are all deferred to one final pass, where some of them will still have to be dropped or coalesced in some sequence, since otherwise a location with a huge number of duplicates would need an unbounded number of passes. Folding the two feature-writing paths in radix1() into one write_feature() also fixes a latent bug in the path taken for a single oversized feature or maximum radix recursion depth, which wrote the feature's whole serialized length and then appended another minzoom byte, corrupting the geometry stream. Before this, --prefer-radix-sort failed with "wrong length decoding feature" on several of the existing test inputs. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_011wLk2itWETPBAS9a9yE8zu --- CHANGELOG.md | 4 + README.md | 1 + main.cpp | 239 +++++- man/tippecanoe.1 | 2 + options.hpp | 1 + serial.cpp | 1 + tests/distinguish-duplicates/in.json | 183 +++++ .../-z1_-r1_-b0_--distinguish-duplicates.json | 755 ++++++++++++++++++ version.hpp | 2 +- 9 files changed, 1161 insertions(+), 27 deletions(-) create mode 100644 tests/distinguish-duplicates/in.json create mode 100644 tests/distinguish-duplicates/out/-z1_-r1_-b0_--distinguish-duplicates.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 108e73030..6d54c32c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 2.81.0 + +* Add --distinguish-duplicates option + # 2.80.0 * Remove undocumented command-line options diff --git a/README.md b/README.md index 5c6ffec56..0eaf8663a 100644 --- a/README.md +++ b/README.md @@ -488,6 +488,7 @@ the same layer, enclose them in an `all` expression so they will all be evaluate * `-aS` or `--coalesce-fraction-as-needed`: Dynamically combine a fraction of features from each zoom level into other nearby features to keep large tiles under the 500K size limit. (Again, mostly useful for polygons.) * `-pd` or `--force-feature-limit`: Dynamically drop some fraction of features from large tiles to keep them under the 500K size limit. It will probably look ugly at the tile boundaries. (This is like `-ad` but applies to each tile individually, not to the entire zoom level.) You probably don't want to use this. * `-aC` or `--cluster-densest-as-needed`: If a tile is too large, try to reduce its size by increasing the minimum spacing between features, and leaving one placeholder feature from each group. The remaining feature will be given a `"clustered": true` attribute to indicate that it represents a cluster, a `"point_count"` attribute to indicate the number of features that were clustered into it, and a `"sqrt_point_count"` attribute to indicate the relative width of a feature to represent the cluster. If the features being clustered are points, the representative feature will be located at the average of the original points' locations; otherwise, one of the original features will be left as the representative. + * `--distinguish-duplicates`: Treat features that share a location with some other feature as belonging to a series of sub-layers, so that they will be dropped or coalesced within their own sub-layer's feature sequence instead of being treated as infinitely dense and dropped or coalesced first. Up to 50 duplicates of each location are distinguished; any beyond that are all deferred to one final sub-layer. ### Dropping tightly overlapping features diff --git a/main.cpp b/main.cpp index 1f8b8f832..03c00df10 100644 --- a/main.cpp +++ b/main.cpp @@ -348,7 +348,123 @@ int calc_feature_minzoom(struct index *ix, struct drop_state *ds, int maxzoom, d return feature_minzoom; } -static void merge(struct mergelist *merges, size_t nmerges, unsigned char *map, FILE *indexfile, int bytes, char *geom_map, FILE *geom_out, std::atomic *geompos, long long *progress, long long *progress_max, long long *progress_reported, int maxzoom, double gamma, struct drop_state *ds) { +// The features that share a location with some other feature are deferred to +// a later pass through the feature sequence, so that they are not treated as +// infinitely dense and therefore dropped or coalesced before any of the +// features whose locations are distinct. +// +// The number of duplicates that are distinguished at each location is limited, +// because with a large number of features that all share the same location, +// some of them will still have to be dropped or coalesced in some sequence, +// and because each pass costs a temporary file. The duplicates beyond the +// limit are all deferred to one final pass. +#define MAX_DUPLICATES_DISTINGUISHED 50 + +struct duplicate_deferral { + const char *tmpdir = NULL; + + // The greatest number of extra passes that features can be deferred to, + // or 0 if duplicate locations are not being distinguished at all + size_t max_passes = 0; + + // One temporary file per pass beyond the first: pass n is files[n - 1] + std::vector files; + + // State for detecting runs of features that share the same index + unsigned long long previndex = 0; + bool have_previndex = false; + size_t pass = 0; +}; + +// Return the temporary file that features deferred to the specified pass +// are accumulated in, creating it if this is the first feature to be +// deferred that far. +static FILE *deferral_file(struct duplicate_deferral *dd, size_t pass) { + while (dd->files.size() < pass) { + std::string name = std::string(dd->tmpdir) + "/dup.XXXXXXXX"; + std::vector tmpl(name.begin(), name.end()); + tmpl.push_back('\0'); + + int fd = mkstemp_cloexec(tmpl.data()); + if (fd < 0) { + perror("temporary file for duplicate features"); + exit(EXIT_OPEN); + } + unlink(tmpl.data()); + + FILE *fp = fdopen(fd, "wb+"); + if (fp == NULL) { + perror("reopen temporary file for duplicate features"); + exit(EXIT_OPEN); + } + + dd->files.push_back(fp); + } + + return dd->files[pass - 1]; +} + +// Write one feature, and the index record that locates it, to the sorted +// output. The features arrive here in index order, so a feature whose index +// matches the previous feature's is a duplicate location, and is set aside +// to be appended to the output later by replay_deferrals(). +static void write_feature(struct index ix, char *geom_map, FILE *geom_out, std::atomic *geompos, FILE *indexfile, int maxzoom, double gamma, struct drop_state *ds, struct duplicate_deferral *dd) { + if (dd->max_passes > 0) { + if (dd->have_previndex && ix.ix == dd->previndex) { + if (dd->pass < dd->max_passes) { + dd->pass++; + } + } else { + dd->pass = 0; + } + + dd->previndex = ix.ix; + dd->have_previndex = true; + } + + // MAGIC: This knows that the feature minzoom is the last byte of the serialized feature + // and is writing one byte less and then adding the byte for the minzoom. + + long long len = ix.end - ix.start - 1; + int feature_minzoom = calc_feature_minzoom(&ix, ds, maxzoom, gamma); + + if (dd->pass > 0) { + FILE *fp = deferral_file(dd, dd->pass); + + // The index record has to be written now, to keep the index in the + // same order that the features were read in, but its location will + // not be known until the geometry is appended to the output, so + // remember where to come back and correct it. + + long long indexoff = ftello(indexfile); + if (indexoff < 0) { + perror("ftello index"); + exit(EXIT_SEEK); + } + + unsigned char minzoom_byte = feature_minzoom; + if (fwrite(&indexoff, sizeof(indexoff), 1, fp) != 1 || + fwrite(&ix, sizeof(ix), 1, fp) != 1 || + fwrite(geom_map + ix.start, 1, len, fp) != (size_t) len || + fwrite(&minzoom_byte, 1, 1, fp) != 1) { + perror("write duplicate feature"); + exit(EXIT_WRITE); + } + } else { + long long pos = *geompos; + + fwrite_check(geom_map + ix.start, 1, len, geom_out, geompos, "merge geometry"); + serialize_byte(geom_out, feature_minzoom, geompos, "merge geometry"); + + ix.start = pos; + ix.end = *geompos; + } + + std::atomic indexpos(0); + fwrite_check(&ix, sizeof(struct index), 1, indexfile, &indexpos, "merge temporary"); +} + +static void merge(struct mergelist *merges, size_t nmerges, unsigned char *map, FILE *indexfile, int bytes, char *geom_map, FILE *geom_out, std::atomic *geompos, long long *progress, long long *progress_max, long long *progress_reported, int maxzoom, double gamma, struct drop_state *ds, struct duplicate_deferral *dd) { struct mergelist *head = NULL; for (size_t i = 0; i < nmerges; i++) { @@ -361,14 +477,8 @@ static void merge(struct mergelist *merges, size_t nmerges, unsigned char *map, while (head != NULL) { struct index ix = *((struct index *) (map + head->start)); - long long pos = *geompos; - // MAGIC: This knows that the feature minzoom is the last byte of the serialized feature - // and is writing one byte less and then adding the byte for the minzoom. - - fwrite_check(geom_map + ix.start, 1, ix.end - ix.start - 1, geom_out, geompos, "merge geometry"); - int feature_minzoom = calc_feature_minzoom(&ix, ds, maxzoom, gamma); - serialize_byte(geom_out, feature_minzoom, geompos, "merge geometry"); + write_feature(ix, geom_map, geom_out, geompos, indexfile, maxzoom, gamma, ds, dd); // Count this as an 75%-accomplishment, since we already 25%-counted it *progress += (ix.end - ix.start) * 3 / 4; @@ -378,10 +488,6 @@ static void merge(struct mergelist *merges, size_t nmerges, unsigned char *map, *progress_reported = 100 * *progress / *progress_max; } - ix.start = pos; - ix.end = *geompos; - std::atomic indexpos; - fwrite_check(&ix, bytes, 1, indexfile, &indexpos, "merge temporary"); head->start += bytes; struct mergelist *m = head; @@ -394,6 +500,72 @@ static void merge(struct mergelist *merges, size_t nmerges, unsigned char *map, } } +// Append the features that were deferred because they shared a location with +// some other feature, one pass at a time, and correct the index records that +// were written for them with the locations they have ended up at. +static void replay_deferrals(struct duplicate_deferral *dd, FILE *geom_out, std::atomic *geompos, FILE *indexfile) { + if (dd->files.size() == 0) { + return; + } + + // so that the corrections below aren't overwritten by buffered index writes + if (fflush(indexfile) != 0) { + perror("flush index"); + exit(EXIT_WRITE); + } + int indexfd = fileno(indexfile); + + for (size_t i = 0; i < dd->files.size(); i++) { + FILE *fp = dd->files[i]; + + if (fseeko(fp, 0, SEEK_SET) < 0) { + perror("rewind duplicate features"); + exit(EXIT_SEEK); + } + + while (true) { + long long indexoff; + struct index ix; + + if (fread(&indexoff, sizeof(indexoff), 1, fp) != 1) { + if (ferror(fp)) { + perror("read duplicate features"); + exit(EXIT_READ); + } + break; // end of this pass + } + if (fread(&ix, sizeof(ix), 1, fp) != 1) { + fprintf(stderr, "Short read of duplicate feature index\n"); + exit(EXIT_READ); + } + + std::string s; + s.resize(ix.end - ix.start); + if (fread((void *) s.c_str(), 1, s.size(), fp) != s.size()) { + fprintf(stderr, "Short read of duplicate feature geometry\n"); + exit(EXIT_READ); + } + + long long pos = *geompos; + fwrite_check(s.c_str(), 1, s.size(), geom_out, geompos, "deferred geometry"); + + ix.start = pos; + ix.end = *geompos; + if (pwrite(indexfd, &ix, sizeof(ix), indexoff) != (ssize_t) sizeof(ix)) { + perror("correct duplicate feature index"); + exit(EXIT_WRITE); + } + } + + if (fclose(fp) != 0) { + perror("close duplicate features"); + exit(EXIT_CLOSE); + } + } + + dd->files.clear(); +} + struct sort_arg { int task; int cpus; @@ -741,7 +913,7 @@ void start_parsing(int fd, STREAM *fp, long long offset, long long len, std::ato parser_created = true; } -void radix1(int *geomfds_in, int *indexfds_in, int inputs, int prefix, int splits, long long mem, const char *tmpdir, long long *availfiles, FILE *geomfile, FILE *indexfile, std::atomic *geompos_out, long long *progress, long long *progress_max, long long *progress_reported, int maxzoom, int basezoom, double droprate, double gamma, struct drop_state *ds) { +void radix1(int *geomfds_in, int *indexfds_in, int inputs, int prefix, int splits, long long mem, const char *tmpdir, long long *availfiles, FILE *geomfile, FILE *indexfile, std::atomic *geompos_out, long long *progress, long long *progress_max, long long *progress_reported, int maxzoom, int basezoom, double droprate, double gamma, struct drop_state *ds, struct duplicate_deferral *dd) { // Arranged as bits to facilitate subdividing again if a subdivided file is still huge int splitbits = log(splits) / log(2); splits = 1 << splitbits; @@ -960,7 +1132,7 @@ void radix1(int *geomfds_in, int *indexfds_in, int inputs, int prefix, int split madvise(geommap, geomst.st_size, MADV_RANDOM); madvise(geommap, geomst.st_size, MADV_WILLNEED); - merge(merges, nmerges, (unsigned char *) indexmap, indexfile, bytes, geommap, geomfile, geompos_out, progress, progress_max, progress_reported, maxzoom, gamma, ds); + merge(merges, nmerges, (unsigned char *) indexmap, indexfile, bytes, geommap, geomfile, geompos_out, progress, progress_max, progress_reported, maxzoom, gamma, ds, dd); madvise(indexmap, indexst.st_size, MADV_DONTNEED); if (munmap(indexmap, indexst.st_size) < 0) { @@ -991,11 +1163,8 @@ void radix1(int *geomfds_in, int *indexfds_in, int inputs, int prefix, int split for (size_t a = 0; a < indexst.st_size / sizeof(struct index); a++) { struct index ix = indexmap[a]; - long long pos = *geompos_out; - fwrite_check(geommap + ix.start, ix.end - ix.start, 1, geomfile, geompos_out, "geom"); - int feature_minzoom = calc_feature_minzoom(&ix, ds, maxzoom, gamma); - serialize_byte(geomfile, feature_minzoom, geompos_out, "merge geometry"); + write_feature(ix, geommap, geomfile, geompos_out, indexfile, maxzoom, gamma, ds, dd); // Count this as an 75%-accomplishment, since we already 25%-counted it *progress += (ix.end - ix.start) * 3 / 4; @@ -1004,11 +1173,6 @@ void radix1(int *geomfds_in, int *indexfds_in, int inputs, int prefix, int split fflush(stderr); *progress_reported = 100 * *progress / *progress_max; } - - ix.start = pos; - ix.end = *geompos_out; - std::atomic indexpos; - fwrite_check(&ix, sizeof(struct index), 1, indexfile, &indexpos, "index"); } madvise(indexmap, indexst.st_size, MADV_DONTNEED); @@ -1029,7 +1193,7 @@ void radix1(int *geomfds_in, int *indexfds_in, int inputs, int prefix, int split // counter backward but will be an honest estimate of the work remaining. *progress_max += geomst.st_size / 4; - radix1(&geomfds[i], &indexfds[i], 1, prefix + splitbits, *availfiles / 4, mem, tmpdir, availfiles, geomfile, indexfile, geompos_out, progress, progress_max, progress_reported, maxzoom, basezoom, droprate, gamma, ds); + radix1(&geomfds[i], &indexfds[i], 1, prefix + splitbits, *availfiles / 4, mem, tmpdir, availfiles, geomfile, indexfile, geompos_out, progress, progress_max, progress_reported, maxzoom, basezoom, droprate, gamma, ds, dd); already_closed = 1; } } @@ -1087,6 +1251,24 @@ void radix(std::vector &readers, int nreaders, FILE *geomfile, FI - 4 // top-level geom and index output, both FILE and fd - 3; // stdin, stdout, stderr + struct duplicate_deferral dd; + dd.tmpdir = tmpdir; + + if (additional[A_DISTINGUISH_DUPLICATES]) { + // one file for each pass that duplicate features can be deferred to, + // including the final pass for the ones beyond the limit, + // but not so many that there are none left to sort with + dd.max_passes = MAX_DUPLICATES_DISTINGUISHED + 1; + if ((long long) dd.max_passes > availfiles - 8) { + dd.max_passes = std::max(0LL, availfiles - 8); + + if (dd.max_passes == 0) { + fprintf(stderr, "Warning: not enough available files to distinguish duplicate locations\n"); + } + } + availfiles -= dd.max_passes; + } + // 4 because for each we have output and input FILE and fd for geom and index int splits = availfiles / 4; @@ -1114,12 +1296,14 @@ void radix(std::vector &readers, int nreaders, FILE *geomfile, FI long long progress = 0, progress_max = geom_total, progress_reported = -1; long long availfiles_before = availfiles; - radix1(geomfds, indexfds, nreaders, 0, splits, mem, tmpdir, &availfiles, geomfile, indexfile, geompos, &progress, &progress_max, &progress_reported, maxzoom, basezoom, droprate, gamma, ds); + radix1(geomfds, indexfds, nreaders, 0, splits, mem, tmpdir, &availfiles, geomfile, indexfile, geompos, &progress, &progress_max, &progress_reported, maxzoom, basezoom, droprate, gamma, ds, &dd); if (availfiles - 2 * nreaders != availfiles_before) { fprintf(stderr, "Internal error: miscounted available file descriptors: %lld vs %lld\n", availfiles - 2 * nreaders, availfiles); exit(EXIT_IMPOSSIBLE); } + + replay_deferrals(&dd, geomfile, geompos, indexfile); } void choose_first_zoom(long long *file_bbox, long long *file_bbox1, long long *file_bbox2, std::vector &readers, unsigned *iz, unsigned *ix, unsigned *iy, int minzoom, int buffer) { @@ -2716,7 +2900,9 @@ std::pair read_input(std::vector &sources, char *fname, i } } else { for (long long ip = 0; ip < indices; ip++) { - if (ip > 0 && map[ip].start != map[ip - 1].end) { + // The features are not consecutive in the geometry if some of them + // were deferred to a later pass for sharing a location with another + if (ip > 0 && map[ip].start != map[ip - 1].end && !additional[A_DISTINGUISH_DUPLICATES]) { fprintf(stderr, "Mismatched index at %lld: %lld vs %lld\n", ip, map[ip].start, map[ip].end); } int feature_minzoom = calc_feature_minzoom(&map[ip], ds, maxzoom, gamma); @@ -3100,6 +3286,7 @@ int main(int argc, char **argv) { {"force-feature-limit", no_argument, &prevent[P_DYNAMIC_DROP], 1}, {"cluster-densest-as-needed", no_argument, &additional[A_CLUSTER_DENSEST_AS_NEEDED], 1}, {"keep-point-cluster-position", no_argument, &additional[A_KEEP_POINT_CLUSTER_POSITION], 1}, + {"distinguish-duplicates", no_argument, &additional[A_DISTINGUISH_DUPLICATES], 1}, {"Dropping tightly overlapping features", 0, 0, 0}, {"gamma", required_argument, 0, 'g'}, diff --git a/man/tippecanoe.1 b/man/tippecanoe.1 index e83fb1043..280306114 100644 --- a/man/tippecanoe.1 +++ b/man/tippecanoe.1 @@ -621,6 +621,8 @@ preference to retaining points in sparse areas and dropping points in dense area \fB\fC\-pd\fR or \fB\fC\-\-force\-feature\-limit\fR: Dynamically drop some fraction of features from large tiles to keep them under the 500K size limit. It will probably look ugly at the tile boundaries. (This is like \fB\fC\-ad\fR but applies to each tile individually, not to the entire zoom level.) You probably don't want to use this. .IP \(bu 2 \fB\fC\-aC\fR or \fB\fC\-\-cluster\-densest\-as\-needed\fR: If a tile is too large, try to reduce its size by increasing the minimum spacing between features, and leaving one placeholder feature from each group. The remaining feature will be given a \fB\fC"clustered": true\fR attribute to indicate that it represents a cluster, a \fB\fC"point_count"\fR attribute to indicate the number of features that were clustered into it, and a \fB\fC"sqrt_point_count"\fR attribute to indicate the relative width of a feature to represent the cluster. If the features being clustered are points, the representative feature will be located at the average of the original points' locations; otherwise, one of the original features will be left as the representative. +.IP \(bu 2 +\fB\fC\-\-distinguish\-duplicates\fR: Treat features that share a location with some other feature as belonging to a series of sub\-layers, so that they will be dropped or coalesced within their own sub\-layer's feature sequence instead of being treated as infinitely dense and dropped or coalesced first. Up to 50 duplicates of each location are distinguished; any beyond that are all deferred to one final sub\-layer. .RE .SS Dropping tightly overlapping features .RS diff --git a/options.hpp b/options.hpp index 0543f8208..91bdd22bc 100644 --- a/options.hpp +++ b/options.hpp @@ -29,6 +29,7 @@ #define A_VISVALINGAM ((int) 'v') #define A_DETECT_WRAPAROUND ((int) 'w') #define A_KEEP_POINT_CLUSTER_POSITION ((int) 'a') +#define A_DISTINGUISH_DUPLICATES ((int) 'u') #define A_DROP_BY_ATTRIBUTE_AS_NEEDED ((int) 'A') #define P_TILE_COMPRESSION ((int) 'C') diff --git a/serial.cpp b/serial.cpp index 5afc2ed2f..2aaa2d7ce 100644 --- a/serial.cpp +++ b/serial.cpp @@ -743,6 +743,7 @@ int serialize_feature(struct serialization_state *sst, serial_feature &sf, std:: prevent[P_DYNAMIC_DROP] || additional[A_INCREASE_GAMMA_AS_NEEDED] || additional[A_GENERATE_POLYGON_LABEL_POINTS] || + additional[A_DISTINGUISH_DUPLICATES] || sst->uses_gamma || retain_points_multiplier > 1 || preserve_multiplier_density_threshold > 0 || diff --git a/tests/distinguish-duplicates/in.json b/tests/distinguish-duplicates/in.json new file mode 100644 index 000000000..684aa0ef8 --- /dev/null +++ b/tests/distinguish-duplicates/in.json @@ -0,0 +1,183 @@ +{"type":"Feature","properties":{"a":0},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":0},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":0},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":1},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":1},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":1},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":2},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":2},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":2},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":3},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":3},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":3},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":4},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":4},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":4},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":5},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":5},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":5},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":6},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":6},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":6},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":7},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":7},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":7},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":8},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":8},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":8},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":9},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":9},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":9},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":10},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":10},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":10},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":11},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":11},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":11},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":12},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":12},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":12},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":13},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":13},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":13},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":14},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":14},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":14},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":15},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":15},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":15},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":16},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":16},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":16},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":17},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":17},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":17},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":18},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":18},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":18},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":19},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":19},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":19},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":20},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":20},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":20},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":21},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":21},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":21},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":22},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":22},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":22},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":23},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":23},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":23},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":24},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":24},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":24},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":25},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":25},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":25},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":26},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":26},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":26},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":27},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":27},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":27},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":28},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":28},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":28},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":29},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":29},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":29},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":30},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":30},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":30},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":31},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":31},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":31},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":32},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":32},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":32},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":33},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":33},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":33},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":34},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":34},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":34},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":35},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":35},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":35},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":36},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":36},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":36},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":37},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":37},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":37},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":38},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":38},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":38},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":39},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":39},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":39},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":40},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":40},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":40},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":41},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":41},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":41},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":42},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":42},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":42},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":43},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":43},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":43},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":44},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":44},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":44},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":45},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":45},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":45},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":46},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":46},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":46},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":47},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":47},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":47},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":48},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":48},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":48},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":49},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":49},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":49},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":50},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":50},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":50},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":51},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":51},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":51},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":52},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":52},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":52},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":53},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":53},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":53},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":54},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":54},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":54},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":55},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":55},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":55},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":56},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":56},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":56},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":57},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":57},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":57},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":58},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":58},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":58},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":59},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":59},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":59},"geometry":{"type":"Point","coordinates":[3,1]}} +{"type":"Feature","properties":{"a":60},"geometry":{"type":"Point","coordinates":[1,1]}} +{"type":"Feature","properties":{"b":60},"geometry":{"type":"Point","coordinates":[2,1]}} +{"type":"Feature","properties":{"c":60},"geometry":{"type":"Point","coordinates":[3,1]}} diff --git a/tests/distinguish-duplicates/out/-z1_-r1_-b0_--distinguish-duplicates.json b/tests/distinguish-duplicates/out/-z1_-r1_-b0_--distinguish-duplicates.json new file mode 100644 index 000000000..4f4dcaca8 --- /dev/null +++ b/tests/distinguish-duplicates/out/-z1_-r1_-b0_--distinguish-duplicates.json @@ -0,0 +1,755 @@ +{ "type": "FeatureCollection", "properties": { +"antimeridian_adjusted_bounds": "1.000000,1.000000,3.000000,1.000000", +"bounds": "1.000000,1.000000,3.000000,1.000000", +"center": "3.000000,1.000000,1", +"description": "tests/distinguish-duplicates/out/-z1_-r1_-b0_--distinguish-duplicates.json.check.mbtiles", +"format": "pbf", +"generator_options": "./tippecanoe -q -a@ -f -o tests/distinguish-duplicates/out/-z1_-r1_-b0_--distinguish-duplicates.json.check.mbtiles -z1 -r1 -b0 --distinguish-duplicates tests/distinguish-duplicates/in.json", +"json": "{\"vector_layers\":[{\"id\":\"in\",\"description\":\"\",\"minzoom\":0,\"maxzoom\":1,\"fields\":{\"a\":\"Number\",\"b\":\"Number\",\"c\":\"Number\"}}],\"tilestats\":{\"layerCount\":1,\"layers\":[{\"layer\":\"in\",\"count\":183,\"geometry\":\"Point\",\"attributeCount\":3,\"attributes\":[{\"attribute\":\"a\",\"count\":61,\"type\":\"number\",\"values\":[0,1,10,11,12,13,14,15,16,17,18,19,2,20,21,22,23,24,25,26,27,28,29,3,30,31,32,33,34,35,36,37,38,39,4,40,41,42,43,44,45,46,47,48,49,5,50,51,52,53,54,55,56,57,58,59,6,60,7,8,9],\"min\":0,\"max\":60},{\"attribute\":\"b\",\"count\":61,\"type\":\"number\",\"values\":[0,1,10,11,12,13,14,15,16,17,18,19,2,20,21,22,23,24,25,26,27,28,29,3,30,31,32,33,34,35,36,37,38,39,4,40,41,42,43,44,45,46,47,48,49,5,50,51,52,53,54,55,56,57,58,59,6,60,7,8,9],\"min\":0,\"max\":60},{\"attribute\":\"c\",\"count\":61,\"type\":\"number\",\"values\":[0,1,10,11,12,13,14,15,16,17,18,19,2,20,21,22,23,24,25,26,27,28,29,3,30,31,32,33,34,35,36,37,38,39,4,40,41,42,43,44,45,46,47,48,49,5,50,51,52,53,54,55,56,57,58,59,6,60,7,8,9],\"min\":0,\"max\":60}]}]}}", +"maxzoom": "1", +"minzoom": "0", +"name": "tests/distinguish-duplicates/out/-z1_-r1_-b0_--distinguish-duplicates.json.check.mbtiles", +"tippecanoe_decisions": "{\"basezoom\":1,\"droprate\":1,\"retain_points_multiplier\":1}", +"type": "overlay", +"version": "2" +}, "features": [ +{ "type": "FeatureCollection", "properties": { "zoom": 0, "x": 0, "y": 0 }, "features": [ +{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ +{ "type": "Feature", "properties": { "a": 0 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 0 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 0 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 1 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 1 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 1 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 2 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 2 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 2 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 3 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 3 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 3 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 4 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 4 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 4 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 5 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 5 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 5 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 6 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 6 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 6 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 7 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 7 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 7 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 8 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 8 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 8 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 9 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 9 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 9 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 10 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 10 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 10 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 11 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 11 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 11 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 12 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 12 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 12 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 13 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 13 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 13 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 14 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 14 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 14 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 15 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 15 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 15 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 16 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 16 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 16 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 17 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 17 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 17 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 18 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 18 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 18 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 19 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 19 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 19 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 20 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 20 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 20 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 21 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 21 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 21 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 22 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 22 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 22 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 23 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 23 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 23 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 24 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 24 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 24 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 25 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 25 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 25 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 26 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 26 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 26 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 27 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 27 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 27 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 28 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 28 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 28 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 29 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 29 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 29 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 30 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 30 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 30 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 31 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 31 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 31 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 32 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 32 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 32 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 33 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 33 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 33 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 34 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 34 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 34 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 35 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 35 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 35 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 36 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 36 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 36 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 37 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 37 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 37 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 38 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 38 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 38 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 39 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 39 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 39 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 40 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 40 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 40 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 41 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 41 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 41 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 42 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 42 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 42 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 43 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 43 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 43 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 44 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 44 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 44 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 45 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 45 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 45 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 46 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 46 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 46 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 47 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 47 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 47 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 48 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 48 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 48 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 49 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 49 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 49 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 50 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 50 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 50 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 51 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 52 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 53 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 54 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 55 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 56 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 57 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 58 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 59 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "a": 60 }, "geometry": { "type": "Point", "coordinates": [ 1.054688, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 51 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 52 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 53 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 54 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 55 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 56 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 57 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 58 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 59 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "b": 60 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 51 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 52 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 53 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 54 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 55 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 56 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 57 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 58 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 59 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +, +{ "type": "Feature", "properties": { "c": 60 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 0.966751 ] } } +] } +] } +, +{ "type": "FeatureCollection", "properties": { "zoom": 1, "x": 1, "y": 0 }, "features": [ +{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ +{ "type": "Feature", "properties": { "a": 0 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 0 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 0 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 1 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 1 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 1 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 2 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 2 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 2 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 3 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 3 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 3 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 4 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 4 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 4 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 5 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 5 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 5 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 6 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 6 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 6 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 7 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 7 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 7 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 8 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 8 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 8 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 9 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 9 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 9 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 10 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 10 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 10 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 11 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 11 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 11 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 12 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 12 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 12 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 13 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 13 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 13 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 14 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 14 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 14 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 15 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 15 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 15 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 16 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 16 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 16 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 17 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 17 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 17 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 18 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 18 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 18 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 19 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 19 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 19 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 20 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 20 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 20 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 21 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 21 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 21 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 22 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 22 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 22 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 23 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 23 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 23 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 24 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 24 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 24 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 25 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 25 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 25 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 26 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 26 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 26 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 27 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 27 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 27 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 28 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 28 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 28 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 29 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 29 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 29 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 30 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 30 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 30 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 31 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 31 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 31 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 32 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 32 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 32 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 33 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 33 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 33 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 34 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 34 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 34 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 35 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 35 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 35 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 36 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 36 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 36 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 37 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 37 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 37 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 38 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 38 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 38 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 39 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 39 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 39 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 40 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 40 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 40 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 41 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 41 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 41 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 42 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 42 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 42 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 43 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 43 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 43 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 44 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 44 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 44 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 45 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 45 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 45 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 46 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 46 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 46 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 47 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 47 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 47 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 48 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 48 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 48 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 49 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 49 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 49 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 50 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 50 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 50 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 51 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 52 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 53 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 54 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 55 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 56 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 57 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 58 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 59 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "a": 60 }, "geometry": { "type": "Point", "coordinates": [ 1.010742, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 51 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 52 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 53 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 54 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 55 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 56 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 57 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 58 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 59 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "b": 60 }, "geometry": { "type": "Point", "coordinates": [ 2.021484, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 51 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 52 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 53 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 54 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 55 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 56 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 57 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 58 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 59 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +, +{ "type": "Feature", "properties": { "c": 60 }, "geometry": { "type": "Point", "coordinates": [ 2.988281, 1.010690 ] } } +] } +] } +] } diff --git a/version.hpp b/version.hpp index 8974b68fc..71b353ad1 100644 --- a/version.hpp +++ b/version.hpp @@ -1,6 +1,6 @@ #ifndef VERSION_HPP #define VERSION_HPP -#define VERSION "v2.80.0" +#define VERSION "v2.81.0" #endif From 034f9c3e62a67a2adc77d8dd1f3e4730936e6526 Mon Sep 17 00:00:00 2001 From: Erica Fischer Date: Wed, 5 Aug 2026 13:22:54 -0700 Subject: [PATCH 2/2] Use data() instead of c_str() Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- main.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/main.cpp b/main.cpp index 03c00df10..2b6f32a06 100644 --- a/main.cpp +++ b/main.cpp @@ -541,14 +541,13 @@ static void replay_deferrals(struct duplicate_deferral *dd, FILE *geom_out, std: std::string s; s.resize(ix.end - ix.start); - if (fread((void *) s.c_str(), 1, s.size(), fp) != s.size()) { + if (s.size() != 0 && fread(&s[0], 1, s.size(), fp) != s.size()) { fprintf(stderr, "Short read of duplicate feature geometry\n"); exit(EXIT_READ); } long long pos = *geompos; - fwrite_check(s.c_str(), 1, s.size(), geom_out, geompos, "deferred geometry"); - + fwrite_check(s.data(), 1, s.size(), geom_out, geompos, "deferred geometry"); ix.start = pos; ix.end = *geompos; if (pwrite(indexfd, &ix, sizeof(ix), indexoff) != (ssize_t) sizeof(ix)) {