diff --git a/CHANGELOG.md b/CHANGELOG.md index 108e7303..6d54c32c 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 5c6ffec5..0eaf8663 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 1f8b8f83..2b6f32a0 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,71 @@ 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 (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.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)) { + 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 +912,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 +1131,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 +1162,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 +1172,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 +1192,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 +1250,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 +1295,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 +2899,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 +3285,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 e83fb104..28030611 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 0543f820..91bdd22b 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 5afc2ed2..2aaa2d7c 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 00000000..684aa0ef --- /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 00000000..4f4dcaca --- /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 8974b68f..71b353ad 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