From dcc3a119155d331eacea9458653218130e110c51 Mon Sep 17 00:00:00 2001 From: hfs Date: Mon, 2 Oct 2023 19:47:32 +0200 Subject: [PATCH 1/4] Fix "make test": build required binaries first (#143) When running "make test" in a pristine working copy, the "test" target calls the "raw-tiles-test" target, which tries to execute ./tile-join. But that binary has not been built, yet, at this point. The target fails with an error. Add the required binaries as dependencies to the test targets in the Makefile. This makes sure that they are built before they are attempted to be executed. --- Makefile | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index 9b73b275..5412d4b1 100644 --- a/Makefile +++ b/Makefile @@ -169,7 +169,7 @@ parallel-test: $(eval SHELL:=$(ADVSHELL)) cmp tests/parallel/linear-file.json tests/parallel/parallel-pipes.json rm tests/parallel/*.mbtiles tests/parallel/*.json -raw-tiles-test: +raw-tiles-test: tippecanoe tippecanoe-decode tile-join ./tippecanoe -q -f -e tests/raw-tiles/raw-tiles -r1 -pC tests/raw-tiles/hackspots.geojson ./tippecanoe-decode -x generator tests/raw-tiles/raw-tiles > tests/raw-tiles/raw-tiles.json.check cmp tests/raw-tiles/raw-tiles.json.check tests/raw-tiles/raw-tiles.json @@ -187,7 +187,7 @@ raw-tiles-test: cmp tests/raw-tiles/nothing.json.check tests/raw-tiles/nothing.json rm -r tests/raw-tiles/nothing tests/raw-tiles/nothing.json.check -pmtiles-test: +pmtiles-test: tippecanoe tippecanoe-decode tile-join ./tippecanoe -q -f -o tests/pmtiles/hackspots.pmtiles -r1 -pC tests/raw-tiles/hackspots.geojson ./tippecanoe-decode -x generator tests/pmtiles/hackspots.pmtiles > tests/pmtiles/hackspots.json.check cmp tests/pmtiles/hackspots.json.check tests/pmtiles/hackspots.json @@ -224,7 +224,7 @@ pmtiles-test: cmp tests/raw-tiles/nothing.json.check tests/raw-tiles/nothing.json rm -r tests/raw-tiles/nothing.pmtiles tests/raw-tiles/nothing.json.check -decode-test: +decode-test: tippecanoe tippecanoe-decode mkdir -p tests/muni/decode ./tippecanoe -q -z11 -Z11 -f -o tests/muni/decode/multi.mbtiles tests/muni/*.json ./tippecanoe-decode -x generator -l subway tests/muni/decode/multi.mbtiles > tests/muni/decode/multi.mbtiles.json.check @@ -241,7 +241,7 @@ decode-test: cmp tests/muni/decode/multi.mbtiles.stats.json.check tests/muni/decode/multi.mbtiles.stats.json rm -f tests/muni/decode/multi.mbtiles.json.check tests/muni/decode/multi.mbtiles tests/muni/decode/multi.mbtiles.pipeline.json.check tests/muni/decode/multi.mbtiles.stats.json.check tests/muni/decode/multi.mbtiles.onetile.json.check -decode-pmtiles-test: +decode-pmtiles-test: tippecanoe tippecanoe-decode mkdir -p tests/muni/decode ./tippecanoe -q -z11 -Z11 -f -o tests/muni/decode/multi.pmtiles tests/muni/*.json ./tippecanoe-decode -x generator -l subway tests/muni/decode/multi.pmtiles | sed 's/pmtiles/mbtiles/g' > tests/muni/decode/multi.pmtiles.json.check @@ -258,7 +258,7 @@ decode-pmtiles-test: cmp tests/muni/decode/multi.pmtiles.stats.json.check tests/muni/decode/multi.mbtiles.stats.json rm -f tests/muni/decode/multi.pmtiles.json.check tests/muni/decode/multi.pmtiles tests/muni/decode/multi.pmtiles.pipeline.json.check tests/muni/decode/multi.pmtiles.stats.json.check tests/muni/decode/multi.pmtiles.onetile.json.check -pbf-test: +pbf-test: tippecanoe-decode ./tippecanoe-decode -x generator tests/pbf/11-328-791.vector.pbf 11 328 791 > tests/pbf/11-328-791.vector.pbf.out cmp tests/pbf/11-328-791.json tests/pbf/11-328-791.vector.pbf.out rm tests/pbf/11-328-791.vector.pbf.out @@ -266,7 +266,7 @@ pbf-test: cmp tests/pbf/11-328-791.3857.json tests/pbf/11-328-791.3857.vector.pbf.out rm tests/pbf/11-328-791.3857.vector.pbf.out -enumerate-test: +enumerate-test: tippecanoe tippecanoe-enumerate ./tippecanoe -q -z5 -f -o tests/ne_110m_admin_0_countries/out/enum.mbtiles tests/ne_110m_admin_0_countries/in.json.gz ./tippecanoe-enumerate tests/ne_110m_admin_0_countries/out/enum.mbtiles > tests/ne_110m_admin_0_countries/out/enum.check cmp tests/ne_110m_admin_0_countries/out/enum.check tests/ne_110m_admin_0_countries/out/enum @@ -288,7 +288,7 @@ overzoom-test: tippecanoe-overzoom cmp tests/pbf/14-2616-6331.pbf /dev/null rm tests/pbf/14-2616-6331.pbf -join-test: tile-join +join-test: tippecanoe tippecanoe-decode tile-join ./tippecanoe -q -f -z12 -o tests/join-population/tabblock_06001420.mbtiles -YALAND10:'Land area' -L'{"file": "tests/join-population/tabblock_06001420.json", "description": "population"}' ./tippecanoe -q -f -Z5 -z10 -o tests/join-population/macarthur.mbtiles -l macarthur tests/join-population/macarthur.json ./tile-join -q -f -Z6 -z9 -o tests/join-population/macarthur-6-9.mbtiles tests/join-population/macarthur.mbtiles @@ -423,7 +423,7 @@ join-test: tile-join cmp tests/ne_110m_ocean/join/joined.mbtiles.json.check tests/ne_110m_ocean/join/joined.mbtiles.json rm -f tests/ne_110m_ocean/join/ocean.mbtiles tests/ne_110m_ocean/join/countries.mbtiles tests/ne_110m_ocean/join/joined.mbtiles tests/ne_110m_ocean/join/joined.mbtiles.json.check -join-filter-test: +join-filter-test: tippecanoe tippecanoe-decode tile-join # Comes out different from the direct tippecanoe run because null attributes are lost ./tippecanoe -q -z0 -f -o tests/feature-filter/out/all.mbtiles tests/feature-filter/in.json ./tile-join -q -J tests/feature-filter/filter -f -o tests/feature-filter/out/filtered.mbtiles tests/feature-filter/out/all.mbtiles @@ -446,7 +446,7 @@ json-tool-test: tippecanoe-json-tool rm -f tests/join-population/tabblock_06001420.json.sort tests/join-population/tabblock_06001420.json.sort.joined rm -f tests/join-population/tabblock_06001420-null.json.sort.joined -allow-existing-test: +allow-existing-test: tippecanoe # Make a tileset ./tippecanoe -q -Z0 -z0 -f -o tests/allow-existing/both.mbtiles tests/coalesce-tract/tl_2010_06001_tract10.json # Writing to existing should fail @@ -475,7 +475,7 @@ allow-existing-test: if ./tippecanoe -q -Z10 -z11 -F -o tests/allow-existing/both.pmtiles tests/coalesce-tract/tl_2010_06001_tract10.json; then exit 1; else exit 0; fi rm -r tests/allow-existing/both.pmtiles tests/allow-existing/both.dir.json.check tests/allow-existing/both.dir tests/allow-existing/both.mbtiles.json.check tests/allow-existing/both.mbtiles -csv-test: +csv-test: tippecanoe tippecanoe-decode # Reading from named CSV ./tippecanoe -q -zg -f -o tests/csv/out.mbtiles tests/csv/ne_110m_populated_places_simple.csv ./tippecanoe-decode -x generator -x generator_options tests/csv/out.mbtiles > tests/csv/out.mbtiles.json.check @@ -492,7 +492,7 @@ csv-test: cmp tests/csv/out.mbtiles.json.check tests/csv/out.mbtiles.json rm -f tests/csv/out.mbtiles.json.check tests/csv/out.mbtiles -layer-json-test: +layer-json-test: tippecanoe tippecanoe-decode # GeoJSON with description and named layer ./tippecanoe -q -z0 -r1 -yNAME -f -o tests/layer-json/out.mbtiles -L'{"file":"tests/ne_110m_populated_places/in.json", "description":"World cities", "layer":"places"}' ./tippecanoe-decode -x generator -x generator_options tests/layer-json/out.mbtiles > tests/layer-json/out.mbtiles.json.check From 26bf08deb2dac249ad2fd0eaad3a4e1f98efeb26 Mon Sep 17 00:00:00 2001 From: Erica Fischer Date: Tue, 3 Oct 2023 10:53:12 -0700 Subject: [PATCH 2/4] Externalizing polygon shard detection (#146) * Start of externalizing polygon shard detection * Completely untested external quicksort * Add unit test for external quicksort * Remember to clean up temporary files * Sort and scan the vertices * Bring over more vertex logic * Make nodes from vertices * Checkpoint on switching over to global shared nodes * Do the thing * Revert unintended change to coalesced linestring behavior * Take shared nodes into account in early simplification * Let it do more sorting in memory * Fix overnoding of collinear linestrings * Remove duplicate nodes, since only duplicate vertices now matter * Remember to delete temporary files * Fix out of bounds memory access below, apparently * Fix the actual undefined behavior * Still running out of memory in one case. Find out where. * Forgot the conditional * Try again to make it not run out of memory * Update version and changelog --- CHANGELOG.md | 5 + Makefile | 4 +- README.md | 2 +- geometry.cpp | 30 ++- geometry.hpp | 6 +- main.cpp | 235 +++++++++++++++++- man/tippecanoe.1 | 4 +- serial.cpp | 124 ++++++++- serial.hpp | 64 ++++- sort.cpp | 123 +++++++++ sort.hpp | 6 + ...e_--no-simplification-of-shared-nodes.json | 2 +- ...1_--no-simplification-of-shared-nodes.json | 26 +- tile-join.cpp | 60 ++--- tile.cpp | 198 +++------------ tile.hpp | 5 +- unit.cpp | 47 ++++ version.hpp | 2 +- 18 files changed, 713 insertions(+), 230 deletions(-) create mode 100644 sort.cpp create mode 100644 sort.hpp diff --git a/CHANGELOG.md b/CHANGELOG.md index ba4664b6..d250fca6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# 2.33.0 + +* Further reduce memory usage of --no-simplification-of-shared-nodes by calculating the list of shared nodes globally using temporary files rather than in memory for each individual tile +* Make --no-simplification-of-shared-nodes behave for LineStrings as it does for Polygons, preventing simplification only at crossings, convergences, and divergences, not at every point along collinear segments + # 2.32.1 * Reduce memory usage of --no-simplification-of-shared-nodes for polygons diff --git a/Makefile b/Makefile index 5412d4b1..7cd602ff 100644 --- a/Makefile +++ b/Makefile @@ -58,7 +58,7 @@ C = $(wildcard *.c) $(wildcard *.cpp) INCLUDES = -I/usr/local/include -I. LIBS = -L/usr/local/lib -tippecanoe: geojson.o jsonpull/jsonpull.o tile.o pool.o mbtiles.o geometry.o projection.o memfile.o mvt.o serial.o main.o text.o dirtiles.o pmtiles_file.o plugin.o read_json.o write_json.o geobuf.o flatgeobuf.o evaluator.o geocsv.o csv.o geojson-loop.o json_logger.o visvalingam.o compression.o clip.o +tippecanoe: geojson.o jsonpull/jsonpull.o tile.o pool.o mbtiles.o geometry.o projection.o memfile.o mvt.o serial.o main.o text.o dirtiles.o pmtiles_file.o plugin.o read_json.o write_json.o geobuf.o flatgeobuf.o evaluator.o geocsv.o csv.o geojson-loop.o json_logger.o visvalingam.o compression.o clip.o sort.o $(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3 -lpthread tippecanoe-enumerate: enumerate.o @@ -73,7 +73,7 @@ tile-join: tile-join.o projection.o mbtiles.o mvt.o memfile.o dirtiles.o jsonpul tippecanoe-json-tool: jsontool.o jsonpull/jsonpull.o csv.o text.o geojson-loop.o $(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3 -lpthread -unit: unit.o text.o +unit: unit.o text.o sort.o $(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3 -lpthread tippecanoe-overzoom: overzoom.o mvt.o clip.o diff --git a/README.md b/README.md index c894c340..6a1c8557 100644 --- a/README.md +++ b/README.md @@ -492,7 +492,7 @@ the same layer, enclose them in an `all` expression so they will all be evaluate * `-ps` or `--no-line-simplification`: Don't simplify lines and polygons * `-pS` or `--simplify-only-low-zooms`: Don't simplify lines and polygons at maxzoom (but do simplify at lower zooms) * `--simplification-at-maximum-zoom=`_scale_: Use the specified _scale_ at maxzoom instead of the standard simplification scale (which still applies at lower zooms) - * `-pn` or `--no-simplification-of-shared-nodes`: Don't simplify away nodes that appear in more than one feature or are used multiple times within the same feature, so that the intersection node will not be lost from intersecting roads. (This will not be effective if you also use `--coalesce`.) For polygons, the vertices where polygon rings meet will be detected, and the shared edges between the polygons will be simplified identically if possible. Use this instead of `--detect-shared-borders`. + * `-pn` or `--no-simplification-of-shared-nodes`: Don't simplify away nodes at which LineStrings or Polygon rings converge, diverge, or cross. (This will not be effective if you also use `--coalesce`.) In between intersection nodes, LineString segments or polygon edges will be simplified identically in each feature if possible. Use this instead of `--detect-shared-borders`. * `-pt` or `--no-tiny-polygon-reduction`: Don't combine the area of very small polygons into small squares that represent their combined area. * `-pT` or `--no-tiny-polygon-reduction-at-maximum-zoom`: Combine the area of very small polygons into small squares that represent their combined area only at zoom levels below the maximum. * `--tiny-polygon-size=`_size_: Use the specified _size_ for tiny polygons instead of the default 2. Anything above 6 or so will lead to visible artifacts with the default tile detail. diff --git a/geometry.cpp b/geometry.cpp index 13a6c330..07ff1529 100644 --- a/geometry.cpp +++ b/geometry.cpp @@ -485,7 +485,7 @@ drawvec impose_tile_boundaries(drawvec &geom, long long extent) { return out; } -drawvec simplify_lines(drawvec &geom, int z, int detail, bool mark_tile_bounds, double simplification, size_t retain, drawvec const &shared_nodes) { +drawvec simplify_lines(drawvec &geom, int z, int tx, int ty, int detail, bool mark_tile_bounds, double simplification, size_t retain, drawvec const &shared_nodes, struct node *shared_nodes_map, size_t nodepos) { int res = 1 << (32 - detail - z); long long area = 1LL << (32 - z); @@ -501,10 +501,35 @@ drawvec simplify_lines(drawvec &geom, int z, int detail, bool mark_tile_bounds, } if (prevent[P_SIMPLIFY_SHARED_NODES]) { + // This is kind of weird, because we have two lists of shared nodes to look through: + // * the drawvec, which is nodes that were introduced during clipping to the tile edge, + // and which are in local tile coordinates + // * the shared_nodes_map, which was made globally before tiling began, and which + // is in global quadkey coordinates. + // To look through the latter, we need to offset and encode the coordinates + // of the feature we are simplifying. + auto pt = std::lower_bound(shared_nodes.begin(), shared_nodes.end(), geom[i]); if (pt != shared_nodes.end() && *pt == geom[i]) { geom[i].necessary = true; } + + if (nodepos > 0) { + // offset to global + draw d = geom[i]; + if (z != 0) { + d.x += tx * (1LL << (32 - z)); + d.y += ty * (1LL << (32 - z)); + } + + // to quadkey + struct node n; + n.index = encode_quadkey((unsigned) d.x, (unsigned) d.y); + + if (bsearch(&n, shared_nodes_map, nodepos / sizeof(node), sizeof(node), nodecmp) != NULL) { + geom[i].necessary = true; + } + } } } @@ -661,6 +686,9 @@ drawvec fix_polygon(drawvec &geom) { ring = tmp; } + // Now we are rotating the ring to make the first/last point + // one that would be unlikely to be simplified away. + // calculate centroid // a + 1 < size() because point 0 is duplicated at the end long long xtotal = 0; diff --git a/geometry.hpp b/geometry.hpp index edebe1fb..f966201b 100644 --- a/geometry.hpp +++ b/geometry.hpp @@ -48,6 +48,10 @@ struct draw { } } + bool operator>(draw const &s) const { + return s < *this; + } + bool operator==(draw const &s) const { return y == s.y && x == s.x; } @@ -73,7 +77,7 @@ drawvec clip_lines(drawvec &geom, int z, long long buffer); drawvec stairstep(drawvec &geom, int z, int detail); bool point_within_tile(long long x, long long y, int z); int quick_check(long long *bbox, int z, long long buffer); -drawvec simplify_lines(drawvec &geom, int z, int detail, bool mark_tile_bounds, double simplification, size_t retain, drawvec const &shared_nodes); +drawvec simplify_lines(drawvec &geom, int z, int tx, int ty, int detail, bool mark_tile_bounds, double simplification, size_t retain, drawvec const &shared_nodes, struct node *shared_nodes_map, size_t nodepos); drawvec reorder_lines(drawvec &geom); drawvec fix_polygon(drawvec &geom); std::vector chop_polygon(std::vector &geoms); diff --git a/main.cpp b/main.cpp index 1ec69d4a..2c303a99 100644 --- a/main.cpp +++ b/main.cpp @@ -65,6 +65,7 @@ #include "text.hpp" #include "errors.hpp" #include "read_json.hpp" +#include "sort.hpp" static int low_detail = 12; static int full_detail = -1; @@ -121,7 +122,8 @@ void checkdisk(std::vector *r) { for (size_t i = 0; i < r->size(); i++) { // Pool and tree are used once. // Geometry and index will be duplicated during sorting and tiling. - used += 2 * (*r)[i].geompos + 2 * (*r)[i].indexpos + (*r)[i].poolfile->off + (*r)[i].treefile->off; + used += 2 * (*r)[i].geompos + 2 * (*r)[i].indexpos + (*r)[i].poolfile->off + (*r)[i].treefile->off + + (*r)[i].vertexpos + (*r)[i].nodepos; } static int warned = 0; @@ -1207,6 +1209,34 @@ void choose_first_zoom(long long *file_bbox, long long *file_bbox1, long long *f } } +int vertexcmp(const void *void1, const void *void2) { + vertex *v1 = (vertex *) void1; + vertex *v2 = (vertex *) void2; + + if (v1->mid < v2->mid) { + return -1; + } + if (v1->mid > v2->mid) { + return 1; + } + + if (v1->p1 < v2->p1) { + return -1; + } + if (v1->p1 > v2->p1) { + return 1; + } + + if (v1->p2 < v2->p2) { + return -1; + } + if (v1->p2 > v2->p2) { + return 1; + } + + return 0; +} + std::pair read_input(std::vector &sources, char *fname, int maxzoom, int minzoom, int basezoom, double basezoom_marker_width, sqlite3 *outdb, const char *outdir, std::set *exclude, std::set *include, int exclude_all, json_object *filter, double droprate, int buffer, const char *tmpdir, double gamma, int read_parallel, int forcetable, const char *attribution, bool uses_gamma, long long *file_bbox, long long *file_bbox1, long long *file_bbox2, const char *prefilter, const char *postfilter, const char *description, bool guess_maxzoom, bool guess_cluster_maxzoom, std::map const *attribute_types, const char *pgm, std::map const *attribute_accum, std::map const &attribute_descriptions, std::string const &commandline, int minimum_maxzoom) { int ret = EXIT_SUCCESS; @@ -1219,11 +1249,15 @@ std::pair read_input(std::vector &sources, char *fname, i char treename[strlen(tmpdir) + strlen("/tree.XXXXXXXX") + 1]; char geomname[strlen(tmpdir) + strlen("/geom.XXXXXXXX") + 1]; char indexname[strlen(tmpdir) + strlen("/index.XXXXXXXX") + 1]; + char vertexname[strlen(tmpdir) + strlen("/vertex.XXXXXXXX") + 1]; + char nodename[strlen(tmpdir) + strlen("/node.XXXXXXXX") + 1]; snprintf(poolname, sizeof(poolname), "%s%s", tmpdir, "/pool.XXXXXXXX"); snprintf(treename, sizeof(treename), "%s%s", tmpdir, "/tree.XXXXXXXX"); snprintf(geomname, sizeof(geomname), "%s%s", tmpdir, "/geom.XXXXXXXX"); snprintf(indexname, sizeof(indexname), "%s%s", tmpdir, "/index.XXXXXXXX"); + snprintf(vertexname, sizeof(vertexname), "%s%s", tmpdir, "/vertex.XXXXXXXX"); + snprintf(nodename, sizeof(nodename), "%s%s", tmpdir, "/node.XXXXXXXX"); r->poolfd = mkstemp_cloexec(poolname); if (r->poolfd < 0) { @@ -1245,6 +1279,16 @@ std::pair read_input(std::vector &sources, char *fname, i perror(indexname); exit(EXIT_OPEN); } + r->vertexfd = mkstemp_cloexec(vertexname); + if (r->vertexfd < 0) { + perror(vertexname); + exit(EXIT_OPEN); + } + r->nodefd = mkstemp_cloexec(nodename); + if (r->nodefd < 0) { + perror(nodename); + exit(EXIT_OPEN); + } r->poolfile = memfile_open(r->poolfd); if (r->poolfile == NULL) { @@ -1266,13 +1310,27 @@ std::pair read_input(std::vector &sources, char *fname, i perror(indexname); exit(EXIT_OPEN); } + r->vertexfile = fopen_oflag(vertexname, "w+b", O_RDWR | O_CLOEXEC); + if (r->vertexfile == NULL) { + perror(("open vertexfile " + std::string(vertexname)).c_str()); + exit(EXIT_OPEN); + } + r->nodefile = fopen_oflag(nodename, "w+b", O_RDWR | O_CLOEXEC); + if (r->nodefile == NULL) { + perror(nodename); + exit(EXIT_OPEN); + } r->geompos = 0; r->indexpos = 0; + r->vertexpos = 0; + r->nodepos = 0; unlink(poolname); unlink(treename); unlink(geomname); unlink(indexname); + unlink(vertexname); + unlink(nodename); // To distinguish a null value { @@ -1842,6 +1900,9 @@ std::pair read_input(std::vector &sources, char *fname, i fflush(stderr); } + std::atomic vertexpos(0); + std::atomic nodepos(0); + for (size_t i = 0; i < CPUS; i++) { if (fclose(readers[i].geomfile) != 0) { perror("fclose geom"); @@ -1857,6 +1918,13 @@ std::pair read_input(std::vector &sources, char *fname, i perror("stat geom\n"); exit(EXIT_STAT); } + + vertexpos += readers[i].vertexpos; + nodepos += readers[i].nodepos; + } + + if (!quiet) { + fprintf(stderr, "Merging string pool \r"); } // Create a combined string pool @@ -1885,7 +1953,6 @@ std::pair read_input(std::vector &sources, char *fname, i } unlink(poolname); - std::atomic poolpos(0); for (size_t i = 0; i < CPUS; i++) { @@ -1949,6 +2016,162 @@ std::pair read_input(std::vector &sources, char *fname, i madvise(stringpool, poolpos, MADV_RANDOM); } + if (!quiet) { + fprintf(stderr, "Merging vertices \r"); + } + + // Sort the vertices; + // find nodes where the same central point is part of two different vertices + { + std::string tmpname = std::string(tmpdir) + "/vertex2.XXXXXX"; + int vertexfd = mkstemp((char *) tmpname.c_str()); + if (vertexfd < 0) { + perror(("mkstemp vertexfile " + std::string(tmpname)).c_str()); + exit(EXIT_OPEN); + } + unlink(tmpname.c_str()); + FILE *vertex_out = fdopen(vertexfd, "w+b"); + if (vertex_out == NULL) { + perror(tmpname.c_str()); + exit(EXIT_OPEN); + } + + std::vector vertex_readers; + for (size_t i = 0; i < CPUS; i++) { + vertex_readers.push_back(readers[i].vertexfile); + rewind(readers[i].vertexfile); + } + fqsort(vertex_readers, sizeof(vertex), vertexcmp, vertex_out, memsize / 10); + + for (size_t i = 0; i < CPUS; i++) { + if (fclose(readers[i].vertexfile) != 0) { + perror("fclose vertex"); + exit(EXIT_CLOSE); + } + } + + rewind(vertex_out); + + vertex prev(draw(VT_MOVETO, 0, 0), draw(VT_MOVETO, 0, 0), draw(VT_MOVETO, 0, 0)); + vertex v(draw(VT_MOVETO, 0, 0), draw(VT_MOVETO, 0, 0), draw(VT_MOVETO, 0, 0)); + while (fread((void *) &v, sizeof(vertex), 1, vertex_out)) { + if (v.mid == prev.mid && (v.p1 != prev.p1 || v.p2 != prev.p2)) { + long long x = v.mid.x * (1LL << geometry_scale); + long long y = v.mid.y * (1LL << geometry_scale); + +#if 0 + double lon, lat; + tile2lonlat(x, y, 32, &lon, &lat); + printf("{\"type\":\"Feature\", \"properties\":{}, \"geometry\":{\"type\":\"Point\", \"coordinates\":[%f,%f]}}\n", lon, lat); +#endif + + struct node n; + n.index = encode_quadkey((unsigned) x, (unsigned) y); + + fwrite_check((char *) &n, sizeof(struct node), 1, readers[0].nodefile, &readers[0].nodepos, "vertices"); + } + prev = v; + } + + fclose(vertex_out); + } + + if (!quiet) { + fprintf(stderr, "Merging nodes \r"); + } + + // Sort nodes that can't be simplified away; scan the list to remove duplicates + + FILE *shared_nodes; + node *shared_nodes_map = NULL; // will be null if there are no shared nodes + { + // sort + + std::string tmpname = std::string(tmpdir) + "/node2.XXXXXX"; + int nodefd = mkstemp((char *) tmpname.c_str()); + if (nodefd < 0) { + perror(("mkstemp nodefile " + std::string(tmpname)).c_str()); + exit(EXIT_OPEN); + } + unlink(tmpname.c_str()); + FILE *node_out; + node_out = fdopen(nodefd, "w+b"); + if (node_out == NULL) { + perror(tmpname.c_str()); + exit(EXIT_OPEN); + } + + std::vector node_readers; + for (size_t i = 0; i < CPUS; i++) { + node_readers.push_back(readers[i].nodefile); + rewind(readers[i].nodefile); + } + + fqsort(node_readers, sizeof(node), nodecmp, node_out, memsize / 10); + + for (size_t i = 0; i < CPUS; i++) { + if (fclose(readers[i].nodefile) != 0) { + perror("fclose node"); + exit(EXIT_CLOSE); + } + } + + rewind(node_out); + + // scan + + tmpname = std::string(tmpdir) + "/node3.XXXXXX"; + nodefd = mkstemp((char *) tmpname.c_str()); + if (nodefd < 0) { + perror(("mkstemp nodefile " + std::string(tmpname)).c_str()); + exit(EXIT_OPEN); + } + unlink(tmpname.c_str()); + shared_nodes = fdopen(nodefd, "w+b"); + if (shared_nodes == NULL) { + perror(tmpname.c_str()); + exit(EXIT_OPEN); + } + + // `written` is to see if this node has already been preserved + // and doesn't need to be preserved again + struct node written; + written.index = ULONG_MAX; + + nodepos = 0; + struct node here; + while (fread((void *) &here, sizeof(here), 1, node_out)) { + if (nodecmp((void *) &here, (void *) &written) != 0) { + fwrite_check((void *) &here, sizeof(here), 1, shared_nodes, &nodepos, "shared nodes"); + written = here; + +#if 0 + unsigned wx, wy; + decode_quadkey(here.index, &wx, &wy); + double lon, lat; + tile2lonlat(wx, wy, 32, &lon, &lat); + printf("{\"type\":\"Feature\", \"properties\":{}, \"geometry\":{\"type\":\"Point\", \"coordinates\":[%f,%f]}}\n", lon, lat); +#endif + } + } + + fflush(shared_nodes); + + if (nodepos > 0) { + shared_nodes_map = (node *) mmap(NULL, nodepos, PROT_READ, MAP_PRIVATE, nodefd, 0); + if (shared_nodes_map == (node *) MAP_FAILED) { + perror("mmap nodes"); + exit(EXIT_MEMORY); + } + } + + fclose(node_out); + } + + if (!quiet) { + fprintf(stderr, "Merging index \r"); + } + char indexname[strlen(tmpdir) + strlen("/index.XXXXXXXX") + 1]; snprintf(indexname, sizeof(indexname), "%s%s", tmpdir, "/index.XXXXXXXX"); @@ -2023,7 +2246,9 @@ std::pair read_input(std::vector &sources, char *fname, i long long s = progress_seq; long long geompos_print = geompos; long long poolpos_print = poolpos; - fprintf(stderr, "%lld features, %lld bytes of geometry, %lld bytes of string pool\n", s, geompos_print, poolpos_print); + long long vertexpos_print = vertexpos; + long long nodepos_print = nodepos; + fprintf(stderr, "%lld features, %lld bytes of geometry and attributes, %lld bytes of string pool, %lld bytes of vertices, %lld bytes of nodes\n", s, geompos_print, poolpos_print, vertexpos_print, nodepos_print); } if (indexpos == 0) { @@ -2532,7 +2757,7 @@ std::pair read_input(std::vector &sources, char *fname, i std::atomic midx(0); std::atomic midy(0); std::vector strategies; - int written = traverse_zooms(fd, size, stringpool, &midx, &midy, maxzoom, minzoom, outdb, outdir, buffer, fname, tmpdir, gamma, full_detail, low_detail, min_detail, pool_off, initial_x, initial_y, simplification, maxzoom_simplification, layermaps, prefilter, postfilter, attribute_accum, filter, strategies, iz); + int written = traverse_zooms(fd, size, stringpool, &midx, &midy, maxzoom, minzoom, outdb, outdir, buffer, fname, tmpdir, gamma, full_detail, low_detail, min_detail, pool_off, initial_x, initial_y, simplification, maxzoom_simplification, layermaps, prefilter, postfilter, attribute_accum, filter, strategies, iz, shared_nodes_map, nodepos); if (maxzoom != written) { if (written > minzoom) { @@ -2555,6 +2780,8 @@ std::pair read_input(std::vector &sources, char *fname, i perror("close pool"); } + fclose(shared_nodes); + // mbtiles-style bounding box and center double minlat = 0, minlon = 0, maxlat = 0, maxlon = 0, midlat = 0, midlon = 0; diff --git a/man/tippecanoe.1 b/man/tippecanoe.1 index 53a7fb97..a1abaaf2 100644 --- a/man/tippecanoe.1 +++ b/man/tippecanoe.1 @@ -54,7 +54,7 @@ $ tippecanoe \-o file.mbtiles [options] [file.json file.json.gz file.fgb ...] .RE .PP If no files are specified, it reads GeoJSON from the standard input. -If multiple files are specified, each is placed in its own layer. +If multiple files are specified, each is placed in its own layer \[la]#input-files-and-layer-names\[ra]\&. .PP The GeoJSON features need not be wrapped in a FeatureCollection. You can concatenate multiple GeoJSON features or files together, @@ -629,7 +629,7 @@ the line or polygon within one tile unit of its proper location. You can probabl .IP \(bu 2 \fB\fC\-\-simplification\-at\-maximum\-zoom=\fR\fIscale\fP: Use the specified \fIscale\fP at maxzoom instead of the standard simplification scale (which still applies at lower zooms) .IP \(bu 2 -\fB\fC\-pn\fR or \fB\fC\-\-no\-simplification\-of\-shared\-nodes\fR: Don't simplify away nodes that appear in more than one feature or are used multiple times within the same feature, so that the intersection node will not be lost from intersecting roads. (This will not be effective if you also use \fB\fC\-\-coalesce\fR\&.) For polygons, the vertices where polygon rings meet will be detected, and the shared edges between the polygons will be simplified identically if possible. Use this instead of \fB\fC\-\-detect\-shared\-borders\fR\&. +\fB\fC\-pn\fR or \fB\fC\-\-no\-simplification\-of\-shared\-nodes\fR: Don't simplify away nodes at which LineStrings or Polygon rings converge, diverge, or cross. (This will not be effective if you also use \fB\fC\-\-coalesce\fR\&.) In between intersection nodes, LineString segments or polygon edges will be simplified identically in each feature if possible. Use this instead of \fB\fC\-\-detect\-shared\-borders\fR\&. .IP \(bu 2 \fB\fC\-pt\fR or \fB\fC\-\-no\-tiny\-polygon\-reduction\fR: Don't combine the area of very small polygons into small squares that represent their combined area. .IP \(bu 2 diff --git a/serial.cpp b/serial.cpp index a462c920..9d6f7370 100644 --- a/serial.cpp +++ b/serial.cpp @@ -393,6 +393,29 @@ static std::string strip_zeroes(std::string s) { return s; } +int nodecmp(const void *void1, const void *void2) { + node *n1 = (node *) void1; + node *n2 = (node *) void2; + + if (n1->index < n2->index) { + return -1; + } else if (n1->index > n2->index) { + return 1; + } + + return 0; +} + +static void add_scaled_node(struct reader *r, serialization_state *sst, draw g) { + long long x = SHIFT_LEFT(g.x); + long long y = SHIFT_LEFT(g.y); + + struct node n; + n.index = encode_quadkey((unsigned) x, (unsigned) y); + + fwrite_check((char *) &n, sizeof(struct node), 1, r->nodefile, &r->nodepos, sst->fname); +} + // called from frontends int serialize_feature(struct serialization_state *sst, serial_feature &sf) { struct reader *r = &(*sst->readers)[sst->segment]; @@ -446,11 +469,12 @@ int serialize_feature(struct serialization_state *sst, serial_feature &sf) { scaled_geometry = simple_clip_poly(scaled_geometry, SHIFT_RIGHT(c.minx), SHIFT_RIGHT(c.miny), SHIFT_RIGHT(c.maxx), SHIFT_RIGHT(c.maxy), prevent[P_SIMPLIFY_SHARED_NODES]); } else if (sf.t == VT_LINE) { scaled_geometry = clip_lines(scaled_geometry, SHIFT_RIGHT(c.minx), SHIFT_RIGHT(c.miny), SHIFT_RIGHT(c.maxx), SHIFT_RIGHT(c.maxy)); - scaled_geometry = remove_noop(scaled_geometry, sf.t, 0); } else if (sf.t == VT_POINT) { scaled_geometry = clip_point(scaled_geometry, SHIFT_RIGHT(c.minx), SHIFT_RIGHT(c.miny), SHIFT_RIGHT(c.maxx), SHIFT_RIGHT(c.maxy)); } + scaled_geometry = remove_noop(scaled_geometry, sf.t, 0); + sf.bbox[0] = LLONG_MAX; sf.bbox[1] = LLONG_MAX; sf.bbox[2] = LLONG_MIN; @@ -480,6 +504,100 @@ int serialize_feature(struct serialization_state *sst, serial_feature &sf) { return 1; } + if (prevent[P_SIMPLIFY_SHARED_NODES]) { + scaled_geometry = remove_noop(scaled_geometry, sf.t, 0); + + if (sf.t == VT_POLYGON || sf.t == VT_LINE) { + for (size_t i = 0; i < scaled_geometry.size(); i++) { + if (scaled_geometry[i].op == VT_MOVETO) { + size_t j; + + for (j = i + 1; j < scaled_geometry.size(); j++) { + if (scaled_geometry[j].op != VT_LINETO) { + break; + } + } + + if (sf.t == VT_POLYGON && j - i >= 4) { + for (size_t k = i; k < j - 1; k++) { + // % (j - i - 1) because we don't want the duplicate last point + + struct vertex v( + scaled_geometry[(k - i + 0) % (j - i - 1) + i], + scaled_geometry[(k - i + 1) % (j - i - 1) + i], + scaled_geometry[(k - i + 2) % (j - i - 1) + i]); + + fwrite_check((char *) &v, sizeof(struct vertex), 1, r->vertexfile, &r->vertexpos, sst->fname); + } + } else if (sf.t == VT_LINE && j - i >= 2) { + for (size_t k = i; k + 2 < j; k++) { + struct vertex v( + scaled_geometry[k + 0], + scaled_geometry[k + 1], + scaled_geometry[k + 2]); + + fwrite_check((char *) &v, sizeof(struct vertex), 1, r->vertexfile, &r->vertexpos, sst->fname); + } + } + + // since the starting point is never simplified away, + // don't let it be simplified away in any other polygons either. + // Needs to appear twice here so that the check below will see + // it as appearing in multiple features. + add_scaled_node(r, sst, scaled_geometry[i]); + + if (sf.t == VT_LINE && j - i >= 2) { + // linestrings also need to preserve the last point + + add_scaled_node(r, sst, scaled_geometry[j - 1]); + } else if (sf.t == VT_POLYGON && j - i >= 4) { + // To avoid letting polygons get simplified away to nothing, + // also keep the furthest-away point from the initial point + // (which Douglas-Peucker simplification would keep anyway, + // if its search weren't being split up by polygon side). + + double far = 0; + size_t which = i; + for (size_t k = i + 1; k < j - 1; k++) { + double xd = scaled_geometry[k].x - scaled_geometry[i].x; + double yd = scaled_geometry[k].y - scaled_geometry[i].y; + double d = xd * xd + yd * yd; + if (d > far || + ((d == far) && (scaled_geometry[k] < scaled_geometry[which]))) { + far = d; + which = k; + } + } + + add_scaled_node(r, sst, scaled_geometry[which]); + + // And, likewise, the point most distant from those two points, + // which probably would also be the one that Douglas-Peucker + // would keep next. + + far = 0; + size_t which2 = i; + + for (size_t k = i + 1; k < j - 1; k++) { + double d = distance_from_line(scaled_geometry[k].x, scaled_geometry[k].y, + scaled_geometry[i].x, scaled_geometry[i].y, + scaled_geometry[which].x, scaled_geometry[which].y); + if ((d > far) || + ((d == far) && (scaled_geometry[k] < scaled_geometry[which2]))) { + far = d; + which2 = k; + } + } + + add_scaled_node(r, sst, scaled_geometry[which2]); + } + + i = j - 1; + } + } + } + } + if (!sf.has_id) { if (additional[A_GENERATE_IDS]) { sf.has_id = true; @@ -583,7 +701,9 @@ int serialize_feature(struct serialization_state *sst, serial_feature &sf) { for (size_t i = 0; i < scaled_geometry.size(); i++) { ix += scaled_geometry[i].x + scaled_geometry[i].y; } - ix = ix % scaled_geometry.size(); + if (scaled_geometry.size() != 0) { + ix = ix % scaled_geometry.size(); + } // If off the edge of the plane, mask to bring it back into the addressable area midx = SHIFT_LEFT(scaled_geometry[ix].x) & ((1LL << 32) - 1); diff --git a/serial.hpp b/serial.hpp index bb1879e8..a465bfd6 100644 --- a/serial.hpp +++ b/serial.hpp @@ -78,14 +78,20 @@ struct reader { int treefd = -1; int geomfd = -1; int indexfd = -1; + int vertexfd = -1; + int nodefd = -1; struct memfile *poolfile = NULL; struct memfile *treefile = NULL; FILE *geomfile = NULL; FILE *indexfile = NULL; + FILE *vertexfile = NULL; + FILE *nodefile = NULL; std::atomic geompos; std::atomic indexpos; + std::atomic vertexpos; + std::atomic nodepos; long long file_bbox[4] = {0, 0, 0, 0}; @@ -97,7 +103,7 @@ struct reader { char *geom_map = NULL; reader() - : geompos(0), indexpos(0) { + : geompos(0), indexpos(0), vertexpos(0), nodepos(0) { } reader(reader const &r) { @@ -105,11 +111,15 @@ struct reader { treefd = r.treefd; geomfd = r.geomfd; indexfd = r.indexfd; + vertexfd = r.vertexfd; + nodefd = r.nodefd; poolfile = r.poolfile; treefile = r.treefile; geomfile = r.geomfile; indexfile = r.indexfile; + vertexfile = r.vertexfile; + nodefile = r.nodefile; long long p = r.geompos; geompos = p; @@ -117,6 +127,12 @@ struct reader { p = r.indexpos; indexpos = p; + p = r.vertexpos; + vertexpos = p; + + p = r.nodepos; + nodepos = p; + memcpy(file_bbox, r.file_bbox, sizeof(file_bbox)); geomst = r.geomst; @@ -158,6 +174,52 @@ struct serialization_state { int exclude_all = 0; }; +struct vertex { + // these are scaled geometry, + // but because scaling is disabled if P_SHARED_NODES is set, + // they are effectively also world coordinates + draw p1; + draw mid; + draw p2; + + vertex(draw one, draw joint, draw two) { + if (one < two) { + p1 = one; + p2 = two; + } else { + p1 = two; + p2 = one; + } + + mid = joint; + } + + bool operator<(const vertex &v) const { + if (mid < v.mid) { + return true; + } else if (mid == v.mid) { + if (p1 < v.p1) { + return true; + } else if (p1 == v.p1) { + if (p2 < v.p2) { + return true; + } + } + } + + return false; + } +}; + +struct node { + // this is in quadkey coordinates so that the nodes for each tile + // will be adjacent in memory, reducing potential thrashing during + // the binary search. + unsigned long long index; +}; + +int nodecmp(const void *void1, const void *void2); + int serialize_feature(struct serialization_state *sst, serial_feature &sf); void coerce_value(std::string const &key, int &vt, std::string &val, std::map const *attribute_types); diff --git a/sort.cpp b/sort.cpp new file mode 100644 index 00000000..4edb4959 --- /dev/null +++ b/sort.cpp @@ -0,0 +1,123 @@ +#include +#include +#include +#include +#include + +#define MAX_MEMORY (10 * 1024 * 1024) + +void fqsort(std::vector &inputs, size_t width, int (*cmp)(const void *, const void *), FILE *out, size_t mem) { + std::string pivot; + FILE *fp1, *fp2; + + { + // read some elements into memory to choose a pivot from + // + // this is in its own scope so `buf` can go out of scope + // before trying to do any sub-sorts. + + std::string buf; + + bool read_everything = false; + for (size_t i = 0; i < inputs.size(); i++) { + if (buf.size() > mem) { + break; + } + + while (true) { + std::string element; + element.resize(width); + + size_t n = fread((void *) element.c_str(), width, 1, inputs[i]); + if (n == 0) { + if (i + 1 == inputs.size()) { + read_everything = true; + } + break; + } + + buf.append(element); + + if (buf.size() > mem) { + break; + } + } + } + + qsort((void *) buf.c_str(), buf.size() / width, width, cmp); + + // If that was everything we have to sort, we are done. + + if (read_everything) { + fwrite((void *) buf.c_str(), buf.size() / width, width, out); + return; + } + + // Otherwise, choose a pivot from it, make some temporary files, + // write what we have to those files, and then partition the rest + // of the input into them. + + // This would be unstable if the pivot is one of several elements + // that compare equal. Does it matter? + + size_t pivot_off = width * (buf.size() / width / 2); + pivot = std::string(buf, pivot_off, width); + + std::string t1 = "/tmp/sort1.XXXXXX"; + std::string t2 = "/tmp/sort2.XXXXXX"; + + int fd1 = mkstemp((char *) t1.c_str()); + unlink(t1.c_str()); + int fd2 = mkstemp((char *) t2.c_str()); + unlink(t2.c_str()); + + fp1 = fdopen(fd1, "w+b"); + if (fp1 == NULL) { + perror(t1.c_str()); + exit(EXIT_FAILURE); + } + fp2 = fdopen(fd2, "w+b"); + if (fp2 == NULL) { + perror(t2.c_str()); + exit(EXIT_FAILURE); + } + + fwrite((void *) buf.c_str(), sizeof(char), pivot_off, fp1); + fwrite((void *) ((char *) buf.c_str() + pivot_off), sizeof(char), buf.size() - pivot_off, fp2); + } + + // read the remaining input into the temporary files + + for (size_t i = 0; i < inputs.size(); i++) { + while (true) { + std::string element; + element.resize(width); + + size_t n = fread((void *) element.c_str(), width, 1, inputs[i]); + if (n == 0) { + break; + } + + if (cmp((void *) element.c_str(), (void *) pivot.c_str()) < 0) { + fwrite((void *) element.c_str(), width, 1, fp1); + } else { + fwrite((void *) element.c_str(), width, 1, fp2); + } + } + } + + // Now sort the sub-ranges into the output. + + rewind(fp1); + rewind(fp2); + + std::vector v1; + v1.emplace_back(fp1); + fqsort(v1, width, cmp, out, mem); + fclose(fp1); + + std::vector v2; + v2.emplace_back(fp2); + fqsort(v2, width, cmp, out, mem); + fclose(fp2); +} diff --git a/sort.hpp b/sort.hpp new file mode 100644 index 00000000..cfae2cf9 --- /dev/null +++ b/sort.hpp @@ -0,0 +1,6 @@ +#ifndef SORT_HPP +#define SORT_HPP + +void fqsort(std::vector &inputs, size_t width, int (*cmp)(const void *, const void *), FILE *out, size_t mem); + +#endif diff --git a/tests/ne_110m_admin_0_countries/out/-z1_-yname_--no-simplification-of-shared-nodes.json b/tests/ne_110m_admin_0_countries/out/-z1_-yname_--no-simplification-of-shared-nodes.json index f2e3baf5..d370bc67 100644 --- a/tests/ne_110m_admin_0_countries/out/-z1_-yname_--no-simplification-of-shared-nodes.json +++ b/tests/ne_110m_admin_0_countries/out/-z1_-yname_--no-simplification-of-shared-nodes.json @@ -367,7 +367,7 @@ , { "type": "Feature", "properties": { "name": "New Zealand" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 172.792969, -40.513799 ], [ 173.232422, -41.310824 ], [ 173.935547, -40.913513 ], [ 174.287109, -41.376809 ], [ 174.287109, -41.771312 ], [ 173.232422, -42.940339 ], [ 172.705078, -43.389082 ], [ 173.056641, -43.834527 ], [ 172.265625, -43.834527 ], [ 171.474609, -44.213710 ], [ 170.595703, -45.890008 ], [ 169.365234, -46.619261 ], [ 168.398438, -46.619261 ], [ 167.783203, -46.316584 ], [ 166.640625, -46.195042 ], [ 166.552734, -45.828799 ], [ 167.080078, -45.089036 ], [ 168.310547, -44.150681 ], [ 168.925781, -43.961191 ], [ 170.507812, -43.004647 ], [ 171.123047, -42.488302 ], [ 171.562500, -41.771312 ], [ 171.914062, -41.508577 ], [ 172.089844, -40.979898 ], [ 172.792969, -40.513799 ] ] ], [ [ [ -187.031250, -43.197167 ], [ -187.031250, -40.847060 ], [ -186.767578, -41.310824 ], [ -186.064453, -40.913513 ], [ -185.712891, -41.376809 ], [ -185.712891, -41.771312 ], [ -187.031250, -43.197167 ] ] ], [ [ [ 172.968750, -34.452218 ], [ 173.583984, -35.029996 ], [ 174.287109, -35.245619 ], [ 174.638672, -36.173357 ], [ 175.341797, -37.230328 ], [ 175.341797, -36.527295 ], [ 175.781250, -36.809285 ], [ 175.957031, -37.579413 ], [ 176.748047, -37.857507 ], [ 177.451172, -37.926868 ], [ 177.978516, -37.579413 ], [ 178.505859, -37.718590 ], [ 177.978516, -39.164141 ], [ 177.187500, -39.164141 ], [ 176.923828, -39.436193 ], [ 177.011719, -39.909736 ], [ 176.044922, -41.310824 ], [ 175.253906, -41.705729 ], [ 175.078125, -41.442726 ], [ 174.638672, -41.310824 ], [ 175.253906, -40.446947 ], [ 174.902344, -39.909736 ], [ 173.847656, -39.504041 ], [ 173.847656, -39.164141 ], [ 174.550781, -38.822591 ], [ 174.726562, -37.996163 ], [ 174.726562, -37.370157 ], [ 174.287109, -36.738884 ], [ 174.287109, -36.527295 ], [ 173.056641, -35.245619 ], [ 172.617188, -34.524661 ], [ 172.968750, -34.452218 ] ] ], [ [ [ -187.031250, -34.452218 ], [ -186.416016, -35.029996 ], [ -185.712891, -35.245619 ], [ -185.361328, -36.173357 ], [ -184.658203, -37.230328 ], [ -184.658203, -36.527295 ], [ -184.218750, -36.809285 ], [ -184.042969, -37.579413 ], [ -183.251953, -37.857507 ], [ -182.548828, -37.926868 ], [ -182.021484, -37.579413 ], [ -181.494141, -37.718590 ], [ -182.021484, -39.164141 ], [ -182.812500, -39.164141 ], [ -183.076172, -39.436193 ], [ -182.988281, -39.909736 ], [ -183.955078, -41.310824 ], [ -184.746094, -41.705729 ], [ -184.921875, -41.442726 ], [ -185.361328, -41.310824 ], [ -184.746094, -40.446947 ], [ -185.097656, -39.909736 ], [ -186.152344, -39.504041 ], [ -186.152344, -39.164141 ], [ -185.449219, -38.822591 ], [ -185.273438, -37.996163 ], [ -185.273438, -37.370157 ], [ -185.712891, -36.738884 ], [ -185.712891, -36.527295 ], [ -187.031250, -35.101934 ], [ -187.031250, -34.452218 ] ] ], [ [ [ -187.031250, -43.197167 ], [ -186.943359, -43.834527 ], [ -187.031250, -43.834527 ], [ -187.031250, -43.197167 ] ] ] ] } } , -{ "type": "Feature", "properties": { "name": "Antarctica" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -46.669922, -77.823323 ], [ -45.175781, -78.043795 ], [ -43.945312, -78.473002 ], [ -43.505859, -79.088462 ], [ -43.330078, -80.027655 ], [ -44.912109, -80.342262 ], [ -46.494141, -80.589727 ], [ -48.427734, -80.830907 ], [ -50.449219, -81.024916 ], [ -52.822266, -80.969904 ], [ -54.140625, -80.632740 ], [ -53.964844, -80.223588 ], [ -51.855469, -79.951265 ], [ -50.976562, -79.608215 ], [ -49.921875, -78.819036 ], [ -48.691406, -78.043795 ], [ -48.164062, -78.043795 ], [ -46.669922, -77.823323 ] ] ], [ [ [ -60.644531, -79.624056 ], [ -59.589844, -80.042864 ], [ -60.117188, -80.997452 ], [ -62.226562, -80.858875 ], [ -64.511719, -80.928426 ], [ -65.742188, -80.589727 ], [ -66.269531, -80.253391 ], [ -64.072266, -80.297927 ], [ -61.875000, -80.386396 ], [ -60.644531, -79.624056 ] ] ], [ [ [ -57.832031, -63.273182 ], [ -57.216797, -63.509375 ], [ -57.568359, -63.860036 ], [ -58.623047, -64.168107 ], [ -59.062500, -64.358931 ], [ -59.765625, -64.206377 ], [ -60.644531, -64.320872 ], [ -62.050781, -64.811557 ], [ -62.490234, -65.109148 ], [ -62.666016, -65.476508 ], [ -62.578125, -65.874725 ], [ -62.138672, -66.196009 ], [ -62.841797, -66.407955 ], [ -63.720703, -66.513260 ], [ -65.478516, -67.575717 ], [ -65.654297, -67.941650 ], [ -65.302734, -68.366801 ], [ -64.775391, -68.688521 ], [ -63.984375, -68.911005 ], [ -63.193359, -69.224997 ], [ -62.753906, -69.626510 ], [ -62.314453, -70.377854 ], [ -61.787109, -70.728979 ], [ -61.523438, -71.102543 ], [ -61.347656, -72.019729 ], [ -60.732422, -73.175897 ], [ -60.820312, -73.701948 ], [ -61.347656, -74.116047 ], [ -61.962891, -74.449358 ], [ -63.281250, -74.566736 ], [ -64.335938, -75.253057 ], [ -65.830078, -75.628632 ], [ -67.236328, -75.802118 ], [ -69.785156, -76.226907 ], [ -70.576172, -76.639226 ], [ -72.246094, -76.679785 ], [ -74.003906, -76.639226 ], [ -75.585938, -76.720223 ], [ -77.255859, -76.720223 ], [ -76.904297, -77.098423 ], [ -75.410156, -77.273855 ], [ -74.267578, -77.561042 ], [ -73.652344, -77.915669 ], [ -74.794922, -78.224513 ], [ -76.464844, -78.116408 ], [ -77.958984, -78.384855 ], [ -78.046875, -79.187834 ], [ -76.816406, -79.512662 ], [ -76.640625, -79.889737 ], [ -75.322266, -80.253391 ], [ -73.212891, -80.415707 ], [ -71.455078, -80.689789 ], [ -70.048828, -80.997452 ], [ -68.203125, -81.321593 ], [ -65.742188, -81.479293 ], [ -63.281250, -81.748454 ], [ -59.677734, -82.379147 ], [ -58.710938, -82.842440 ], [ -58.183594, -83.215693 ], [ -57.041016, -82.864308 ], [ -53.613281, -82.261699 ], [ -51.503906, -82.009169 ], [ -49.746094, -81.723188 ], [ -47.285156, -81.710526 ], [ -44.824219, -81.848756 ], [ -42.802734, -82.082145 ], [ -42.187500, -81.646927 ], [ -40.781250, -81.361287 ], [ -38.232422, -81.334844 ], [ -34.365234, -80.900669 ], [ -30.058594, -80.589727 ], [ -28.564453, -80.342262 ], [ -29.267578, -79.981891 ], [ -29.707031, -79.639874 ], [ -29.707031, -79.253586 ], [ -31.640625, -79.302640 ], [ -33.662109, -79.448477 ], [ -35.683594, -79.448477 ], [ -35.947266, -79.088462 ], [ -35.771484, -78.331648 ], [ -35.332031, -78.116408 ], [ -32.255859, -77.655346 ], [ -29.794922, -77.059116 ], [ -28.916016, -76.679785 ], [ -25.488281, -76.289542 ], [ -23.906250, -76.247817 ], [ -22.500000, -76.100796 ], [ -20.039062, -75.672197 ], [ -17.490234, -75.118222 ], [ -15.732422, -74.496413 ], [ -15.380859, -74.116047 ], [ -16.435547, -73.873717 ], [ -16.083984, -73.453473 ], [ -15.468750, -73.150440 ], [ -13.271484, -72.711903 ], [ -12.304688, -72.395706 ], [ -11.513672, -72.019729 ], [ -10.986328, -71.552741 ], [ -10.283203, -71.272595 ], [ -9.140625, -71.328950 ], [ -8.613281, -71.663663 ], [ -7.382812, -71.691293 ], [ -7.382812, -71.328950 ], [ -6.855469, -70.931004 ], [ -5.800781, -71.016960 ], [ -5.537109, -71.413177 ], [ -4.306641, -71.469124 ], [ -1.757812, -71.159391 ], [ -0.703125, -71.216075 ], [ -0.263672, -71.635993 ], [ 0.878906, -71.300793 ], [ 1.845703, -71.130988 ], [ 4.130859, -70.844673 ], [ 5.185547, -70.612614 ], [ 6.240234, -70.466207 ], [ 7.119141, -70.259452 ], [ 7.734375, -69.900118 ], [ 8.525391, -70.140364 ], [ 9.492188, -70.020587 ], [ 10.810547, -70.844673 ], [ 11.953125, -70.641769 ], [ 12.392578, -70.259452 ], [ 13.447266, -69.960439 ], [ 14.765625, -70.020587 ], [ 15.117188, -70.407348 ], [ 15.908203, -70.020587 ], [ 17.050781, -69.900118 ], [ 19.248047, -69.900118 ], [ 21.445312, -70.080562 ], [ 21.884766, -70.407348 ], [ 22.587891, -70.699951 ], [ 23.642578, -70.524897 ], [ 27.070312, -70.466207 ], [ 29.179688, -70.199994 ], [ 30.058594, -69.930300 ], [ 30.937500, -69.748551 ], [ 31.992188, -69.657086 ], [ 32.783203, -69.380313 ], [ 33.310547, -68.847665 ], [ 33.837891, -68.496040 ], [ 34.892578, -68.656555 ], [ 35.332031, -69.005675 ], [ 36.123047, -69.256149 ], [ 37.177734, -69.162558 ], [ 37.880859, -69.534518 ], [ 38.671875, -69.778952 ], [ 39.638672, -69.534518 ], [ 39.990234, -69.099940 ], [ 40.957031, -68.942607 ], [ 41.923828, -68.592487 ], [ 44.121094, -68.269387 ], [ 46.494141, -67.609221 ], [ 47.460938, -67.709445 ], [ 48.955078, -67.101656 ], [ 49.921875, -67.101656 ], [ 50.712891, -66.861082 ], [ 50.976562, -66.513260 ], [ 52.646484, -66.053716 ], [ 54.492188, -65.802776 ], [ 56.337891, -65.982270 ], [ 57.128906, -66.231457 ], [ 57.216797, -66.687784 ], [ 58.710938, -67.272043 ], [ 59.941406, -67.407487 ], [ 61.435547, -67.941650 ], [ 62.402344, -68.007571 ], [ 63.193359, -67.809245 ], [ 64.072266, -67.407487 ], [ 64.951172, -67.609221 ], [ 66.884766, -67.842416 ], [ 67.851562, -67.941650 ], [ 68.906250, -67.941650 ], [ 69.697266, -68.974164 ], [ 69.697266, -69.224997 ], [ 69.521484, -69.687618 ], [ 68.554688, -69.930300 ], [ 67.851562, -70.318738 ], [ 67.939453, -70.699951 ], [ 69.082031, -70.670881 ], [ 68.906250, -71.074056 ], [ 67.939453, -71.856229 ], [ 68.730469, -72.154890 ], [ 69.873047, -72.262310 ], [ 71.015625, -72.100944 ], [ 71.894531, -71.328950 ], [ 73.125000, -70.728979 ], [ 73.828125, -69.869892 ], [ 74.531250, -69.778952 ], [ 75.585938, -69.748551 ], [ 77.607422, -69.472969 ], [ 78.398438, -68.688521 ], [ 79.101562, -68.334376 ], [ 80.947266, -67.875541 ], [ 81.474609, -67.542167 ], [ 82.089844, -67.373698 ], [ 82.792969, -67.204032 ], [ 83.759766, -67.305976 ], [ 85.693359, -67.101656 ], [ 86.748047, -67.135829 ], [ 87.451172, -66.861082 ], [ 87.978516, -66.196009 ], [ 88.857422, -66.964476 ], [ 89.648438, -67.135829 ], [ 90.615234, -67.238062 ], [ 91.582031, -67.101656 ], [ 93.515625, -67.204032 ], [ 94.218750, -67.101656 ], [ 95.009766, -67.169955 ], [ 95.800781, -67.373698 ], [ 96.679688, -67.238062 ], [ 97.734375, -67.238062 ], [ 98.701172, -67.101656 ], [ 99.755859, -67.238062 ], [ 102.832031, -65.549367 ], [ 103.447266, -65.694476 ], [ 104.238281, -65.982270 ], [ 106.171875, -66.930060 ], [ 108.105469, -66.964476 ], [ 110.214844, -66.687784 ], [ 111.708984, -66.124962 ], [ 112.851562, -66.089364 ], [ 113.642578, -65.874725 ], [ 114.345703, -66.089364 ], [ 115.576172, -66.687784 ], [ 116.718750, -66.652977 ], [ 117.421875, -66.930060 ], [ 118.564453, -67.169955 ], [ 119.794922, -67.272043 ], [ 120.849609, -67.204032 ], [ 122.343750, -66.548263 ], [ 123.222656, -66.478208 ], [ 125.156250, -66.722541 ], [ 126.123047, -66.548263 ], [ 127.001953, -66.548263 ], [ 128.759766, -66.757250 ], [ 130.781250, -66.407955 ], [ 132.978516, -66.372755 ], [ 134.736328, -66.196009 ], [ 135.000000, -65.730626 ], [ 135.087891, -65.293468 ], [ 135.703125, -65.585720 ], [ 135.878906, -66.018018 ], [ 136.582031, -66.791909 ], [ 137.460938, -66.964476 ], [ 140.800781, -66.826520 ], [ 143.085938, -66.791909 ], [ 145.458984, -66.930060 ], [ 146.162109, -67.238062 ], [ 145.986328, -67.609221 ], [ 146.689453, -67.908619 ], [ 148.798828, -68.399180 ], [ 152.490234, -68.879358 ], [ 153.632812, -68.879358 ], [ 154.248047, -68.560384 ], [ 155.917969, -69.162558 ], [ 156.796875, -69.380313 ], [ 159.169922, -69.595890 ], [ 159.697266, -69.990535 ], [ 160.839844, -70.229744 ], [ 161.542969, -70.583418 ], [ 162.685547, -70.728979 ], [ 166.113281, -70.757966 ], [ 167.343750, -70.844673 ], [ 168.398438, -70.959697 ], [ 170.507812, -71.413177 ], [ 171.210938, -71.691293 ], [ 171.123047, -72.100944 ], [ 170.595703, -72.448792 ], [ 169.277344, -73.652545 ], [ 167.958984, -73.824820 ], [ 167.343750, -74.164085 ], [ 166.113281, -74.378513 ], [ 165.673828, -74.775843 ], [ 164.267578, -75.453071 ], [ 163.564453, -76.247817 ], [ 163.476562, -76.700019 ], [ 163.476562, -77.059116 ], [ 164.091797, -77.466028 ], [ 164.267578, -77.823323 ], [ 164.707031, -78.188586 ], [ 166.640625, -78.313860 ], [ 166.992188, -78.750659 ], [ 165.234375, -78.903929 ], [ 163.652344, -79.121686 ], [ 161.806641, -79.154810 ], [ 160.927734, -79.734281 ], [ 160.751953, -80.193694 ], [ 159.785156, -80.942273 ], [ 161.103516, -81.281717 ], [ 161.630859, -81.685144 ], [ 162.509766, -82.057893 ], [ 163.740234, -82.390794 ], [ 166.640625, -83.026219 ], [ 168.925781, -83.339153 ], [ 169.365234, -83.829945 ], [ 172.265625, -84.043447 ], [ 173.232422, -84.414502 ], [ 175.957031, -84.160849 ], [ 180.000000, -84.714152 ], [ 180.087891, -84.722243 ], [ 180.966797, -84.142939 ], [ 182.724609, -84.457112 ], [ 183.955078, -84.097922 ], [ 184.130859, -84.115970 ], [ 185.625000, -84.532994 ], [ 187.031250, -84.079819 ], [ 187.031250, -85.622069 ], [ 180.000000, -85.622069 ], [ -180.000000, -85.622069 ], [ -187.031250, -85.622069 ], [ -187.031250, -84.310902 ], [ -186.767578, -84.414502 ], [ -184.042969, -84.160849 ], [ -180.000000, -84.714152 ], [ -179.912109, -84.722243 ], [ -179.033203, -84.142939 ], [ -177.275391, -84.457112 ], [ -176.044922, -84.097922 ], [ -175.869141, -84.115970 ], [ -174.375000, -84.532994 ], [ -172.880859, -84.061661 ], [ -169.980469, -83.886366 ], [ -166.992188, -84.566386 ], [ -164.179688, -84.826305 ], [ -162.597656, -85.051129 ], [ -161.894531, -85.141284 ], [ -158.115234, -85.373767 ], [ -155.214844, -85.096413 ], [ -150.908203, -85.295131 ], [ -148.535156, -85.608630 ], [ -145.898438, -85.316708 ], [ -143.173828, -85.051129 ], [ -143.085938, -85.043541 ], [ -142.910156, -84.566386 ], [ -146.865234, -84.532994 ], [ -150.029297, -84.293450 ], [ -150.908203, -83.905058 ], [ -153.544922, -83.686615 ], [ -153.369141, -83.236426 ], [ -152.666016, -82.448764 ], [ -152.841797, -82.045740 ], [ -154.511719, -81.773644 ], [ -155.302734, -81.413933 ], [ -156.796875, -81.106811 ], [ -154.423828, -81.160996 ], [ -152.138672, -80.997452 ], [ -150.644531, -81.334844 ], [ -148.886719, -81.038617 ], [ -147.216797, -80.675559 ], [ -146.425781, -80.342262 ], [ -146.777344, -79.920548 ], [ -149.501953, -79.351472 ], [ -151.611328, -79.302640 ], [ -153.369141, -79.154810 ], [ -155.302734, -79.071812 ], [ -156.005859, -78.699106 ], [ -157.236328, -78.384855 ], [ -158.027344, -78.025574 ], [ -158.378906, -76.880775 ], [ -157.851562, -76.980149 ], [ -156.972656, -77.293202 ], [ -155.302734, -77.196176 ], [ -153.720703, -77.059116 ], [ -152.929688, -77.504119 ], [ -151.347656, -77.389504 ], [ -150.029297, -77.176684 ], [ -148.710938, -76.900709 ], [ -147.656250, -76.578159 ], [ -146.074219, -76.475773 ], [ -146.162109, -76.100796 ], [ -146.513672, -75.737303 ], [ -146.162109, -75.386696 ], [ -144.931641, -75.208245 ], [ -144.316406, -75.541113 ], [ -142.822266, -75.342282 ], [ -141.679688, -75.095633 ], [ -140.185547, -75.073010 ], [ -138.867188, -74.959392 ], [ -135.175781, -74.307353 ], [ -133.769531, -74.449358 ], [ -132.275391, -74.307353 ], [ -130.957031, -74.472903 ], [ -129.550781, -74.449358 ], [ -128.232422, -74.331108 ], [ -125.419922, -74.519889 ], [ -124.013672, -74.472903 ], [ -121.113281, -74.519889 ], [ -119.707031, -74.472903 ], [ -118.652344, -74.188052 ], [ -117.509766, -74.019543 ], [ -116.191406, -74.235878 ], [ -115.048828, -74.067866 ], [ -113.906250, -73.726595 ], [ -113.291016, -74.019543 ], [ -112.939453, -74.378513 ], [ -112.324219, -74.706450 ], [ -111.269531, -74.425777 ], [ -110.039062, -74.798906 ], [ -108.720703, -74.913708 ], [ -107.578125, -75.185789 ], [ -106.171875, -75.118222 ], [ -104.853516, -74.959392 ], [ -103.359375, -74.982183 ], [ -100.634766, -75.297735 ], [ -100.107422, -74.867889 ], [ -101.250000, -74.188052 ], [ -102.568359, -74.116047 ], [ -103.095703, -73.726595 ], [ -103.710938, -72.607120 ], [ -102.919922, -72.764065 ], [ -101.601562, -72.816074 ], [ -100.283203, -72.764065 ], [ -99.140625, -72.919635 ], [ -98.085938, -73.201317 ], [ -97.646484, -73.553302 ], [ -96.328125, -73.627789 ], [ -92.460938, -73.175897 ], [ -91.406250, -73.403338 ], [ -90.087891, -73.327858 ], [ -89.208984, -72.554498 ], [ -88.417969, -72.996909 ], [ -87.275391, -73.175897 ], [ -86.044922, -73.099413 ], [ -85.166016, -73.478485 ], [ -83.847656, -73.528399 ], [ -82.705078, -73.627789 ], [ -81.474609, -73.849286 ], [ -80.683594, -73.478485 ], [ -80.332031, -73.124945 ], [ -79.277344, -73.528399 ], [ -77.958984, -73.428424 ], [ -76.904297, -73.627789 ], [ -76.201172, -73.971078 ], [ -74.882812, -73.873717 ], [ -72.861328, -73.403338 ], [ -68.906250, -72.996909 ], [ -67.939453, -72.790088 ], [ -67.412109, -72.475276 ], [ -67.148438, -72.046840 ], [ -67.236328, -71.635993 ], [ -68.466797, -70.110485 ], [ -68.554688, -69.718107 ], [ -68.466797, -69.318320 ], [ -67.587891, -68.528235 ], [ -67.412109, -68.138852 ], [ -67.763672, -67.339861 ], [ -67.236328, -66.861082 ], [ -66.093750, -66.196009 ], [ -64.599609, -65.585720 ], [ -64.160156, -65.183030 ], [ -63.632812, -64.886265 ], [ -63.017578, -64.623877 ], [ -62.050781, -64.586185 ], [ -61.435547, -64.282760 ], [ -60.732422, -64.091408 ], [ -59.853516, -63.937372 ], [ -59.150391, -63.704722 ], [ -58.623047, -63.391522 ], [ -57.832031, -63.273182 ] ] ], [ [ [ -163.125000, -78.224513 ], [ -161.279297, -78.384855 ], [ -160.224609, -78.699106 ], [ -159.521484, -79.038437 ], [ -159.169922, -79.496652 ], [ -161.103516, -79.639874 ], [ -162.421875, -79.286313 ], [ -163.037109, -78.870048 ], [ -163.740234, -78.595299 ], [ -163.125000, -78.224513 ] ] ], [ [ [ -122.431641, -73.327858 ], [ -119.882812, -73.652545 ], [ -118.740234, -73.478485 ], [ -119.267578, -73.824820 ], [ -120.234375, -74.091974 ], [ -121.640625, -74.019543 ], [ -122.607422, -73.652545 ], [ -122.431641, -73.327858 ] ] ], [ [ [ -126.562500, -73.252045 ], [ -124.013672, -73.873717 ], [ -125.947266, -73.726595 ], [ -127.265625, -73.453473 ], [ -126.562500, -73.252045 ] ] ], [ [ [ -101.689453, -71.718882 ], [ -100.458984, -71.856229 ], [ -98.964844, -71.938158 ], [ -97.910156, -72.073911 ], [ -96.767578, -71.965388 ], [ -96.240234, -72.528130 ], [ -96.943359, -72.448792 ], [ -98.173828, -72.475276 ], [ -99.404297, -72.448792 ], [ -100.810547, -72.501722 ], [ -101.777344, -72.315785 ], [ -102.304688, -71.883578 ], [ -101.689453, -71.718882 ] ] ], [ [ [ -70.224609, -68.879358 ], [ -69.697266, -69.256149 ], [ -68.466797, -70.959697 ], [ -68.291016, -71.413177 ], [ -68.818359, -72.181804 ], [ -69.960938, -72.315785 ], [ -71.103516, -72.501722 ], [ -72.421875, -72.475276 ], [ -71.894531, -72.100944 ], [ -74.179688, -72.369105 ], [ -74.970703, -72.073911 ], [ -74.970703, -71.663663 ], [ -73.916016, -71.272595 ], [ -73.212891, -71.159391 ], [ -72.070312, -71.187754 ], [ -71.806641, -70.670881 ], [ -71.718750, -69.503765 ], [ -71.191406, -69.037142 ], [ -70.224609, -68.879358 ] ] ] ] } } +{ "type": "Feature", "properties": { "name": "Antarctica" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -46.669922, -77.823323 ], [ -45.175781, -78.043795 ], [ -43.945312, -78.473002 ], [ -43.505859, -79.088462 ], [ -43.330078, -80.027655 ], [ -44.912109, -80.342262 ], [ -46.494141, -80.589727 ], [ -48.427734, -80.830907 ], [ -50.449219, -81.024916 ], [ -52.822266, -80.969904 ], [ -54.140625, -80.632740 ], [ -53.964844, -80.223588 ], [ -51.855469, -79.951265 ], [ -50.976562, -79.608215 ], [ -49.921875, -78.819036 ], [ -48.691406, -78.043795 ], [ -48.164062, -78.043795 ], [ -46.669922, -77.823323 ] ] ], [ [ [ -60.644531, -79.624056 ], [ -59.589844, -80.042864 ], [ -60.117188, -80.997452 ], [ -62.226562, -80.858875 ], [ -64.511719, -80.928426 ], [ -65.742188, -80.589727 ], [ -66.269531, -80.253391 ], [ -64.072266, -80.297927 ], [ -61.875000, -80.386396 ], [ -60.644531, -79.624056 ] ] ], [ [ [ -57.832031, -63.273182 ], [ -57.216797, -63.509375 ], [ -57.568359, -63.860036 ], [ -58.623047, -64.168107 ], [ -59.062500, -64.358931 ], [ -59.765625, -64.206377 ], [ -60.644531, -64.320872 ], [ -62.050781, -64.811557 ], [ -62.490234, -65.109148 ], [ -62.666016, -65.476508 ], [ -62.578125, -65.874725 ], [ -62.138672, -66.196009 ], [ -62.841797, -66.407955 ], [ -63.720703, -66.513260 ], [ -65.478516, -67.575717 ], [ -65.654297, -67.941650 ], [ -65.302734, -68.366801 ], [ -64.775391, -68.688521 ], [ -63.984375, -68.911005 ], [ -63.193359, -69.224997 ], [ -62.753906, -69.626510 ], [ -62.314453, -70.377854 ], [ -61.787109, -70.728979 ], [ -61.523438, -71.102543 ], [ -61.347656, -72.019729 ], [ -60.732422, -73.175897 ], [ -60.820312, -73.701948 ], [ -61.347656, -74.116047 ], [ -61.962891, -74.449358 ], [ -63.281250, -74.566736 ], [ -64.335938, -75.253057 ], [ -65.830078, -75.628632 ], [ -67.236328, -75.802118 ], [ -69.785156, -76.226907 ], [ -70.576172, -76.639226 ], [ -72.246094, -76.679785 ], [ -74.003906, -76.639226 ], [ -75.585938, -76.720223 ], [ -77.255859, -76.720223 ], [ -76.904297, -77.098423 ], [ -75.410156, -77.273855 ], [ -74.267578, -77.561042 ], [ -73.652344, -77.915669 ], [ -74.794922, -78.224513 ], [ -76.464844, -78.116408 ], [ -77.958984, -78.384855 ], [ -78.046875, -79.187834 ], [ -76.816406, -79.512662 ], [ -76.640625, -79.889737 ], [ -75.322266, -80.253391 ], [ -73.212891, -80.415707 ], [ -71.455078, -80.689789 ], [ -70.048828, -80.997452 ], [ -68.203125, -81.321593 ], [ -65.742188, -81.479293 ], [ -63.281250, -81.748454 ], [ -59.677734, -82.379147 ], [ -58.710938, -82.842440 ], [ -58.183594, -83.215693 ], [ -57.041016, -82.864308 ], [ -53.613281, -82.261699 ], [ -51.503906, -82.009169 ], [ -49.746094, -81.723188 ], [ -47.285156, -81.710526 ], [ -44.824219, -81.848756 ], [ -42.802734, -82.082145 ], [ -42.187500, -81.646927 ], [ -40.781250, -81.361287 ], [ -38.232422, -81.334844 ], [ -34.365234, -80.900669 ], [ -30.058594, -80.589727 ], [ -28.564453, -80.342262 ], [ -29.267578, -79.981891 ], [ -29.707031, -79.639874 ], [ -29.707031, -79.253586 ], [ -31.640625, -79.302640 ], [ -33.662109, -79.448477 ], [ -35.683594, -79.448477 ], [ -35.947266, -79.088462 ], [ -35.771484, -78.331648 ], [ -35.332031, -78.116408 ], [ -32.255859, -77.655346 ], [ -29.794922, -77.059116 ], [ -28.916016, -76.679785 ], [ -25.488281, -76.289542 ], [ -23.906250, -76.247817 ], [ -22.500000, -76.100796 ], [ -20.039062, -75.672197 ], [ -17.490234, -75.118222 ], [ -15.732422, -74.496413 ], [ -15.380859, -74.116047 ], [ -16.435547, -73.873717 ], [ -16.083984, -73.453473 ], [ -15.468750, -73.150440 ], [ -13.271484, -72.711903 ], [ -12.304688, -72.395706 ], [ -11.513672, -72.019729 ], [ -10.986328, -71.552741 ], [ -10.283203, -71.272595 ], [ -9.140625, -71.328950 ], [ -8.613281, -71.663663 ], [ -7.382812, -71.691293 ], [ -7.382812, -71.328950 ], [ -6.855469, -70.931004 ], [ -5.800781, -71.016960 ], [ -5.537109, -71.413177 ], [ -4.306641, -71.469124 ], [ -1.757812, -71.159391 ], [ -0.703125, -71.216075 ], [ -0.263672, -71.635993 ], [ 0.878906, -71.300793 ], [ 1.845703, -71.130988 ], [ 4.130859, -70.844673 ], [ 5.185547, -70.612614 ], [ 6.240234, -70.466207 ], [ 7.119141, -70.259452 ], [ 7.734375, -69.900118 ], [ 8.525391, -70.140364 ], [ 9.492188, -70.020587 ], [ 10.810547, -70.844673 ], [ 11.953125, -70.641769 ], [ 12.392578, -70.259452 ], [ 13.447266, -69.960439 ], [ 14.765625, -70.020587 ], [ 15.117188, -70.407348 ], [ 15.908203, -70.020587 ], [ 17.050781, -69.900118 ], [ 18.193359, -69.869892 ], [ 19.248047, -69.900118 ], [ 21.445312, -70.080562 ], [ 21.884766, -70.407348 ], [ 22.587891, -70.699951 ], [ 23.642578, -70.524897 ], [ 27.070312, -70.466207 ], [ 29.179688, -70.199994 ], [ 30.058594, -69.930300 ], [ 30.937500, -69.748551 ], [ 31.992188, -69.657086 ], [ 32.783203, -69.380313 ], [ 33.310547, -68.847665 ], [ 33.837891, -68.496040 ], [ 34.892578, -68.656555 ], [ 35.332031, -69.005675 ], [ 36.123047, -69.256149 ], [ 37.177734, -69.162558 ], [ 37.880859, -69.534518 ], [ 38.671875, -69.778952 ], [ 39.638672, -69.534518 ], [ 39.990234, -69.099940 ], [ 40.957031, -68.942607 ], [ 41.923828, -68.592487 ], [ 44.121094, -68.269387 ], [ 46.494141, -67.609221 ], [ 47.460938, -67.709445 ], [ 48.955078, -67.101656 ], [ 49.921875, -67.101656 ], [ 50.712891, -66.861082 ], [ 50.976562, -66.513260 ], [ 52.646484, -66.053716 ], [ 54.492188, -65.802776 ], [ 56.337891, -65.982270 ], [ 57.128906, -66.231457 ], [ 57.216797, -66.687784 ], [ 58.710938, -67.272043 ], [ 59.941406, -67.407487 ], [ 61.435547, -67.941650 ], [ 62.402344, -68.007571 ], [ 63.193359, -67.809245 ], [ 64.072266, -67.407487 ], [ 64.951172, -67.609221 ], [ 66.884766, -67.842416 ], [ 67.851562, -67.941650 ], [ 68.906250, -67.941650 ], [ 69.697266, -68.974164 ], [ 69.697266, -69.224997 ], [ 69.521484, -69.687618 ], [ 68.554688, -69.930300 ], [ 67.851562, -70.318738 ], [ 67.939453, -70.699951 ], [ 69.082031, -70.670881 ], [ 68.906250, -71.074056 ], [ 67.939453, -71.856229 ], [ 68.730469, -72.154890 ], [ 69.873047, -72.262310 ], [ 71.015625, -72.100944 ], [ 71.894531, -71.328950 ], [ 73.125000, -70.728979 ], [ 73.828125, -69.869892 ], [ 74.531250, -69.778952 ], [ 75.585938, -69.748551 ], [ 77.607422, -69.472969 ], [ 78.398438, -68.688521 ], [ 79.101562, -68.334376 ], [ 80.947266, -67.875541 ], [ 81.474609, -67.542167 ], [ 82.089844, -67.373698 ], [ 82.792969, -67.204032 ], [ 83.759766, -67.305976 ], [ 85.693359, -67.101656 ], [ 86.748047, -67.135829 ], [ 87.451172, -66.861082 ], [ 87.978516, -66.196009 ], [ 88.857422, -66.964476 ], [ 89.648438, -67.135829 ], [ 90.615234, -67.238062 ], [ 91.582031, -67.101656 ], [ 93.515625, -67.204032 ], [ 94.218750, -67.101656 ], [ 95.009766, -67.169955 ], [ 95.800781, -67.373698 ], [ 96.679688, -67.238062 ], [ 97.734375, -67.238062 ], [ 98.701172, -67.101656 ], [ 99.755859, -67.238062 ], [ 102.832031, -65.549367 ], [ 103.447266, -65.694476 ], [ 104.238281, -65.982270 ], [ 106.171875, -66.930060 ], [ 108.105469, -66.964476 ], [ 110.214844, -66.687784 ], [ 111.708984, -66.124962 ], [ 112.851562, -66.089364 ], [ 113.642578, -65.874725 ], [ 114.345703, -66.089364 ], [ 115.576172, -66.687784 ], [ 116.718750, -66.652977 ], [ 117.421875, -66.930060 ], [ 118.564453, -67.169955 ], [ 119.794922, -67.272043 ], [ 120.849609, -67.204032 ], [ 122.343750, -66.548263 ], [ 123.222656, -66.478208 ], [ 125.156250, -66.722541 ], [ 126.123047, -66.548263 ], [ 127.001953, -66.548263 ], [ 128.759766, -66.757250 ], [ 130.781250, -66.407955 ], [ 132.978516, -66.372755 ], [ 134.736328, -66.196009 ], [ 135.000000, -65.730626 ], [ 135.087891, -65.293468 ], [ 135.703125, -65.585720 ], [ 135.878906, -66.018018 ], [ 136.582031, -66.791909 ], [ 137.460938, -66.964476 ], [ 140.800781, -66.826520 ], [ 143.085938, -66.791909 ], [ 145.458984, -66.930060 ], [ 146.162109, -67.238062 ], [ 145.986328, -67.609221 ], [ 146.689453, -67.908619 ], [ 148.798828, -68.399180 ], [ 152.490234, -68.879358 ], [ 153.632812, -68.879358 ], [ 154.248047, -68.560384 ], [ 155.917969, -69.162558 ], [ 156.796875, -69.380313 ], [ 159.169922, -69.595890 ], [ 159.697266, -69.990535 ], [ 160.839844, -70.229744 ], [ 161.542969, -70.583418 ], [ 162.685547, -70.728979 ], [ 166.113281, -70.757966 ], [ 167.343750, -70.844673 ], [ 168.398438, -70.959697 ], [ 170.507812, -71.413177 ], [ 171.210938, -71.691293 ], [ 171.123047, -72.100944 ], [ 170.595703, -72.448792 ], [ 169.277344, -73.652545 ], [ 167.958984, -73.824820 ], [ 167.343750, -74.164085 ], [ 166.113281, -74.378513 ], [ 165.673828, -74.775843 ], [ 164.267578, -75.453071 ], [ 163.564453, -76.247817 ], [ 163.476562, -76.700019 ], [ 163.476562, -77.059116 ], [ 164.091797, -77.466028 ], [ 164.267578, -77.823323 ], [ 164.707031, -78.188586 ], [ 166.640625, -78.313860 ], [ 166.992188, -78.750659 ], [ 165.234375, -78.903929 ], [ 163.652344, -79.121686 ], [ 161.806641, -79.154810 ], [ 160.927734, -79.734281 ], [ 160.751953, -80.193694 ], [ 159.785156, -80.942273 ], [ 161.103516, -81.281717 ], [ 161.630859, -81.685144 ], [ 162.509766, -82.057893 ], [ 163.740234, -82.390794 ], [ 166.640625, -83.026219 ], [ 168.925781, -83.339153 ], [ 169.365234, -83.829945 ], [ 172.265625, -84.043447 ], [ 173.232422, -84.414502 ], [ 175.957031, -84.160849 ], [ 180.000000, -84.714152 ], [ 180.087891, -84.722243 ], [ 180.966797, -84.142939 ], [ 182.724609, -84.457112 ], [ 183.955078, -84.097922 ], [ 184.130859, -84.115970 ], [ 185.625000, -84.532994 ], [ 187.031250, -84.079819 ], [ 187.031250, -85.622069 ], [ 180.000000, -85.622069 ], [ -180.000000, -85.622069 ], [ -187.031250, -85.622069 ], [ -187.031250, -84.310902 ], [ -186.767578, -84.414502 ], [ -184.042969, -84.160849 ], [ -180.000000, -84.714152 ], [ -179.912109, -84.722243 ], [ -179.033203, -84.142939 ], [ -177.275391, -84.457112 ], [ -176.044922, -84.097922 ], [ -175.869141, -84.115970 ], [ -174.375000, -84.532994 ], [ -172.880859, -84.061661 ], [ -169.980469, -83.886366 ], [ -166.992188, -84.566386 ], [ -164.179688, -84.826305 ], [ -162.597656, -85.051129 ], [ -161.894531, -85.141284 ], [ -158.115234, -85.373767 ], [ -155.214844, -85.096413 ], [ -150.908203, -85.295131 ], [ -148.535156, -85.608630 ], [ -145.898438, -85.316708 ], [ -143.173828, -85.051129 ], [ -143.085938, -85.043541 ], [ -142.910156, -84.566386 ], [ -146.865234, -84.532994 ], [ -150.029297, -84.293450 ], [ -150.908203, -83.905058 ], [ -153.544922, -83.686615 ], [ -153.369141, -83.236426 ], [ -152.666016, -82.448764 ], [ -152.841797, -82.045740 ], [ -154.511719, -81.773644 ], [ -155.302734, -81.413933 ], [ -156.796875, -81.106811 ], [ -154.423828, -81.160996 ], [ -152.138672, -80.997452 ], [ -150.644531, -81.334844 ], [ -148.886719, -81.038617 ], [ -147.216797, -80.675559 ], [ -146.425781, -80.342262 ], [ -146.777344, -79.920548 ], [ -149.501953, -79.351472 ], [ -151.611328, -79.302640 ], [ -153.369141, -79.154810 ], [ -155.302734, -79.071812 ], [ -156.005859, -78.699106 ], [ -157.236328, -78.384855 ], [ -158.027344, -78.025574 ], [ -158.378906, -76.880775 ], [ -157.851562, -76.980149 ], [ -156.972656, -77.293202 ], [ -155.302734, -77.196176 ], [ -153.720703, -77.059116 ], [ -152.929688, -77.504119 ], [ -151.347656, -77.389504 ], [ -150.029297, -77.176684 ], [ -148.710938, -76.900709 ], [ -147.656250, -76.578159 ], [ -146.074219, -76.475773 ], [ -146.162109, -76.100796 ], [ -146.513672, -75.737303 ], [ -146.162109, -75.386696 ], [ -144.931641, -75.208245 ], [ -144.316406, -75.541113 ], [ -142.822266, -75.342282 ], [ -141.679688, -75.095633 ], [ -140.185547, -75.073010 ], [ -138.867188, -74.959392 ], [ -135.175781, -74.307353 ], [ -133.769531, -74.449358 ], [ -132.275391, -74.307353 ], [ -130.957031, -74.472903 ], [ -129.550781, -74.449358 ], [ -128.232422, -74.331108 ], [ -125.419922, -74.519889 ], [ -124.013672, -74.472903 ], [ -121.113281, -74.519889 ], [ -119.707031, -74.472903 ], [ -118.652344, -74.188052 ], [ -117.509766, -74.019543 ], [ -116.191406, -74.235878 ], [ -115.048828, -74.067866 ], [ -113.906250, -73.726595 ], [ -113.291016, -74.019543 ], [ -112.939453, -74.378513 ], [ -112.324219, -74.706450 ], [ -111.269531, -74.425777 ], [ -110.039062, -74.798906 ], [ -108.720703, -74.913708 ], [ -107.578125, -75.185789 ], [ -106.171875, -75.118222 ], [ -104.853516, -74.959392 ], [ -103.359375, -74.982183 ], [ -100.634766, -75.297735 ], [ -100.107422, -74.867889 ], [ -101.250000, -74.188052 ], [ -102.568359, -74.116047 ], [ -103.095703, -73.726595 ], [ -103.710938, -72.607120 ], [ -102.919922, -72.764065 ], [ -101.601562, -72.816074 ], [ -100.283203, -72.764065 ], [ -99.140625, -72.919635 ], [ -98.085938, -73.201317 ], [ -97.646484, -73.553302 ], [ -96.328125, -73.627789 ], [ -92.460938, -73.175897 ], [ -91.406250, -73.403338 ], [ -90.087891, -73.327858 ], [ -89.208984, -72.554498 ], [ -88.417969, -72.996909 ], [ -87.275391, -73.175897 ], [ -86.044922, -73.099413 ], [ -85.166016, -73.478485 ], [ -83.847656, -73.528399 ], [ -82.705078, -73.627789 ], [ -81.474609, -73.849286 ], [ -80.683594, -73.478485 ], [ -80.332031, -73.124945 ], [ -79.277344, -73.528399 ], [ -77.958984, -73.428424 ], [ -76.904297, -73.627789 ], [ -76.201172, -73.971078 ], [ -74.882812, -73.873717 ], [ -72.861328, -73.403338 ], [ -68.906250, -72.996909 ], [ -67.939453, -72.790088 ], [ -67.412109, -72.475276 ], [ -67.148438, -72.046840 ], [ -67.236328, -71.635993 ], [ -68.466797, -70.110485 ], [ -68.554688, -69.718107 ], [ -68.466797, -69.318320 ], [ -67.587891, -68.528235 ], [ -67.412109, -68.138852 ], [ -67.763672, -67.339861 ], [ -67.236328, -66.861082 ], [ -66.093750, -66.196009 ], [ -64.599609, -65.585720 ], [ -64.160156, -65.183030 ], [ -63.632812, -64.886265 ], [ -63.017578, -64.623877 ], [ -62.050781, -64.586185 ], [ -61.435547, -64.282760 ], [ -60.732422, -64.091408 ], [ -59.853516, -63.937372 ], [ -59.150391, -63.704722 ], [ -58.623047, -63.391522 ], [ -57.832031, -63.273182 ] ] ], [ [ [ -163.125000, -78.224513 ], [ -161.279297, -78.384855 ], [ -160.224609, -78.699106 ], [ -159.521484, -79.038437 ], [ -159.169922, -79.496652 ], [ -161.103516, -79.639874 ], [ -162.421875, -79.286313 ], [ -163.037109, -78.870048 ], [ -163.740234, -78.595299 ], [ -163.125000, -78.224513 ] ] ], [ [ [ -122.431641, -73.327858 ], [ -119.882812, -73.652545 ], [ -118.740234, -73.478485 ], [ -119.267578, -73.824820 ], [ -120.234375, -74.091974 ], [ -121.640625, -74.019543 ], [ -122.607422, -73.652545 ], [ -122.431641, -73.327858 ] ] ], [ [ [ -126.562500, -73.252045 ], [ -124.013672, -73.873717 ], [ -125.947266, -73.726595 ], [ -127.265625, -73.453473 ], [ -126.562500, -73.252045 ] ] ], [ [ [ -101.689453, -71.718882 ], [ -100.458984, -71.856229 ], [ -98.964844, -71.938158 ], [ -97.910156, -72.073911 ], [ -96.767578, -71.965388 ], [ -96.240234, -72.528130 ], [ -96.943359, -72.448792 ], [ -98.173828, -72.475276 ], [ -99.404297, -72.448792 ], [ -100.810547, -72.501722 ], [ -101.777344, -72.315785 ], [ -102.304688, -71.883578 ], [ -101.689453, -71.718882 ] ] ], [ [ [ -70.224609, -68.879358 ], [ -69.697266, -69.256149 ], [ -68.466797, -70.959697 ], [ -68.291016, -71.413177 ], [ -68.818359, -72.181804 ], [ -69.960938, -72.315785 ], [ -71.103516, -72.501722 ], [ -72.421875, -72.475276 ], [ -71.894531, -72.100944 ], [ -74.179688, -72.369105 ], [ -74.970703, -72.073911 ], [ -74.970703, -71.663663 ], [ -73.916016, -71.272595 ], [ -73.212891, -71.159391 ], [ -72.070312, -71.187754 ], [ -71.806641, -70.670881 ], [ -71.718750, -69.503765 ], [ -71.191406, -69.037142 ], [ -70.224609, -68.879358 ] ] ] ] } } ] } ] } , diff --git a/tests/tl_2018_51685_roads/out/-Z11_-z11_--no-simplification-of-shared-nodes.json b/tests/tl_2018_51685_roads/out/-Z11_-z11_--no-simplification-of-shared-nodes.json index c3dd7fcb..62856592 100644 --- a/tests/tl_2018_51685_roads/out/-Z11_-z11_--no-simplification-of-shared-nodes.json +++ b/tests/tl_2018_51685_roads/out/-Z11_-z11_--no-simplification-of-shared-nodes.json @@ -130,21 +130,21 @@ , { "type": "Feature", "properties": { "LINEARID": "1103679538189", "FULLNAME": "Old Centreville Rd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.458506, 38.787409 ], [ -77.458720, 38.785602 ], [ -77.458935, 38.783762 ], [ -77.459021, 38.783227 ], [ -77.459064, 38.782290 ], [ -77.459106, 38.781856 ], [ -77.459493, 38.778410 ], [ -77.459450, 38.778209 ], [ -77.454772, 38.775532 ], [ -77.453613, 38.774897 ], [ -77.452970, 38.774462 ], [ -77.452669, 38.774094 ], [ -77.452497, 38.773525 ], [ -77.452283, 38.773458 ] ] } } , -{ "type": "Feature", "properties": { "LINEARID": "110410477217", "FULLNAME": "State Rte 28", "RTTYP": "S", "MTFCC": "S1200" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.452111, 38.773425 ], [ -77.452283, 38.772622 ], [ -77.452326, 38.772387 ], [ -77.452455, 38.771886 ], [ -77.452497, 38.771685 ], [ -77.452583, 38.771317 ], [ -77.452712, 38.770681 ], [ -77.452798, 38.770514 ], [ -77.452884, 38.770246 ], [ -77.452970, 38.770012 ], [ -77.453098, 38.769811 ], [ -77.453270, 38.769510 ], [ -77.453356, 38.769343 ], [ -77.453570, 38.769042 ] ] } } +{ "type": "Feature", "properties": { "LINEARID": "110410477217", "FULLNAME": "State Rte 28", "RTTYP": "S", "MTFCC": "S1200" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.452111, 38.773425 ], [ -77.452497, 38.771685 ], [ -77.452884, 38.770246 ], [ -77.453270, 38.769510 ], [ -77.453570, 38.769042 ] ] } } , -{ "type": "Feature", "properties": { "LINEARID": "110410477454", "FULLNAME": "Centreville Rd", "RTTYP": "M", "MTFCC": "S1200" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.452111, 38.773425 ], [ -77.452283, 38.772622 ], [ -77.452326, 38.772387 ], [ -77.452455, 38.771886 ], [ -77.452497, 38.771685 ], [ -77.452583, 38.771317 ], [ -77.452712, 38.770681 ], [ -77.452798, 38.770514 ], [ -77.452884, 38.770246 ], [ -77.452970, 38.770012 ], [ -77.453098, 38.769811 ], [ -77.453270, 38.769510 ], [ -77.453356, 38.769343 ], [ -77.453570, 38.769042 ] ] } } +{ "type": "Feature", "properties": { "LINEARID": "110410477454", "FULLNAME": "Centreville Rd", "RTTYP": "M", "MTFCC": "S1200" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.452111, 38.773425 ], [ -77.452497, 38.771685 ], [ -77.452884, 38.770246 ], [ -77.453270, 38.769510 ], [ -77.453570, 38.769042 ] ] } } , -{ "type": "Feature", "properties": { "LINEARID": "1106073064085", "FULLNAME": "Blooms Quarry Ln", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.452111, 38.773425 ], [ -77.451854, 38.773391 ], [ -77.451768, 38.773391 ], [ -77.451725, 38.773391 ], [ -77.451639, 38.773391 ], [ -77.451339, 38.773458 ], [ -77.451210, 38.773492 ], [ -77.450867, 38.773625 ], [ -77.450824, 38.773659 ], [ -77.450695, 38.773659 ], [ -77.450566, 38.773692 ], [ -77.450266, 38.773692 ], [ -77.449965, 38.773659 ], [ -77.449880, 38.773625 ], [ -77.449322, 38.773358 ], [ -77.448163, 38.772856 ], [ -77.447605, 38.772588 ], [ -77.447305, 38.772387 ], [ -77.447047, 38.772187 ], [ -77.446790, 38.771986 ] ] } } +{ "type": "Feature", "properties": { "LINEARID": "1106073064085", "FULLNAME": "Blooms Quarry Ln", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.452111, 38.773425 ], [ -77.451339, 38.773458 ], [ -77.450824, 38.773659 ], [ -77.450266, 38.773692 ], [ -77.449965, 38.773659 ], [ -77.449322, 38.773358 ], [ -77.447605, 38.772588 ], [ -77.446790, 38.771986 ] ] } } , -{ "type": "Feature", "properties": { "LINEARID": "1102214409896", "FULLNAME": "Centreville Rd", "RTTYP": "M", "MTFCC": "S1200" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.452283, 38.773458 ], [ -77.452326, 38.773224 ], [ -77.452497, 38.772421 ], [ -77.452669, 38.771718 ], [ -77.452841, 38.770882 ], [ -77.452927, 38.770581 ], [ -77.453012, 38.770380 ], [ -77.453098, 38.770146 ], [ -77.453227, 38.769845 ], [ -77.453399, 38.769543 ], [ -77.453485, 38.769376 ], [ -77.453699, 38.769075 ] ] } } +{ "type": "Feature", "properties": { "LINEARID": "1102214409896", "FULLNAME": "Centreville Rd", "RTTYP": "M", "MTFCC": "S1200" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.452283, 38.773458 ], [ -77.452669, 38.771718 ], [ -77.452927, 38.770581 ], [ -77.453227, 38.769845 ], [ -77.453699, 38.769075 ] ] } } , -{ "type": "Feature", "properties": { "LINEARID": "1102214411210", "FULLNAME": "State Rte 28", "RTTYP": "S", "MTFCC": "S1200" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.452283, 38.773458 ], [ -77.452326, 38.773224 ], [ -77.452497, 38.772421 ], [ -77.452669, 38.771718 ], [ -77.452841, 38.770882 ], [ -77.452927, 38.770581 ], [ -77.453012, 38.770380 ], [ -77.453098, 38.770146 ], [ -77.453227, 38.769845 ], [ -77.453399, 38.769543 ], [ -77.453485, 38.769376 ], [ -77.453699, 38.769075 ] ] } } +{ "type": "Feature", "properties": { "LINEARID": "1102214411210", "FULLNAME": "State Rte 28", "RTTYP": "S", "MTFCC": "S1200" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.452283, 38.773458 ], [ -77.452669, 38.771718 ], [ -77.452927, 38.770581 ], [ -77.453227, 38.769845 ], [ -77.453699, 38.769075 ] ] } } , { "type": "Feature", "properties": { "LINEARID": "110410477418", "FULLNAME": "Manassas Dr", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.443743, 38.768640 ], [ -77.443914, 38.768841 ], [ -77.445374, 38.769711 ], [ -77.445545, 38.769778 ], [ -77.446747, 38.770581 ], [ -77.447648, 38.770982 ], [ -77.448807, 38.771250 ], [ -77.449880, 38.771417 ], [ -77.452283, 38.771752 ], [ -77.452497, 38.771685 ] ] } } , { "type": "Feature", "properties": { "LINEARID": "110410477419", "FULLNAME": "Manassas Dr", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.452497, 38.771685 ], [ -77.452326, 38.771584 ], [ -77.452025, 38.771518 ], [ -77.449880, 38.771250 ], [ -77.448764, 38.771083 ], [ -77.447777, 38.770815 ], [ -77.446790, 38.770380 ], [ -77.445674, 38.769644 ], [ -77.445545, 38.769543 ], [ -77.444601, 38.769042 ], [ -77.443743, 38.768640 ] ] } } , -{ "type": "Feature", "properties": { "LINEARID": "1106092774118", "FULLNAME": "Manassas Dr", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.452283, 38.773458 ], [ -77.452111, 38.773425 ], [ -77.451854, 38.773391 ], [ -77.451768, 38.773391 ], [ -77.451725, 38.773391 ], [ -77.451639, 38.773391 ], [ -77.451339, 38.773458 ], [ -77.451210, 38.773492 ], [ -77.450867, 38.773625 ], [ -77.450824, 38.773659 ], [ -77.450695, 38.773659 ], [ -77.450566, 38.773692 ], [ -77.450266, 38.773692 ], [ -77.449965, 38.773659 ], [ -77.449880, 38.773625 ], [ -77.449322, 38.773358 ] ] } } +{ "type": "Feature", "properties": { "LINEARID": "1106092774118", "FULLNAME": "Manassas Dr", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.452283, 38.773458 ], [ -77.452111, 38.773425 ], [ -77.451339, 38.773458 ], [ -77.450824, 38.773659 ], [ -77.450266, 38.773692 ], [ -77.449965, 38.773659 ], [ -77.449322, 38.773358 ] ] } } , { "type": "Feature", "properties": { "LINEARID": "110410477551", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.450566, 38.772287 ], [ -77.450824, 38.772387 ], [ -77.450910, 38.772254 ], [ -77.450738, 38.772153 ], [ -77.450566, 38.772287 ] ] } } , @@ -154,7 +154,7 @@ , { "type": "Feature", "properties": { "LINEARID": "110410477440", "FULLNAME": "Sunnyside Ct", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.449665, 38.772053 ], [ -77.449493, 38.771952 ] ] } } , -{ "type": "Feature", "properties": { "LINEARID": "1106087402596", "FULLNAME": "Blooms Quarry Rd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.449322, 38.773358 ], [ -77.448163, 38.772856 ], [ -77.447605, 38.772588 ], [ -77.447305, 38.772387 ], [ -77.447047, 38.772187 ], [ -77.446790, 38.771986 ], [ -77.445030, 38.770614 ] ] } } +{ "type": "Feature", "properties": { "LINEARID": "1106087402596", "FULLNAME": "Blooms Quarry Rd", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.449322, 38.773358 ], [ -77.447605, 38.772588 ], [ -77.446790, 38.771986 ], [ -77.445030, 38.770614 ] ] } } , { "type": "Feature", "properties": { "LINEARID": "110410477452", "FULLNAME": "White Pine Dr", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.447348, 38.771417 ], [ -77.446961, 38.771250 ], [ -77.446876, 38.771350 ], [ -77.447176, 38.771584 ], [ -77.448249, 38.772321 ], [ -77.449064, 38.772689 ], [ -77.450180, 38.773157 ] ] } } , @@ -336,13 +336,13 @@ , { "type": "Feature", "properties": { "LINEARID": "110410477422", "FULLNAME": "Primrose Ln", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.434087, 38.763989 ], [ -77.433829, 38.764190 ], [ -77.433658, 38.764457 ], [ -77.433443, 38.764491 ], [ -77.433186, 38.764625 ], [ -77.433100, 38.764758 ], [ -77.433143, 38.765026 ] ] } } , -{ "type": "Feature", "properties": { "LINEARID": "1103678606081", "FULLNAME": "Silver Meteor Ct", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.432799, 38.762650 ], [ -77.432885, 38.762851 ], [ -77.432971, 38.763119 ], [ -77.432971, 38.763186 ], [ -77.432971, 38.763253 ], [ -77.432842, 38.763420 ], [ -77.432628, 38.763822 ], [ -77.432585, 38.763855 ], [ -77.432499, 38.763888 ], [ -77.432284, 38.763955 ], [ -77.432241, 38.763955 ], [ -77.432156, 38.763955 ], [ -77.431855, 38.763822 ], [ -77.431812, 38.763822 ], [ -77.431812, 38.763788 ], [ -77.431812, 38.763721 ], [ -77.431941, 38.763353 ], [ -77.432241, 38.762952 ], [ -77.432284, 38.762918 ], [ -77.432456, 38.762784 ], [ -77.432542, 38.762717 ], [ -77.432628, 38.762684 ], [ -77.432714, 38.762684 ], [ -77.432799, 38.762650 ] ] } } +{ "type": "Feature", "properties": { "LINEARID": "1103678606081", "FULLNAME": "Silver Meteor Ct", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.432799, 38.762650 ], [ -77.432971, 38.763253 ], [ -77.432585, 38.763855 ], [ -77.432156, 38.763955 ], [ -77.431812, 38.763788 ], [ -77.431941, 38.763353 ], [ -77.432284, 38.762918 ], [ -77.432542, 38.762717 ], [ -77.432799, 38.762650 ] ] } } , -{ "type": "Feature", "properties": { "LINEARID": "1103679538423", "FULLNAME": "Black Hawk Ct", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.432799, 38.762650 ], [ -77.432885, 38.762851 ], [ -77.432971, 38.763119 ], [ -77.432971, 38.763186 ], [ -77.432971, 38.763253 ], [ -77.432842, 38.763420 ], [ -77.432628, 38.763822 ], [ -77.432585, 38.763855 ], [ -77.432499, 38.763888 ], [ -77.432284, 38.763955 ], [ -77.432241, 38.763955 ], [ -77.432156, 38.763955 ], [ -77.431855, 38.763822 ], [ -77.431812, 38.763822 ], [ -77.431812, 38.763788 ], [ -77.431812, 38.763721 ], [ -77.431941, 38.763353 ], [ -77.432241, 38.762952 ], [ -77.432284, 38.762918 ], [ -77.432456, 38.762784 ], [ -77.432542, 38.762717 ], [ -77.432628, 38.762684 ], [ -77.432714, 38.762684 ], [ -77.432799, 38.762650 ] ] } } +{ "type": "Feature", "properties": { "LINEARID": "1103679538423", "FULLNAME": "Black Hawk Ct", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.432799, 38.762650 ], [ -77.432971, 38.763253 ], [ -77.432585, 38.763855 ], [ -77.432156, 38.763955 ], [ -77.431812, 38.763788 ], [ -77.431941, 38.763353 ], [ -77.432284, 38.762918 ], [ -77.432542, 38.762717 ], [ -77.432799, 38.762650 ] ] } } , -{ "type": "Feature", "properties": { "LINEARID": "1103678606039", "FULLNAME": "Silver Meteor Ct", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.433400, 38.762583 ], [ -77.433100, 38.762650 ], [ -77.432928, 38.762684 ], [ -77.432799, 38.762650 ] ] } } +{ "type": "Feature", "properties": { "LINEARID": "1103678606039", "FULLNAME": "Silver Meteor Ct", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.433400, 38.762583 ], [ -77.432799, 38.762650 ] ] } } , -{ "type": "Feature", "properties": { "LINEARID": "1103679538422", "FULLNAME": "Black Hawk Ct", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.433400, 38.762583 ], [ -77.433100, 38.762650 ], [ -77.432928, 38.762684 ], [ -77.432799, 38.762650 ] ] } } +{ "type": "Feature", "properties": { "LINEARID": "1103679538422", "FULLNAME": "Black Hawk Ct", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.433400, 38.762583 ], [ -77.432799, 38.762650 ] ] } } , { "type": "Feature", "properties": { "LINEARID": "110410477423", "FULLNAME": "Railroad Dr", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.442241, 38.762617 ], [ -77.441897, 38.762650 ], [ -77.441554, 38.762851 ], [ -77.440696, 38.763688 ], [ -77.440567, 38.763989 ], [ -77.440567, 38.764089 ] ] } } , @@ -434,9 +434,9 @@ , { "type": "Feature", "properties": { "LINEARID": "110410477227", "FULLNAME": "Gary Ct", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.429924, 38.767636 ], [ -77.430696, 38.767101 ], [ -77.431211, 38.766733 ] ] } } , -{ "type": "Feature", "properties": { "LINEARID": "1106087387886", "FULLNAME": "Manassas Dr", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.427735, 38.765361 ], [ -77.427692, 38.765796 ], [ -77.427649, 38.767302 ], [ -77.427478, 38.768673 ], [ -77.427564, 38.769108 ], [ -77.427649, 38.769242 ], [ -77.427735, 38.769376 ], [ -77.427821, 38.769476 ], [ -77.427950, 38.769577 ], [ -77.428079, 38.769677 ], [ -77.428207, 38.769778 ], [ -77.428293, 38.769811 ], [ -77.428422, 38.769878 ], [ -77.428551, 38.769911 ], [ -77.428722, 38.769945 ], [ -77.428808, 38.769978 ] ] } } +{ "type": "Feature", "properties": { "LINEARID": "1106087387886", "FULLNAME": "Manassas Dr", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.427735, 38.765361 ], [ -77.427692, 38.765796 ], [ -77.427649, 38.767302 ], [ -77.427478, 38.768673 ], [ -77.427564, 38.769108 ], [ -77.427735, 38.769376 ], [ -77.428079, 38.769677 ], [ -77.428422, 38.769878 ], [ -77.428808, 38.769978 ] ] } } , -{ "type": "Feature", "properties": { "LINEARID": "110410477374", "FULLNAME": "Fairway Ct", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.427564, 38.769108 ], [ -77.427649, 38.769242 ], [ -77.427735, 38.769376 ], [ -77.427821, 38.769476 ], [ -77.427950, 38.769577 ], [ -77.428079, 38.769677 ], [ -77.428207, 38.769778 ], [ -77.428293, 38.769811 ], [ -77.428422, 38.769878 ], [ -77.428551, 38.769911 ], [ -77.428722, 38.769945 ], [ -77.428808, 38.769978 ], [ -77.430611, 38.769911 ], [ -77.431340, 38.769711 ] ] } } +{ "type": "Feature", "properties": { "LINEARID": "110410477374", "FULLNAME": "Fairway Ct", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.427564, 38.769108 ], [ -77.427735, 38.769376 ], [ -77.428079, 38.769677 ], [ -77.428422, 38.769878 ], [ -77.428808, 38.769978 ], [ -77.430611, 38.769911 ], [ -77.431340, 38.769711 ] ] } } , { "type": "Feature", "properties": { "LINEARID": "110410477279", "FULLNAME": "Payne Ct", "RTTYP": "M", "MTFCC": "S1400" }, "geometry": { "type": "LineString", "coordinates": [ [ -77.428508, 38.767302 ], [ -77.428594, 38.766565 ], [ -77.428551, 38.766197 ] ] } } , diff --git a/tile-join.cpp b/tile-join.cpp index b3c2c4e1..125ae159 100644 --- a/tile-join.cpp +++ b/tile-join.cpp @@ -378,7 +378,7 @@ double max(double a, double b) { struct tilecmp { bool operator()(std::pair const &a, std::pair const &b) { - // must match behavior of reader::operator<() + // must match behavior of tileset_reader::operator<() if (a.first < b.first) { return true; @@ -394,13 +394,13 @@ struct tilecmp { } } tilecmp; -// The `reader` is an iterator through the tiles of a tileset, +// The `tileset_reader` is an iterator through the tiles of a tileset, // in z/x/tms_y order. // // The basic idea is that it is used like this: // // void blah(const char *fname) { -// reader r(fname); +// tileset_reader r(fname); // // for (; !r.all_done(); r.advance()) { // std::pair tile = r.current(); @@ -411,13 +411,13 @@ struct tilecmp { // } // // The complication is that you can actually keep calling current() -// and advance() after the reader claims to be done, in which case +// and advance() after the tileset_reader claims to be done, in which case // it will produce overzoomed tiles generated from the tiles in // the maxzoom tileset. The parent tiles for those overzoomed tiles // are retrieved internally using get_tile() rather than through the // main iteration query. -struct reader { +struct tileset_reader { // z/x/y and data of the current tile long long zoom = 0; long long x = 0; @@ -438,7 +438,7 @@ struct reader { // for iterating mbtiles sqlite3 *db = NULL; sqlite3_stmt *stmt = NULL; - struct reader *next = NULL; + struct tileset_reader *next = NULL; // for iterating dirtiles std::vector dirtiles; @@ -449,7 +449,7 @@ struct reader { char *pmtiles_map = NULL; std::vector pmtiles_entries; - reader(const char *fname) { + tileset_reader(const char *fname) { name = fname; struct stat st; if (stat(fname, &st) == 0 && (st.st_mode & S_IFDIR) != 0) { @@ -499,7 +499,7 @@ struct reader { } } - // Checks the done status not only of this reader but also + // Checks the done status not only of this tileset_reader but also // the others chained to it in the queue. // // Also claims not to be done if at least one overzoomed tile @@ -513,7 +513,7 @@ struct reader { return false; } - for (struct reader *r = next; r != NULL; r = r->next) { + for (struct tileset_reader *r = next; r != NULL; r = r->next) { if (!r->done) { return false; } @@ -688,7 +688,7 @@ struct reader { // Sort in z/x/tms_y order, because that is the order of the // straightforward query of the mbtiles tiles table. - bool operator<(const struct reader &r) const { + bool operator<(const struct tileset_reader &r) const { // must match behavior of tilecmp if (zoom < r.zoom) { @@ -752,10 +752,10 @@ struct reader { } }; -struct reader *begin_reading(char *fname) { - struct reader *r = new reader(fname); +struct tileset_reader *begin_reading(char *fname) { + struct tileset_reader *r = new tileset_reader(fname); - // The reason this prefetches is so the reader queue can be + // The reason this prefetches is so the tileset_reader queue can be // priority-ordered, so the one with the next relevant tile // is first in line. r->advance(); @@ -776,7 +776,7 @@ struct arg { std::set *remove_layers = NULL; int ifmatched = 0; json_object *filter = NULL; - struct reader *readers = NULL; + struct tileset_reader *readers = NULL; }; void *join_worker(void *v) { @@ -821,7 +821,7 @@ void *join_worker(void *v) { return NULL; } -void dispatch_tasks(std::map> &tasks, std::vector> &layermaps, sqlite3 *outdb, const char *outdir, std::vector &header, std::map> &mapping, std::set &exclude, std::set &include, int ifmatched, std::set &keep_layers, std::set &remove_layers, json_object *filter, struct reader *readers) { +void dispatch_tasks(std::map> &tasks, std::vector> &layermaps, sqlite3 *outdb, const char *outdir, std::vector &header, std::map> &mapping, std::set &exclude, std::set &include, int ifmatched, std::set &keep_layers, std::set &remove_layers, json_object *filter, struct tileset_reader *readers) { pthread_t pthreads[CPUS]; std::vector args; @@ -969,7 +969,7 @@ void handle_vector_layers(json_object *vector_layers, std::map &layermap, sqlite3 *outdb, const char *outdir, struct stats *st, std::vector &header, std::map> &mapping, std::set &exclude, std::set &include, int ifmatched, std::string &attribution, std::string &description, std::set &keep_layers, std::set &remove_layers, std::string &name, json_object *filter, std::map &attribute_descriptions, std::string &generator_options, std::vector *strategies) { +void decode(struct tileset_reader *readers, std::map &layermap, sqlite3 *outdb, const char *outdir, struct stats *st, std::vector &header, std::map> &mapping, std::set &exclude, std::set &include, int ifmatched, std::string &attribution, std::string &description, std::set &keep_layers, std::set &remove_layers, std::string &name, json_object *filter, std::map &attribute_descriptions, std::string &generator_options, std::vector *strategies) { std::vector> layermaps; for (size_t i = 0; i < CPUS; i++) { layermaps.push_back(std::map()); @@ -1028,21 +1028,21 @@ void decode(struct reader *readers, std::map &layer } } - // The reason this prefetches is so the reader queue can be + // The reason this prefetches is so the tileset_reader queue can be // priority-ordered, so the one with the next relevant tile // is first in line. readers->advance(); - // pull the reader off the front of the queue for reordering + // pull the tileset_reader off the front of the queue for reordering - reader *r = readers; + tileset_reader *r = readers; readers = readers->next; r->next = NULL; - // put the reader back onto the queue, + // put the tileset_reader back onto the queue, // in whatever sequence its next tile calls for - struct reader **rr; + struct tileset_reader **rr; for (rr = &readers; *rr != NULL; rr = &((*rr)->next)) { if (*r < **rr) { break; @@ -1066,8 +1066,8 @@ void decode(struct reader *readers, std::map &layer dispatch_tasks(tasks, layermaps, outdb, outdir, header, mapping, exclude, include, ifmatched, keep_layers, remove_layers, filter, readers); layermap = merge_layermaps(layermaps); - struct reader *next; - for (struct reader *r = readers; r != NULL; r = next) { + struct tileset_reader *next; + for (struct tileset_reader *r = readers; r != NULL; r = next) { next = r->next; r->close(); @@ -1218,7 +1218,7 @@ int main(int argc, char **argv) { int filearg = 0; json_object *filter = NULL; - struct reader *readers = NULL; + struct tileset_reader *readers = NULL; CPUS = sysconf(_SC_NPROCESSORS_ONLN); @@ -1417,10 +1417,10 @@ int main(int argc, char **argv) { filearg = 1; while (getline(read_file, sa)) { char *c = const_cast(sa.c_str()); - reader *r = begin_reading(c); + tileset_reader *r = begin_reading(c); - // put the new reader in priority order - struct reader **rr; + // put the new tileset_reader in priority order + struct tileset_reader **rr; for (rr = &readers; *rr != NULL; rr = &((*rr)->next)) { if (*r < **rr) { break; @@ -1509,10 +1509,10 @@ int main(int argc, char **argv) { if (filearg == 0) { for (i = optind; i < argc; i++) { - reader *r = begin_reading(argv[i]); + tileset_reader *r = begin_reading(argv[i]); - // put the new reader in priority order - struct reader **rr; + // put the new tileset_reader in priority order + struct tileset_reader **rr; for (rr = &readers; *rr != NULL; rr = &((*rr)->next)) { if (*r < **rr) { break; diff --git a/tile.cpp b/tile.cpp index 4584c316..d94b1493 100644 --- a/tile.cpp +++ b/tile.cpp @@ -480,7 +480,10 @@ struct partial_arg { std::vector *partials = NULL; int task = 0; int tasks = 0; + drawvec *shared_nodes; + node *shared_nodes_map; + size_t nodepos; }; drawvec revive_polygon(drawvec &geom, double area, int z, int detail) { @@ -524,7 +527,7 @@ drawvec revive_polygon(drawvec &geom, double area, int z, int detail) { } } -double simplify_partial(partial *p, drawvec &shared_nodes) { +double simplify_partial(partial *p, drawvec const &shared_nodes, node *shared_nodes_map, size_t nodepos) { drawvec geom; for (size_t j = 0; j < p->geoms.size(); j++) { @@ -579,7 +582,7 @@ double simplify_partial(partial *p, drawvec &shared_nodes) { } // continues to simplify to line_detail even if we have extra detail - drawvec ngeom = simplify_lines(geom, z, line_detail, !(prevent[P_CLIPPING] || prevent[P_DUPLICATION]), p->simplification, t == VT_POLYGON ? 4 : 0, shared_nodes); + drawvec ngeom = simplify_lines(geom, z, p->tx, p->ty, line_detail, !(prevent[P_CLIPPING] || prevent[P_DUPLICATION]), p->simplification, t == VT_POLYGON ? 4 : 0, shared_nodes, shared_nodes_map, nodepos); if (t != VT_POLYGON || ngeom.size() >= 3) { geom = ngeom; @@ -602,7 +605,7 @@ void *partial_feature_worker(void *v) { std::vector *partials = a->partials; for (size_t i = a->task; i < (*partials).size(); i += a->tasks) { - double area = simplify_partial(&((*partials)[i]), *(a->shared_nodes)); + double area = simplify_partial(&((*partials)[i]), *(a->shared_nodes), a->shared_nodes_map, a->nodepos); signed char t = (*partials)[i].t; int z = (*partials)[i].z; @@ -1031,7 +1034,8 @@ bool find_common_edges(std::vector &partials, int z, int line_detail, d } } if (!(prevent[P_SIMPLIFY] || (z == maxzoom && prevent[P_SIMPLIFY_LOW]) || (z < maxzoom && additional[A_GRID_LOW_ZOOMS]))) { - simplified_arcs[ai->second] = simplify_lines(dv, z, line_detail, !(prevent[P_CLIPPING] || prevent[P_DUPLICATION]), simplification, 4, drawvec()); + // tx and ty are 0 here because we aren't trying to do anything with the shared_nodes_map + simplified_arcs[ai->second] = simplify_lines(dv, z, 0, 0, line_detail, !(prevent[P_CLIPPING] || prevent[P_DUPLICATION]), simplification, 4, drawvec(), NULL, 0); } else { simplified_arcs[ai->second] = dv; } @@ -1294,48 +1298,6 @@ long long choose_minextent(std::vector &extents, double f) { return extents[(extents.size() - 1) * (1 - f)]; } -struct joint { - long long x : 34; // enough to wrap around the world either way - unsigned long long p1 : 64 - 34; - - long long y : 33; // enough to touch the top and bottom of the world - unsigned long long p2 : 64 - 34; - - joint(draw one, draw hinge, draw two) { - if (one < two) { - std::swap(one, two); - } - - long long coord1[2] = {one.x, one.y}; - long long coord2[2] = {two.x, two.y}; - p1 = fnv1a(std::string((const char *) &coord1, sizeof(coord1))); - p2 = fnv1a(std::string((const char *) &coord2, sizeof(coord2))); - - x = hinge.x; - y = hinge.y; - } - - bool operator<(const joint &o) const { - if (y < o.y) { - return true; - } else if (y == o.y) { - if (x < o.x) { - return true; - } else if (x == o.x) { - if (p1 < o.p1) { - return true; - } else if (p1 == o.p1) { - if (p2 < o.p2) { - return true; - } - } - } - } - - return false; - } -}; - struct write_tile_args { struct task *tasks = NULL; char *stringpool = NULL; @@ -1387,6 +1349,8 @@ struct write_tile_args { atomic_strategy *strategy = NULL; int zoom = -1; bool compressed; + struct node *shared_nodes_map; + size_t nodepos; }; bool clip_to_tile(serial_feature &sf, int z, long long buffer) { @@ -1934,7 +1898,7 @@ void add_sample_to(std::vector &vals, T val, size_t &increment, size_t seq) { } } -long long write_tile(decompressor *geoms, std::atomic *geompos_in, char *stringpool, int z, const unsigned tx, const unsigned ty, const int detail, int min_detail, sqlite3 *outdb, const char *outdir, int buffer, const char *fname, compressor **geomfile, int minzoom, int maxzoom, double todo, std::atomic *along, long long alongminus, double gamma, int child_shards, long long *pool_off, unsigned *initial_x, unsigned *initial_y, std::atomic *running, double simplification, std::vector> *layermaps, std::vector> *layer_unmaps, size_t tiling_seg, size_t pass, unsigned long long mingap, long long minextent, double fraction, const char *prefilter, const char *postfilter, struct json_object *filter, write_tile_args *arg, atomic_strategy *strategy, bool compressed_input) { +long long write_tile(decompressor *geoms, std::atomic *geompos_in, char *stringpool, int z, const unsigned tx, const unsigned ty, const int detail, int min_detail, sqlite3 *outdb, const char *outdir, int buffer, const char *fname, compressor **geomfile, int minzoom, int maxzoom, double todo, std::atomic *along, long long alongminus, double gamma, int child_shards, long long *pool_off, unsigned *initial_x, unsigned *initial_y, std::atomic *running, double simplification, std::vector> *layermaps, std::vector> *layer_unmaps, size_t tiling_seg, size_t pass, unsigned long long mingap, long long minextent, double fraction, const char *prefilter, const char *postfilter, struct json_object *filter, write_tile_args *arg, atomic_strategy *strategy, bool compressed_input, struct node *shared_nodes_map, size_t nodepos) { double merge_fraction = 1; double mingap_fraction = 1; double minextent_fraction = 1; @@ -1990,7 +1954,6 @@ long long write_tile(decompressor *geoms, std::atomic *geompos_in, ch double coalesced_area = 0; drawvec shared_nodes; - std::vector shared_joints; int tile_detail = line_detail; size_t skipped = 0; @@ -2272,89 +2235,8 @@ long long write_tile(decompressor *geoms, std::atomic *geompos_in, ch } else { kept++; - if (prevent[P_SIMPLIFY_SHARED_NODES]) { - if (sf.t == VT_LINE) { - for (auto &g : sf.geometry) { - shared_nodes.push_back(g); - } - } else if (sf.t == VT_POLYGON) { - sf.geometry = remove_noop(sf.geometry, sf.t, 0); - - for (size_t i = 0; i < sf.geometry.size(); i++) { - if (sf.geometry[i].op == VT_MOVETO) { - size_t j; - for (j = i + 1; j < sf.geometry.size(); j++) { - if (sf.geometry[j].op != VT_LINETO) { - break; - } - } - - // j - 1 because we don't want the duplicate last point - for (size_t k = i; k < j - 1; k++) { - shared_joints.emplace_back( - sf.geometry[k], - sf.geometry[(k + 1 - i) % (j - 1 - i) + i], - sf.geometry[(k + 2 - i) % (j - 1 - i) + i]); - } - - // since the starting point is never simplified away, - // don't let it be simplified away in any other polygons either. - // Needs to appear twice here so that the check below will see - // it as appearing in multiple features. - shared_nodes.push_back(sf.geometry[i]); - shared_nodes.push_back(sf.geometry[i]); - - // To avoid letting polygons get simplified away to nothing, - // also keep the furthest-away point from the initial point - // (which Douglas-Peucker simplification would keep anyway, - // if its search weren't being split up by polygon side). - - double far = 0; - size_t which = i; - for (size_t k = i + 1; k < j - 1; k++) { - double xd = sf.geometry[k].x - sf.geometry[i].x; - double yd = sf.geometry[k].y - sf.geometry[i].y; - double d = xd * xd + yd * yd; - if (d > far || - ((d == far) && (sf.geometry[k] < sf.geometry[which]))) { - far = d; - which = k; - } - } - - shared_nodes.push_back(sf.geometry[which]); - shared_nodes.push_back(sf.geometry[which]); - - // And, likewise, the point most distant from those two points, - // which probably would also be the one that Douglas-Peucker - // would keep next. - - far = 0; - size_t which2 = i; - - for (size_t k = i + 1; k < j - 1; k++) { - double d = distance_from_line(sf.geometry[k].x, sf.geometry[k].y, - sf.geometry[i].x, sf.geometry[i].y, - sf.geometry[which].x, sf.geometry[which].y); - if ((d > far) || - ((d == far) && (sf.geometry[k] < sf.geometry[which2]))) { - far = d; - which2 = k; - } - } - - shared_nodes.push_back(sf.geometry[which2]); - shared_nodes.push_back(sf.geometry[which2]); - - i = j - 1; - } - } - } - - for (auto &p : sf.edge_nodes) { - shared_nodes.push_back(p); - shared_nodes.push_back(p); - } + for (auto &p : sf.edge_nodes) { + shared_nodes.push_back(p); } partial p; @@ -2398,11 +2280,15 @@ long long write_tile(decompressor *geoms, std::atomic *geompos_in, ch partials.push_back(p); unsimplified_geometry_size += sf.geometry.size() * sizeof(draw); - if (unsimplified_geometry_size > 10 * 1024 * 1024 && !additional[A_DETECT_SHARED_BORDERS] && !prevent[P_SIMPLIFY_SHARED_NODES]) { + if (unsimplified_geometry_size > 10 * 1024 * 1024 && !additional[A_DETECT_SHARED_BORDERS]) { + // we should be safe to simplify here with P_SIMPLIFY_SHARED_NODES, since they will + // have been assembled globally, although that also means that simplification + // may not be very effective for reducing memory usage. + drawvec dv; for (; simplified_geometry_through < partials.size(); simplified_geometry_through++) { - simplify_partial(&partials[simplified_geometry_through], dv); + simplify_partial(&partials[simplified_geometry_through], dv, shared_nodes_map, nodepos); for (auto &g : partials[simplified_geometry_through].geoms) { if (partials[simplified_geometry_through].t == VT_POLYGON) { @@ -2421,38 +2307,7 @@ long long write_tile(decompressor *geoms, std::atomic *geompos_in, ch coalesced_area = 0; } - { - drawvec just_shared_nodes; - std::sort(shared_nodes.begin(), shared_nodes.end()); - - for (size_t i = 0; i + 1 < shared_nodes.size(); i++) { - if (shared_nodes[i] == shared_nodes[i + 1]) { - just_shared_nodes.push_back(shared_nodes[i]); - - draw d = shared_nodes[i]; - i++; // consume the first, point at the duplicate - while (i + 1 < shared_nodes.size() && shared_nodes[i + 1] == d) { - i++; - } - } - } - - shared_nodes = just_shared_nodes; - - std::sort(shared_joints.begin(), shared_joints.end()); - for (size_t i = 0; i + 1 < shared_joints.size(); i++) { - if (shared_joints[i].x == shared_joints[i + 1].x && - shared_joints[i].y == shared_joints[i + 1].y) { - if (shared_joints[i].p1 != shared_joints[i + 1].p1 || - shared_joints[i].p2 != shared_joints[i + 1].p2) { - shared_nodes.push_back(draw(VT_MOVETO, shared_joints[i].x, shared_joints[i].y)); - } - } - } - - std::sort(shared_nodes.begin(), shared_nodes.end()); - shared_joints.clear(); - } + std::sort(shared_nodes.begin(), shared_nodes.end()); for (size_t i = 0; i < partials.size(); i++) { partial &p = partials[i]; @@ -2552,6 +2407,8 @@ long long write_tile(decompressor *geoms, std::atomic *geompos_in, ch args[i].tasks = tasks; args[i].partials = &partials; args[i].shared_nodes = &shared_nodes; + args[i].shared_nodes_map = shared_nodes_map; + args[i].nodepos = nodepos; if (tasks > 1) { if (pthread_create(&pthreads[i], NULL, partial_feature_worker, &args[i]) != 0) { @@ -2667,8 +2524,9 @@ long long write_tile(decompressor *geoms, std::atomic *geompos_in, ch if (layer_features[x].coalesced && layer_features[x].type == VT_LINE) { layer_features[x].geom = remove_noop(layer_features[x].geom, layer_features[x].type, 0); if (!(prevent[P_SIMPLIFY] || (z == maxzoom && prevent[P_SIMPLIFY_LOW]))) { - layer_features[x].geom = simplify_lines(layer_features[x].geom, 32, 0, - !(prevent[P_CLIPPING] || prevent[P_DUPLICATION]), simplification, layer_features[x].type == VT_POLYGON ? 4 : 0, shared_nodes); + // XXX revisit: why does this not take zoom into account? + layer_features[x].geom = simplify_lines(layer_features[x].geom, 32, 0, 0, 0, + !(prevent[P_CLIPPING] || prevent[P_DUPLICATION]), simplification, layer_features[x].type == VT_POLYGON ? 4 : 0, shared_nodes, NULL, 0); } } @@ -3082,7 +2940,7 @@ void *run_thread(void *vargs) { // fprintf(stderr, "%d/%u/%u\n", z, x, y); - long long len = write_tile(&dc, &geompos, arg->stringpool, z, x, y, z == arg->maxzoom ? arg->full_detail : arg->low_detail, arg->min_detail, arg->outdb, arg->outdir, arg->buffer, arg->fname, arg->geomfile, arg->minzoom, arg->maxzoom, arg->todo, arg->along, geompos, arg->gamma, arg->child_shards, arg->pool_off, arg->initial_x, arg->initial_y, arg->running, arg->simplification, arg->layermaps, arg->layer_unmaps, arg->tiling_seg, arg->pass, arg->mingap, arg->minextent, arg->fraction, arg->prefilter, arg->postfilter, arg->filter, arg, arg->strategy, arg->compressed); + long long len = write_tile(&dc, &geompos, arg->stringpool, z, x, y, z == arg->maxzoom ? arg->full_detail : arg->low_detail, arg->min_detail, arg->outdb, arg->outdir, arg->buffer, arg->fname, arg->geomfile, arg->minzoom, arg->maxzoom, arg->todo, arg->along, geompos, arg->gamma, arg->child_shards, arg->pool_off, arg->initial_x, arg->initial_y, arg->running, arg->simplification, arg->layermaps, arg->layer_unmaps, arg->tiling_seg, arg->pass, arg->mingap, arg->minextent, arg->fraction, arg->prefilter, arg->postfilter, arg->filter, arg, arg->strategy, arg->compressed, arg->shared_nodes_map, arg->nodepos); if (len < 0) { int *err = &arg->err; @@ -3147,7 +3005,7 @@ void *run_thread(void *vargs) { return NULL; } -int traverse_zooms(int *geomfd, off_t *geom_size, char *stringpool, std::atomic *midx, std::atomic *midy, int &maxzoom, int minzoom, sqlite3 *outdb, const char *outdir, int buffer, const char *fname, const char *tmpdir, double gamma, int full_detail, int low_detail, int min_detail, long long *pool_off, unsigned *initial_x, unsigned *initial_y, double simplification, double maxzoom_simplification, std::vector> &layermaps, const char *prefilter, const char *postfilter, std::map const *attribute_accum, struct json_object *filter, std::vector &strategies, int iz) { +int traverse_zooms(int *geomfd, off_t *geom_size, char *stringpool, std::atomic *midx, std::atomic *midy, int &maxzoom, int minzoom, sqlite3 *outdb, const char *outdir, int buffer, const char *fname, const char *tmpdir, double gamma, int full_detail, int low_detail, int min_detail, long long *pool_off, unsigned *initial_x, unsigned *initial_y, double simplification, double maxzoom_simplification, std::vector> &layermaps, const char *prefilter, const char *postfilter, std::map const *attribute_accum, struct json_object *filter, std::vector &strategies, int iz, struct node *shared_nodes_map, size_t nodepos) { last_progress = 0; // The existing layermaps are one table per input thread. @@ -3352,6 +3210,8 @@ int traverse_zooms(int *geomfd, off_t *geom_size, char *stringpool, std::atomic< args[thread].strategy = &strategy; args[thread].zoom = z; args[thread].compressed = (z != iz); + args[thread].shared_nodes_map = shared_nodes_map; + args[thread].nodepos = nodepos; if (pthread_create(&pthreads[thread], NULL, run_thread, &args[thread]) != 0) { perror("pthread_create"); diff --git a/tile.hpp b/tile.hpp index 1159f376..cecff006 100644 --- a/tile.hpp +++ b/tile.hpp @@ -7,6 +7,7 @@ #include #include #include "mbtiles.hpp" +#include "serial.hpp" #include "jsonpull/jsonpull.h" enum attribute_op { @@ -61,9 +62,9 @@ struct strategy { strategy() = default; }; -long long write_tile(char **geom, char *stringpool, unsigned *file_bbox, int z, unsigned x, unsigned y, int detail, int min_detail, int basezoom, sqlite3 *outdb, const char *outdir, double droprate, int buffer, const char *fname, FILE **geomfile, int file_minzoom, int file_maxzoom, double todo, char *geomstart, long long along, double gamma, int nlayers, std::atomic *strategy); +// long long write_tile(char **geom, char *stringpool, unsigned *file_bbox, int z, unsigned x, unsigned y, int detail, int min_detail, int basezoom, sqlite3 *outdb, const char *outdir, double droprate, int buffer, const char *fname, FILE **geomfile, int file_minzoom, int file_maxzoom, double todo, char *geomstart, long long along, double gamma, int nlayers, std::atomic *strategy); -int traverse_zooms(int *geomfd, off_t *geom_size, char *stringpool, std::atomic *midx, std::atomic *midy, int &maxzoom, int minzoom, sqlite3 *outdb, const char *outdir, int buffer, const char *fname, const char *tmpdir, double gamma, int full_detail, int low_detail, int min_detail, long long *pool_off, unsigned *initial_x, unsigned *initial_y, double simplification, double maxzoom_simplification, std::vector > &layermap, const char *prefilter, const char *postfilter, std::map const *attribute_accum, struct json_object *filter, std::vector &strategies, int iz); +int traverse_zooms(int *geomfd, off_t *geom_size, char *stringpool, std::atomic *midx, std::atomic *midy, int &maxzoom, int minzoom, sqlite3 *outdb, const char *outdir, int buffer, const char *fname, const char *tmpdir, double gamma, int full_detail, int low_detail, int min_detail, long long *pool_off, unsigned *initial_x, unsigned *initial_y, double simplification, double maxzoom_simplification, std::vector > &layermap, const char *prefilter, const char *postfilter, std::map const *attribute_accum, struct json_object *filter, std::vector &strategies, int iz, struct node *shared_nodes_map, size_t nodepos); int manage_gap(unsigned long long index, unsigned long long *previndex, double scale, double gamma, double *gap); diff --git a/unit.cpp b/unit.cpp index 24c3fb10..006dab32 100644 --- a/unit.cpp +++ b/unit.cpp @@ -1,6 +1,9 @@ #define CATCH_CONFIG_MAIN #include "catch/catch.hpp" #include "text.hpp" +#include "sort.hpp" +#include +#include TEST_CASE("UTF-8 enforcement", "[utf8]") { REQUIRE(check_utf8("") == std::string("")); @@ -18,3 +21,47 @@ TEST_CASE("UTF-8 truncation", "[trunc]") { REQUIRE(truncate16("0123456789😀😬😁😂😃😄😅😆", 17) == std::string("0123456789😀😬😁")); REQUIRE(truncate16("0123456789あいうえおかきくけこさ", 16) == std::string("0123456789あいうえおか")); } + +int intcmp(const void *v1, const void *v2) { + return *((int *) v1) - *((int *) v2); +} + +TEST_CASE("External quicksort", "fqsort") { + std::vector inputs; + + size_t written = 0; + for (size_t i = 0; i < 5; i++) { + std::string tmpname = "/tmp/in.XXXXXXX"; + int fd = mkstemp((char *) tmpname.c_str()); + unlink(tmpname.c_str()); + FILE *f = fdopen(fd, "w+b"); + inputs.emplace_back(f); + size_t iterations = 2000 + rand() % 200; + for (size_t j = 0; j < iterations; j++) { + int n = rand(); + fwrite((void *) &n, sizeof(int), 1, f); + written++; + } + rewind(f); + } + + std::string tmpname = "/tmp/out.XXXXXX"; + int fd = mkstemp((char *) tmpname.c_str()); + unlink(tmpname.c_str()); + FILE *f = fdopen(fd, "w+b"); + + fqsort(inputs, sizeof(int), intcmp, f, 256); + rewind(f); + + int prev = INT_MIN; + int here; + size_t nread = 0; + while (fread((void *) &here, sizeof(int), 1, f)) { + REQUIRE(here >= prev); + prev = here; + nread++; + } + + fclose(f); + REQUIRE(nread == written); +} diff --git a/version.hpp b/version.hpp index 9d8e4b14..a88ebb88 100644 --- a/version.hpp +++ b/version.hpp @@ -1,6 +1,6 @@ #ifndef VERSION_HPP #define VERSION_HPP -#define VERSION "v2.32.1" +#define VERSION "v2.33.0" #endif From cc5c1c79df6eac61b7180854384e83de0ede7a19 Mon Sep 17 00:00:00 2001 From: Erica Fischer Date: Wed, 4 Oct 2023 12:14:22 -0700 Subject: [PATCH 3/4] Speed up overzooming in tile-join (#147) * Clip away entire features by bbox. Avoid unnecessary recompression. * Move parent tile decoding in tile-join out of overzoom proper * An ever-growing cache of parent tiles * Limit the size of the cache * Remove the current reader *before* checking if we can run the queue * Clean up * Add missing #include * Add comment * When the tile-join cache fills up, evict the least recently used * Fix microsecond math * Factoring out tile-join's cache for testing * Add unit tests for tile-join cache * Update changelog and version --- CHANGELOG.md | 4 + Makefile | 2 +- clip.cpp | 39 +++- dirtiles.hpp | 1 + geometry.hpp | 6 +- overzoom.cpp | 2 +- tests/ne_110m_ocean/join/joined.mbtiles.json | 184 +++++++++---------- tile-cache.hpp | 46 +++++ tile-join.cpp | 52 ++++-- unit.cpp | 34 ++++ version.hpp | 2 +- 11 files changed, 260 insertions(+), 112 deletions(-) create mode 100644 tile-cache.hpp diff --git a/CHANGELOG.md b/CHANGELOG.md index d250fca6..9abda4a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 2.34.0 + +* Improve speed of overzooming in tile-join + # 2.33.0 * Further reduce memory usage of --no-simplification-of-shared-nodes by calculating the list of shared nodes globally using temporary files rather than in memory for each individual tile diff --git a/Makefile b/Makefile index 7cd602ff..3968ed49 100644 --- a/Makefile +++ b/Makefile @@ -73,7 +73,7 @@ tile-join: tile-join.o projection.o mbtiles.o mvt.o memfile.o dirtiles.o jsonpul tippecanoe-json-tool: jsontool.o jsonpull/jsonpull.o csv.o text.o geojson-loop.o $(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3 -lpthread -unit: unit.o text.o sort.o +unit: unit.o text.o sort.o mvt.o $(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3 -lpthread tippecanoe-overzoom: overzoom.o mvt.o clip.o diff --git a/clip.cpp b/clip.cpp index 8ff28d9f..5e4e644f 100644 --- a/clip.cpp +++ b/clip.cpp @@ -1,6 +1,8 @@ +#include #include #include #include +#include #include "geometry.hpp" #include "errors.hpp" #include "compression.hpp" @@ -751,11 +753,11 @@ static std::vector> clip_poly1(std::vector const &keep) { - mvt_tile tile, outtile; - bool was_compressed; + int detail, int buffer, std::set const &keep, bool do_compress) { + mvt_tile tile; try { + bool was_compressed; if (!tile.decode(s, was_compressed)) { fprintf(stderr, "Couldn't parse tile %d/%u/%u\n", oz, ox, oy); exit(EXIT_MVT); @@ -765,6 +767,13 @@ std::string overzoom(std::string s, int oz, int ox, int oy, int nz, int nx, int exit(EXIT_PROTOBUF); } + return overzoom(tile, oz, ox, oy, nz, nx, ny, detail, buffer, keep, do_compress); +} + +std::string overzoom(mvt_tile tile, int oz, int ox, int oy, int nz, int nx, int ny, + int detail, int buffer, std::set const &keep, bool do_compress) { + mvt_tile outtile; + for (auto const &layer : tile.layers) { mvt_layer outlayer = mvt_layer(); @@ -813,6 +822,23 @@ std::string overzoom(std::string s, int oz, int ox, int oy, int nz, int nx, int // Clip to output tile + long long xmin = LLONG_MAX; + long long ymin = LLONG_MAX; + long long xmax = LLONG_MIN; + long long ymax = LLONG_MIN; + + for (auto const &g : geom) { + xmin = std::min(xmin, g.x); + ymin = std::min(ymin, g.y); + xmax = std::max(xmax, g.x); + ymax = std::max(ymax, g.y); + } + + long long b = outtilesize * buffer / 256; + if (xmax < -b || ymax < -b || xmin > outtilesize + b || ymin > outtilesize + b) { + continue; + } + if (t == VT_LINE) { geom = clip_lines(geom, nz, buffer); } else if (t == VT_POLYGON) { @@ -866,8 +892,13 @@ std::string overzoom(std::string s, int oz, int ox, int oy, int nz, int nx, int if (outtile.layers.size() > 0) { std::string pbf = outtile.encode(); + std::string compressed; - compress(pbf, compressed, true); + if (do_compress) { + compress(pbf, compressed, true); + } else { + compressed = pbf; + } return compressed; } else { diff --git a/dirtiles.hpp b/dirtiles.hpp index 099fa4f0..226d4430 100644 --- a/dirtiles.hpp +++ b/dirtiles.hpp @@ -1,6 +1,7 @@ #include #include #include +#include "mbtiles.hpp" #ifndef DIRTILES_HPP #define DIRTILES_HPP diff --git a/geometry.hpp b/geometry.hpp index f966201b..5da7cdf3 100644 --- a/geometry.hpp +++ b/geometry.hpp @@ -7,6 +7,7 @@ #include #include #include +#include #define VT_POINT 1 #define VT_LINE 2 @@ -97,7 +98,10 @@ void visvalingam(drawvec &ls, size_t start, size_t end, double threshold, size_t int pnpoly(const drawvec &vert, size_t start, size_t nvert, long long testx, long long testy); double distance_from_line(long long point_x, long long point_y, long long segA_x, long long segA_y, long long segB_x, long long segB_y); +std::string overzoom(mvt_tile tile, int oz, int ox, int oy, int nz, int nx, int ny, + int detail, int buffer, std::set const &keep, bool do_compress); + std::string overzoom(std::string s, int oz, int ox, int oy, int nz, int nx, int ny, - int detail, int buffer, std::set const &keep); + int detail, int buffer, std::set const &keep, bool do_compress); #endif diff --git a/overzoom.cpp b/overzoom.cpp index 43024f7e..c2129a02 100644 --- a/overzoom.cpp +++ b/overzoom.cpp @@ -91,7 +91,7 @@ int main(int argc, char **argv) { exit(EXIT_FAILURE); } - std::string out = overzoom(tile, oz, ox, oy, nz, nx, ny, detail, buffer, keep); + std::string out = overzoom(tile, oz, ox, oy, nz, nx, ny, detail, buffer, keep, true); fwrite(out.c_str(), sizeof(char), out.size(), f); fclose(f); diff --git a/tests/ne_110m_ocean/join/joined.mbtiles.json b/tests/ne_110m_ocean/join/joined.mbtiles.json index 305ab9fa..3d30e18f 100644 --- a/tests/ne_110m_ocean/join/joined.mbtiles.json +++ b/tests/ne_110m_ocean/join/joined.mbtiles.json @@ -1,14 +1,14 @@ { "type": "FeatureCollection", "properties": { "antimeridian_adjusted_bounds": "-180.000000,-85.051129,180.000000,85.051129", "bounds": "-180.000000,-85.051129,180.000000,85.051129", -"center": "11.250000,48.378236,4", -"description": "tests/ne_110m_ocean/join/countries.mbtiles", +"center": "-45.000000,33.256630,4", +"description": "tests/ne_110m_ocean/join/ocean.mbtiles", "format": "pbf", -"generator_options": "./tippecanoe -q -z2 -f -o tests/ne_110m_ocean/join/ocean.mbtiles tests/ne_110m_ocean/in.json; ./tippecanoe -q -z4 -d8 -y name -f -o tests/ne_110m_ocean/join/countries.mbtiles tests/ne_110m_admin_0_countries/in.json.gz; ./tile-join --overzoom -f -o tests/ne_110m_ocean/join/joined.mbtiles tests/ne_110m_ocean/join/ocean.mbtiles tests/ne_110m_ocean/join/countries.mbtiles", +"generator_options": "./tippecanoe -q -z4 -d8 -y name -f -o tests/ne_110m_ocean/join/countries.mbtiles tests/ne_110m_admin_0_countries/in.json.gz; ./tippecanoe -q -z2 -f -o tests/ne_110m_ocean/join/ocean.mbtiles tests/ne_110m_ocean/in.json; ./tile-join --overzoom -f -o tests/ne_110m_ocean/join/joined.mbtiles tests/ne_110m_ocean/join/ocean.mbtiles tests/ne_110m_ocean/join/countries.mbtiles", "json": "{\"vector_layers\":[{\"id\":\"in\",\"description\":\"\",\"minzoom\":0,\"maxzoom\":4,\"fields\":{\"featurecla\":\"String\",\"min_zoom\":\"Number\",\"name\":\"String\",\"scalerank\":\"Number\"}}],\"tilestats\":{\"layerCount\":1,\"layers\":[{\"layer\":\"in\",\"count\":1776,\"geometry\":\"Polygon\",\"attributeCount\":4,\"attributes\":[{\"attribute\":\"featurecla\",\"count\":1,\"type\":\"string\",\"values\":[\"Ocean\"]},{\"attribute\":\"min_zoom\",\"count\":1,\"type\":\"number\",\"values\":[0],\"min\":0,\"max\":0},{\"attribute\":\"name\",\"count\":177,\"type\":\"string\",\"values\":[\"Afghanistan\",\"Albania\",\"Algeria\",\"Angola\",\"Antarctica\",\"Argentina\",\"Armenia\",\"Australia\",\"Austria\",\"Azerbaijan\",\"Bahamas\",\"Bangladesh\",\"Belarus\",\"Belgium\",\"Belize\",\"Benin\",\"Bhutan\",\"Bolivia\",\"Bosnia and Herz.\",\"Botswana\",\"Brazil\",\"Brunei\",\"Bulgaria\",\"Burkina Faso\",\"Burundi\",\"Cambodia\",\"Cameroon\",\"Canada\",\"Central African Rep.\",\"Chad\",\"Chile\",\"China\",\"Colombia\",\"Congo\",\"Costa Rica\",\"Croatia\",\"Cuba\",\"Cyprus\",\"Czech Rep.\",\"Côte d'Ivoire\",\"Dem. Rep. Congo\",\"Dem. Rep. Korea\",\"Denmark\",\"Djibouti\",\"Dominican Rep.\",\"Ecuador\",\"Egypt\",\"El Salvador\",\"Eq. Guinea\",\"Eritrea\",\"Estonia\",\"Ethiopia\",\"Falkland Is.\",\"Fiji\",\"Finland\",\"Fr. S. Antarctic Lands\",\"France\",\"Gabon\",\"Gambia\",\"Georgia\",\"Germany\",\"Ghana\",\"Greece\",\"Greenland\",\"Guatemala\",\"Guinea\",\"Guinea-Bissau\",\"Guyana\",\"Haiti\",\"Honduras\",\"Hungary\",\"Iceland\",\"India\",\"Indonesia\",\"Iran\",\"Iraq\",\"Ireland\",\"Israel\",\"Italy\",\"Jamaica\",\"Japan\",\"Jordan\",\"Kazakhstan\",\"Kenya\",\"Korea\",\"Kosovo\",\"Kuwait\",\"Kyrgyzstan\",\"Lao PDR\",\"Latvia\",\"Lebanon\",\"Lesotho\",\"Liberia\",\"Libya\",\"Lithuania\",\"Luxembourg\",\"Macedonia\",\"Madagascar\",\"Malawi\",\"Malaysia\"]},{\"attribute\":\"scalerank\",\"count\":1,\"type\":\"number\",\"values\":[0],\"min\":0,\"max\":0}]}]}}", "maxzoom": "4", "minzoom": "0", -"name": "tests/ne_110m_ocean/join/ocean.mbtiles + tests/ne_110m_ocean/join/countries.mbtiles", +"name": "tests/ne_110m_ocean/join/countries.mbtiles + tests/ne_110m_ocean/join/ocean.mbtiles", "strategies": "[{},{},{},{},{\"tiny_polygons\":4}]", "type": "overlay", "version": "2" @@ -1439,17 +1439,17 @@ , { "type": "FeatureCollection", "properties": { "zoom": 3, "x": 0, "y": 4 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Fiji" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -180.000000, -16.045813 ], [ -179.824219, -16.045813 ], [ -179.912109, -16.467695 ], [ -180.000000, -16.551962 ], [ -180.615234, -16.804541 ], [ -180.878906, -16.867634 ], [ -180.878906, -16.467695 ], [ -180.615234, -16.383391 ], [ -180.000000, -16.045813 ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -180.878906, -16.425548 ], [ -180.878906, 0.878872 ], [ -134.121094, 0.878872 ], [ -134.121094, -41.640078 ], [ -180.878906, -41.640078 ], [ -180.878906, -16.867634 ], [ -180.000000, -16.551962 ], [ -179.912109, -16.509833 ], [ -179.802246, -16.024696 ], [ -180.000000, -16.066929 ], [ -180.593262, -16.383391 ], [ -180.878906, -16.425548 ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Fiji" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -180.000000, -16.045813 ], [ -179.824219, -16.045813 ], [ -179.912109, -16.467695 ], [ -180.000000, -16.551962 ], [ -180.615234, -16.804541 ], [ -180.878906, -16.867634 ], [ -180.878906, -16.467695 ], [ -180.615234, -16.383391 ], [ -180.000000, -16.045813 ] ] ] } } ] } ] } , { "type": "FeatureCollection", "properties": { "zoom": 3, "x": 0, "y": 3 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "United States" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -155.830078, 20.303418 ], [ -155.742188, 20.220966 ], [ -155.039062, 19.890723 ], [ -154.775391, 19.476950 ], [ -154.863281, 19.476950 ], [ -155.214844, 19.228177 ], [ -155.566406, 19.062118 ], [ -155.654297, 18.895893 ], [ -155.917969, 19.062118 ], [ -155.917969, 19.311143 ], [ -156.093750, 19.725342 ], [ -155.830078, 19.973349 ], [ -155.917969, 20.138470 ], [ -155.830078, 20.303418 ] ] ], [ [ [ -156.621094, 21.043491 ], [ -156.269531, 20.879343 ], [ -156.005859, 20.797201 ], [ -156.093750, 20.632784 ], [ -156.445312, 20.550509 ], [ -156.621094, 20.797201 ], [ -156.708984, 20.879343 ], [ -156.708984, 20.961440 ], [ -156.621094, 21.043491 ] ] ], [ [ [ -156.796875, 21.207459 ], [ -156.796875, 21.043491 ], [ -157.324219, 21.125498 ], [ -157.236328, 21.207459 ], [ -156.796875, 21.207459 ] ] ], [ [ [ -158.027344, 21.698265 ], [ -157.939453, 21.616579 ], [ -157.675781, 21.289374 ], [ -158.115234, 21.289374 ], [ -158.291016, 21.534847 ], [ -158.291016, 21.616579 ], [ -158.027344, 21.698265 ] ] ], [ [ [ -159.609375, 22.268764 ], [ -159.345703, 22.187405 ], [ -159.345703, 21.943046 ], [ -159.433594, 21.861499 ], [ -159.785156, 22.105999 ], [ -159.609375, 22.268764 ] ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -134.121094, 41.640078 ], [ -134.121094, -0.878872 ], [ -180.878906, -0.878872 ], [ -180.878906, 41.640078 ], [ -134.121094, 41.640078 ] ], [ [ -155.852051, 20.262197 ], [ -155.917969, 20.179724 ], [ -155.852051, 19.973349 ], [ -156.027832, 19.808054 ], [ -156.071777, 19.704658 ], [ -155.917969, 19.331878 ], [ -155.939941, 19.062118 ], [ -155.698242, 18.916680 ], [ -155.544434, 19.082884 ], [ -154.841309, 19.456234 ], [ -154.797363, 19.518375 ], [ -155.214844, 19.993998 ], [ -155.852051, 20.262197 ] ], [ [ -156.621094, 21.002471 ], [ -156.708984, 20.920397 ], [ -156.708984, 20.858812 ], [ -156.577148, 20.776659 ], [ -156.423340, 20.571082 ], [ -156.071777, 20.653346 ], [ -156.005859, 20.756114 ], [ -156.247559, 20.920397 ], [ -156.621094, 21.002471 ] ], [ [ -157.258301, 21.227942 ], [ -157.324219, 21.105000 ], [ -156.796875, 21.063997 ], [ -156.752930, 21.186973 ], [ -157.258301, 21.227942 ] ], [ [ -158.027344, 21.718680 ], [ -158.291016, 21.575719 ], [ -158.137207, 21.309846 ], [ -157.697754, 21.268900 ], [ -157.653809, 21.330315 ], [ -158.027344, 21.718680 ] ], [ [ -159.587402, 22.228090 ], [ -159.741211, 22.146708 ], [ -159.807129, 22.065278 ], [ -159.455566, 21.881890 ], [ -159.345703, 21.983801 ], [ -159.367676, 22.207749 ], [ -159.587402, 22.228090 ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "United States" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -155.830078, 20.303418 ], [ -155.742188, 20.220966 ], [ -155.039062, 19.890723 ], [ -154.775391, 19.476950 ], [ -154.863281, 19.476950 ], [ -155.214844, 19.228177 ], [ -155.566406, 19.062118 ], [ -155.654297, 18.895893 ], [ -155.917969, 19.062118 ], [ -155.917969, 19.311143 ], [ -156.093750, 19.725342 ], [ -155.830078, 19.973349 ], [ -155.917969, 20.138470 ], [ -155.830078, 20.303418 ] ] ], [ [ [ -156.621094, 21.043491 ], [ -156.269531, 20.879343 ], [ -156.005859, 20.797201 ], [ -156.093750, 20.632784 ], [ -156.445312, 20.550509 ], [ -156.621094, 20.797201 ], [ -156.708984, 20.879343 ], [ -156.708984, 20.961440 ], [ -156.621094, 21.043491 ] ] ], [ [ [ -156.796875, 21.207459 ], [ -156.796875, 21.043491 ], [ -157.324219, 21.125498 ], [ -157.236328, 21.207459 ], [ -156.796875, 21.207459 ] ] ], [ [ [ -158.027344, 21.698265 ], [ -157.939453, 21.616579 ], [ -157.675781, 21.289374 ], [ -158.115234, 21.289374 ], [ -158.291016, 21.534847 ], [ -158.291016, 21.616579 ], [ -158.027344, 21.698265 ] ] ], [ [ [ -159.609375, 22.268764 ], [ -159.345703, 22.187405 ], [ -159.345703, 21.943046 ], [ -159.433594, 21.861499 ], [ -159.785156, 22.105999 ], [ -159.609375, 22.268764 ] ] ] ] } } ] } ] } , @@ -1697,9 +1697,9 @@ , { "type": "FeatureCollection", "properties": { "zoom": 3, "x": 3, "y": 7 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Antarctica" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 0.878906, -79.004962 ], [ 0.878906, -85.126373 ], [ -45.878906, -85.126373 ], [ -45.878906, -81.789349 ], [ -45.000000, -81.839404 ], [ -44.824219, -81.848756 ], [ -42.802734, -82.082145 ], [ -42.187500, -81.646927 ], [ -40.781250, -81.361287 ], [ -38.232422, -81.334844 ], [ -34.365234, -80.900669 ], [ -32.343750, -80.774716 ], [ -30.058594, -80.589727 ], [ -28.564453, -80.342262 ], [ -29.267578, -79.981891 ], [ -29.707031, -79.639874 ], [ -29.707031, -79.253586 ], [ -31.640625, -79.302640 ], [ -33.662109, -79.448477 ], [ -35.683594, -79.448477 ], [ -35.892334, -79.171335 ], [ -35.947266, -79.088462 ], [ -35.925293, -79.004962 ], [ 0.878906, -79.004962 ] ] ], [ [ [ -43.571777, -79.004962 ], [ -43.505859, -79.088462 ], [ -43.472900, -79.171335 ], [ -43.330078, -79.512662 ], [ -43.330078, -80.027655 ], [ -44.912109, -80.342262 ], [ -45.000000, -80.356995 ], [ -45.878906, -80.494044 ], [ -45.878906, -79.004962 ], [ -43.571777, -79.004962 ] ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -45.878906, -80.494044 ], [ -44.890137, -80.338575 ], [ -43.330078, -80.027655 ], [ -43.374023, -79.516660 ], [ -43.483887, -79.084302 ], [ -43.538818, -79.004962 ], [ -35.892334, -79.004962 ], [ -35.903320, -79.084302 ], [ -35.639648, -79.456522 ], [ -33.684082, -79.456522 ], [ -31.618652, -79.298560 ], [ -29.685059, -79.261777 ], [ -29.685059, -79.631968 ], [ -29.245605, -79.985712 ], [ -28.542480, -80.338575 ], [ -30.102539, -80.593319 ], [ -32.299805, -80.767668 ], [ -34.387207, -80.907616 ], [ -38.254395, -81.338154 ], [ -40.781250, -81.357986 ], [ -42.165527, -81.650118 ], [ -42.802734, -82.082145 ], [ -44.824219, -81.845640 ], [ -45.878906, -81.787779 ], [ -45.878906, -80.494044 ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Antarctica" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 0.878906, -79.004962 ], [ 0.878906, -85.126373 ], [ -45.878906, -85.126373 ], [ -45.878906, -81.789349 ], [ -45.000000, -81.839404 ], [ -44.824219, -81.848756 ], [ -42.802734, -82.082145 ], [ -42.187500, -81.646927 ], [ -40.781250, -81.361287 ], [ -38.232422, -81.334844 ], [ -34.365234, -80.900669 ], [ -32.343750, -80.774716 ], [ -30.058594, -80.589727 ], [ -28.564453, -80.342262 ], [ -29.267578, -79.981891 ], [ -29.707031, -79.639874 ], [ -29.707031, -79.253586 ], [ -31.640625, -79.302640 ], [ -33.662109, -79.448477 ], [ -35.683594, -79.448477 ], [ -35.892334, -79.171335 ], [ -35.947266, -79.088462 ], [ -35.925293, -79.004962 ], [ 0.878906, -79.004962 ] ] ], [ [ [ -43.571777, -79.004962 ], [ -43.505859, -79.088462 ], [ -43.472900, -79.171335 ], [ -43.330078, -79.512662 ], [ -43.330078, -80.027655 ], [ -44.912109, -80.342262 ], [ -45.000000, -80.356995 ], [ -45.878906, -80.494044 ], [ -45.878906, -79.004962 ], [ -43.571777, -79.004962 ] ] ] ] } } ] } ] } , @@ -1801,9 +1801,9 @@ , { "type": "FeatureCollection", "properties": { "zoom": 3, "x": 3, "y": 0 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Greenland" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -35.068359, 83.647837 ], [ -27.070312, 83.520162 ], [ -20.830078, 82.732092 ], [ -22.675781, 82.344100 ], [ -26.542969, 82.297121 ], [ -31.904297, 82.202302 ], [ -31.376953, 82.021378 ], [ -27.861328, 82.130427 ], [ -24.873047, 81.786210 ], [ -22.939453, 82.094243 ], [ -22.060547, 81.735830 ], [ -23.203125, 81.147481 ], [ -20.654297, 81.518272 ], [ -15.732422, 81.910828 ], [ -12.744141, 81.723188 ], [ -12.216797, 81.295029 ], [ -16.259766, 80.575346 ], [ -16.875000, 80.356995 ], [ -20.039062, 80.178713 ], [ -17.753906, 80.133635 ], [ -18.896484, 79.400085 ], [ -19.182129, 79.171335 ], [ -19.379883, 79.004962 ], [ -45.878906, 79.004962 ], [ -45.878906, 81.873641 ], [ -45.000000, 81.731092 ], [ -44.560547, 81.659685 ], [ -45.000000, 81.762633 ], [ -45.878906, 81.966292 ], [ -45.878906, 82.792991 ], [ -45.000000, 82.951121 ], [ -43.417969, 83.226067 ], [ -39.902344, 83.184473 ], [ -38.583984, 83.549851 ], [ -35.068359, 83.647837 ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -45.878906, 82.790234 ], [ -45.878906, 85.126373 ], [ 0.878906, 85.126373 ], [ 0.878906, 79.004962 ], [ -19.401855, 79.004962 ], [ -18.896484, 79.400085 ], [ -17.731934, 80.129870 ], [ -20.039062, 80.178713 ], [ -16.853027, 80.349631 ], [ -16.281738, 80.578943 ], [ -12.216797, 81.291703 ], [ -12.766113, 81.720024 ], [ -15.776367, 81.913920 ], [ -20.632324, 81.524751 ], [ -23.159180, 81.154241 ], [ -22.082520, 81.735830 ], [ -22.895508, 82.094243 ], [ -24.851074, 81.786210 ], [ -27.861328, 82.130427 ], [ -31.398926, 82.021378 ], [ -31.904297, 82.199320 ], [ -26.520996, 82.297121 ], [ -22.697754, 82.341172 ], [ -20.852051, 82.726530 ], [ -27.092285, 83.520162 ], [ -35.090332, 83.645406 ], [ -38.627930, 83.549851 ], [ -39.902344, 83.179256 ], [ -43.395996, 83.226067 ], [ -45.878906, 82.790234 ] ] ], [ [ [ -45.878906, 81.970897 ], [ -44.516602, 81.659685 ], [ -45.878906, 81.873641 ], [ -45.878906, 81.970897 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Greenland" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -35.068359, 83.647837 ], [ -27.070312, 83.520162 ], [ -20.830078, 82.732092 ], [ -22.675781, 82.344100 ], [ -26.542969, 82.297121 ], [ -31.904297, 82.202302 ], [ -31.376953, 82.021378 ], [ -27.861328, 82.130427 ], [ -24.873047, 81.786210 ], [ -22.939453, 82.094243 ], [ -22.060547, 81.735830 ], [ -23.203125, 81.147481 ], [ -20.654297, 81.518272 ], [ -15.732422, 81.910828 ], [ -12.744141, 81.723188 ], [ -12.216797, 81.295029 ], [ -16.259766, 80.575346 ], [ -16.875000, 80.356995 ], [ -20.039062, 80.178713 ], [ -17.753906, 80.133635 ], [ -18.896484, 79.400085 ], [ -19.182129, 79.171335 ], [ -19.379883, 79.004962 ], [ -45.878906, 79.004962 ], [ -45.878906, 81.873641 ], [ -45.000000, 81.731092 ], [ -44.560547, 81.659685 ], [ -45.000000, 81.762633 ], [ -45.878906, 81.966292 ], [ -45.878906, 82.792991 ], [ -45.000000, 82.951121 ], [ -43.417969, 83.226067 ], [ -39.902344, 83.184473 ], [ -38.583984, 83.549851 ], [ -35.068359, 83.647837 ] ] ] } } ] } ] } , @@ -2103,24 +2103,28 @@ , { "type": "FeatureCollection", "properties": { "zoom": 3, "x": 5, "y": 5 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ +{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 90.878906, -40.313043 ], [ 90.878906, -66.861082 ], [ 88.736572, -66.861082 ], [ 88.374023, -66.513260 ], [ 87.978516, -66.213739 ], [ 87.758789, -66.513260 ], [ 87.484131, -66.861082 ], [ 57.733154, -66.861082 ], [ 57.260742, -66.679087 ], [ 57.216797, -66.513260 ], [ 57.150879, -66.249163 ], [ 56.359863, -65.973325 ], [ 55.415039, -65.874725 ], [ 54.536133, -65.820782 ], [ 53.613281, -65.892680 ], [ 52.624512, -66.053716 ], [ 51.789551, -66.249163 ], [ 50.976562, -66.513260 ], [ 50.767822, -66.861082 ], [ 44.121094, -66.861082 ], [ 44.121094, -40.313043 ], [ 90.878906, -40.313043 ] ], [ [ 68.928223, -48.618385 ], [ 68.730469, -49.239121 ], [ 68.752441, -49.781264 ], [ 70.290527, -49.710273 ], [ 70.554199, -49.253465 ], [ 70.532227, -49.066668 ], [ 69.587402, -48.936935 ], [ 68.928223, -48.618385 ] ] ] } } +, { "type": "Feature", "properties": { "name": "Antarctica" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 54.492188, -65.802776 ], [ 55.371094, -65.874725 ], [ 56.337891, -65.982270 ], [ 57.128906, -66.231457 ], [ 57.183838, -66.513260 ], [ 57.216797, -66.687784 ], [ 57.700195, -66.861082 ], [ 50.712891, -66.861082 ], [ 50.976562, -66.513260 ], [ 51.767578, -66.231457 ], [ 52.646484, -66.053716 ], [ 53.613281, -65.910623 ], [ 54.492188, -65.802776 ] ] ], [ [ [ 87.451172, -66.861082 ], [ 87.725830, -66.513260 ], [ 87.978516, -66.196009 ], [ 88.363037, -66.513260 ], [ 88.747559, -66.861082 ], [ 87.451172, -66.861082 ] ] ] ] } } , { "type": "Feature", "properties": { "name": "Fr. S. Antarctic Lands" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 68.906250, -48.632909 ], [ 69.609375, -48.922499 ], [ 70.488281, -49.037868 ], [ 70.576172, -49.267805 ], [ 70.312500, -49.724479 ], [ 68.730469, -49.781264 ], [ 68.730469, -49.267805 ], [ 68.906250, -48.806863 ], [ 68.906250, -48.632909 ] ] ] } } -, -{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 90.878906, -40.313043 ], [ 90.878906, -66.861082 ], [ 88.736572, -66.861082 ], [ 88.374023, -66.513260 ], [ 87.978516, -66.213739 ], [ 87.758789, -66.513260 ], [ 87.484131, -66.861082 ], [ 57.733154, -66.861082 ], [ 57.260742, -66.679087 ], [ 57.216797, -66.513260 ], [ 57.150879, -66.249163 ], [ 56.359863, -65.973325 ], [ 55.415039, -65.874725 ], [ 54.536133, -65.820782 ], [ 53.613281, -65.892680 ], [ 52.624512, -66.053716 ], [ 51.789551, -66.249163 ], [ 50.976562, -66.513260 ], [ 50.767822, -66.861082 ], [ 44.121094, -66.861082 ], [ 44.121094, -40.313043 ], [ 90.878906, -40.313043 ] ], [ [ 68.928223, -48.618385 ], [ 68.730469, -49.239121 ], [ 68.752441, -49.781264 ], [ 70.290527, -49.710273 ], [ 70.554199, -49.253465 ], [ 70.532227, -49.066668 ], [ 69.587402, -48.936935 ], [ 68.928223, -48.618385 ] ] ] } } ] } ] } , { "type": "FeatureCollection", "properties": { "zoom": 3, "x": 5, "y": 4 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Madagascar" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 49.218750, -12.039321 ], [ 49.570312, -12.468760 ], [ 49.833984, -12.897489 ], [ 50.097656, -13.581921 ], [ 50.185547, -14.774883 ], [ 50.449219, -15.199386 ], [ 50.361328, -15.707663 ], [ 50.185547, -15.961329 ], [ 49.833984, -15.453680 ], [ 49.658203, -15.707663 ], [ 49.833984, -16.467695 ], [ 49.746094, -16.888660 ], [ 49.482422, -17.140790 ], [ 49.394531, -17.978733 ], [ 49.042969, -19.145168 ], [ 48.515625, -20.468189 ], [ 47.900391, -22.431340 ], [ 47.548828, -23.805450 ], [ 47.109375, -24.926295 ], [ 46.318359, -25.165173 ], [ 45.439453, -25.562265 ], [ 45.000000, -25.393661 ], [ 44.121094, -25.045792 ], [ 44.121094, -20.427013 ], [ 44.384766, -20.055931 ], [ 44.472656, -19.394068 ], [ 44.208984, -18.979026 ], [ 44.121094, -18.646245 ], [ 44.121094, -17.140790 ], [ 44.296875, -16.888660 ], [ 44.472656, -16.214675 ], [ 44.912109, -16.214675 ], [ 45.000000, -16.183024 ], [ 45.527344, -15.961329 ], [ 45.878906, -15.792254 ], [ 46.318359, -15.792254 ], [ 46.845703, -15.199386 ], [ 47.724609, -14.604847 ], [ 47.988281, -14.093957 ], [ 47.900391, -13.667338 ], [ 48.251953, -13.752725 ], [ 48.867188, -13.068777 ], [ 48.867188, -12.468760 ], [ 49.218750, -12.039321 ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 44.121094, -17.161786 ], [ 44.121094, 0.878872 ], [ 90.878906, 0.878872 ], [ 90.878906, -41.640078 ], [ 44.121094, -41.640078 ], [ 44.121094, -25.025884 ], [ 45.417480, -25.601902 ], [ 46.274414, -25.185059 ], [ 47.087402, -24.946219 ], [ 47.548828, -23.785345 ], [ 47.922363, -22.390714 ], [ 48.537598, -20.488773 ], [ 49.438477, -17.957832 ], [ 49.504395, -17.098792 ], [ 49.768066, -16.867634 ], [ 49.855957, -16.446622 ], [ 49.680176, -15.707663 ], [ 49.855957, -15.411319 ], [ 50.207520, -16.003576 ], [ 50.383301, -15.707663 ], [ 50.471191, -15.220589 ], [ 50.207520, -14.753635 ], [ 50.053711, -13.560562 ], [ 49.812012, -12.897489 ], [ 49.548340, -12.468760 ], [ 49.196777, -12.039321 ], [ 48.867188, -12.490214 ], [ 48.845215, -13.090179 ], [ 48.295898, -13.774066 ], [ 47.878418, -13.667338 ], [ 48.010254, -14.093957 ], [ 47.702637, -14.604847 ], [ 46.889648, -15.220589 ], [ 46.318359, -15.771109 ], [ 45.878906, -15.792254 ], [ 45.505371, -15.982454 ], [ 44.934082, -16.172473 ], [ 44.450684, -16.214675 ], [ 44.318848, -16.846605 ], [ 44.121094, -17.161786 ] ] ], [ [ [ 44.121094, -18.615013 ], [ 44.230957, -18.958246 ], [ 44.472656, -19.435514 ], [ 44.384766, -20.076570 ], [ 44.121094, -20.488773 ], [ 44.121094, -18.615013 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Madagascar" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 49.218750, -12.039321 ], [ 49.570312, -12.468760 ], [ 49.833984, -12.897489 ], [ 50.097656, -13.581921 ], [ 50.185547, -14.774883 ], [ 50.449219, -15.199386 ], [ 50.361328, -15.707663 ], [ 50.185547, -15.961329 ], [ 49.833984, -15.453680 ], [ 49.658203, -15.707663 ], [ 49.833984, -16.467695 ], [ 49.746094, -16.888660 ], [ 49.482422, -17.140790 ], [ 49.394531, -17.978733 ], [ 49.042969, -19.145168 ], [ 48.515625, -20.468189 ], [ 47.900391, -22.431340 ], [ 47.548828, -23.805450 ], [ 47.109375, -24.926295 ], [ 46.318359, -25.165173 ], [ 45.439453, -25.562265 ], [ 45.000000, -25.393661 ], [ 44.121094, -25.045792 ], [ 44.121094, -20.427013 ], [ 44.384766, -20.055931 ], [ 44.472656, -19.394068 ], [ 44.208984, -18.979026 ], [ 44.121094, -18.646245 ], [ 44.121094, -17.140790 ], [ 44.296875, -16.888660 ], [ 44.472656, -16.214675 ], [ 44.912109, -16.214675 ], [ 45.000000, -16.183024 ], [ 45.527344, -15.961329 ], [ 45.878906, -15.792254 ], [ 46.318359, -15.792254 ], [ 46.845703, -15.199386 ], [ 47.724609, -14.604847 ], [ 47.988281, -14.093957 ], [ 47.900391, -13.667338 ], [ 48.251953, -13.752725 ], [ 48.867188, -13.068777 ], [ 48.867188, -12.468760 ], [ 49.218750, -12.039321 ] ] ] } } ] } ] } , { "type": "FeatureCollection", "properties": { "zoom": 3, "x": 5, "y": 3 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ +{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 48.933105, 30.315988 ], [ 49.570312, 29.993002 ], [ 50.119629, 30.145127 ], [ 50.844727, 28.806174 ], [ 51.525879, 27.858504 ], [ 52.492676, 27.586198 ], [ 53.503418, 26.804461 ], [ 54.711914, 26.490240 ], [ 55.722656, 26.961246 ], [ 56.491699, 27.137368 ], [ 56.975098, 26.961246 ], [ 57.392578, 25.740529 ], [ 58.535156, 25.601902 ], [ 59.611816, 25.383735 ], [ 61.501465, 25.085599 ], [ 62.907715, 25.224820 ], [ 64.533691, 25.244696 ], [ 66.379395, 25.423431 ], [ 67.148438, 24.666986 ], [ 67.434082, 23.946096 ], [ 68.181152, 23.684774 ], [ 69.345703, 22.836946 ], [ 69.653320, 22.451649 ], [ 69.169922, 22.085640 ], [ 70.466309, 20.879343 ], [ 71.169434, 20.756114 ], [ 72.641602, 21.350781 ], [ 72.817383, 20.427013 ], [ 72.817383, 19.207429 ], [ 73.542480, 15.982454 ], [ 74.443359, 14.626109 ], [ 74.619141, 13.987376 ], [ 74.860840, 12.747516 ], [ 75.388184, 11.781325 ], [ 75.739746, 11.307708 ], [ 76.135254, 10.293301 ], [ 76.596680, 8.906780 ], [ 77.541504, 7.972198 ], [ 77.937012, 8.254983 ], [ 78.288574, 8.928487 ], [ 79.189453, 9.210560 ], [ 78.881836, 9.535749 ], [ 79.343262, 10.314919 ], [ 79.848633, 10.358151 ], [ 79.870605, 12.060809 ], [ 80.288086, 13.004558 ], [ 80.244141, 13.838080 ], [ 80.024414, 15.135764 ], [ 80.332031, 15.897942 ], [ 80.793457, 15.961329 ], [ 82.199707, 16.551962 ], [ 82.199707, 17.014768 ], [ 83.188477, 17.664960 ], [ 83.935547, 18.291950 ], [ 85.056152, 19.476950 ], [ 86.506348, 20.159098 ], [ 87.033691, 20.735566 ], [ 86.967773, 21.493964 ], [ 88.198242, 21.698265 ], [ 88.879395, 21.698265 ], [ 89.033203, 22.065278 ], [ 89.692383, 21.861499 ], [ 89.846191, 22.044913 ], [ 90.000000, 21.963425 ], [ 90.263672, 21.841105 ], [ 90.593262, 22.390714 ], [ 90.505371, 22.796439 ], [ 90.878906, 22.776182 ], [ 90.878906, -0.878872 ], [ 44.121094, -0.878872 ], [ 44.121094, 1.087581 ], [ 45.571289, 2.043024 ], [ 46.560059, 2.855263 ], [ 47.746582, 4.214943 ], [ 48.603516, 5.331644 ], [ 49.460449, 6.795535 ], [ 50.075684, 8.080985 ], [ 50.559082, 9.188870 ], [ 50.844727, 10.271681 ], [ 51.042480, 10.639014 ], [ 51.042480, 11.156845 ], [ 51.130371, 11.738302 ], [ 51.108398, 12.017830 ], [ 50.734863, 12.017830 ], [ 50.251465, 11.673755 ], [ 49.724121, 11.587669 ], [ 49.262695, 11.436955 ], [ 48.383789, 11.372339 ], [ 48.032227, 11.199957 ], [ 47.526855, 11.135287 ], [ 46.647949, 10.811724 ], [ 45.549316, 10.703792 ], [ 44.604492, 10.444598 ], [ 44.121094, 10.444598 ], [ 44.121094, 12.576010 ], [ 44.165039, 12.576010 ], [ 44.494629, 12.726084 ], [ 45.000000, 12.704651 ], [ 45.153809, 12.961736 ], [ 45.417480, 13.025966 ], [ 45.615234, 13.282719 ], [ 45.878906, 13.346865 ], [ 46.713867, 13.389620 ], [ 47.351074, 13.581921 ], [ 47.944336, 14.008696 ], [ 48.229980, 13.944730 ], [ 48.669434, 14.008696 ], [ 49.570312, 14.711135 ], [ 51.174316, 15.178181 ], [ 52.163086, 15.601875 ], [ 52.185059, 15.940202 ], [ 52.382812, 16.383391 ], [ 53.107910, 16.657244 ], [ 53.569336, 16.699340 ], [ 54.228516, 17.035777 ], [ 54.799805, 16.951724 ], [ 55.283203, 17.224758 ], [ 55.261230, 17.623082 ], [ 55.656738, 17.874203 ], [ 56.293945, 17.874203 ], [ 56.513672, 18.083201 ], [ 56.601562, 18.583776 ], [ 57.238770, 18.958246 ], [ 57.700195, 18.937464 ], [ 57.788086, 19.062118 ], [ 57.656250, 19.746024 ], [ 57.832031, 20.241583 ], [ 58.029785, 20.488773 ], [ 58.491211, 20.427013 ], [ 58.864746, 21.105000 ], [ 59.282227, 21.432617 ], [ 59.809570, 22.309426 ], [ 59.809570, 22.532854 ], [ 59.458008, 22.654572 ], [ 58.732910, 23.563987 ], [ 58.139648, 23.745126 ], [ 57.392578, 23.885838 ], [ 56.843262, 24.246965 ], [ 56.403809, 24.926295 ], [ 56.271973, 25.720735 ], [ 56.381836, 25.898762 ], [ 56.491699, 26.313113 ], [ 56.359863, 26.391870 ], [ 56.074219, 26.056783 ], [ 55.437012, 25.443275 ], [ 54.689941, 24.806681 ], [ 54.008789, 24.126702 ], [ 52.580566, 24.186847 ], [ 51.789551, 24.026397 ], [ 51.767578, 24.287027 ], [ 51.569824, 24.246965 ], [ 51.394043, 24.627045 ], [ 51.613770, 25.224820 ], [ 51.591797, 25.799891 ], [ 51.284180, 26.115986 ], [ 51.020508, 25.997550 ], [ 50.734863, 25.482951 ], [ 50.800781, 24.746831 ], [ 50.537109, 25.324167 ], [ 50.229492, 25.601902 ], [ 50.119629, 25.938287 ], [ 50.207520, 26.273714 ], [ 50.141602, 26.686730 ], [ 49.460449, 27.117813 ], [ 49.306641, 27.469287 ], [ 48.801270, 27.683528 ], [ 48.098145, 29.305561 ], [ 48.186035, 29.535230 ], [ 47.966309, 29.973970 ], [ 48.559570, 29.935895 ], [ 48.933105, 30.315988 ] ], [ [ 80.156250, 9.817329 ], [ 79.694824, 8.211490 ], [ 79.870605, 6.773716 ], [ 80.354004, 5.965754 ], [ 81.210938, 6.206090 ], [ 81.628418, 6.489983 ], [ 81.782227, 7.514981 ], [ 81.298828, 8.559294 ], [ 80.837402, 9.275622 ], [ 80.156250, 9.817329 ] ] ] } } +, +{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 53.964844, 41.640078 ], [ 54.008789, 41.557922 ], [ 54.733887, 40.946714 ], [ 53.854980, 40.630630 ], [ 52.910156, 40.880295 ], [ 52.690430, 40.027614 ], [ 53.349609, 39.977120 ], [ 53.107910, 39.283294 ], [ 53.876953, 38.959409 ], [ 53.745117, 37.909534 ], [ 53.920898, 37.195331 ], [ 53.833008, 36.967449 ], [ 52.272949, 36.703660 ], [ 50.844727, 36.879621 ], [ 50.141602, 37.370157 ], [ 49.196777, 37.579413 ], [ 48.889160, 38.324420 ], [ 48.867188, 38.822591 ], [ 49.218750, 39.044786 ], [ 49.394531, 39.402244 ], [ 49.570312, 40.178873 ], [ 50.383301, 40.262761 ], [ 50.075684, 40.530502 ], [ 49.614258, 40.580585 ], [ 49.108887, 41.277806 ], [ 48.746338, 41.640078 ], [ 52.569580, 41.640078 ], [ 52.822266, 41.129021 ], [ 52.888184, 41.640078 ], [ 53.964844, 41.640078 ] ] ] } } +, { "type": "Feature", "properties": { "name": "Georgia" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 46.208496, 41.640078 ], [ 46.669922, 41.178654 ], [ 46.494141, 41.046217 ], [ 45.966797, 41.112469 ], [ 45.175781, 41.442726 ], [ 45.000000, 41.244772 ], [ 44.121094, 41.162114 ], [ 44.121094, 41.640078 ], [ 46.208496, 41.640078 ] ] ] } } , { "type": "Feature", "properties": { "name": "Turkey" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 44.121094, 39.436193 ], [ 44.384766, 38.272689 ], [ 44.208984, 37.996163 ], [ 44.736328, 37.160317 ], [ 44.296875, 37.020098 ], [ 44.121094, 37.125286 ], [ 44.121094, 39.436193 ] ] ], [ [ [ 44.121094, 39.436193 ], [ 44.121094, 40.078071 ], [ 44.384766, 39.977120 ], [ 44.824219, 39.707187 ], [ 44.121094, 39.436193 ] ] ] ] } } @@ -2178,15 +2182,15 @@ { "type": "Feature", "properties": { "name": "China" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 90.878906, 41.640078 ], [ 90.878906, 28.071980 ], [ 90.703125, 28.071980 ], [ 90.000000, 28.304381 ], [ 89.472656, 28.071980 ], [ 88.857422, 27.293689 ], [ 88.769531, 28.071980 ], [ 88.154297, 27.839076 ], [ 86.923828, 27.994401 ], [ 85.781250, 28.226970 ], [ 84.990234, 28.613459 ], [ 84.199219, 28.844674 ], [ 83.935547, 29.305561 ], [ 83.320312, 29.458731 ], [ 82.353516, 30.145127 ], [ 81.562500, 30.448674 ], [ 81.123047, 30.221102 ], [ 79.716797, 30.902225 ], [ 78.750000, 31.503629 ], [ 78.486328, 32.620870 ], [ 79.189453, 32.472695 ], [ 79.189453, 32.990236 ], [ 78.837891, 33.504759 ], [ 78.925781, 34.307144 ], [ 77.871094, 35.460670 ], [ 76.201172, 35.889050 ], [ 75.937500, 36.668419 ], [ 75.146484, 37.160317 ], [ 74.970703, 37.439974 ], [ 74.794922, 37.996163 ], [ 74.882812, 38.410558 ], [ 74.267578, 38.616870 ], [ 73.916016, 38.479395 ], [ 73.652344, 39.436193 ], [ 74.003906, 39.639538 ], [ 73.828125, 39.909736 ], [ 74.794922, 40.380028 ], [ 75.498047, 40.580585 ], [ 76.552734, 40.446947 ], [ 76.860352, 40.979898 ], [ 76.904297, 41.046217 ], [ 78.222656, 41.178654 ], [ 78.574219, 41.574361 ], [ 78.771973, 41.640078 ], [ 90.878906, 41.640078 ] ] ] } } , { "type": "Feature", "properties": { "name": "Russia" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 48.339844, 41.640078 ], [ 47.988281, 41.376809 ], [ 47.812500, 41.178654 ], [ 47.373047, 41.244772 ], [ 46.900635, 41.640078 ], [ 48.339844, 41.640078 ] ] ] } } -, -{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 48.933105, 30.315988 ], [ 49.570312, 29.993002 ], [ 50.119629, 30.145127 ], [ 50.844727, 28.806174 ], [ 51.525879, 27.858504 ], [ 52.492676, 27.586198 ], [ 53.503418, 26.804461 ], [ 54.711914, 26.490240 ], [ 55.722656, 26.961246 ], [ 56.491699, 27.137368 ], [ 56.975098, 26.961246 ], [ 57.392578, 25.740529 ], [ 58.535156, 25.601902 ], [ 59.611816, 25.383735 ], [ 61.501465, 25.085599 ], [ 62.907715, 25.224820 ], [ 64.533691, 25.244696 ], [ 66.379395, 25.423431 ], [ 67.148438, 24.666986 ], [ 67.434082, 23.946096 ], [ 68.181152, 23.684774 ], [ 69.345703, 22.836946 ], [ 69.653320, 22.451649 ], [ 69.169922, 22.085640 ], [ 70.466309, 20.879343 ], [ 71.169434, 20.756114 ], [ 72.641602, 21.350781 ], [ 72.817383, 20.427013 ], [ 72.817383, 19.207429 ], [ 73.542480, 15.982454 ], [ 74.443359, 14.626109 ], [ 74.619141, 13.987376 ], [ 74.860840, 12.747516 ], [ 75.388184, 11.781325 ], [ 75.739746, 11.307708 ], [ 76.135254, 10.293301 ], [ 76.596680, 8.906780 ], [ 77.541504, 7.972198 ], [ 77.937012, 8.254983 ], [ 78.288574, 8.928487 ], [ 79.189453, 9.210560 ], [ 78.881836, 9.535749 ], [ 79.343262, 10.314919 ], [ 79.848633, 10.358151 ], [ 79.870605, 12.060809 ], [ 80.288086, 13.004558 ], [ 80.244141, 13.838080 ], [ 80.024414, 15.135764 ], [ 80.332031, 15.897942 ], [ 80.793457, 15.961329 ], [ 82.199707, 16.551962 ], [ 82.199707, 17.014768 ], [ 83.188477, 17.664960 ], [ 83.935547, 18.291950 ], [ 85.056152, 19.476950 ], [ 86.506348, 20.159098 ], [ 87.033691, 20.735566 ], [ 86.967773, 21.493964 ], [ 88.198242, 21.698265 ], [ 88.879395, 21.698265 ], [ 89.033203, 22.065278 ], [ 89.692383, 21.861499 ], [ 89.846191, 22.044913 ], [ 90.000000, 21.963425 ], [ 90.263672, 21.841105 ], [ 90.593262, 22.390714 ], [ 90.505371, 22.796439 ], [ 90.878906, 22.776182 ], [ 90.878906, -0.878872 ], [ 44.121094, -0.878872 ], [ 44.121094, 1.087581 ], [ 45.571289, 2.043024 ], [ 46.560059, 2.855263 ], [ 47.746582, 4.214943 ], [ 48.603516, 5.331644 ], [ 49.460449, 6.795535 ], [ 50.075684, 8.080985 ], [ 50.559082, 9.188870 ], [ 50.844727, 10.271681 ], [ 51.042480, 10.639014 ], [ 51.042480, 11.156845 ], [ 51.130371, 11.738302 ], [ 51.108398, 12.017830 ], [ 50.734863, 12.017830 ], [ 50.251465, 11.673755 ], [ 49.724121, 11.587669 ], [ 49.262695, 11.436955 ], [ 48.383789, 11.372339 ], [ 48.032227, 11.199957 ], [ 47.526855, 11.135287 ], [ 46.647949, 10.811724 ], [ 45.549316, 10.703792 ], [ 44.604492, 10.444598 ], [ 44.121094, 10.444598 ], [ 44.121094, 12.576010 ], [ 44.165039, 12.576010 ], [ 44.494629, 12.726084 ], [ 45.000000, 12.704651 ], [ 45.153809, 12.961736 ], [ 45.417480, 13.025966 ], [ 45.615234, 13.282719 ], [ 45.878906, 13.346865 ], [ 46.713867, 13.389620 ], [ 47.351074, 13.581921 ], [ 47.944336, 14.008696 ], [ 48.229980, 13.944730 ], [ 48.669434, 14.008696 ], [ 49.570312, 14.711135 ], [ 51.174316, 15.178181 ], [ 52.163086, 15.601875 ], [ 52.185059, 15.940202 ], [ 52.382812, 16.383391 ], [ 53.107910, 16.657244 ], [ 53.569336, 16.699340 ], [ 54.228516, 17.035777 ], [ 54.799805, 16.951724 ], [ 55.283203, 17.224758 ], [ 55.261230, 17.623082 ], [ 55.656738, 17.874203 ], [ 56.293945, 17.874203 ], [ 56.513672, 18.083201 ], [ 56.601562, 18.583776 ], [ 57.238770, 18.958246 ], [ 57.700195, 18.937464 ], [ 57.788086, 19.062118 ], [ 57.656250, 19.746024 ], [ 57.832031, 20.241583 ], [ 58.029785, 20.488773 ], [ 58.491211, 20.427013 ], [ 58.864746, 21.105000 ], [ 59.282227, 21.432617 ], [ 59.809570, 22.309426 ], [ 59.809570, 22.532854 ], [ 59.458008, 22.654572 ], [ 58.732910, 23.563987 ], [ 58.139648, 23.745126 ], [ 57.392578, 23.885838 ], [ 56.843262, 24.246965 ], [ 56.403809, 24.926295 ], [ 56.271973, 25.720735 ], [ 56.381836, 25.898762 ], [ 56.491699, 26.313113 ], [ 56.359863, 26.391870 ], [ 56.074219, 26.056783 ], [ 55.437012, 25.443275 ], [ 54.689941, 24.806681 ], [ 54.008789, 24.126702 ], [ 52.580566, 24.186847 ], [ 51.789551, 24.026397 ], [ 51.767578, 24.287027 ], [ 51.569824, 24.246965 ], [ 51.394043, 24.627045 ], [ 51.613770, 25.224820 ], [ 51.591797, 25.799891 ], [ 51.284180, 26.115986 ], [ 51.020508, 25.997550 ], [ 50.734863, 25.482951 ], [ 50.800781, 24.746831 ], [ 50.537109, 25.324167 ], [ 50.229492, 25.601902 ], [ 50.119629, 25.938287 ], [ 50.207520, 26.273714 ], [ 50.141602, 26.686730 ], [ 49.460449, 27.117813 ], [ 49.306641, 27.469287 ], [ 48.801270, 27.683528 ], [ 48.098145, 29.305561 ], [ 48.186035, 29.535230 ], [ 47.966309, 29.973970 ], [ 48.559570, 29.935895 ], [ 48.933105, 30.315988 ] ], [ [ 80.156250, 9.817329 ], [ 79.694824, 8.211490 ], [ 79.870605, 6.773716 ], [ 80.354004, 5.965754 ], [ 81.210938, 6.206090 ], [ 81.628418, 6.489983 ], [ 81.782227, 7.514981 ], [ 81.298828, 8.559294 ], [ 80.837402, 9.275622 ], [ 80.156250, 9.817329 ] ] ] } } -, -{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 53.964844, 41.640078 ], [ 54.008789, 41.557922 ], [ 54.733887, 40.946714 ], [ 53.854980, 40.630630 ], [ 52.910156, 40.880295 ], [ 52.690430, 40.027614 ], [ 53.349609, 39.977120 ], [ 53.107910, 39.283294 ], [ 53.876953, 38.959409 ], [ 53.745117, 37.909534 ], [ 53.920898, 37.195331 ], [ 53.833008, 36.967449 ], [ 52.272949, 36.703660 ], [ 50.844727, 36.879621 ], [ 50.141602, 37.370157 ], [ 49.196777, 37.579413 ], [ 48.889160, 38.324420 ], [ 48.867188, 38.822591 ], [ 49.218750, 39.044786 ], [ 49.394531, 39.402244 ], [ 49.570312, 40.178873 ], [ 50.383301, 40.262761 ], [ 50.075684, 40.530502 ], [ 49.614258, 40.580585 ], [ 49.108887, 41.277806 ], [ 48.746338, 41.640078 ], [ 52.569580, 41.640078 ], [ 52.822266, 41.129021 ], [ 52.888184, 41.640078 ], [ 53.964844, 41.640078 ] ] ] } } ] } ] } , { "type": "FeatureCollection", "properties": { "zoom": 3, "x": 5, "y": 2 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ +{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 73.948975, 66.861082 ], [ 73.916016, 66.791909 ], [ 72.817383, 66.530768 ], [ 72.795410, 66.513260 ], [ 72.421875, 66.169390 ], [ 71.279297, 66.319861 ], [ 71.542969, 66.513260 ], [ 72.015381, 66.861082 ], [ 73.948975, 66.861082 ] ] ], [ [ [ 44.395752, 66.861082 ], [ 44.538574, 66.757250 ], [ 44.318848, 66.513260 ], [ 44.121094, 66.280118 ], [ 44.121094, 66.861082 ], [ 44.395752, 66.861082 ] ] ], [ [ [ 47.713623, 66.861082 ], [ 46.340332, 66.670387 ], [ 45.911865, 66.861082 ], [ 47.713623, 66.861082 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 51.196289, 47.055154 ], [ 52.031250, 46.800059 ], [ 53.041992, 46.860191 ], [ 53.217773, 46.240652 ], [ 53.041992, 45.259422 ], [ 52.163086, 45.413876 ], [ 51.306152, 45.243953 ], [ 51.284180, 44.512176 ], [ 50.295410, 44.606113 ], [ 50.339355, 44.276671 ], [ 50.888672, 44.024422 ], [ 51.350098, 43.133061 ], [ 52.492676, 42.795401 ], [ 52.690430, 42.439674 ], [ 52.448730, 42.032974 ], [ 52.492676, 41.787697 ], [ 52.822266, 41.129021 ], [ 52.910156, 41.869561 ], [ 53.723145, 42.130821 ], [ 54.008789, 41.557922 ], [ 54.733887, 40.946714 ], [ 53.854980, 40.630630 ], [ 52.910156, 40.880295 ], [ 52.767334, 40.313043 ], [ 50.328369, 40.313043 ], [ 50.075684, 40.530502 ], [ 49.614258, 40.580585 ], [ 49.108887, 41.277806 ], [ 48.581543, 41.804078 ], [ 47.482910, 42.988576 ], [ 47.592773, 43.659924 ], [ 46.691895, 44.606113 ], [ 47.680664, 45.644768 ], [ 48.647461, 45.813486 ], [ 49.108887, 46.392411 ], [ 50.031738, 46.604167 ], [ 51.196289, 47.055154 ] ] ] } } +, { "type": "Feature", "properties": { "name": "Georgia" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 44.560547, 42.682435 ], [ 45.439453, 42.488302 ], [ 45.791016, 42.098222 ], [ 46.406250, 41.836828 ], [ 46.142578, 41.705729 ], [ 46.669922, 41.178654 ], [ 46.494141, 41.046217 ], [ 45.966797, 41.112469 ], [ 45.175781, 41.442726 ], [ 45.000000, 41.244772 ], [ 44.121094, 41.162114 ], [ 44.121094, 42.593533 ], [ 44.560547, 42.682435 ] ] ] } } , { "type": "Feature", "properties": { "name": "Kazakhstan" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 69.082031, 55.379110 ], [ 70.839844, 55.178868 ], [ 71.191406, 54.110943 ], [ 72.246094, 54.367759 ], [ 73.476562, 54.059388 ], [ 73.388672, 53.488046 ], [ 74.355469, 53.540307 ], [ 76.904297, 54.470038 ], [ 76.552734, 54.162434 ], [ 77.783203, 53.383328 ], [ 80.068359, 50.847573 ], [ 80.595703, 51.399206 ], [ 81.914062, 50.792047 ], [ 83.408203, 51.069017 ], [ 83.935547, 50.903033 ], [ 84.375000, 50.289339 ], [ 85.078125, 50.120578 ], [ 85.517578, 49.667628 ], [ 86.835938, 49.837982 ], [ 87.363281, 49.210420 ], [ 86.572266, 48.574790 ], [ 85.781250, 48.458352 ], [ 85.693359, 47.457809 ], [ 85.166016, 46.980252 ], [ 83.144531, 47.338823 ], [ 82.441406, 45.521744 ], [ 81.914062, 45.336702 ], [ 79.980469, 44.902578 ], [ 80.859375, 43.197167 ], [ 80.156250, 42.940339 ], [ 80.244141, 42.358544 ], [ 79.628906, 42.488302 ], [ 79.101562, 42.875964 ], [ 76.025391, 43.004647 ], [ 75.673828, 42.875964 ], [ 74.179688, 43.325178 ], [ 73.652344, 43.068888 ], [ 73.476562, 42.488302 ], [ 71.806641, 42.875964 ], [ 71.191406, 42.682435 ], [ 70.927734, 42.293564 ], [ 70.400391, 42.098222 ], [ 69.082031, 41.376809 ], [ 68.840332, 40.979898 ], [ 68.642578, 40.647304 ], [ 68.291016, 40.647304 ], [ 68.104248, 40.979898 ], [ 68.027344, 41.112469 ], [ 66.708984, 41.178654 ], [ 66.533203, 41.967659 ], [ 66.005859, 41.967659 ], [ 66.093750, 43.004647 ], [ 64.863281, 43.707594 ], [ 63.193359, 43.644026 ], [ 62.050781, 43.516689 ], [ 61.083984, 44.402392 ], [ 60.205078, 44.777936 ], [ 58.710938, 45.521744 ], [ 58.535156, 45.583290 ], [ 55.898438, 44.964798 ], [ 55.986328, 41.310824 ], [ 55.458984, 41.244772 ], [ 54.755859, 42.032974 ], [ 54.052734, 42.293564 ], [ 52.910156, 42.098222 ], [ 52.470703, 41.771312 ], [ 52.470703, 42.032974 ], [ 52.734375, 42.423457 ], [ 52.470703, 42.811522 ], [ 51.328125, 43.133061 ], [ 50.888672, 44.024422 ], [ 50.361328, 44.276671 ], [ 50.273438, 44.590467 ], [ 51.240234, 44.527843 ], [ 51.328125, 45.274886 ], [ 52.207031, 45.398450 ], [ 52.998047, 45.274886 ], [ 53.261719, 46.255847 ], [ 53.085938, 46.860191 ], [ 52.031250, 46.800059 ], [ 51.152344, 47.040182 ], [ 50.009766, 46.619261 ], [ 49.130859, 46.377254 ], [ 48.603516, 46.558860 ], [ 48.691406, 47.100045 ], [ 48.076172, 47.754098 ], [ 47.285156, 47.694974 ], [ 46.494141, 48.400032 ], [ 47.021484, 49.152970 ], [ 46.757812, 49.382373 ], [ 47.548828, 50.457504 ], [ 48.603516, 49.894634 ], [ 48.691406, 50.625073 ], [ 50.800781, 51.672555 ], [ 52.294922, 51.727028 ], [ 54.492188, 51.013755 ], [ 55.722656, 50.625073 ], [ 56.777344, 51.069017 ], [ 58.359375, 51.069017 ], [ 59.677734, 50.569283 ], [ 59.941406, 50.847573 ], [ 61.347656, 50.792047 ], [ 61.611328, 51.289406 ], [ 59.941406, 51.944265 ], [ 60.908203, 52.429222 ], [ 60.732422, 52.696361 ], [ 61.699219, 52.961875 ], [ 60.996094, 53.644638 ], [ 61.435547, 54.007769 ], [ 65.214844, 54.367759 ], [ 65.654297, 54.622978 ], [ 68.203125, 54.977614 ], [ 69.082031, 55.379110 ] ] ] } } @@ -2208,10 +2212,6 @@ { "type": "Feature", "properties": { "name": "China" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 87.714844, 49.325122 ], [ 87.978516, 48.574790 ], [ 88.857422, 48.048710 ], [ 90.263672, 47.694974 ], [ 90.878906, 46.965259 ], [ 90.878906, 46.573967 ], [ 90.615234, 45.706179 ], [ 90.878906, 45.383019 ], [ 90.878906, 40.313043 ], [ 74.652100, 40.313043 ], [ 74.794922, 40.380028 ], [ 75.498047, 40.580585 ], [ 76.552734, 40.446947 ], [ 76.860352, 40.979898 ], [ 76.904297, 41.046217 ], [ 78.222656, 41.178654 ], [ 78.574219, 41.574361 ], [ 80.156250, 42.098222 ], [ 80.244141, 42.358544 ], [ 80.156250, 42.940339 ], [ 80.859375, 43.197167 ], [ 79.980469, 44.902578 ], [ 81.914062, 45.336702 ], [ 82.441406, 45.521744 ], [ 83.144531, 47.338823 ], [ 85.166016, 46.980252 ], [ 85.693359, 47.457809 ], [ 85.781250, 48.458352 ], [ 86.572266, 48.574790 ], [ 87.363281, 49.210420 ], [ 87.714844, 49.325122 ] ] ] } } , { "type": "Feature", "properties": { "name": "Russia" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 90.878906, 66.861082 ], [ 90.878906, 50.401515 ], [ 90.703125, 50.345460 ], [ 90.000000, 50.035974 ], [ 88.769531, 49.496675 ], [ 87.714844, 49.325122 ], [ 87.363281, 49.210420 ], [ 86.835938, 49.837982 ], [ 85.517578, 49.667628 ], [ 85.078125, 50.120578 ], [ 84.375000, 50.289339 ], [ 83.935547, 50.903033 ], [ 83.408203, 51.069017 ], [ 81.914062, 50.792047 ], [ 80.595703, 51.399206 ], [ 80.068359, 50.847573 ], [ 77.783203, 53.383328 ], [ 76.552734, 54.162434 ], [ 76.904297, 54.470038 ], [ 74.355469, 53.540307 ], [ 73.388672, 53.488046 ], [ 73.476562, 54.059388 ], [ 72.246094, 54.367759 ], [ 71.191406, 54.110943 ], [ 70.839844, 55.178868 ], [ 69.082031, 55.379110 ], [ 68.203125, 54.977614 ], [ 65.654297, 54.622978 ], [ 65.214844, 54.367759 ], [ 61.435547, 54.007769 ], [ 60.996094, 53.644638 ], [ 61.699219, 52.961875 ], [ 60.732422, 52.696361 ], [ 60.908203, 52.429222 ], [ 59.941406, 51.944265 ], [ 61.611328, 51.289406 ], [ 61.347656, 50.792047 ], [ 59.941406, 50.847573 ], [ 59.677734, 50.569283 ], [ 58.359375, 51.069017 ], [ 56.777344, 51.069017 ], [ 55.722656, 50.625073 ], [ 54.492188, 51.013755 ], [ 52.294922, 51.727028 ], [ 50.800781, 51.672555 ], [ 48.691406, 50.625073 ], [ 48.603516, 49.894634 ], [ 47.548828, 50.457504 ], [ 46.757812, 49.382373 ], [ 47.021484, 49.152970 ], [ 46.494141, 48.400032 ], [ 47.285156, 47.694974 ], [ 48.076172, 47.754098 ], [ 48.691406, 47.100045 ], [ 48.603516, 46.558860 ], [ 49.130859, 46.377254 ], [ 48.603516, 45.828799 ], [ 47.636719, 45.644768 ], [ 46.669922, 44.590467 ], [ 47.548828, 43.644026 ], [ 47.460938, 43.004647 ], [ 48.603516, 41.836828 ], [ 47.988281, 41.376809 ], [ 47.812500, 41.178654 ], [ 47.373047, 41.244772 ], [ 46.669922, 41.836828 ], [ 46.406250, 41.836828 ], [ 45.791016, 42.098222 ], [ 45.439453, 42.488302 ], [ 44.560547, 42.682435 ], [ 44.121094, 42.593533 ], [ 44.121094, 66.258011 ], [ 44.560547, 66.757250 ], [ 44.395752, 66.861082 ], [ 45.845947, 66.861082 ], [ 46.318359, 66.652977 ], [ 47.669678, 66.861082 ], [ 71.960449, 66.861082 ], [ 71.510010, 66.513260 ], [ 71.279297, 66.337505 ], [ 72.421875, 66.160511 ], [ 72.817383, 66.513260 ], [ 72.861328, 66.548263 ], [ 73.916016, 66.791909 ], [ 73.959961, 66.861082 ], [ 90.878906, 66.861082 ] ] ] } } -, -{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 73.948975, 66.861082 ], [ 73.916016, 66.791909 ], [ 72.817383, 66.530768 ], [ 72.795410, 66.513260 ], [ 72.421875, 66.169390 ], [ 71.279297, 66.319861 ], [ 71.542969, 66.513260 ], [ 72.015381, 66.861082 ], [ 73.948975, 66.861082 ] ] ], [ [ [ 44.395752, 66.861082 ], [ 44.538574, 66.757250 ], [ 44.318848, 66.513260 ], [ 44.121094, 66.280118 ], [ 44.121094, 66.861082 ], [ 44.395752, 66.861082 ] ] ], [ [ [ 47.713623, 66.861082 ], [ 46.340332, 66.670387 ], [ 45.911865, 66.861082 ], [ 47.713623, 66.861082 ] ] ] ] } } -, -{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 51.196289, 47.055154 ], [ 52.031250, 46.800059 ], [ 53.041992, 46.860191 ], [ 53.217773, 46.240652 ], [ 53.041992, 45.259422 ], [ 52.163086, 45.413876 ], [ 51.306152, 45.243953 ], [ 51.284180, 44.512176 ], [ 50.295410, 44.606113 ], [ 50.339355, 44.276671 ], [ 50.888672, 44.024422 ], [ 51.350098, 43.133061 ], [ 52.492676, 42.795401 ], [ 52.690430, 42.439674 ], [ 52.448730, 42.032974 ], [ 52.492676, 41.787697 ], [ 52.822266, 41.129021 ], [ 52.910156, 41.869561 ], [ 53.723145, 42.130821 ], [ 54.008789, 41.557922 ], [ 54.733887, 40.946714 ], [ 53.854980, 40.630630 ], [ 52.910156, 40.880295 ], [ 52.767334, 40.313043 ], [ 50.328369, 40.313043 ], [ 50.075684, 40.530502 ], [ 49.614258, 40.580585 ], [ 49.108887, 41.277806 ], [ 48.581543, 41.804078 ], [ 47.482910, 42.988576 ], [ 47.592773, 43.659924 ], [ 46.691895, 44.606113 ], [ 47.680664, 45.644768 ], [ 48.647461, 45.813486 ], [ 49.108887, 46.392411 ], [ 50.031738, 46.604167 ], [ 51.196289, 47.055154 ] ] ] } } ] } ] } , @@ -2225,9 +2225,9 @@ , { "type": "FeatureCollection", "properties": { "zoom": 3, "x": 5, "y": 0 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Russia" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 50.009766, 80.914558 ], [ 51.503906, 80.703997 ], [ 51.152344, 80.546518 ], [ 49.833984, 80.415707 ], [ 48.867188, 80.342262 ], [ 48.779297, 80.178713 ], [ 47.548828, 80.012423 ], [ 46.494141, 80.253391 ], [ 47.109375, 80.560943 ], [ 45.000000, 80.587930 ], [ 44.824219, 80.589727 ], [ 45.000000, 80.605880 ], [ 46.757812, 80.774716 ], [ 48.339844, 80.788795 ], [ 48.515625, 80.517603 ], [ 49.130859, 80.760615 ], [ 50.009766, 80.914558 ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 90.878906, 85.126373 ], [ 90.878906, 79.004962 ], [ 44.121094, 79.004962 ], [ 44.121094, 85.126373 ], [ 90.878906, 85.126373 ] ], [ [ 50.031738, 80.918027 ], [ 49.086914, 80.753556 ], [ 48.515625, 80.513982 ], [ 48.317871, 80.785277 ], [ 46.801758, 80.771192 ], [ 44.846191, 80.589727 ], [ 47.065430, 80.560943 ], [ 46.494141, 80.245949 ], [ 47.592773, 80.008612 ], [ 48.757324, 80.174965 ], [ 48.889160, 80.338575 ], [ 49.790039, 80.415707 ], [ 51.130371, 80.546518 ], [ 51.525879, 80.700447 ], [ 50.031738, 80.918027 ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Russia" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 50.009766, 80.914558 ], [ 51.503906, 80.703997 ], [ 51.152344, 80.546518 ], [ 49.833984, 80.415707 ], [ 48.867188, 80.342262 ], [ 48.779297, 80.178713 ], [ 47.548828, 80.012423 ], [ 46.494141, 80.253391 ], [ 47.109375, 80.560943 ], [ 45.000000, 80.587930 ], [ 44.824219, 80.589727 ], [ 45.000000, 80.605880 ], [ 46.757812, 80.774716 ], [ 48.339844, 80.788795 ], [ 48.515625, 80.517603 ], [ 49.130859, 80.760615 ], [ 50.009766, 80.914558 ] ] ] } } ] } ] } , @@ -2311,6 +2311,8 @@ , { "type": "FeatureCollection", "properties": { "zoom": 3, "x": 6, "y": 2 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ +{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 121.640625, 40.946714 ], [ 122.167969, 40.430224 ], [ 122.025146, 40.313043 ], [ 120.311279, 40.313043 ], [ 120.761719, 40.597271 ], [ 121.640625, 40.946714 ] ] ], [ [ [ 135.878906, 44.315988 ], [ 135.878906, 40.313043 ], [ 128.781738, 40.313043 ], [ 129.001465, 40.480381 ], [ 129.177246, 40.663973 ], [ 129.704590, 40.880295 ], [ 129.660645, 41.607228 ], [ 129.968262, 41.934977 ], [ 130.407715, 42.277309 ], [ 130.781250, 42.212245 ], [ 130.935059, 42.553080 ], [ 132.275391, 43.277205 ], [ 132.912598, 42.795401 ], [ 133.527832, 42.811522 ], [ 134.868164, 43.405047 ], [ 135.505371, 43.992815 ], [ 135.878906, 44.315988 ] ] ], [ [ [ 135.878906, 54.661124 ], [ 135.131836, 54.724620 ], [ 135.878906, 55.197683 ], [ 135.878906, 54.661124 ] ] ] ] } } +, { "type": "Feature", "properties": { "name": "Mongolia" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 98.876953, 52.052490 ], [ 100.019531, 51.618017 ], [ 100.898438, 51.508742 ], [ 102.041016, 51.234407 ], [ 102.216797, 50.513427 ], [ 103.710938, 50.064192 ], [ 104.589844, 50.289339 ], [ 105.908203, 50.401515 ], [ 106.875000, 50.289339 ], [ 107.841797, 49.781264 ], [ 108.457031, 49.267805 ], [ 109.423828, 49.267805 ], [ 110.654297, 49.152970 ], [ 111.621094, 49.382373 ], [ 112.939453, 49.553726 ], [ 114.345703, 50.233152 ], [ 114.960938, 50.120578 ], [ 115.488281, 49.781264 ], [ 116.718750, 49.894634 ], [ 115.488281, 48.107431 ], [ 115.751953, 47.754098 ], [ 116.279297, 47.872144 ], [ 117.333984, 47.694974 ], [ 118.037109, 48.048710 ], [ 118.828125, 47.754098 ], [ 119.794922, 47.040182 ], [ 119.707031, 46.679594 ], [ 118.916016, 46.800059 ], [ 117.421875, 46.679594 ], [ 116.718750, 46.377254 ], [ 116.015625, 45.706179 ], [ 114.433594, 45.336702 ], [ 113.466797, 44.777936 ], [ 112.412109, 45.026950 ], [ 111.884766, 45.089036 ], [ 111.357422, 44.465151 ], [ 111.708984, 44.087585 ], [ 111.796875, 43.771094 ], [ 111.093750, 43.389082 ], [ 110.390625, 42.875964 ], [ 109.248047, 42.488302 ], [ 107.753906, 42.488302 ], [ 106.171875, 42.163403 ], [ 104.941406, 41.574361 ], [ 104.501953, 41.902277 ], [ 103.271484, 41.902277 ], [ 101.865234, 42.488302 ], [ 100.810547, 42.682435 ], [ 99.492188, 42.553080 ], [ 97.470703, 42.747012 ], [ 96.328125, 42.747012 ], [ 95.800781, 43.325178 ], [ 95.273438, 44.213710 ], [ 94.658203, 44.339565 ], [ 93.515625, 44.964798 ], [ 92.109375, 45.089036 ], [ 90.966797, 45.274886 ], [ 90.615234, 45.706179 ], [ 90.966797, 46.860191 ], [ 90.263672, 47.694974 ], [ 89.121094, 47.982568 ], [ 89.121094, 49.653405 ], [ 90.000000, 50.035974 ], [ 90.703125, 50.345460 ], [ 92.197266, 50.792047 ], [ 93.076172, 50.513427 ], [ 94.130859, 50.457504 ], [ 94.833984, 50.007739 ], [ 95.800781, 49.951220 ], [ 97.294922, 49.724479 ], [ 98.261719, 50.401515 ], [ 97.822266, 51.013755 ], [ 98.876953, 52.052490 ] ] ] } } , { "type": "Feature", "properties": { "name": "China" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 123.574219, 53.435719 ], [ 125.068359, 53.173119 ], [ 125.947266, 52.802761 ], [ 126.562500, 51.781436 ], [ 126.914062, 51.344339 ], [ 127.265625, 50.736455 ], [ 127.617188, 49.781264 ], [ 129.375000, 49.439557 ], [ 130.605469, 48.748945 ], [ 130.957031, 47.813155 ], [ 132.539062, 47.813155 ], [ 133.330078, 48.166085 ], [ 135.000000, 48.458352 ], [ 134.472656, 47.576526 ], [ 134.121094, 47.219568 ], [ 133.769531, 46.134170 ], [ 133.066406, 45.151053 ], [ 131.923828, 45.336702 ], [ 131.044922, 44.964798 ], [ 131.308594, 44.087585 ], [ 131.132812, 42.940339 ], [ 130.605469, 42.875964 ], [ 130.605469, 42.423457 ], [ 129.990234, 43.004647 ], [ 129.638672, 42.423457 ], [ 128.056641, 41.967659 ], [ 128.232422, 41.442726 ], [ 127.353516, 41.508577 ], [ 126.826172, 41.836828 ], [ 126.210938, 41.112469 ], [ 125.068359, 40.580585 ], [ 124.749756, 40.313043 ], [ 122.014160, 40.313043 ], [ 122.167969, 40.446947 ], [ 121.640625, 40.913513 ], [ 120.761719, 40.580585 ], [ 120.300293, 40.313043 ], [ 89.121094, 40.313043 ], [ 89.121094, 47.982568 ], [ 90.263672, 47.694974 ], [ 90.966797, 46.860191 ], [ 90.615234, 45.706179 ], [ 90.966797, 45.274886 ], [ 92.109375, 45.089036 ], [ 93.515625, 44.964798 ], [ 94.658203, 44.339565 ], [ 95.273438, 44.213710 ], [ 95.800781, 43.325178 ], [ 96.328125, 42.747012 ], [ 97.470703, 42.747012 ], [ 99.492188, 42.553080 ], [ 100.810547, 42.682435 ], [ 101.865234, 42.488302 ], [ 103.271484, 41.902277 ], [ 104.501953, 41.902277 ], [ 104.941406, 41.574361 ], [ 106.171875, 42.163403 ], [ 107.753906, 42.488302 ], [ 109.248047, 42.488302 ], [ 110.390625, 42.875964 ], [ 111.093750, 43.389082 ], [ 111.796875, 43.771094 ], [ 111.708984, 44.087585 ], [ 111.357422, 44.465151 ], [ 111.884766, 45.089036 ], [ 112.412109, 45.026950 ], [ 113.466797, 44.777936 ], [ 114.433594, 45.336702 ], [ 116.015625, 45.706179 ], [ 116.718750, 46.377254 ], [ 117.421875, 46.679594 ], [ 118.916016, 46.800059 ], [ 119.707031, 46.679594 ], [ 119.794922, 47.040182 ], [ 118.828125, 47.754098 ], [ 118.037109, 48.048710 ], [ 117.333984, 47.694974 ], [ 116.279297, 47.872144 ], [ 115.751953, 47.754098 ], [ 115.488281, 48.107431 ], [ 116.718750, 49.894634 ], [ 117.861328, 49.496675 ], [ 119.267578, 50.120578 ], [ 119.267578, 50.569283 ], [ 120.146484, 51.618017 ], [ 120.761719, 51.944265 ], [ 120.761719, 52.536273 ], [ 120.146484, 52.749594 ], [ 121.025391, 53.225768 ], [ 122.255859, 53.435719 ], [ 123.574219, 53.435719 ] ] ] } } @@ -2318,8 +2320,6 @@ { "type": "Feature", "properties": { "name": "Dem. Rep. Korea" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 129.990234, 43.004647 ], [ 130.605469, 42.423457 ], [ 130.781250, 42.228517 ], [ 130.429688, 42.293564 ], [ 129.990234, 41.967659 ], [ 129.638672, 41.574361 ], [ 129.715576, 40.979898 ], [ 129.726562, 40.913513 ], [ 129.199219, 40.647304 ], [ 129.023438, 40.513799 ], [ 128.814697, 40.313043 ], [ 124.749756, 40.313043 ], [ 125.068359, 40.580585 ], [ 126.210938, 41.112469 ], [ 126.826172, 41.836828 ], [ 127.353516, 41.508577 ], [ 128.232422, 41.442726 ], [ 128.056641, 41.967659 ], [ 129.638672, 42.423457 ], [ 129.990234, 43.004647 ] ] ] } } , { "type": "Feature", "properties": { "name": "Russia" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 135.878906, 66.861082 ], [ 135.878906, 55.222757 ], [ 135.087891, 54.724620 ], [ 135.878906, 54.673831 ], [ 135.878906, 44.284537 ], [ 135.000000, 43.468868 ], [ 134.912109, 43.389082 ], [ 133.505859, 42.811522 ], [ 132.890625, 42.811522 ], [ 132.275391, 43.261206 ], [ 130.957031, 42.553080 ], [ 130.781250, 42.228517 ], [ 130.605469, 42.423457 ], [ 130.605469, 42.875964 ], [ 131.132812, 42.940339 ], [ 131.308594, 44.087585 ], [ 131.044922, 44.964798 ], [ 131.923828, 45.336702 ], [ 133.066406, 45.151053 ], [ 133.769531, 46.134170 ], [ 134.121094, 47.219568 ], [ 134.472656, 47.576526 ], [ 135.000000, 48.458352 ], [ 133.330078, 48.166085 ], [ 132.539062, 47.813155 ], [ 130.957031, 47.813155 ], [ 130.605469, 48.748945 ], [ 129.375000, 49.439557 ], [ 127.617188, 49.781264 ], [ 127.265625, 50.736455 ], [ 126.914062, 51.344339 ], [ 126.562500, 51.781436 ], [ 125.947266, 52.802761 ], [ 125.068359, 53.173119 ], [ 123.574219, 53.435719 ], [ 122.255859, 53.435719 ], [ 121.025391, 53.225768 ], [ 120.146484, 52.749594 ], [ 120.761719, 52.536273 ], [ 120.761719, 51.944265 ], [ 120.146484, 51.618017 ], [ 119.267578, 50.569283 ], [ 119.267578, 50.120578 ], [ 117.861328, 49.496675 ], [ 116.718750, 49.894634 ], [ 115.488281, 49.781264 ], [ 114.960938, 50.120578 ], [ 114.345703, 50.233152 ], [ 112.939453, 49.553726 ], [ 111.621094, 49.382373 ], [ 110.654297, 49.152970 ], [ 109.423828, 49.267805 ], [ 108.457031, 49.267805 ], [ 107.841797, 49.781264 ], [ 106.875000, 50.289339 ], [ 105.908203, 50.401515 ], [ 104.589844, 50.289339 ], [ 103.710938, 50.064192 ], [ 102.216797, 50.513427 ], [ 102.041016, 51.234407 ], [ 100.898438, 51.508742 ], [ 100.019531, 51.618017 ], [ 98.876953, 52.052490 ], [ 97.822266, 51.013755 ], [ 98.261719, 50.401515 ], [ 97.294922, 49.724479 ], [ 95.800781, 49.951220 ], [ 94.833984, 50.007739 ], [ 94.130859, 50.457504 ], [ 93.076172, 50.513427 ], [ 92.197266, 50.792047 ], [ 90.703125, 50.345460 ], [ 90.000000, 50.035974 ], [ 89.121094, 49.653405 ], [ 89.121094, 66.861082 ], [ 135.878906, 66.861082 ] ] ] } } -, -{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 121.640625, 40.946714 ], [ 122.167969, 40.430224 ], [ 122.025146, 40.313043 ], [ 120.311279, 40.313043 ], [ 120.761719, 40.597271 ], [ 121.640625, 40.946714 ] ] ], [ [ [ 135.878906, 44.315988 ], [ 135.878906, 40.313043 ], [ 128.781738, 40.313043 ], [ 129.001465, 40.480381 ], [ 129.177246, 40.663973 ], [ 129.704590, 40.880295 ], [ 129.660645, 41.607228 ], [ 129.968262, 41.934977 ], [ 130.407715, 42.277309 ], [ 130.781250, 42.212245 ], [ 130.935059, 42.553080 ], [ 132.275391, 43.277205 ], [ 132.912598, 42.795401 ], [ 133.527832, 42.811522 ], [ 134.868164, 43.405047 ], [ 135.505371, 43.992815 ], [ 135.878906, 44.315988 ] ] ], [ [ [ 135.878906, 54.661124 ], [ 135.131836, 54.724620 ], [ 135.878906, 55.197683 ], [ 135.878906, 54.661124 ] ] ] ] } } ] } ] } , @@ -2333,9 +2333,9 @@ , { "type": "FeatureCollection", "properties": { "zoom": 3, "x": 6, "y": 0 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Russia" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 102.128906, 79.351472 ], [ 102.832031, 79.286313 ], [ 103.359375, 79.171335 ], [ 104.106445, 79.004962 ], [ 100.909424, 79.004962 ], [ 101.151123, 79.171335 ], [ 101.250000, 79.237185 ], [ 102.128906, 79.351472 ] ] ], [ [ [ 95.976562, 81.255032 ], [ 97.910156, 80.746492 ], [ 100.195312, 79.781164 ], [ 100.008545, 79.171335 ], [ 99.964600, 79.004962 ], [ 95.328369, 79.004962 ], [ 95.009766, 79.038437 ], [ 94.449463, 79.171335 ], [ 93.339844, 79.432371 ], [ 92.548828, 80.148684 ], [ 91.142578, 80.342262 ], [ 93.779297, 81.024916 ], [ 95.976562, 81.255032 ] ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 100.942383, 79.004962 ], [ 99.964600, 79.004962 ], [ 100.195312, 79.781164 ], [ 97.888184, 80.746492 ], [ 95.932617, 81.251691 ], [ 93.779297, 81.024916 ], [ 91.186523, 80.342262 ], [ 92.548828, 80.144924 ], [ 93.317871, 79.428340 ], [ 94.965820, 79.046790 ], [ 95.372314, 79.004962 ], [ 89.121094, 79.004962 ], [ 89.121094, 85.126373 ], [ 135.878906, 85.126373 ], [ 135.878906, 79.004962 ], [ 104.084473, 79.004962 ], [ 102.832031, 79.282227 ], [ 102.084961, 79.347411 ], [ 101.271973, 79.233081 ], [ 100.942383, 79.004962 ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Russia" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 102.128906, 79.351472 ], [ 102.832031, 79.286313 ], [ 103.359375, 79.171335 ], [ 104.106445, 79.004962 ], [ 100.909424, 79.004962 ], [ 101.151123, 79.171335 ], [ 101.250000, 79.237185 ], [ 102.128906, 79.351472 ] ] ], [ [ [ 95.976562, 81.255032 ], [ 97.910156, 80.746492 ], [ 100.195312, 79.781164 ], [ 100.008545, 79.171335 ], [ 99.964600, 79.004962 ], [ 95.328369, 79.004962 ], [ 95.009766, 79.038437 ], [ 94.449463, 79.171335 ], [ 93.339844, 79.432371 ], [ 92.548828, 80.148684 ], [ 91.142578, 80.342262 ], [ 93.779297, 81.024916 ], [ 95.976562, 81.255032 ] ] ] ] } } ] } ] } , @@ -2391,9 +2391,9 @@ , { "type": "FeatureCollection", "properties": { "zoom": 3, "x": 7, "y": 3 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Japan" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 134.121094, 34.325292 ], [ 134.648438, 34.161818 ], [ 134.736328, 33.797409 ], [ 134.208984, 33.211116 ], [ 134.121094, 33.266250 ], [ 134.121094, 34.325292 ] ] ], [ [ [ 141.328125, 41.376809 ], [ 141.943359, 39.977120 ], [ 141.855469, 39.164141 ], [ 140.976562, 38.203655 ], [ 140.976562, 37.160317 ], [ 140.625000, 36.315125 ], [ 140.800781, 35.817813 ], [ 140.273438, 35.173808 ], [ 138.955078, 34.669359 ], [ 137.197266, 34.597042 ], [ 135.791016, 33.431441 ], [ 135.087891, 33.870416 ], [ 135.087891, 34.597042 ], [ 135.000000, 34.587997 ], [ 134.121094, 34.479392 ], [ 134.121094, 35.675147 ], [ 134.648438, 35.746512 ], [ 135.703125, 35.532226 ], [ 136.757812, 37.300275 ], [ 137.373047, 36.809285 ], [ 138.867188, 37.857507 ], [ 139.394531, 38.203655 ], [ 140.097656, 39.436193 ], [ 139.921875, 40.580585 ], [ 140.152588, 40.979898 ], [ 140.273438, 41.178654 ], [ 141.328125, 41.376809 ] ] ], [ [ [ 141.097412, 41.640078 ], [ 141.064453, 41.574361 ], [ 139.921875, 41.574361 ], [ 139.910889, 41.640078 ], [ 141.097412, 41.640078 ] ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 134.121094, 35.657296 ], [ 134.121094, 41.640078 ], [ 139.954834, 41.640078 ], [ 139.965820, 41.574361 ], [ 141.064453, 41.590797 ], [ 141.086426, 41.640078 ], [ 180.878906, 41.640078 ], [ 180.878906, -0.878872 ], [ 134.121094, -0.878872 ], [ 134.121094, 33.266250 ], [ 134.208984, 33.192731 ], [ 134.758301, 33.797409 ], [ 134.648438, 34.143635 ], [ 134.121094, 34.298068 ], [ 134.121094, 34.479392 ], [ 135.087891, 34.597042 ], [ 135.131836, 33.852170 ], [ 135.791016, 33.468108 ], [ 137.219238, 34.615127 ], [ 138.977051, 34.669359 ], [ 140.251465, 35.137879 ], [ 140.778809, 35.835628 ], [ 140.603027, 36.350527 ], [ 140.976562, 37.142803 ], [ 140.954590, 38.169114 ], [ 141.877441, 39.181175 ], [ 141.921387, 39.993956 ], [ 141.372070, 41.376809 ], [ 140.295410, 41.195190 ], [ 139.877930, 40.563895 ], [ 140.053711, 39.436193 ], [ 139.416504, 38.220920 ], [ 137.395020, 36.826875 ], [ 136.713867, 37.300275 ], [ 135.681152, 35.532226 ], [ 134.604492, 35.728677 ], [ 134.121094, 35.657296 ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Japan" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 134.121094, 34.325292 ], [ 134.648438, 34.161818 ], [ 134.736328, 33.797409 ], [ 134.208984, 33.211116 ], [ 134.121094, 33.266250 ], [ 134.121094, 34.325292 ] ] ], [ [ [ 141.328125, 41.376809 ], [ 141.943359, 39.977120 ], [ 141.855469, 39.164141 ], [ 140.976562, 38.203655 ], [ 140.976562, 37.160317 ], [ 140.625000, 36.315125 ], [ 140.800781, 35.817813 ], [ 140.273438, 35.173808 ], [ 138.955078, 34.669359 ], [ 137.197266, 34.597042 ], [ 135.791016, 33.431441 ], [ 135.087891, 33.870416 ], [ 135.087891, 34.597042 ], [ 135.000000, 34.587997 ], [ 134.121094, 34.479392 ], [ 134.121094, 35.675147 ], [ 134.648438, 35.746512 ], [ 135.703125, 35.532226 ], [ 136.757812, 37.300275 ], [ 137.373047, 36.809285 ], [ 138.867188, 37.857507 ], [ 139.394531, 38.203655 ], [ 140.097656, 39.436193 ], [ 139.921875, 40.580585 ], [ 140.152588, 40.979898 ], [ 140.273438, 41.178654 ], [ 141.328125, 41.376809 ] ] ], [ [ [ 141.097412, 41.640078 ], [ 141.064453, 41.574361 ], [ 139.921875, 41.574361 ], [ 139.910889, 41.640078 ], [ 141.097412, 41.640078 ] ] ] ] } } ] } ] } , @@ -2411,9 +2411,9 @@ , { "type": "FeatureCollection", "properties": { "zoom": 3, "x": 7, "y": 1 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Russia" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 140.449219, 72.842021 ], [ 149.501953, 72.208678 ], [ 150.380859, 71.608283 ], [ 152.929688, 70.844673 ], [ 156.972656, 71.045529 ], [ 158.994141, 70.873491 ], [ 159.873047, 70.466207 ], [ 159.697266, 69.718107 ], [ 160.927734, 69.442128 ], [ 162.246094, 69.657086 ], [ 164.091797, 69.657086 ], [ 165.937500, 69.472969 ], [ 167.871094, 69.595890 ], [ 169.541016, 68.688521 ], [ 170.859375, 69.005675 ], [ 169.980469, 69.657086 ], [ 170.419922, 70.110485 ], [ 173.671875, 69.809309 ], [ 175.693359, 69.869892 ], [ 178.593750, 69.411242 ], [ 180.000000, 68.974164 ], [ 180.878906, 68.704486 ], [ 180.878906, 66.160511 ], [ 180.000000, 66.160511 ], [ 134.121094, 66.160511 ], [ 134.121094, 71.430678 ], [ 135.000000, 71.577060 ], [ 135.527344, 71.663663 ], [ 137.460938, 71.357067 ], [ 138.251953, 71.635993 ], [ 139.833984, 71.497037 ], [ 139.130859, 72.422268 ], [ 140.449219, 72.842021 ] ] ], [ [ [ 138.867188, 76.142958 ], [ 141.503906, 76.100796 ], [ 145.107422, 75.563041 ], [ 144.316406, 74.821934 ], [ 140.625000, 74.844929 ], [ 138.955078, 74.613445 ], [ 136.933594, 75.253057 ], [ 137.548828, 75.952235 ], [ 138.867188, 76.142958 ] ] ], [ [ [ 180.000000, 71.524909 ], [ 180.087891, 71.552741 ], [ 180.878906, 71.552741 ], [ 180.878906, 70.884288 ], [ 180.000000, 70.844673 ], [ 178.945312, 70.786910 ], [ 178.681641, 71.102543 ], [ 180.000000, 71.524909 ] ] ], [ [ [ 146.337891, 75.497157 ], [ 148.183594, 75.342282 ], [ 150.732422, 75.073010 ], [ 149.589844, 74.683250 ], [ 148.007812, 74.775843 ], [ 146.162109, 75.163300 ], [ 146.337891, 75.497157 ] ] ], [ [ [ 142.031250, 73.849286 ], [ 143.525391, 73.478485 ], [ 143.613281, 73.201317 ], [ 142.119141, 73.201317 ], [ 140.009766, 73.327858 ], [ 139.833984, 73.378215 ], [ 140.800781, 73.775780 ], [ 142.031250, 73.849286 ] ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 180.878906, 79.335219 ], [ 180.878906, 71.552741 ], [ 180.131836, 71.559692 ], [ 180.000000, 71.517945 ], [ 178.725586, 71.095425 ], [ 178.901367, 70.779678 ], [ 180.000000, 70.830248 ], [ 180.878906, 70.873491 ], [ 180.878906, 68.692513 ], [ 180.000000, 68.966279 ], [ 178.593750, 69.403514 ], [ 175.715332, 69.877452 ], [ 173.649902, 69.816891 ], [ 170.463867, 70.095529 ], [ 170.002441, 69.649446 ], [ 170.815430, 69.013546 ], [ 169.584961, 68.696505 ], [ 167.827148, 69.580563 ], [ 165.937500, 69.472969 ], [ 164.047852, 69.664723 ], [ 162.290039, 69.641804 ], [ 160.949707, 69.434410 ], [ 159.719238, 69.725722 ], [ 159.829102, 70.451508 ], [ 158.994141, 70.866291 ], [ 157.016602, 71.031249 ], [ 152.973633, 70.844673 ], [ 150.358887, 71.608283 ], [ 149.501953, 72.201963 ], [ 140.471191, 72.848502 ], [ 139.152832, 72.415631 ], [ 139.877930, 71.490063 ], [ 138.229980, 71.629069 ], [ 137.504883, 71.350041 ], [ 135.571289, 71.656749 ], [ 134.121094, 71.427179 ], [ 134.121094, 79.335219 ], [ 180.878906, 79.335219 ] ], [ [ 138.823242, 76.137695 ], [ 137.504883, 75.946901 ], [ 136.977539, 75.264239 ], [ 138.955078, 74.613445 ], [ 140.603027, 74.844929 ], [ 144.294434, 74.821934 ], [ 145.085449, 75.563041 ], [ 141.481934, 76.095517 ], [ 138.823242, 76.137695 ] ], [ [ 142.053223, 73.855397 ], [ 140.800781, 73.763497 ], [ 139.855957, 73.371928 ], [ 140.031738, 73.315246 ], [ 142.097168, 73.207666 ], [ 143.613281, 73.214013 ], [ 143.481445, 73.472235 ], [ 142.053223, 73.855397 ] ], [ [ 146.359863, 75.497157 ], [ 146.118164, 75.174549 ], [ 147.985840, 74.775843 ], [ 149.567871, 74.689053 ], [ 150.732422, 75.084326 ], [ 148.227539, 75.347841 ], [ 146.359863, 75.497157 ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Russia" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 140.449219, 72.842021 ], [ 149.501953, 72.208678 ], [ 150.380859, 71.608283 ], [ 152.929688, 70.844673 ], [ 156.972656, 71.045529 ], [ 158.994141, 70.873491 ], [ 159.873047, 70.466207 ], [ 159.697266, 69.718107 ], [ 160.927734, 69.442128 ], [ 162.246094, 69.657086 ], [ 164.091797, 69.657086 ], [ 165.937500, 69.472969 ], [ 167.871094, 69.595890 ], [ 169.541016, 68.688521 ], [ 170.859375, 69.005675 ], [ 169.980469, 69.657086 ], [ 170.419922, 70.110485 ], [ 173.671875, 69.809309 ], [ 175.693359, 69.869892 ], [ 178.593750, 69.411242 ], [ 180.000000, 68.974164 ], [ 180.878906, 68.704486 ], [ 180.878906, 66.160511 ], [ 180.000000, 66.160511 ], [ 134.121094, 66.160511 ], [ 134.121094, 71.430678 ], [ 135.000000, 71.577060 ], [ 135.527344, 71.663663 ], [ 137.460938, 71.357067 ], [ 138.251953, 71.635993 ], [ 139.833984, 71.497037 ], [ 139.130859, 72.422268 ], [ 140.449219, 72.842021 ] ] ], [ [ [ 138.867188, 76.142958 ], [ 141.503906, 76.100796 ], [ 145.107422, 75.563041 ], [ 144.316406, 74.821934 ], [ 140.625000, 74.844929 ], [ 138.955078, 74.613445 ], [ 136.933594, 75.253057 ], [ 137.548828, 75.952235 ], [ 138.867188, 76.142958 ] ] ], [ [ [ 180.000000, 71.524909 ], [ 180.087891, 71.552741 ], [ 180.878906, 71.552741 ], [ 180.878906, 70.884288 ], [ 180.000000, 70.844673 ], [ 178.945312, 70.786910 ], [ 178.681641, 71.102543 ], [ 180.000000, 71.524909 ] ] ], [ [ [ 146.337891, 75.497157 ], [ 148.183594, 75.342282 ], [ 150.732422, 75.073010 ], [ 149.589844, 74.683250 ], [ 148.007812, 74.775843 ], [ 146.162109, 75.163300 ], [ 146.337891, 75.497157 ] ] ], [ [ [ 142.031250, 73.849286 ], [ 143.525391, 73.478485 ], [ 143.613281, 73.201317 ], [ 142.119141, 73.201317 ], [ 140.009766, 73.327858 ], [ 139.833984, 73.378215 ], [ 140.800781, 73.775780 ], [ 142.031250, 73.849286 ] ] ] ] } } ] } ] } , @@ -2861,9 +2861,9 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 3, "y": 3 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Canada" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -95.185547, 71.910888 ], [ -93.867188, 71.746432 ], [ -92.900391, 71.328950 ], [ -91.494141, 70.199994 ], [ -92.373047, 69.687618 ], [ -90.527344, 69.503765 ], [ -90.527344, 68.463800 ], [ -90.000000, 68.784144 ], [ -89.560547, 69.037142 ], [ -89.560547, 66.337505 ], [ -112.939453, 66.337505 ], [ -112.939453, 67.709445 ], [ -112.500000, 67.709445 ], [ -110.830078, 67.809245 ], [ -109.951172, 67.974634 ], [ -108.896484, 67.373698 ], [ -107.753906, 67.875541 ], [ -108.808594, 68.301905 ], [ -108.193359, 68.656555 ], [ -106.962891, 68.688521 ], [ -106.171875, 68.784144 ], [ -105.380859, 68.560384 ], [ -104.326172, 68.007571 ], [ -103.183594, 68.106102 ], [ -101.425781, 67.642676 ], [ -99.931641, 67.809245 ], [ -98.437500, 67.776025 ], [ -98.525391, 68.399180 ], [ -97.646484, 68.592487 ], [ -96.152344, 68.236823 ], [ -96.152344, 67.305976 ], [ -95.449219, 68.106102 ], [ -94.658203, 68.073305 ], [ -94.218750, 69.068563 ], [ -95.273438, 69.687618 ], [ -96.503906, 70.080562 ], [ -96.416016, 71.187754 ], [ -95.185547, 71.910888 ] ] ], [ [ [ -107.490234, 73.226700 ], [ -106.523438, 73.073844 ], [ -105.380859, 72.659588 ], [ -104.765625, 71.691293 ], [ -104.501953, 70.988349 ], [ -100.986328, 70.020587 ], [ -101.074219, 69.595890 ], [ -102.744141, 69.503765 ], [ -102.128906, 69.131271 ], [ -102.392578, 68.752315 ], [ -104.238281, 68.911005 ], [ -105.996094, 69.193800 ], [ -107.138672, 69.131271 ], [ -108.984375, 68.784144 ], [ -112.500000, 68.560384 ], [ -112.939453, 68.560384 ], [ -112.939453, 70.318738 ], [ -112.500000, 70.377854 ], [ -112.939453, 70.436799 ], [ -112.939453, 72.867930 ], [ -112.500000, 72.945431 ], [ -112.412109, 72.945431 ], [ -111.093750, 72.448792 ], [ -109.951172, 72.971189 ], [ -108.984375, 72.633374 ], [ -108.193359, 71.663663 ], [ -107.666016, 72.073911 ], [ -108.369141, 73.099413 ], [ -107.490234, 73.226700 ] ] ], [ [ [ -98.261719, 70.140364 ], [ -96.591797, 69.687618 ], [ -95.625000, 69.099940 ], [ -96.240234, 68.752315 ], [ -97.646484, 69.068563 ], [ -98.437500, 68.942607 ], [ -99.755859, 69.411242 ], [ -98.876953, 69.718107 ], [ -98.261719, 70.140364 ] ] ], [ [ [ -100.371094, 73.849286 ], [ -99.140625, 73.627789 ], [ -97.382812, 73.751205 ], [ -97.119141, 73.478485 ], [ -98.085938, 72.996909 ], [ -96.503906, 72.554498 ], [ -96.679688, 71.663663 ], [ -98.349609, 71.272595 ], [ -99.316406, 71.357067 ], [ -100.019531, 71.746432 ], [ -102.480469, 72.501722 ], [ -102.480469, 72.842021 ], [ -100.458984, 72.711903 ], [ -101.513672, 73.353055 ], [ -100.371094, 73.849286 ] ] ], [ [ [ -94.482422, 74.140084 ], [ -92.460938, 74.091974 ], [ -91.845703, 74.019543 ], [ -90.527344, 73.849286 ], [ -92.021484, 72.971189 ], [ -93.164062, 72.764065 ], [ -94.306641, 72.019729 ], [ -95.449219, 72.073911 ], [ -96.064453, 72.945431 ], [ -95.976562, 73.428424 ], [ -95.537109, 73.873717 ], [ -94.921875, 74.019543 ], [ -94.482422, 74.140084 ] ] ], [ [ [ -89.560547, 73.022592 ], [ -89.560547, 71.216075 ], [ -89.912109, 71.216075 ], [ -90.000000, 71.552741 ], [ -90.175781, 72.235514 ], [ -90.000000, 72.448792 ], [ -89.560547, 73.022592 ] ] ], [ [ [ -105.292969, 73.627789 ], [ -104.501953, 73.428424 ], [ -105.380859, 72.764065 ], [ -106.962891, 73.453473 ], [ -106.611328, 73.602996 ], [ -105.292969, 73.627789 ] ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -112.939453, 72.890570 ], [ -112.939453, 74.140084 ], [ -89.560547, 74.140084 ], [ -89.560547, 72.980838 ], [ -90.000000, 72.468659 ], [ -90.197754, 72.235514 ], [ -90.000000, 71.587473 ], [ -89.890137, 71.223149 ], [ -89.560547, 71.221381 ], [ -89.560547, 69.054822 ], [ -90.000000, 68.800041 ], [ -90.549316, 68.471864 ], [ -90.549316, 69.496070 ], [ -92.416992, 69.702868 ], [ -91.516113, 70.192550 ], [ -92.878418, 71.321915 ], [ -93.889160, 71.760191 ], [ -95.207520, 71.917709 ], [ -96.394043, 71.194838 ], [ -96.481934, 70.088047 ], [ -95.295410, 69.687618 ], [ -94.240723, 69.068563 ], [ -94.680176, 68.065098 ], [ -95.493164, 68.089709 ], [ -96.130371, 67.297497 ], [ -96.130371, 68.236823 ], [ -97.668457, 68.576441 ], [ -98.569336, 68.407268 ], [ -98.437500, 67.784335 ], [ -99.909668, 67.809245 ], [ -101.447754, 67.651033 ], [ -103.227539, 68.097907 ], [ -104.348145, 68.015798 ], [ -105.336914, 68.560384 ], [ -106.149902, 68.800041 ], [ -106.940918, 68.696505 ], [ -108.171387, 68.656555 ], [ -108.808594, 68.310027 ], [ -107.797852, 67.883815 ], [ -108.874512, 67.382150 ], [ -109.951172, 67.982873 ], [ -110.808105, 67.809245 ], [ -112.939453, 67.709445 ], [ -112.939453, 68.554359 ], [ -111.972656, 68.600505 ], [ -109.006348, 68.776191 ], [ -107.116699, 69.115611 ], [ -105.952148, 69.178184 ], [ -104.238281, 68.911005 ], [ -102.436523, 68.752315 ], [ -102.084961, 69.123443 ], [ -102.722168, 69.503765 ], [ -101.096191, 69.588228 ], [ -100.986328, 70.020587 ], [ -102.788086, 70.495574 ], [ -104.458008, 70.995506 ], [ -104.765625, 71.698194 ], [ -105.402832, 72.672681 ], [ -106.523438, 73.073844 ], [ -107.512207, 73.233040 ], [ -108.391113, 73.086633 ], [ -107.687988, 72.067147 ], [ -108.193359, 71.649833 ], [ -109.006348, 72.633374 ], [ -109.929199, 72.958315 ], [ -111.049805, 72.448792 ], [ -112.434082, 72.958315 ], [ -112.939453, 72.890570 ] ], [ [ -100.349121, 73.843173 ], [ -101.535645, 73.359348 ], [ -100.437012, 72.705372 ], [ -102.480469, 72.829052 ], [ -102.502441, 72.508328 ], [ -100.019531, 71.739548 ], [ -99.316406, 71.357067 ], [ -98.349609, 71.272595 ], [ -96.723633, 71.656749 ], [ -96.547852, 72.561085 ], [ -98.063965, 72.990483 ], [ -97.119141, 73.472235 ], [ -97.382812, 73.757352 ], [ -99.162598, 73.633981 ], [ -100.349121, 73.843173 ] ], [ [ -98.217773, 70.140364 ], [ -98.920898, 69.710489 ], [ -99.799805, 69.403514 ], [ -98.437500, 68.950500 ], [ -97.624512, 69.060712 ], [ -96.262207, 68.760276 ], [ -95.646973, 69.107777 ], [ -96.547852, 69.679990 ], [ -97.163086, 69.862328 ], [ -98.217773, 70.140364 ] ], [ [ -94.504395, 74.134078 ], [ -95.493164, 73.861506 ], [ -96.020508, 73.434689 ], [ -96.042480, 72.938986 ], [ -95.405273, 72.060381 ], [ -94.262695, 72.026510 ], [ -93.186035, 72.770574 ], [ -91.999512, 72.964753 ], [ -90.505371, 73.855397 ], [ -92.416992, 74.097996 ], [ -94.504395, 74.134078 ] ], [ [ -105.249023, 73.640171 ], [ -106.589355, 73.602996 ], [ -106.940918, 73.459729 ], [ -105.380859, 72.757553 ], [ -104.501953, 73.422156 ], [ -105.249023, 73.640171 ] ] ], [ [ [ -112.939453, 70.427600 ], [ -112.412109, 70.363091 ], [ -112.939453, 70.294674 ], [ -112.939453, 70.427600 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Canada" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -95.185547, 71.910888 ], [ -93.867188, 71.746432 ], [ -92.900391, 71.328950 ], [ -91.494141, 70.199994 ], [ -92.373047, 69.687618 ], [ -90.527344, 69.503765 ], [ -90.527344, 68.463800 ], [ -90.000000, 68.784144 ], [ -89.560547, 69.037142 ], [ -89.560547, 66.337505 ], [ -112.939453, 66.337505 ], [ -112.939453, 67.709445 ], [ -112.500000, 67.709445 ], [ -110.830078, 67.809245 ], [ -109.951172, 67.974634 ], [ -108.896484, 67.373698 ], [ -107.753906, 67.875541 ], [ -108.808594, 68.301905 ], [ -108.193359, 68.656555 ], [ -106.962891, 68.688521 ], [ -106.171875, 68.784144 ], [ -105.380859, 68.560384 ], [ -104.326172, 68.007571 ], [ -103.183594, 68.106102 ], [ -101.425781, 67.642676 ], [ -99.931641, 67.809245 ], [ -98.437500, 67.776025 ], [ -98.525391, 68.399180 ], [ -97.646484, 68.592487 ], [ -96.152344, 68.236823 ], [ -96.152344, 67.305976 ], [ -95.449219, 68.106102 ], [ -94.658203, 68.073305 ], [ -94.218750, 69.068563 ], [ -95.273438, 69.687618 ], [ -96.503906, 70.080562 ], [ -96.416016, 71.187754 ], [ -95.185547, 71.910888 ] ] ], [ [ [ -107.490234, 73.226700 ], [ -106.523438, 73.073844 ], [ -105.380859, 72.659588 ], [ -104.765625, 71.691293 ], [ -104.501953, 70.988349 ], [ -100.986328, 70.020587 ], [ -101.074219, 69.595890 ], [ -102.744141, 69.503765 ], [ -102.128906, 69.131271 ], [ -102.392578, 68.752315 ], [ -104.238281, 68.911005 ], [ -105.996094, 69.193800 ], [ -107.138672, 69.131271 ], [ -108.984375, 68.784144 ], [ -112.500000, 68.560384 ], [ -112.939453, 68.560384 ], [ -112.939453, 70.318738 ], [ -112.500000, 70.377854 ], [ -112.939453, 70.436799 ], [ -112.939453, 72.867930 ], [ -112.500000, 72.945431 ], [ -112.412109, 72.945431 ], [ -111.093750, 72.448792 ], [ -109.951172, 72.971189 ], [ -108.984375, 72.633374 ], [ -108.193359, 71.663663 ], [ -107.666016, 72.073911 ], [ -108.369141, 73.099413 ], [ -107.490234, 73.226700 ] ] ], [ [ [ -98.261719, 70.140364 ], [ -96.591797, 69.687618 ], [ -95.625000, 69.099940 ], [ -96.240234, 68.752315 ], [ -97.646484, 69.068563 ], [ -98.437500, 68.942607 ], [ -99.755859, 69.411242 ], [ -98.876953, 69.718107 ], [ -98.261719, 70.140364 ] ] ], [ [ [ -100.371094, 73.849286 ], [ -99.140625, 73.627789 ], [ -97.382812, 73.751205 ], [ -97.119141, 73.478485 ], [ -98.085938, 72.996909 ], [ -96.503906, 72.554498 ], [ -96.679688, 71.663663 ], [ -98.349609, 71.272595 ], [ -99.316406, 71.357067 ], [ -100.019531, 71.746432 ], [ -102.480469, 72.501722 ], [ -102.480469, 72.842021 ], [ -100.458984, 72.711903 ], [ -101.513672, 73.353055 ], [ -100.371094, 73.849286 ] ] ], [ [ [ -94.482422, 74.140084 ], [ -92.460938, 74.091974 ], [ -91.845703, 74.019543 ], [ -90.527344, 73.849286 ], [ -92.021484, 72.971189 ], [ -93.164062, 72.764065 ], [ -94.306641, 72.019729 ], [ -95.449219, 72.073911 ], [ -96.064453, 72.945431 ], [ -95.976562, 73.428424 ], [ -95.537109, 73.873717 ], [ -94.921875, 74.019543 ], [ -94.482422, 74.140084 ] ] ], [ [ [ -89.560547, 73.022592 ], [ -89.560547, 71.216075 ], [ -89.912109, 71.216075 ], [ -90.000000, 71.552741 ], [ -90.175781, 72.235514 ], [ -90.000000, 72.448792 ], [ -89.560547, 73.022592 ] ] ], [ [ [ -105.292969, 73.627789 ], [ -104.501953, 73.428424 ], [ -105.380859, 72.764065 ], [ -106.962891, 73.453473 ], [ -106.611328, 73.602996 ], [ -105.292969, 73.627789 ] ] ] ] } } ] } ] } , @@ -2913,9 +2913,9 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 4, "y": 12 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Antarctica" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -67.060547, -66.757250 ], [ -67.060547, -74.140084 ], [ -90.439453, -74.140084 ], [ -90.439453, -73.353055 ], [ -90.087891, -73.327858 ], [ -89.208984, -72.554498 ], [ -88.417969, -72.996909 ], [ -87.275391, -73.175897 ], [ -86.044922, -73.099413 ], [ -85.166016, -73.478485 ], [ -83.847656, -73.528399 ], [ -82.705078, -73.627789 ], [ -81.474609, -73.849286 ], [ -80.683594, -73.478485 ], [ -80.332031, -73.124945 ], [ -79.277344, -73.528399 ], [ -77.958984, -73.428424 ], [ -76.904297, -73.627789 ], [ -76.201172, -73.971078 ], [ -74.882812, -73.873717 ], [ -72.861328, -73.403338 ], [ -68.906250, -72.996909 ], [ -67.939453, -72.790088 ], [ -67.500000, -72.528130 ], [ -67.148438, -72.046840 ], [ -67.236328, -71.635993 ], [ -67.500000, -71.357067 ], [ -68.466797, -70.110485 ], [ -68.554688, -69.718107 ], [ -68.466797, -69.318320 ], [ -67.939453, -68.942607 ], [ -67.500000, -68.334376 ], [ -67.500000, -67.941650 ], [ -67.763672, -67.339861 ], [ -67.500000, -67.101656 ], [ -67.060547, -66.757250 ] ] ], [ [ [ -70.224609, -68.879358 ], [ -69.697266, -69.256149 ], [ -69.521484, -69.626510 ], [ -68.730469, -70.495574 ], [ -68.291016, -71.413177 ], [ -68.466797, -71.801410 ], [ -68.818359, -72.181804 ], [ -71.103516, -72.501722 ], [ -72.421875, -72.475276 ], [ -71.894531, -72.100944 ], [ -74.179688, -72.369105 ], [ -74.970703, -72.073911 ], [ -74.970703, -71.663663 ], [ -73.916016, -71.272595 ], [ -73.212891, -71.159391 ], [ -72.070312, -71.187754 ], [ -71.718750, -70.318738 ], [ -71.718750, -69.503765 ], [ -71.191406, -69.037142 ], [ -70.224609, -68.879358 ] ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -67.060547, -66.337505 ], [ -67.060547, -66.772419 ], [ -67.258301, -66.878345 ], [ -67.741699, -67.322924 ], [ -67.631836, -67.717778 ], [ -67.434082, -68.147032 ], [ -67.587891, -68.544315 ], [ -67.983398, -68.950500 ], [ -68.444824, -69.326079 ], [ -68.554688, -69.718107 ], [ -68.488770, -70.110485 ], [ -67.258301, -71.635993 ], [ -67.126465, -72.046840 ], [ -67.368164, -72.481891 ], [ -67.961426, -72.796588 ], [ -68.928223, -73.009755 ], [ -70.202637, -73.144070 ], [ -71.608887, -73.264704 ], [ -72.839355, -73.403338 ], [ -73.850098, -73.658728 ], [ -74.882812, -73.873717 ], [ -76.223145, -73.971078 ], [ -76.904297, -73.633981 ], [ -77.915039, -73.422156 ], [ -79.299316, -73.515935 ], [ -80.288086, -73.124945 ], [ -80.683594, -73.478485 ], [ -81.474609, -73.849286 ], [ -82.661133, -73.633981 ], [ -83.869629, -73.515935 ], [ -85.187988, -73.478485 ], [ -86.022949, -73.086633 ], [ -87.275391, -73.188612 ], [ -88.417969, -73.009755 ], [ -89.230957, -72.561085 ], [ -90.000000, -73.245712 ], [ -90.087891, -73.321553 ], [ -90.439453, -73.343610 ], [ -90.439453, -66.337505 ], [ -67.060547, -66.337505 ] ], [ [ -70.246582, -68.879358 ], [ -71.169434, -69.037142 ], [ -71.740723, -69.503765 ], [ -71.718750, -70.311337 ], [ -71.784668, -70.678153 ], [ -72.070312, -71.187754 ], [ -73.234863, -71.152294 ], [ -73.916016, -71.272595 ], [ -75.014648, -71.663663 ], [ -74.948730, -72.073911 ], [ -74.179688, -72.369105 ], [ -73.081055, -72.228809 ], [ -71.894531, -72.094189 ], [ -72.377930, -72.481891 ], [ -71.081543, -72.501722 ], [ -69.960938, -72.309109 ], [ -68.774414, -72.168351 ], [ -68.510742, -71.801410 ], [ -68.334961, -71.406172 ], [ -68.444824, -70.952528 ], [ -68.730469, -70.502908 ], [ -69.060059, -70.073075 ], [ -69.499512, -69.626510 ], [ -69.719238, -69.248365 ], [ -70.246582, -68.879358 ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Antarctica" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -67.060547, -66.757250 ], [ -67.060547, -74.140084 ], [ -90.439453, -74.140084 ], [ -90.439453, -73.353055 ], [ -90.087891, -73.327858 ], [ -89.208984, -72.554498 ], [ -88.417969, -72.996909 ], [ -87.275391, -73.175897 ], [ -86.044922, -73.099413 ], [ -85.166016, -73.478485 ], [ -83.847656, -73.528399 ], [ -82.705078, -73.627789 ], [ -81.474609, -73.849286 ], [ -80.683594, -73.478485 ], [ -80.332031, -73.124945 ], [ -79.277344, -73.528399 ], [ -77.958984, -73.428424 ], [ -76.904297, -73.627789 ], [ -76.201172, -73.971078 ], [ -74.882812, -73.873717 ], [ -72.861328, -73.403338 ], [ -68.906250, -72.996909 ], [ -67.939453, -72.790088 ], [ -67.500000, -72.528130 ], [ -67.148438, -72.046840 ], [ -67.236328, -71.635993 ], [ -67.500000, -71.357067 ], [ -68.466797, -70.110485 ], [ -68.554688, -69.718107 ], [ -68.466797, -69.318320 ], [ -67.939453, -68.942607 ], [ -67.500000, -68.334376 ], [ -67.500000, -67.941650 ], [ -67.763672, -67.339861 ], [ -67.500000, -67.101656 ], [ -67.060547, -66.757250 ] ] ], [ [ [ -70.224609, -68.879358 ], [ -69.697266, -69.256149 ], [ -69.521484, -69.626510 ], [ -68.730469, -70.495574 ], [ -68.291016, -71.413177 ], [ -68.466797, -71.801410 ], [ -68.818359, -72.181804 ], [ -71.103516, -72.501722 ], [ -72.421875, -72.475276 ], [ -71.894531, -72.100944 ], [ -74.179688, -72.369105 ], [ -74.970703, -72.073911 ], [ -74.970703, -71.663663 ], [ -73.916016, -71.272595 ], [ -73.212891, -71.159391 ], [ -72.070312, -71.187754 ], [ -71.718750, -70.318738 ], [ -71.718750, -69.503765 ], [ -71.191406, -69.037142 ], [ -70.224609, -68.879358 ] ] ] ] } } ] } ] } , @@ -2969,6 +2969,8 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 4, "y": 7 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ +{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -90.439453, 13.843414 ], [ -90.087891, 13.731381 ], [ -90.000000, 13.667338 ], [ -89.802246, 13.517838 ], [ -89.252930, 13.453737 ], [ -88.835449, 13.261333 ], [ -88.483887, 13.154376 ], [ -87.912598, 13.154376 ], [ -87.802734, 13.389620 ], [ -87.495117, 13.304103 ], [ -87.319336, 12.983148 ], [ -87.385254, 12.918907 ], [ -87.561035, 13.068777 ], [ -87.670898, 12.918907 ], [ -86.748047, 12.146746 ], [ -86.528320, 11.802834 ], [ -85.715332, 11.092166 ], [ -85.935059, 10.898042 ], [ -85.649414, 10.746969 ], [ -85.781250, 10.444598 ], [ -85.803223, 10.141932 ], [ -85.671387, 9.925566 ], [ -85.341797, 9.838979 ], [ -85.100098, 9.557417 ], [ -84.902344, 9.795678 ], [ -84.968262, 10.077037 ], [ -84.704590, 9.903921 ], [ -84.638672, 9.622414 ], [ -83.913574, 9.297307 ], [ -83.627930, 9.058702 ], [ -83.605957, 8.819939 ], [ -83.715820, 8.646196 ], [ -83.518066, 8.450639 ], [ -82.968750, 8.233237 ], [ -82.858887, 8.080985 ], [ -82.814941, 8.298470 ], [ -82.397461, 8.298470 ], [ -82.133789, 8.167993 ], [ -81.716309, 8.102739 ], [ -81.518555, 7.710992 ], [ -81.188965, 7.645665 ], [ -81.057129, 7.819847 ], [ -80.881348, 7.209900 ], [ -80.419922, 7.275292 ], [ -80.266113, 7.427837 ], [ -80.002441, 7.536764 ], [ -80.485840, 8.080985 ], [ -80.375977, 8.298470 ], [ -80.156250, 8.341953 ], [ -79.760742, 8.581021 ], [ -79.562988, 8.928487 ], [ -79.123535, 8.993600 ], [ -78.618164, 8.711359 ], [ -78.442383, 8.385431 ], [ -78.178711, 8.320212 ], [ -78.420410, 8.059230 ], [ -78.222656, 7.514981 ], [ -77.871094, 7.231699 ], [ -77.475586, 6.686431 ], [ -77.321777, 5.834616 ], [ -77.541504, 5.572250 ], [ -77.299805, 4.674980 ], [ -77.497559, 4.083453 ], [ -77.124023, 3.842332 ], [ -77.937012, 2.701635 ], [ -78.420410, 2.635789 ], [ -78.662109, 2.262595 ], [ -78.618164, 1.757537 ], [ -78.991699, 1.691649 ], [ -78.859863, 1.384143 ], [ -79.541016, 0.988720 ], [ -80.090332, 0.769020 ], [ -80.024414, 0.351560 ], [ -80.222168, 0.000000 ], [ -80.397949, -0.285643 ], [ -80.441895, -0.439449 ], [ -90.439453, -0.439449 ], [ -90.439453, 13.843414 ] ] ], [ [ [ -67.060547, 17.947381 ], [ -67.060547, 10.574222 ], [ -67.302246, 10.552622 ], [ -68.203125, 10.552622 ], [ -68.225098, 10.876465 ], [ -68.884277, 11.436955 ], [ -69.587402, 11.458491 ], [ -69.938965, 12.168226 ], [ -70.290527, 11.845847 ], [ -70.158691, 11.372339 ], [ -71.411133, 10.962764 ], [ -71.345215, 10.206813 ], [ -71.037598, 9.860628 ], [ -71.257324, 9.145486 ], [ -71.696777, 9.080400 ], [ -72.070312, 9.860628 ], [ -71.630859, 10.444598 ], [ -71.630859, 10.962764 ], [ -71.938477, 11.415418 ], [ -71.367188, 11.544616 ], [ -71.323242, 11.781325 ], [ -71.147461, 12.103781 ], [ -71.389160, 12.382928 ], [ -71.762695, 12.447305 ], [ -72.246094, 11.953349 ], [ -73.410645, 11.221510 ], [ -74.201660, 11.307708 ], [ -74.267578, 11.092166 ], [ -74.904785, 11.092166 ], [ -75.476074, 10.617418 ], [ -75.673828, 9.774025 ], [ -75.673828, 9.449062 ], [ -76.091309, 9.340672 ], [ -76.838379, 8.646196 ], [ -77.343750, 8.667918 ], [ -77.739258, 8.950193 ], [ -78.046875, 9.253936 ], [ -78.508301, 9.427387 ], [ -79.057617, 9.449062 ], [ -79.013672, 9.557417 ], [ -79.562988, 9.622414 ], [ -79.914551, 9.318990 ], [ -80.529785, 9.102097 ], [ -80.947266, 8.863362 ], [ -81.430664, 8.776511 ], [ -81.716309, 9.037003 ], [ -81.804199, 8.950193 ], [ -82.199707, 8.993600 ], [ -82.177734, 9.210560 ], [ -83.408203, 10.401378 ], [ -83.649902, 10.941192 ], [ -83.803711, 11.113727 ], [ -83.847656, 11.372339 ], [ -83.649902, 11.630716 ], [ -83.715820, 11.888853 ], [ -83.627930, 12.318536 ], [ -83.474121, 12.425848 ], [ -83.496094, 12.876070 ], [ -83.562012, 13.132979 ], [ -83.518066, 13.560562 ], [ -83.408203, 13.966054 ], [ -83.188477, 14.306969 ], [ -83.276367, 14.668626 ], [ -83.232422, 14.902322 ], [ -83.144531, 14.987240 ], [ -83.408203, 15.262989 ], [ -83.781738, 15.432501 ], [ -84.375000, 15.834536 ], [ -84.990234, 16.003576 ], [ -85.187988, 15.919074 ], [ -85.451660, 15.876809 ], [ -85.693359, 15.961329 ], [ -86.000977, 16.003576 ], [ -86.110840, 15.897942 ], [ -86.440430, 15.792254 ], [ -86.901855, 15.749963 ], [ -87.363281, 15.855674 ], [ -87.517090, 15.792254 ], [ -87.604980, 15.876809 ], [ -87.912598, 15.855674 ], [ -88.110352, 15.686510 ], [ -88.527832, 15.855674 ], [ -88.593750, 15.707663 ], [ -88.923340, 15.876809 ], [ -88.725586, 16.235772 ], [ -88.549805, 16.256867 ], [ -88.352051, 16.530898 ], [ -88.242188, 17.035777 ], [ -88.308105, 17.140790 ], [ -88.198242, 17.497389 ], [ -88.286133, 17.644022 ], [ -88.132324, 18.083201 ], [ -88.110352, 18.354526 ], [ -88.286133, 18.354526 ], [ -88.308105, 18.500447 ], [ -88.088379, 18.521283 ], [ -87.846680, 18.250220 ], [ -87.429199, 19.476950 ], [ -87.626953, 19.642588 ], [ -87.385254, 20.262197 ], [ -86.835938, 20.858812 ], [ -86.813965, 21.330315 ], [ -87.055664, 21.534847 ], [ -87.648926, 21.453069 ], [ -88.549805, 21.493964 ], [ -89.604492, 21.268900 ], [ -90.000000, 21.105000 ], [ -90.285645, 21.002471 ], [ -90.439453, 20.750977 ], [ -90.439453, 22.350076 ], [ -84.353027, 22.350076 ], [ -84.440918, 22.207749 ], [ -84.968262, 21.902278 ], [ -84.550781, 21.800308 ], [ -84.045410, 21.902278 ], [ -83.913574, 22.146708 ], [ -83.496094, 22.167058 ], [ -83.243408, 22.350076 ], [ -82.106323, 22.350076 ], [ -81.826172, 22.187405 ], [ -80.507812, 22.044913 ], [ -80.222168, 21.820708 ], [ -79.277344, 21.555284 ], [ -78.728027, 21.596151 ], [ -78.486328, 21.022983 ], [ -78.134766, 20.735566 ], [ -77.497559, 20.673905 ], [ -77.080078, 20.406420 ], [ -77.761230, 19.849394 ], [ -76.333008, 19.952696 ], [ -75.629883, 19.870060 ], [ -74.970703, 19.932041 ], [ -74.289551, 20.055931 ], [ -74.179688, 20.282809 ], [ -74.926758, 20.694462 ], [ -75.673828, 20.735566 ], [ -75.607910, 21.022983 ], [ -76.201172, 21.227942 ], [ -76.530762, 21.207459 ], [ -78.123779, 22.350076 ], [ -67.060547, 22.350076 ], [ -67.060547, 18.521283 ], [ -67.104492, 18.521283 ], [ -67.236328, 18.375379 ], [ -67.192383, 17.936929 ], [ -67.060547, 17.947381 ] ], [ [ -73.190918, 19.911384 ], [ -73.410645, 19.642588 ], [ -72.773438, 19.476950 ], [ -72.795410, 19.103648 ], [ -72.333984, 18.667063 ], [ -72.685547, 18.437925 ], [ -74.377441, 18.667063 ], [ -74.465332, 18.333669 ], [ -73.916016, 18.041421 ], [ -73.454590, 18.208480 ], [ -72.839355, 18.145852 ], [ -72.377930, 18.208480 ], [ -71.718750, 18.041421 ], [ -71.652832, 17.748687 ], [ -71.411133, 17.602139 ], [ -70.993652, 18.291950 ], [ -70.664062, 18.417079 ], [ -70.510254, 18.187607 ], [ -70.136719, 18.250220 ], [ -69.960938, 18.437925 ], [ -69.631348, 18.375379 ], [ -69.169922, 18.417079 ], [ -68.686523, 18.208480 ], [ -68.312988, 18.604601 ], [ -68.818359, 18.979026 ], [ -69.257812, 19.020577 ], [ -69.213867, 19.311143 ], [ -69.763184, 19.290406 ], [ -69.960938, 19.642588 ], [ -70.224609, 19.621892 ], [ -70.795898, 19.870060 ], [ -71.586914, 19.890723 ], [ -71.718750, 19.704658 ], [ -72.575684, 19.870060 ], [ -73.190918, 19.911384 ] ], [ [ -77.805176, 18.521283 ], [ -78.222656, 18.458768 ], [ -78.332520, 18.229351 ], [ -77.761230, 17.853290 ], [ -77.211914, 17.706828 ], [ -76.904297, 17.874203 ], [ -76.201172, 17.895114 ], [ -76.354980, 18.166730 ], [ -76.904297, 18.396230 ], [ -77.563477, 18.500447 ], [ -77.805176, 18.521283 ] ] ] ] } } +, { "type": "Feature", "properties": { "name": "Mexico" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -87.011719, 21.534847 ], [ -86.835938, 21.371244 ], [ -86.835938, 20.879343 ], [ -87.363281, 20.220966 ], [ -87.626953, 19.642588 ], [ -87.451172, 19.476950 ], [ -87.802734, 18.229351 ], [ -88.066406, 18.479609 ], [ -88.505859, 18.479609 ], [ -88.857422, 17.895114 ], [ -89.121094, 17.978733 ], [ -89.121094, 17.811456 ], [ -90.439453, 17.811456 ], [ -90.439453, 20.715015 ], [ -90.000000, 21.043491 ], [ -89.560547, 21.289374 ], [ -88.505859, 21.453069 ], [ -87.011719, 21.534847 ] ] ] } } , { "type": "Feature", "properties": { "name": "Guatemala" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -89.121094, 17.811456 ], [ -89.208984, 15.876809 ], [ -88.593750, 15.707663 ], [ -88.505859, 15.876809 ], [ -88.242188, 15.707663 ], [ -89.121094, 15.029686 ], [ -89.121094, 14.689881 ], [ -90.000000, 13.923404 ], [ -90.087891, 13.752725 ], [ -90.439453, 13.838080 ], [ -90.439453, 17.811456 ], [ -89.121094, 17.811456 ] ] ] } } @@ -3004,8 +3006,6 @@ { "type": "Feature", "properties": { "name": "Brazil" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -67.500000, 2.021065 ], [ -67.236328, 1.757537 ], [ -67.060547, 1.142502 ], [ -67.060547, -0.439449 ], [ -69.697266, -0.439449 ], [ -70.048828, -0.175781 ], [ -70.048828, 0.527336 ], [ -69.433594, 0.703107 ], [ -69.257812, 0.615223 ], [ -69.257812, 0.966751 ], [ -69.785156, 1.054628 ], [ -69.785156, 1.757537 ], [ -67.851562, 1.669686 ], [ -67.500000, 2.021065 ] ] ] } } , { "type": "Feature", "properties": { "name": "Peru" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -75.146484, -0.087891 ], [ -74.619141, -0.439449 ], [ -75.322266, -0.439449 ], [ -75.410156, -0.175781 ], [ -75.146484, -0.087891 ] ] ] } } -, -{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -90.439453, 13.843414 ], [ -90.087891, 13.731381 ], [ -90.000000, 13.667338 ], [ -89.802246, 13.517838 ], [ -89.252930, 13.453737 ], [ -88.835449, 13.261333 ], [ -88.483887, 13.154376 ], [ -87.912598, 13.154376 ], [ -87.802734, 13.389620 ], [ -87.495117, 13.304103 ], [ -87.319336, 12.983148 ], [ -87.385254, 12.918907 ], [ -87.561035, 13.068777 ], [ -87.670898, 12.918907 ], [ -86.748047, 12.146746 ], [ -86.528320, 11.802834 ], [ -85.715332, 11.092166 ], [ -85.935059, 10.898042 ], [ -85.649414, 10.746969 ], [ -85.781250, 10.444598 ], [ -85.803223, 10.141932 ], [ -85.671387, 9.925566 ], [ -85.341797, 9.838979 ], [ -85.100098, 9.557417 ], [ -84.902344, 9.795678 ], [ -84.968262, 10.077037 ], [ -84.704590, 9.903921 ], [ -84.638672, 9.622414 ], [ -83.913574, 9.297307 ], [ -83.627930, 9.058702 ], [ -83.605957, 8.819939 ], [ -83.715820, 8.646196 ], [ -83.518066, 8.450639 ], [ -82.968750, 8.233237 ], [ -82.858887, 8.080985 ], [ -82.814941, 8.298470 ], [ -82.397461, 8.298470 ], [ -82.133789, 8.167993 ], [ -81.716309, 8.102739 ], [ -81.518555, 7.710992 ], [ -81.188965, 7.645665 ], [ -81.057129, 7.819847 ], [ -80.881348, 7.209900 ], [ -80.419922, 7.275292 ], [ -80.266113, 7.427837 ], [ -80.002441, 7.536764 ], [ -80.485840, 8.080985 ], [ -80.375977, 8.298470 ], [ -80.156250, 8.341953 ], [ -79.760742, 8.581021 ], [ -79.562988, 8.928487 ], [ -79.123535, 8.993600 ], [ -78.618164, 8.711359 ], [ -78.442383, 8.385431 ], [ -78.178711, 8.320212 ], [ -78.420410, 8.059230 ], [ -78.222656, 7.514981 ], [ -77.871094, 7.231699 ], [ -77.475586, 6.686431 ], [ -77.321777, 5.834616 ], [ -77.541504, 5.572250 ], [ -77.299805, 4.674980 ], [ -77.497559, 4.083453 ], [ -77.124023, 3.842332 ], [ -77.937012, 2.701635 ], [ -78.420410, 2.635789 ], [ -78.662109, 2.262595 ], [ -78.618164, 1.757537 ], [ -78.991699, 1.691649 ], [ -78.859863, 1.384143 ], [ -79.541016, 0.988720 ], [ -80.090332, 0.769020 ], [ -80.024414, 0.351560 ], [ -80.222168, 0.000000 ], [ -80.397949, -0.285643 ], [ -80.441895, -0.439449 ], [ -90.439453, -0.439449 ], [ -90.439453, 13.843414 ] ] ], [ [ [ -67.060547, 17.947381 ], [ -67.060547, 10.574222 ], [ -67.302246, 10.552622 ], [ -68.203125, 10.552622 ], [ -68.225098, 10.876465 ], [ -68.884277, 11.436955 ], [ -69.587402, 11.458491 ], [ -69.938965, 12.168226 ], [ -70.290527, 11.845847 ], [ -70.158691, 11.372339 ], [ -71.411133, 10.962764 ], [ -71.345215, 10.206813 ], [ -71.037598, 9.860628 ], [ -71.257324, 9.145486 ], [ -71.696777, 9.080400 ], [ -72.070312, 9.860628 ], [ -71.630859, 10.444598 ], [ -71.630859, 10.962764 ], [ -71.938477, 11.415418 ], [ -71.367188, 11.544616 ], [ -71.323242, 11.781325 ], [ -71.147461, 12.103781 ], [ -71.389160, 12.382928 ], [ -71.762695, 12.447305 ], [ -72.246094, 11.953349 ], [ -73.410645, 11.221510 ], [ -74.201660, 11.307708 ], [ -74.267578, 11.092166 ], [ -74.904785, 11.092166 ], [ -75.476074, 10.617418 ], [ -75.673828, 9.774025 ], [ -75.673828, 9.449062 ], [ -76.091309, 9.340672 ], [ -76.838379, 8.646196 ], [ -77.343750, 8.667918 ], [ -77.739258, 8.950193 ], [ -78.046875, 9.253936 ], [ -78.508301, 9.427387 ], [ -79.057617, 9.449062 ], [ -79.013672, 9.557417 ], [ -79.562988, 9.622414 ], [ -79.914551, 9.318990 ], [ -80.529785, 9.102097 ], [ -80.947266, 8.863362 ], [ -81.430664, 8.776511 ], [ -81.716309, 9.037003 ], [ -81.804199, 8.950193 ], [ -82.199707, 8.993600 ], [ -82.177734, 9.210560 ], [ -83.408203, 10.401378 ], [ -83.649902, 10.941192 ], [ -83.803711, 11.113727 ], [ -83.847656, 11.372339 ], [ -83.649902, 11.630716 ], [ -83.715820, 11.888853 ], [ -83.627930, 12.318536 ], [ -83.474121, 12.425848 ], [ -83.496094, 12.876070 ], [ -83.562012, 13.132979 ], [ -83.518066, 13.560562 ], [ -83.408203, 13.966054 ], [ -83.188477, 14.306969 ], [ -83.276367, 14.668626 ], [ -83.232422, 14.902322 ], [ -83.144531, 14.987240 ], [ -83.408203, 15.262989 ], [ -83.781738, 15.432501 ], [ -84.375000, 15.834536 ], [ -84.990234, 16.003576 ], [ -85.187988, 15.919074 ], [ -85.451660, 15.876809 ], [ -85.693359, 15.961329 ], [ -86.000977, 16.003576 ], [ -86.110840, 15.897942 ], [ -86.440430, 15.792254 ], [ -86.901855, 15.749963 ], [ -87.363281, 15.855674 ], [ -87.517090, 15.792254 ], [ -87.604980, 15.876809 ], [ -87.912598, 15.855674 ], [ -88.110352, 15.686510 ], [ -88.527832, 15.855674 ], [ -88.593750, 15.707663 ], [ -88.923340, 15.876809 ], [ -88.725586, 16.235772 ], [ -88.549805, 16.256867 ], [ -88.352051, 16.530898 ], [ -88.242188, 17.035777 ], [ -88.308105, 17.140790 ], [ -88.198242, 17.497389 ], [ -88.286133, 17.644022 ], [ -88.132324, 18.083201 ], [ -88.110352, 18.354526 ], [ -88.286133, 18.354526 ], [ -88.308105, 18.500447 ], [ -88.088379, 18.521283 ], [ -87.846680, 18.250220 ], [ -87.429199, 19.476950 ], [ -87.626953, 19.642588 ], [ -87.385254, 20.262197 ], [ -86.835938, 20.858812 ], [ -86.813965, 21.330315 ], [ -87.055664, 21.534847 ], [ -87.648926, 21.453069 ], [ -88.549805, 21.493964 ], [ -89.604492, 21.268900 ], [ -90.000000, 21.105000 ], [ -90.285645, 21.002471 ], [ -90.439453, 20.750977 ], [ -90.439453, 22.350076 ], [ -84.353027, 22.350076 ], [ -84.440918, 22.207749 ], [ -84.968262, 21.902278 ], [ -84.550781, 21.800308 ], [ -84.045410, 21.902278 ], [ -83.913574, 22.146708 ], [ -83.496094, 22.167058 ], [ -83.243408, 22.350076 ], [ -82.106323, 22.350076 ], [ -81.826172, 22.187405 ], [ -80.507812, 22.044913 ], [ -80.222168, 21.820708 ], [ -79.277344, 21.555284 ], [ -78.728027, 21.596151 ], [ -78.486328, 21.022983 ], [ -78.134766, 20.735566 ], [ -77.497559, 20.673905 ], [ -77.080078, 20.406420 ], [ -77.761230, 19.849394 ], [ -76.333008, 19.952696 ], [ -75.629883, 19.870060 ], [ -74.970703, 19.932041 ], [ -74.289551, 20.055931 ], [ -74.179688, 20.282809 ], [ -74.926758, 20.694462 ], [ -75.673828, 20.735566 ], [ -75.607910, 21.022983 ], [ -76.201172, 21.227942 ], [ -76.530762, 21.207459 ], [ -78.123779, 22.350076 ], [ -67.060547, 22.350076 ], [ -67.060547, 18.521283 ], [ -67.104492, 18.521283 ], [ -67.236328, 18.375379 ], [ -67.192383, 17.936929 ], [ -67.060547, 17.947381 ] ], [ [ -73.190918, 19.911384 ], [ -73.410645, 19.642588 ], [ -72.773438, 19.476950 ], [ -72.795410, 19.103648 ], [ -72.333984, 18.667063 ], [ -72.685547, 18.437925 ], [ -74.377441, 18.667063 ], [ -74.465332, 18.333669 ], [ -73.916016, 18.041421 ], [ -73.454590, 18.208480 ], [ -72.839355, 18.145852 ], [ -72.377930, 18.208480 ], [ -71.718750, 18.041421 ], [ -71.652832, 17.748687 ], [ -71.411133, 17.602139 ], [ -70.993652, 18.291950 ], [ -70.664062, 18.417079 ], [ -70.510254, 18.187607 ], [ -70.136719, 18.250220 ], [ -69.960938, 18.437925 ], [ -69.631348, 18.375379 ], [ -69.169922, 18.417079 ], [ -68.686523, 18.208480 ], [ -68.312988, 18.604601 ], [ -68.818359, 18.979026 ], [ -69.257812, 19.020577 ], [ -69.213867, 19.311143 ], [ -69.763184, 19.290406 ], [ -69.960938, 19.642588 ], [ -70.224609, 19.621892 ], [ -70.795898, 19.870060 ], [ -71.586914, 19.890723 ], [ -71.718750, 19.704658 ], [ -72.575684, 19.870060 ], [ -73.190918, 19.911384 ] ], [ [ -77.805176, 18.521283 ], [ -78.222656, 18.458768 ], [ -78.332520, 18.229351 ], [ -77.761230, 17.853290 ], [ -77.211914, 17.706828 ], [ -76.904297, 17.874203 ], [ -76.201172, 17.895114 ], [ -76.354980, 18.166730 ], [ -76.904297, 18.396230 ], [ -77.563477, 18.500447 ], [ -77.805176, 18.521283 ] ] ] ] } } ] } ] } , @@ -3033,17 +3033,17 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 4, "y": 4 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Canada" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -90.439453, 63.743631 ], [ -90.439453, 66.687784 ], [ -82.529297, 66.687784 ], [ -83.056641, 66.513260 ], [ -83.320312, 66.407955 ], [ -84.726562, 66.266856 ], [ -85.605469, 66.513260 ], [ -85.781250, 66.513260 ], [ -86.044922, 66.053716 ], [ -87.011719, 65.219894 ], [ -87.363281, 64.774125 ], [ -88.505859, 64.091408 ], [ -90.000000, 63.975961 ], [ -90.439453, 63.743631 ] ] ], [ [ [ -77.607422, 55.528631 ], [ -77.167969, 55.776573 ], [ -76.552734, 56.511018 ], [ -76.640625, 57.183902 ], [ -77.343750, 58.031372 ], [ -78.486328, 58.813742 ], [ -77.343750, 59.844815 ], [ -77.783203, 60.759160 ], [ -78.134766, 62.308794 ], [ -77.431641, 62.552857 ], [ -75.673828, 62.267923 ], [ -74.707031, 62.186014 ], [ -73.828125, 62.431074 ], [ -71.718750, 61.522695 ], [ -71.367188, 61.143235 ], [ -69.609375, 61.058285 ], [ -69.609375, 60.239811 ], [ -69.257812, 58.950008 ], [ -68.378906, 58.813742 ], [ -67.675781, 58.217025 ], [ -67.500000, 58.263287 ], [ -67.060547, 58.447733 ], [ -67.060547, 55.528631 ], [ -77.607422, 55.528631 ] ] ], [ [ [ -79.892578, 62.390369 ], [ -79.541016, 62.349609 ], [ -79.277344, 62.144976 ], [ -79.628906, 61.648162 ], [ -80.068359, 61.731526 ], [ -80.332031, 62.103883 ], [ -79.892578, 62.390369 ] ] ], [ [ [ -67.060547, 66.687784 ], [ -67.060547, 66.337505 ], [ -67.500000, 66.302205 ], [ -68.027344, 66.266856 ], [ -68.115234, 65.694476 ], [ -67.500000, 65.366837 ], [ -67.060547, 65.109148 ], [ -67.060547, 63.194018 ], [ -67.500000, 63.352129 ], [ -68.818359, 63.743631 ], [ -67.500000, 62.915233 ], [ -67.412109, 62.875188 ], [ -67.060547, 62.674143 ], [ -67.060547, 62.062733 ], [ -67.500000, 62.144976 ], [ -68.906250, 62.349609 ], [ -71.015625, 62.915233 ], [ -72.246094, 63.391522 ], [ -71.894531, 63.665760 ], [ -74.794922, 64.661517 ], [ -74.794922, 64.396938 ], [ -77.695312, 64.244595 ], [ -78.574219, 64.586185 ], [ -77.871094, 65.293468 ], [ -73.916016, 65.440002 ], [ -74.267578, 65.802776 ], [ -73.652344, 66.513260 ], [ -73.388672, 66.687784 ], [ -67.060547, 66.687784 ] ] ], [ [ [ -81.914062, 62.915233 ], [ -81.914062, 62.714462 ], [ -83.056641, 62.144976 ], [ -83.759766, 62.186014 ], [ -84.023438, 62.471724 ], [ -83.232422, 62.915233 ], [ -81.914062, 62.915233 ] ] ], [ [ [ -85.869141, 65.730626 ], [ -85.166016, 65.658275 ], [ -84.990234, 65.219894 ], [ -84.462891, 65.366837 ], [ -83.847656, 65.109148 ], [ -81.650391, 64.472794 ], [ -81.562500, 63.975961 ], [ -80.859375, 64.052978 ], [ -80.068359, 63.743631 ], [ -80.947266, 63.430860 ], [ -82.529297, 63.665760 ], [ -83.144531, 64.091408 ], [ -84.111328, 63.587675 ], [ -85.517578, 63.035039 ], [ -85.869141, 63.626745 ], [ -87.187500, 63.548552 ], [ -86.396484, 64.052978 ], [ -85.869141, 65.730626 ] ] ], [ [ [ -90.439453, 57.183902 ], [ -90.000000, 57.088515 ], [ -89.033203, 56.848972 ], [ -88.066406, 56.462490 ], [ -87.363281, 56.022948 ], [ -86.220703, 55.776573 ], [ -85.605469, 55.528631 ], [ -90.439453, 55.528631 ], [ -90.439453, 57.183902 ] ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -67.060547, 62.062733 ], [ -67.060547, 58.444858 ], [ -67.653809, 58.217025 ], [ -68.378906, 58.802362 ], [ -69.279785, 58.961340 ], [ -69.609375, 60.217991 ], [ -69.587402, 61.058285 ], [ -71.367188, 61.132629 ], [ -71.674805, 61.522695 ], [ -72.905273, 62.103883 ], [ -73.850098, 62.441242 ], [ -74.663086, 62.186014 ], [ -75.695801, 62.278146 ], [ -77.409668, 62.552857 ], [ -78.112793, 62.319003 ], [ -77.783203, 60.759160 ], [ -77.343750, 59.855851 ], [ -78.508301, 58.802362 ], [ -77.299805, 58.054632 ], [ -76.618652, 57.207710 ], [ -76.530762, 56.535258 ], [ -77.102051, 55.838314 ], [ -77.601929, 55.528631 ], [ -85.572510, 55.528631 ], [ -86.066895, 55.727110 ], [ -87.319336, 55.998381 ], [ -88.044434, 56.474628 ], [ -89.033203, 56.848972 ], [ -90.000000, 57.076575 ], [ -90.439453, 57.174970 ], [ -90.439453, 63.748491 ], [ -90.000000, 63.985600 ], [ -89.912109, 64.033744 ], [ -88.483887, 64.101007 ], [ -87.319336, 64.774125 ], [ -87.033691, 65.210683 ], [ -86.066895, 66.053716 ], [ -85.781250, 66.513260 ], [ -85.759277, 66.557007 ], [ -85.605469, 66.513260 ], [ -84.726562, 66.258011 ], [ -83.342285, 66.407955 ], [ -83.056641, 66.513260 ], [ -82.573242, 66.687784 ], [ -73.443604, 66.687784 ], [ -73.674316, 66.513260 ], [ -73.937988, 66.311035 ], [ -74.289551, 65.811781 ], [ -73.959961, 65.458261 ], [ -76.025391, 65.330178 ], [ -77.893066, 65.311829 ], [ -78.552246, 64.576754 ], [ -77.717285, 64.225493 ], [ -74.816895, 64.387441 ], [ -74.838867, 64.680318 ], [ -71.894531, 63.675506 ], [ -72.246094, 63.401361 ], [ -71.015625, 62.915233 ], [ -68.884277, 62.329208 ], [ -67.060547, 62.062733 ] ], [ [ -79.936523, 62.390369 ], [ -80.310059, 62.083315 ], [ -80.354004, 62.021528 ], [ -80.090332, 61.721118 ], [ -79.650879, 61.637726 ], [ -79.255371, 62.155241 ], [ -79.519043, 62.359805 ], [ -79.936523, 62.390369 ] ], [ [ -83.254395, 62.915233 ], [ -84.001465, 62.451406 ], [ -83.781738, 62.186014 ], [ -83.078613, 62.155241 ], [ -81.892090, 62.714462 ], [ -81.870117, 62.905227 ], [ -83.254395, 62.915233 ] ], [ [ -85.891113, 65.739656 ], [ -86.220703, 64.820907 ], [ -86.352539, 64.033744 ], [ -87.231445, 63.538763 ], [ -85.869141, 63.636504 ], [ -85.517578, 63.054959 ], [ -84.111328, 63.568120 ], [ -83.100586, 64.101007 ], [ -82.551270, 63.656011 ], [ -80.991211, 63.411198 ], [ -80.112305, 63.724183 ], [ -80.815430, 64.052978 ], [ -81.562500, 63.975961 ], [ -81.650391, 64.453849 ], [ -82.792969, 64.764759 ], [ -83.891602, 65.109148 ], [ -84.462891, 65.375994 ], [ -84.968262, 65.219894 ], [ -85.166016, 65.658275 ], [ -85.891113, 65.739656 ] ] ], [ [ [ -67.060547, 65.102211 ], [ -67.082520, 65.109148 ], [ -68.137207, 65.685430 ], [ -68.005371, 66.266856 ], [ -67.060547, 66.359542 ], [ -67.060547, 65.102211 ] ] ], [ [ [ -67.060547, 63.198973 ], [ -67.060547, 62.706907 ], [ -67.368164, 62.885205 ], [ -68.774414, 63.743631 ], [ -67.060547, 63.198973 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Canada" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -90.439453, 63.743631 ], [ -90.439453, 66.687784 ], [ -82.529297, 66.687784 ], [ -83.056641, 66.513260 ], [ -83.320312, 66.407955 ], [ -84.726562, 66.266856 ], [ -85.605469, 66.513260 ], [ -85.781250, 66.513260 ], [ -86.044922, 66.053716 ], [ -87.011719, 65.219894 ], [ -87.363281, 64.774125 ], [ -88.505859, 64.091408 ], [ -90.000000, 63.975961 ], [ -90.439453, 63.743631 ] ] ], [ [ [ -77.607422, 55.528631 ], [ -77.167969, 55.776573 ], [ -76.552734, 56.511018 ], [ -76.640625, 57.183902 ], [ -77.343750, 58.031372 ], [ -78.486328, 58.813742 ], [ -77.343750, 59.844815 ], [ -77.783203, 60.759160 ], [ -78.134766, 62.308794 ], [ -77.431641, 62.552857 ], [ -75.673828, 62.267923 ], [ -74.707031, 62.186014 ], [ -73.828125, 62.431074 ], [ -71.718750, 61.522695 ], [ -71.367188, 61.143235 ], [ -69.609375, 61.058285 ], [ -69.609375, 60.239811 ], [ -69.257812, 58.950008 ], [ -68.378906, 58.813742 ], [ -67.675781, 58.217025 ], [ -67.500000, 58.263287 ], [ -67.060547, 58.447733 ], [ -67.060547, 55.528631 ], [ -77.607422, 55.528631 ] ] ], [ [ [ -79.892578, 62.390369 ], [ -79.541016, 62.349609 ], [ -79.277344, 62.144976 ], [ -79.628906, 61.648162 ], [ -80.068359, 61.731526 ], [ -80.332031, 62.103883 ], [ -79.892578, 62.390369 ] ] ], [ [ [ -67.060547, 66.687784 ], [ -67.060547, 66.337505 ], [ -67.500000, 66.302205 ], [ -68.027344, 66.266856 ], [ -68.115234, 65.694476 ], [ -67.500000, 65.366837 ], [ -67.060547, 65.109148 ], [ -67.060547, 63.194018 ], [ -67.500000, 63.352129 ], [ -68.818359, 63.743631 ], [ -67.500000, 62.915233 ], [ -67.412109, 62.875188 ], [ -67.060547, 62.674143 ], [ -67.060547, 62.062733 ], [ -67.500000, 62.144976 ], [ -68.906250, 62.349609 ], [ -71.015625, 62.915233 ], [ -72.246094, 63.391522 ], [ -71.894531, 63.665760 ], [ -74.794922, 64.661517 ], [ -74.794922, 64.396938 ], [ -77.695312, 64.244595 ], [ -78.574219, 64.586185 ], [ -77.871094, 65.293468 ], [ -73.916016, 65.440002 ], [ -74.267578, 65.802776 ], [ -73.652344, 66.513260 ], [ -73.388672, 66.687784 ], [ -67.060547, 66.687784 ] ] ], [ [ [ -81.914062, 62.915233 ], [ -81.914062, 62.714462 ], [ -83.056641, 62.144976 ], [ -83.759766, 62.186014 ], [ -84.023438, 62.471724 ], [ -83.232422, 62.915233 ], [ -81.914062, 62.915233 ] ] ], [ [ [ -85.869141, 65.730626 ], [ -85.166016, 65.658275 ], [ -84.990234, 65.219894 ], [ -84.462891, 65.366837 ], [ -83.847656, 65.109148 ], [ -81.650391, 64.472794 ], [ -81.562500, 63.975961 ], [ -80.859375, 64.052978 ], [ -80.068359, 63.743631 ], [ -80.947266, 63.430860 ], [ -82.529297, 63.665760 ], [ -83.144531, 64.091408 ], [ -84.111328, 63.587675 ], [ -85.517578, 63.035039 ], [ -85.869141, 63.626745 ], [ -87.187500, 63.548552 ], [ -86.396484, 64.052978 ], [ -85.869141, 65.730626 ] ] ], [ [ [ -90.439453, 57.183902 ], [ -90.000000, 57.088515 ], [ -89.033203, 56.848972 ], [ -88.066406, 56.462490 ], [ -87.363281, 56.022948 ], [ -86.220703, 55.776573 ], [ -85.605469, 55.528631 ], [ -90.439453, 55.528631 ], [ -90.439453, 57.183902 ] ] ] ] } } ] } ] } , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 4, "y": 3 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Canada" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -85.869141, 73.800318 ], [ -86.572266, 73.150440 ], [ -85.781250, 72.528130 ], [ -84.814453, 73.327858 ], [ -82.353516, 73.751205 ], [ -80.595703, 72.711903 ], [ -80.771484, 72.073911 ], [ -78.750000, 72.342464 ], [ -77.783203, 72.738003 ], [ -75.585938, 72.235514 ], [ -74.267578, 71.773941 ], [ -74.091797, 71.328950 ], [ -72.246094, 71.552741 ], [ -71.191406, 70.931004 ], [ -68.818359, 70.524897 ], [ -67.939453, 70.110485 ], [ -67.500000, 69.687618 ], [ -67.060547, 69.287257 ], [ -67.060547, 69.162558 ], [ -67.500000, 69.068563 ], [ -68.818359, 68.720441 ], [ -67.500000, 68.366801 ], [ -67.060547, 68.236823 ], [ -67.060547, 66.337505 ], [ -73.828125, 66.337505 ], [ -73.652344, 66.513260 ], [ -72.685547, 67.272043 ], [ -72.949219, 67.742759 ], [ -73.300781, 68.073305 ], [ -74.882812, 68.560384 ], [ -76.904297, 68.879358 ], [ -76.201172, 69.162558 ], [ -77.255859, 69.778952 ], [ -78.134766, 69.839622 ], [ -78.925781, 70.170201 ], [ -79.453125, 69.869892 ], [ -81.298828, 69.748551 ], [ -84.902344, 69.960439 ], [ -87.099609, 70.259452 ], [ -88.681641, 70.407348 ], [ -89.472656, 70.757966 ], [ -88.505859, 71.216075 ], [ -89.912109, 71.216075 ], [ -90.000000, 71.552741 ], [ -90.175781, 72.235514 ], [ -90.000000, 72.448792 ], [ -89.472656, 73.124945 ], [ -88.417969, 73.528399 ], [ -85.869141, 73.800318 ] ] ], [ [ [ -85.517578, 69.869892 ], [ -84.111328, 69.809309 ], [ -82.617188, 69.657086 ], [ -81.298828, 69.162558 ], [ -81.210938, 68.656555 ], [ -82.001953, 68.138852 ], [ -81.298828, 67.609221 ], [ -81.386719, 67.101656 ], [ -83.056641, 66.513260 ], [ -83.320312, 66.407955 ], [ -84.023438, 66.337505 ], [ -84.990234, 66.337505 ], [ -85.605469, 66.513260 ], [ -85.781250, 66.548263 ], [ -85.781250, 66.513260 ], [ -85.869141, 66.337505 ], [ -90.439453, 66.337505 ], [ -90.439453, 68.528235 ], [ -90.000000, 68.784144 ], [ -89.208984, 69.256149 ], [ -87.978516, 68.624544 ], [ -88.330078, 67.875541 ], [ -87.363281, 67.204032 ], [ -86.308594, 67.908619 ], [ -85.605469, 68.784144 ], [ -85.517578, 69.869892 ] ] ], [ [ [ -80.332031, 73.751205 ], [ -78.046875, 73.652545 ], [ -76.376953, 73.099413 ], [ -76.289062, 72.816074 ], [ -77.343750, 72.867930 ], [ -78.398438, 72.867930 ], [ -79.453125, 72.738003 ], [ -79.804688, 72.790088 ], [ -80.859375, 73.327858 ], [ -80.859375, 73.701948 ], [ -80.332031, 73.751205 ] ] ], [ [ [ -75.937500, 68.301905 ], [ -75.146484, 68.007571 ], [ -75.234375, 67.441229 ], [ -75.849609, 67.135829 ], [ -76.992188, 67.101656 ], [ -77.255859, 67.575717 ], [ -76.816406, 68.138852 ], [ -75.937500, 68.301905 ] ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -85.759277, 66.557007 ], [ -85.605469, 66.513260 ], [ -85.001221, 66.337505 ], [ -85.891113, 66.337505 ], [ -85.781250, 66.513260 ], [ -85.759277, 66.557007 ] ] ], [ [ [ -67.060547, 66.359542 ], [ -67.060547, 66.337505 ], [ -67.274780, 66.337505 ], [ -67.060547, 66.359542 ] ] ], [ [ [ -67.060547, 69.164512 ], [ -67.060547, 68.238859 ], [ -68.796387, 68.720441 ], [ -67.060547, 69.164512 ] ] ], [ [ [ -67.060547, 69.275597 ], [ -67.917480, 70.125430 ], [ -68.796387, 70.524897 ], [ -71.191406, 70.916641 ], [ -72.246094, 71.559692 ], [ -74.091797, 71.328950 ], [ -74.223633, 71.767067 ], [ -75.607910, 72.242216 ], [ -77.827148, 72.751039 ], [ -78.771973, 72.349128 ], [ -80.749512, 72.060381 ], [ -80.595703, 72.718432 ], [ -82.309570, 73.751205 ], [ -84.858398, 73.340461 ], [ -85.781250, 72.534726 ], [ -86.572266, 73.156808 ], [ -85.825195, 73.806447 ], [ -88.417969, 73.540855 ], [ -89.428711, 73.131322 ], [ -90.000000, 72.468659 ], [ -90.197754, 72.235514 ], [ -90.000000, 71.587473 ], [ -89.890137, 71.223149 ], [ -88.461914, 71.216075 ], [ -89.516602, 70.765206 ], [ -88.681641, 70.407348 ], [ -87.055664, 70.259452 ], [ -84.946289, 69.967967 ], [ -81.298828, 69.740944 ], [ -79.497070, 69.869892 ], [ -78.947754, 70.170201 ], [ -78.178711, 69.824471 ], [ -77.277832, 69.771356 ], [ -76.223145, 69.146920 ], [ -76.860352, 68.895187 ], [ -74.838867, 68.552351 ], [ -73.300781, 68.073305 ], [ -72.927246, 67.726108 ], [ -72.641602, 67.280530 ], [ -73.674316, 66.513260 ], [ -73.905029, 66.337505 ], [ -83.995972, 66.337505 ], [ -83.342285, 66.407955 ], [ -83.056641, 66.513260 ], [ -81.386719, 67.110204 ], [ -81.254883, 67.600849 ], [ -81.958008, 68.130668 ], [ -81.210938, 68.664551 ], [ -81.276855, 69.162558 ], [ -82.617188, 69.657086 ], [ -84.111328, 69.801724 ], [ -85.517578, 69.885010 ], [ -85.583496, 68.784144 ], [ -86.308594, 67.925140 ], [ -87.341309, 67.195518 ], [ -88.308105, 67.875541 ], [ -88.022461, 68.616534 ], [ -89.208984, 69.256149 ], [ -90.000000, 68.800041 ], [ -90.439453, 68.538286 ], [ -90.439453, 74.140084 ], [ -67.060547, 74.140084 ], [ -67.060547, 69.275597 ] ], [ [ -80.354004, 73.757352 ], [ -80.837402, 73.695780 ], [ -80.881348, 73.334161 ], [ -79.782715, 72.803086 ], [ -79.497070, 72.744522 ], [ -78.398438, 72.874402 ], [ -76.245117, 72.829052 ], [ -76.333008, 73.105800 ], [ -78.068848, 73.652545 ], [ -80.354004, 73.757352 ] ], [ [ -75.893555, 68.285651 ], [ -76.816406, 68.147032 ], [ -77.233887, 67.584098 ], [ -76.992188, 67.101656 ], [ -75.871582, 67.152898 ], [ -75.212402, 67.441229 ], [ -75.102539, 67.584098 ], [ -75.124512, 68.007571 ], [ -75.893555, 68.285651 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Canada" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -85.869141, 73.800318 ], [ -86.572266, 73.150440 ], [ -85.781250, 72.528130 ], [ -84.814453, 73.327858 ], [ -82.353516, 73.751205 ], [ -80.595703, 72.711903 ], [ -80.771484, 72.073911 ], [ -78.750000, 72.342464 ], [ -77.783203, 72.738003 ], [ -75.585938, 72.235514 ], [ -74.267578, 71.773941 ], [ -74.091797, 71.328950 ], [ -72.246094, 71.552741 ], [ -71.191406, 70.931004 ], [ -68.818359, 70.524897 ], [ -67.939453, 70.110485 ], [ -67.500000, 69.687618 ], [ -67.060547, 69.287257 ], [ -67.060547, 69.162558 ], [ -67.500000, 69.068563 ], [ -68.818359, 68.720441 ], [ -67.500000, 68.366801 ], [ -67.060547, 68.236823 ], [ -67.060547, 66.337505 ], [ -73.828125, 66.337505 ], [ -73.652344, 66.513260 ], [ -72.685547, 67.272043 ], [ -72.949219, 67.742759 ], [ -73.300781, 68.073305 ], [ -74.882812, 68.560384 ], [ -76.904297, 68.879358 ], [ -76.201172, 69.162558 ], [ -77.255859, 69.778952 ], [ -78.134766, 69.839622 ], [ -78.925781, 70.170201 ], [ -79.453125, 69.869892 ], [ -81.298828, 69.748551 ], [ -84.902344, 69.960439 ], [ -87.099609, 70.259452 ], [ -88.681641, 70.407348 ], [ -89.472656, 70.757966 ], [ -88.505859, 71.216075 ], [ -89.912109, 71.216075 ], [ -90.000000, 71.552741 ], [ -90.175781, 72.235514 ], [ -90.000000, 72.448792 ], [ -89.472656, 73.124945 ], [ -88.417969, 73.528399 ], [ -85.869141, 73.800318 ] ] ], [ [ [ -85.517578, 69.869892 ], [ -84.111328, 69.809309 ], [ -82.617188, 69.657086 ], [ -81.298828, 69.162558 ], [ -81.210938, 68.656555 ], [ -82.001953, 68.138852 ], [ -81.298828, 67.609221 ], [ -81.386719, 67.101656 ], [ -83.056641, 66.513260 ], [ -83.320312, 66.407955 ], [ -84.023438, 66.337505 ], [ -84.990234, 66.337505 ], [ -85.605469, 66.513260 ], [ -85.781250, 66.548263 ], [ -85.781250, 66.513260 ], [ -85.869141, 66.337505 ], [ -90.439453, 66.337505 ], [ -90.439453, 68.528235 ], [ -90.000000, 68.784144 ], [ -89.208984, 69.256149 ], [ -87.978516, 68.624544 ], [ -88.330078, 67.875541 ], [ -87.363281, 67.204032 ], [ -86.308594, 67.908619 ], [ -85.605469, 68.784144 ], [ -85.517578, 69.869892 ] ] ], [ [ [ -80.332031, 73.751205 ], [ -78.046875, 73.652545 ], [ -76.376953, 73.099413 ], [ -76.289062, 72.816074 ], [ -77.343750, 72.867930 ], [ -78.398438, 72.867930 ], [ -79.453125, 72.738003 ], [ -79.804688, 72.790088 ], [ -80.859375, 73.327858 ], [ -80.859375, 73.701948 ], [ -80.332031, 73.751205 ] ] ], [ [ [ -75.937500, 68.301905 ], [ -75.146484, 68.007571 ], [ -75.234375, 67.441229 ], [ -75.849609, 67.135829 ], [ -76.992188, 67.101656 ], [ -77.255859, 67.575717 ], [ -76.816406, 68.138852 ], [ -75.937500, 68.301905 ] ] ] ] } } ] } ] } , @@ -3077,9 +3077,9 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 5, "y": 15 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Antarctica" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -44.560547, -82.620052 ], [ -44.560547, -85.088894 ], [ -67.939453, -85.088894 ], [ -67.939453, -82.620052 ], [ -59.150391, -82.620052 ], [ -58.183594, -83.215693 ], [ -57.041016, -82.864308 ], [ -55.986328, -82.676285 ], [ -55.634766, -82.620052 ], [ -44.560547, -82.620052 ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -55.634766, -82.620052 ], [ -57.019043, -82.867037 ], [ -58.227539, -83.218288 ], [ -58.710938, -82.845177 ], [ -59.194336, -82.620052 ], [ -55.634766, -82.620052 ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Antarctica" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -44.560547, -82.620052 ], [ -44.560547, -85.088894 ], [ -67.939453, -85.088894 ], [ -67.939453, -82.620052 ], [ -59.150391, -82.620052 ], [ -58.183594, -83.215693 ], [ -57.041016, -82.864308 ], [ -55.986328, -82.676285 ], [ -55.634766, -82.620052 ], [ -44.560547, -82.620052 ] ] ] } } ] } ] } , @@ -3147,6 +3147,8 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 5, "y": 8 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ +{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -44.560547, -2.630301 ], [ -44.560547, -2.696148 ], [ -44.582520, -2.701635 ], [ -44.560547, -2.630301 ] ] ], [ [ [ -44.560547, -1.955187 ], [ -44.912109, -1.559866 ], [ -46.560059, -0.944781 ], [ -47.834473, -0.571280 ], [ -48.581543, -1.230374 ], [ -48.625488, -0.241699 ], [ -50.383301, -0.087891 ], [ -50.690918, 0.219726 ], [ -50.493164, 0.439449 ], [ -44.560547, 0.439449 ], [ -44.560547, -1.955187 ] ] ] ] } } +, { "type": "Feature", "properties": { "name": "Brazil" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -50.537109, 0.439449 ], [ -50.712891, 0.263671 ], [ -50.449219, 0.000000 ], [ -48.603516, -0.263671 ], [ -48.603516, -1.230374 ], [ -47.812500, -0.615223 ], [ -45.000000, -1.581830 ], [ -44.560547, -1.933227 ], [ -44.560547, -22.350076 ], [ -55.810547, -22.350076 ], [ -56.513672, -22.105999 ], [ -56.865234, -22.268764 ], [ -57.919922, -22.105999 ], [ -57.919922, -21.943046 ], [ -57.832031, -20.715015 ], [ -58.183594, -20.138470 ], [ -57.832031, -19.973349 ], [ -57.919922, -19.394068 ], [ -57.656250, -18.979026 ], [ -57.480469, -18.145852 ], [ -57.744141, -17.560247 ], [ -58.271484, -17.308688 ], [ -58.271484, -16.299051 ], [ -60.117188, -16.299051 ], [ -60.556641, -15.114553 ], [ -60.292969, -15.114553 ], [ -60.468750, -13.752725 ], [ -61.083984, -13.496473 ], [ -61.699219, -13.496473 ], [ -62.841797, -12.983148 ], [ -63.193359, -12.640338 ], [ -64.335938, -12.468760 ], [ -65.390625, -11.609193 ], [ -65.302734, -10.919618 ], [ -65.478516, -10.487812 ], [ -65.302734, -9.795678 ], [ -66.621094, -9.968851 ], [ -67.939453, -10.746969 ], [ -67.939453, 0.439449 ], [ -50.537109, 0.439449 ] ] ] } } , { "type": "Feature", "properties": { "name": "Argentina" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -65.830078, -21.943046 ], [ -64.951172, -22.105999 ], [ -64.775391, -22.350076 ], [ -66.708984, -22.350076 ], [ -66.357422, -21.943046 ], [ -65.830078, -21.943046 ] ] ], [ [ [ -64.160156, -22.350076 ], [ -63.984375, -22.024546 ], [ -62.841797, -22.024546 ], [ -62.578125, -22.350076 ], [ -64.160156, -22.350076 ] ] ] ] } } @@ -3154,8 +3156,6 @@ { "type": "Feature", "properties": { "name": "Bolivia" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -65.302734, -9.795678 ], [ -65.478516, -10.487812 ], [ -65.302734, -10.919618 ], [ -65.390625, -11.609193 ], [ -64.335938, -12.468760 ], [ -63.193359, -12.640338 ], [ -62.841797, -12.983148 ], [ -61.699219, -13.496473 ], [ -61.083984, -13.496473 ], [ -60.468750, -13.752725 ], [ -60.292969, -15.114553 ], [ -60.556641, -15.114553 ], [ -60.117188, -16.299051 ], [ -58.271484, -16.299051 ], [ -58.271484, -17.308688 ], [ -57.744141, -17.560247 ], [ -57.480469, -18.145852 ], [ -57.656250, -18.979026 ], [ -57.919922, -19.394068 ], [ -57.832031, -19.973349 ], [ -58.183594, -20.138470 ], [ -58.183594, -19.890723 ], [ -59.150391, -19.394068 ], [ -60.029297, -19.311143 ], [ -61.787109, -19.642588 ], [ -62.226562, -20.550509 ], [ -62.578125, -21.943046 ], [ -62.666016, -22.268764 ], [ -62.841797, -22.024546 ], [ -63.984375, -22.024546 ], [ -64.160156, -22.350076 ], [ -64.775391, -22.350076 ], [ -64.951172, -22.105999 ], [ -65.830078, -21.943046 ], [ -66.357422, -21.943046 ], [ -66.708984, -22.350076 ], [ -67.939453, -22.350076 ], [ -67.939453, -10.746969 ], [ -66.621094, -9.968851 ], [ -65.302734, -9.795678 ] ] ] } } , { "type": "Feature", "properties": { "name": "Paraguay" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -60.029297, -19.311143 ], [ -59.150391, -19.394068 ], [ -58.183594, -19.890723 ], [ -58.183594, -20.138470 ], [ -57.832031, -20.715015 ], [ -57.919922, -21.943046 ], [ -57.919922, -22.105999 ], [ -56.865234, -22.268764 ], [ -56.513672, -22.105999 ], [ -55.810547, -22.350076 ], [ -62.578125, -22.350076 ], [ -62.666016, -22.268764 ], [ -62.578125, -21.943046 ], [ -62.226562, -20.550509 ], [ -61.787109, -19.642588 ], [ -60.029297, -19.311143 ] ] ] } } -, -{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -44.560547, -2.630301 ], [ -44.560547, -2.696148 ], [ -44.582520, -2.701635 ], [ -44.560547, -2.630301 ] ] ], [ [ [ -44.560547, -1.955187 ], [ -44.912109, -1.559866 ], [ -46.560059, -0.944781 ], [ -47.834473, -0.571280 ], [ -48.581543, -1.230374 ], [ -48.625488, -0.241699 ], [ -50.383301, -0.087891 ], [ -50.690918, 0.219726 ], [ -50.493164, 0.439449 ], [ -44.560547, 0.439449 ], [ -44.560547, -1.955187 ] ] ] ] } } ] } ] } , @@ -3219,9 +3219,9 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 5, "y": 2 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Greenland" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -44.560547, 79.253586 ], [ -44.560547, 73.898111 ], [ -56.425781, 73.898111 ], [ -56.513672, 74.019543 ], [ -57.304688, 74.706450 ], [ -58.623047, 75.095633 ], [ -58.623047, 75.519151 ], [ -61.259766, 76.100796 ], [ -63.369141, 76.184995 ], [ -67.500000, 76.100796 ], [ -67.939453, 76.079668 ], [ -67.939453, 77.351070 ], [ -67.500000, 77.351070 ], [ -66.796875, 77.370301 ], [ -67.500000, 77.408678 ], [ -67.939453, 77.446940 ], [ -67.939453, 79.105086 ], [ -67.500000, 79.171335 ], [ -66.884766, 79.253586 ], [ -44.560547, 79.253586 ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -67.939453, 79.104048 ], [ -67.939453, 79.253586 ], [ -66.813354, 79.253586 ], [ -67.939453, 79.104048 ] ] ], [ [ [ -67.939453, 76.079668 ], [ -66.071777, 76.132430 ], [ -63.391113, 76.174498 ], [ -61.259766, 76.100796 ], [ -58.579102, 75.519151 ], [ -58.601074, 75.101283 ], [ -57.326660, 74.712244 ], [ -56.392822, 73.898111 ], [ -67.939453, 73.898111 ], [ -67.939453, 76.079668 ] ] ], [ [ [ -67.939453, 77.446940 ], [ -66.774902, 77.375105 ], [ -67.939453, 77.343850 ], [ -67.939453, 77.446940 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Greenland" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -44.560547, 79.253586 ], [ -44.560547, 73.898111 ], [ -56.425781, 73.898111 ], [ -56.513672, 74.019543 ], [ -57.304688, 74.706450 ], [ -58.623047, 75.095633 ], [ -58.623047, 75.519151 ], [ -61.259766, 76.100796 ], [ -63.369141, 76.184995 ], [ -67.500000, 76.100796 ], [ -67.939453, 76.079668 ], [ -67.939453, 77.351070 ], [ -67.500000, 77.351070 ], [ -66.796875, 77.370301 ], [ -67.500000, 77.408678 ], [ -67.939453, 77.446940 ], [ -67.939453, 79.105086 ], [ -67.500000, 79.171335 ], [ -66.884766, 79.253586 ], [ -44.560547, 79.253586 ] ] ] } } ] } ] } , @@ -3237,11 +3237,11 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 5, "y": 0 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ +{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -67.939453, 83.091276 ], [ -67.939453, 85.088894 ], [ -44.560547, 85.088894 ], [ -44.560547, 83.024885 ], [ -46.757812, 82.628514 ], [ -46.763306, 82.620052 ], [ -61.853027, 82.620052 ], [ -61.853027, 82.628514 ], [ -63.676758, 82.899703 ], [ -65.830078, 83.028886 ], [ -67.939453, 83.091276 ] ] ] } } +, { "type": "Feature", "properties": { "name": "Greenland" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -44.560547, 83.026219 ], [ -44.560547, 82.620052 ], [ -46.757812, 82.620052 ], [ -46.494141, 82.676285 ], [ -45.000000, 82.951121 ], [ -44.560547, 83.026219 ] ] ] } } , { "type": "Feature", "properties": { "name": "Canada" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -67.939453, 83.089955 ], [ -67.500000, 83.079373 ], [ -65.830078, 83.026219 ], [ -63.720703, 82.896987 ], [ -62.138672, 82.676285 ], [ -61.875000, 82.631333 ], [ -61.875000, 82.620052 ], [ -67.939453, 82.620052 ], [ -67.939453, 83.089955 ] ] ] } } -, -{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -67.939453, 83.091276 ], [ -67.939453, 85.088894 ], [ -44.560547, 85.088894 ], [ -44.560547, 83.024885 ], [ -46.757812, 82.628514 ], [ -46.763306, 82.620052 ], [ -61.853027, 82.620052 ], [ -61.853027, 82.628514 ], [ -63.676758, 82.899703 ], [ -65.830078, 83.028886 ], [ -67.939453, 83.091276 ] ] ] } } ] } ] } , @@ -3287,9 +3287,9 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 6, "y": 9 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Brazil" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -40.869141, -21.534847 ], [ -40.957031, -21.943046 ], [ -41.748047, -22.350076 ], [ -42.011719, -22.998852 ], [ -43.066406, -22.998852 ], [ -44.648438, -23.322080 ], [ -45.351562, -23.805450 ], [ -45.439453, -23.805450 ], [ -45.439453, -21.534847 ], [ -40.869141, -21.534847 ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -22.060547, -21.534847 ], [ -22.060547, -41.310824 ], [ -45.439453, -41.310824 ], [ -45.439453, -23.825551 ], [ -45.351562, -23.805450 ], [ -44.648438, -23.342256 ], [ -43.066406, -22.958393 ], [ -41.989746, -22.978624 ], [ -41.748047, -22.370396 ], [ -40.935059, -21.943046 ], [ -40.874634, -21.534847 ], [ -22.060547, -21.534847 ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Brazil" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -40.869141, -21.534847 ], [ -40.957031, -21.943046 ], [ -41.748047, -22.350076 ], [ -42.011719, -22.998852 ], [ -43.066406, -22.998852 ], [ -44.648438, -23.322080 ], [ -45.351562, -23.805450 ], [ -45.439453, -23.805450 ], [ -45.439453, -21.534847 ], [ -40.869141, -21.534847 ] ] ] } } ] } ] } , @@ -3355,9 +3355,9 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 6, "y": 0 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Greenland" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -35.068359, 83.647837 ], [ -27.070312, 83.520162 ], [ -22.500000, 82.951121 ], [ -22.060547, 82.896987 ], [ -22.060547, 82.620052 ], [ -45.439453, 82.620052 ], [ -45.439453, 82.864308 ], [ -45.000000, 82.951121 ], [ -43.417969, 83.226067 ], [ -39.902344, 83.184473 ], [ -38.583984, 83.549851 ], [ -35.068359, 83.647837 ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -22.060547, 85.088894 ], [ -22.060547, 82.887471 ], [ -27.092285, 83.520162 ], [ -35.090332, 83.645406 ], [ -38.627930, 83.549851 ], [ -39.902344, 83.179256 ], [ -43.395996, 83.226067 ], [ -45.439453, 82.869083 ], [ -45.439453, 85.088894 ], [ -22.060547, 85.088894 ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Greenland" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -35.068359, 83.647837 ], [ -27.070312, 83.520162 ], [ -22.500000, 82.951121 ], [ -22.060547, 82.896987 ], [ -22.060547, 82.620052 ], [ -45.439453, 82.620052 ], [ -45.439453, 82.864308 ], [ -45.000000, 82.951121 ], [ -43.417969, 83.226067 ], [ -39.902344, 83.184473 ], [ -38.583984, 83.549851 ], [ -35.068359, 83.647837 ] ] ] } } ] } ] } , @@ -3525,9 +3525,9 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 7, "y": 0 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Greenland" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -22.939453, 83.004844 ], [ -22.500000, 82.951121 ], [ -20.830078, 82.732092 ], [ -21.357422, 82.620052 ], [ -22.939453, 82.620052 ], [ -22.939453, 83.004844 ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 0.439453, 85.088894 ], [ 0.439453, 82.620052 ], [ -21.373901, 82.620052 ], [ -20.852051, 82.726530 ], [ -22.939453, 83.002167 ], [ -22.939453, 85.088894 ], [ 0.439453, 85.088894 ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Greenland" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -22.939453, 83.004844 ], [ -22.500000, 82.951121 ], [ -20.830078, 82.732092 ], [ -21.357422, 82.620052 ], [ -22.939453, 82.620052 ], [ -22.939453, 83.004844 ] ] ] } } ] } ] } , @@ -3603,6 +3603,8 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 8, "y": 7 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ +{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 4.328613, 6.271618 ], [ 5.031738, 5.615986 ], [ 5.361328, 4.893941 ], [ 5.888672, 4.258768 ], [ 6.701660, 4.236856 ], [ 7.075195, 4.455951 ], [ 7.470703, 4.412137 ], [ 8.503418, 4.762573 ], [ 8.481445, 4.499762 ], [ 8.745117, 4.346411 ], [ 8.942871, 3.908099 ], [ 9.404297, 3.732708 ], [ 9.799805, 3.074695 ], [ 9.645996, 2.284551 ], [ 9.316406, 1.164471 ], [ 9.492188, 1.010690 ], [ 9.206543, 0.000000 ], [ 9.058228, -0.439449 ], [ -0.439453, -0.439449 ], [ -0.439453, 5.375398 ], [ 0.000000, 5.528511 ], [ 1.054688, 5.922045 ], [ 1.867676, 6.140555 ], [ 2.702637, 6.249776 ], [ 4.328613, 6.271618 ] ] ] } } +, { "type": "Feature", "properties": { "name": "Algeria" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 10.019531, 22.350076 ], [ 9.316406, 21.943046 ], [ 5.712891, 19.642588 ], [ 4.306641, 19.145168 ], [ 3.164062, 19.062118 ], [ 3.164062, 19.725342 ], [ 2.021484, 20.138470 ], [ 1.845703, 20.632784 ], [ 0.000000, 21.779905 ], [ -0.439453, 22.105999 ], [ -0.439453, 22.350076 ], [ 10.019531, 22.350076 ] ] ] } } , { "type": "Feature", "properties": { "name": "Burkina Faso" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -0.439453, 15.029686 ], [ 0.000000, 14.944785 ], [ 0.351562, 14.944785 ], [ 0.263672, 14.434680 ], [ 0.966797, 13.325485 ], [ 1.054688, 12.811801 ], [ 2.197266, 12.640338 ], [ 2.197266, 11.953349 ], [ 1.933594, 11.609193 ], [ 1.406250, 11.523088 ], [ 1.230469, 11.092166 ], [ 0.000000, 11.005904 ], [ -0.439453, 11.092166 ], [ -0.439453, 15.029686 ] ] ] } } @@ -3636,8 +3638,6 @@ { "type": "Feature", "properties": { "name": "Dem. Rep. Congo" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 19.511719, 5.003394 ], [ 20.917969, 4.302591 ], [ 22.412109, 4.039618 ], [ 22.500000, 4.214943 ], [ 22.675781, 4.653080 ], [ 22.939453, 4.740675 ], [ 22.939453, -0.439449 ], [ 17.666016, -0.439449 ], [ 17.753906, 0.000000 ], [ 17.841797, 0.263671 ], [ 17.753906, 0.878872 ], [ 18.105469, 2.372369 ], [ 18.369141, 2.899153 ], [ 18.544922, 4.214943 ], [ 18.896484, 4.740675 ], [ 19.511719, 5.003394 ] ] ] } } , { "type": "Feature", "properties": { "name": "Congo" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 17.138672, 3.688855 ], [ 18.457031, 3.513421 ], [ 18.369141, 2.899153 ], [ 17.929688, 1.757537 ], [ 17.753906, 0.878872 ], [ 17.841797, 0.263671 ], [ 17.753906, 0.000000 ], [ 17.666016, -0.087891 ], [ 17.666016, -0.439449 ], [ 14.238281, -0.439449 ], [ 13.886719, 0.000000 ], [ 14.238281, 1.230374 ], [ 14.062500, 1.406109 ], [ 13.271484, 1.318243 ], [ 13.007812, 1.845384 ], [ 13.095703, 2.284551 ], [ 14.326172, 2.196727 ], [ 15.908203, 1.757537 ], [ 15.996094, 2.284551 ], [ 16.523438, 3.162456 ], [ 17.138672, 3.688855 ] ] ] } } -, -{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 4.328613, 6.271618 ], [ 5.031738, 5.615986 ], [ 5.361328, 4.893941 ], [ 5.888672, 4.258768 ], [ 6.701660, 4.236856 ], [ 7.075195, 4.455951 ], [ 7.470703, 4.412137 ], [ 8.503418, 4.762573 ], [ 8.481445, 4.499762 ], [ 8.745117, 4.346411 ], [ 8.942871, 3.908099 ], [ 9.404297, 3.732708 ], [ 9.799805, 3.074695 ], [ 9.645996, 2.284551 ], [ 9.316406, 1.164471 ], [ 9.492188, 1.010690 ], [ 9.206543, 0.000000 ], [ 9.058228, -0.439449 ], [ -0.439453, -0.439449 ], [ -0.439453, 5.375398 ], [ 0.000000, 5.528511 ], [ 1.054688, 5.922045 ], [ 1.867676, 6.140555 ], [ 2.702637, 6.249776 ], [ 4.328613, 6.271618 ] ] ] } } ] } ] } , @@ -3755,13 +3755,13 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 8, "y": 3 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ +{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 22.939453, 74.140084 ], [ 22.939453, 70.201855 ], [ 21.379395, 70.252029 ], [ 19.182129, 69.816891 ], [ 16.435547, 68.560384 ], [ 14.765625, 67.809245 ], [ 13.117676, 66.513260 ], [ 12.897949, 66.337505 ], [ -0.439453, 66.337505 ], [ -0.439453, 74.140084 ], [ 22.939453, 74.140084 ] ] ] } } +, { "type": "Feature", "properties": { "name": "Norway" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 21.357422, 70.259452 ], [ 22.500000, 70.229744 ], [ 22.939453, 70.199994 ], [ 22.939453, 68.847665 ], [ 22.324219, 68.847665 ], [ 21.269531, 69.380313 ], [ 20.654297, 69.099940 ], [ 20.039062, 69.068563 ], [ 19.863281, 68.399180 ], [ 18.017578, 68.560384 ], [ 17.753906, 68.007571 ], [ 16.787109, 68.007571 ], [ 15.380859, 66.513260 ], [ 15.205078, 66.337505 ], [ 12.919922, 66.337505 ], [ 13.183594, 66.513260 ], [ 14.765625, 67.809245 ], [ 19.160156, 69.809309 ], [ 21.357422, 70.259452 ] ] ] } } , { "type": "Feature", "properties": { "name": "Sweden" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 20.654297, 69.099940 ], [ 22.500000, 68.399180 ], [ 22.939453, 68.204212 ], [ 22.939453, 66.337505 ], [ 15.205078, 66.337505 ], [ 15.380859, 66.513260 ], [ 16.787109, 68.007571 ], [ 17.753906, 68.007571 ], [ 18.017578, 68.560384 ], [ 19.863281, 68.399180 ], [ 20.039062, 69.068563 ], [ 20.654297, 69.099940 ] ] ] } } , { "type": "Feature", "properties": { "name": "Finland" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 21.269531, 69.380313 ], [ 22.324219, 68.847665 ], [ 22.939453, 68.847665 ], [ 22.939453, 68.204212 ], [ 22.500000, 68.399180 ], [ 20.654297, 69.099940 ], [ 21.269531, 69.380313 ] ] ] } } -, -{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 22.939453, 74.140084 ], [ 22.939453, 70.201855 ], [ 21.379395, 70.252029 ], [ 19.182129, 69.816891 ], [ 16.435547, 68.560384 ], [ 14.765625, 67.809245 ], [ 13.117676, 66.513260 ], [ 12.897949, 66.337505 ], [ -0.439453, 66.337505 ], [ -0.439453, 74.140084 ], [ 22.939453, 74.140084 ] ] ] } } ] } ] } , @@ -3827,6 +3827,8 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 9, "y": 9 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ +{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 45.439453, -25.591994 ], [ 45.439453, -41.310824 ], [ 22.060547, -41.310824 ], [ 22.060547, -34.057211 ], [ 22.565918, -33.870416 ], [ 22.983398, -33.925130 ], [ 23.598633, -33.797409 ], [ 24.675293, -33.979809 ], [ 25.180664, -33.797409 ], [ 25.773926, -33.943360 ], [ 25.905762, -33.669497 ], [ 26.411133, -33.614619 ], [ 27.465820, -33.229498 ], [ 28.212891, -32.768800 ], [ 30.058594, -31.147006 ], [ 30.629883, -30.429730 ], [ 30.893555, -29.916852 ], [ 31.333008, -29.401320 ], [ 32.211914, -28.748397 ], [ 32.453613, -28.304381 ], [ 32.585449, -27.469287 ], [ 32.827148, -26.745610 ], [ 32.915039, -26.214591 ], [ 32.651367, -26.155438 ], [ 32.585449, -25.720735 ], [ 33.002930, -25.363882 ], [ 34.211426, -24.806681 ], [ 35.046387, -24.487149 ], [ 35.463867, -24.126702 ], [ 35.617676, -23.704895 ], [ 35.375977, -23.543845 ], [ 35.529785, -23.079732 ], [ 35.551758, -22.085640 ], [ 35.375977, -22.146708 ], [ 35.375977, -21.841105 ], [ 35.271606, -21.534847 ], [ 43.390503, -21.534847 ], [ 43.264160, -22.065278 ], [ 43.352051, -22.776182 ], [ 43.703613, -23.584126 ], [ 43.769531, -24.467151 ], [ 44.033203, -24.986058 ], [ 45.417480, -25.601902 ], [ 45.439453, -25.591994 ] ] ] } } +, { "type": "Feature", "properties": { "name": "Botswana" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 28.476562, -21.534847 ], [ 28.828125, -21.616579 ], [ 29.267578, -21.943046 ], [ 29.443359, -22.105999 ], [ 28.037109, -22.836946 ], [ 27.158203, -23.563987 ], [ 26.455078, -24.607069 ], [ 25.927734, -24.686952 ], [ 25.664062, -25.482951 ], [ 25.048828, -25.720735 ], [ 24.169922, -25.641526 ], [ 23.291016, -25.244696 ], [ 22.851562, -25.482951 ], [ 22.500000, -26.037042 ], [ 22.060547, -26.352498 ], [ 22.060547, -21.534847 ], [ 28.476562, -21.534847 ] ] ] } } , { "type": "Feature", "properties": { "name": "South Africa" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 29.882812, -22.105999 ], [ 30.322266, -22.268764 ], [ 31.201172, -22.268764 ], [ 31.904297, -24.367114 ], [ 31.728516, -25.482951 ], [ 31.816406, -25.878994 ], [ 31.376953, -25.641526 ], [ 31.025391, -25.720735 ], [ 30.673828, -26.431228 ], [ 30.673828, -26.745610 ], [ 31.289062, -27.293689 ], [ 31.904297, -27.215556 ], [ 32.080078, -26.745610 ], [ 32.871094, -26.745610 ], [ 32.431641, -28.304381 ], [ 32.167969, -28.767659 ], [ 31.289062, -29.382175 ], [ 30.058594, -31.128199 ], [ 28.212891, -32.768800 ], [ 26.455078, -33.651208 ], [ 25.927734, -33.651208 ], [ 25.751953, -33.943360 ], [ 25.136719, -33.797409 ], [ 24.697266, -34.016242 ], [ 23.554688, -33.797409 ], [ 23.027344, -33.943360 ], [ 22.500000, -33.870416 ], [ 22.060547, -34.089061 ], [ 22.060547, -26.352498 ], [ 22.500000, -26.037042 ], [ 22.851562, -25.482951 ], [ 23.291016, -25.244696 ], [ 24.169922, -25.641526 ], [ 25.048828, -25.720735 ], [ 25.664062, -25.482951 ], [ 25.927734, -24.686952 ], [ 26.455078, -24.607069 ], [ 27.158203, -23.563987 ], [ 28.037109, -22.836946 ], [ 29.443359, -22.105999 ], [ 29.882812, -22.105999 ] ], [ [ 28.564453, -28.613459 ], [ 27.509766, -29.228890 ], [ 26.982422, -29.840644 ], [ 27.773438, -30.675715 ], [ 28.125000, -30.524413 ], [ 28.300781, -30.221102 ], [ 28.828125, -30.069094 ], [ 29.355469, -29.228890 ], [ 28.564453, -28.613459 ] ] ] } } @@ -3840,8 +3842,6 @@ { "type": "Feature", "properties": { "name": "Swaziland" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 31.376953, -25.641526 ], [ 31.816406, -25.878994 ], [ 32.080078, -26.745610 ], [ 31.904297, -27.215556 ], [ 31.289062, -27.293689 ], [ 30.673828, -26.745610 ], [ 30.673828, -26.431228 ], [ 31.025391, -25.720735 ], [ 31.376953, -25.641526 ] ] ] } } , { "type": "Feature", "properties": { "name": "Madagascar" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 45.439453, -21.534847 ], [ 45.439453, -25.562265 ], [ 45.000000, -25.403585 ], [ 44.033203, -25.005973 ], [ 43.769531, -24.447150 ], [ 43.681641, -23.563987 ], [ 43.330078, -22.755921 ], [ 43.242188, -21.943046 ], [ 43.417969, -21.534847 ], [ 45.439453, -21.534847 ] ] ] } } -, -{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 45.439453, -25.591994 ], [ 45.439453, -41.310824 ], [ 22.060547, -41.310824 ], [ 22.060547, -34.057211 ], [ 22.565918, -33.870416 ], [ 22.983398, -33.925130 ], [ 23.598633, -33.797409 ], [ 24.675293, -33.979809 ], [ 25.180664, -33.797409 ], [ 25.773926, -33.943360 ], [ 25.905762, -33.669497 ], [ 26.411133, -33.614619 ], [ 27.465820, -33.229498 ], [ 28.212891, -32.768800 ], [ 30.058594, -31.147006 ], [ 30.629883, -30.429730 ], [ 30.893555, -29.916852 ], [ 31.333008, -29.401320 ], [ 32.211914, -28.748397 ], [ 32.453613, -28.304381 ], [ 32.585449, -27.469287 ], [ 32.827148, -26.745610 ], [ 32.915039, -26.214591 ], [ 32.651367, -26.155438 ], [ 32.585449, -25.720735 ], [ 33.002930, -25.363882 ], [ 34.211426, -24.806681 ], [ 35.046387, -24.487149 ], [ 35.463867, -24.126702 ], [ 35.617676, -23.704895 ], [ 35.375977, -23.543845 ], [ 35.529785, -23.079732 ], [ 35.551758, -22.085640 ], [ 35.375977, -22.146708 ], [ 35.375977, -21.841105 ], [ 35.271606, -21.534847 ], [ 43.390503, -21.534847 ], [ 43.264160, -22.065278 ], [ 43.352051, -22.776182 ], [ 43.703613, -23.584126 ], [ 43.769531, -24.467151 ], [ 44.033203, -24.986058 ], [ 45.417480, -25.601902 ], [ 45.439453, -25.591994 ] ] ] } } ] } ] } , @@ -4045,19 +4045,19 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 9, "y": 2 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Norway" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 22.851562, 78.455425 ], [ 23.291016, 78.080156 ], [ 24.697266, 77.860345 ], [ 22.500000, 77.446940 ], [ 22.060547, 77.504119 ], [ 22.060547, 78.384855 ], [ 22.500000, 78.420193 ], [ 22.851562, 78.455425 ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 22.060547, 78.377111 ], [ 22.060547, 79.253586 ], [ 45.439453, 79.253586 ], [ 45.439453, 73.898111 ], [ 22.060547, 73.898111 ], [ 22.060547, 77.504119 ], [ 22.500000, 77.446940 ], [ 24.719238, 77.855723 ], [ 23.291016, 78.080156 ], [ 22.873535, 78.455425 ], [ 22.060547, 78.377111 ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Norway" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 22.851562, 78.455425 ], [ 23.291016, 78.080156 ], [ 24.697266, 77.860345 ], [ 22.500000, 77.446940 ], [ 22.060547, 77.504119 ], [ 22.060547, 78.384855 ], [ 22.500000, 78.420193 ], [ 22.851562, 78.455425 ] ] ] } } ] } ] } , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 9, "y": 1 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ +{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 45.439453, 80.581640 ], [ 45.439453, 79.088462 ], [ 22.060547, 79.088462 ], [ 22.060547, 79.455516 ], [ 23.027344, 79.400085 ], [ 25.927734, 79.516660 ], [ 27.399902, 80.058050 ], [ 25.444336, 80.408388 ], [ 22.917480, 80.657741 ], [ 22.060547, 80.403810 ], [ 22.060547, 82.732092 ], [ 45.439453, 82.732092 ], [ 45.439453, 80.645249 ], [ 44.846191, 80.589727 ], [ 45.439453, 80.581640 ] ] ] } } +, { "type": "Feature", "properties": { "name": "Norway" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 22.939453, 80.661308 ], [ 25.488281, 80.401063 ], [ 27.421875, 80.058050 ], [ 25.927734, 79.512662 ], [ 23.027344, 79.400085 ], [ 22.500000, 79.432371 ], [ 22.060547, 79.448477 ], [ 22.060547, 80.401063 ], [ 22.939453, 80.661308 ] ] ] } } , { "type": "Feature", "properties": { "name": "Russia" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 45.439453, 80.647035 ], [ 45.439453, 80.575346 ], [ 45.000000, 80.589727 ], [ 44.824219, 80.589727 ], [ 45.000000, 80.604086 ], [ 45.439453, 80.647035 ] ] ] } } -, -{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 45.439453, 80.581640 ], [ 45.439453, 79.088462 ], [ 22.060547, 79.088462 ], [ 22.060547, 79.455516 ], [ 23.027344, 79.400085 ], [ 25.927734, 79.516660 ], [ 27.399902, 80.058050 ], [ 25.444336, 80.408388 ], [ 22.917480, 80.657741 ], [ 22.060547, 80.403810 ], [ 22.060547, 82.732092 ], [ 45.439453, 82.732092 ], [ 45.439453, 80.645249 ], [ 44.846191, 80.589727 ], [ 45.439453, 80.581640 ] ] ] } } ] } ] } , @@ -4109,9 +4109,9 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 10, "y": 9 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Madagascar" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 48.164062, -21.534847 ], [ 48.076172, -21.943046 ], [ 47.109375, -24.926295 ], [ 45.439453, -25.562265 ], [ 45.000000, -25.403585 ], [ 44.824219, -25.324167 ], [ 44.560547, -25.244696 ], [ 44.560547, -21.534847 ], [ 48.164062, -21.534847 ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 44.560547, -25.219851 ], [ 45.417480, -25.601902 ], [ 46.274414, -25.185059 ], [ 47.087402, -24.946219 ], [ 47.548828, -23.785345 ], [ 47.922363, -22.390714 ], [ 48.202515, -21.534847 ], [ 67.939453, -21.534847 ], [ 67.939453, -41.310824 ], [ 44.560547, -41.310824 ], [ 44.560547, -25.219851 ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Madagascar" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 48.164062, -21.534847 ], [ 48.076172, -21.943046 ], [ 47.109375, -24.926295 ], [ 45.439453, -25.562265 ], [ 45.000000, -25.403585 ], [ 44.824219, -25.324167 ], [ 44.560547, -25.244696 ], [ 44.560547, -21.534847 ], [ 48.164062, -21.534847 ] ] ] } } ] } ] } , @@ -4143,6 +4143,10 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 10, "y": 6 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ +{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 48.933105, 30.315988 ], [ 49.570312, 29.993002 ], [ 50.119629, 30.145127 ], [ 50.844727, 28.806174 ], [ 51.525879, 27.858504 ], [ 52.492676, 27.586198 ], [ 53.503418, 26.804461 ], [ 54.711914, 26.490240 ], [ 55.722656, 26.961246 ], [ 56.491699, 27.137368 ], [ 56.975098, 26.961246 ], [ 57.392578, 25.740529 ], [ 58.535156, 25.601902 ], [ 59.611816, 25.383735 ], [ 61.501465, 25.085599 ], [ 62.907715, 25.224820 ], [ 64.533691, 25.244696 ], [ 66.379395, 25.423431 ], [ 67.148438, 24.666986 ], [ 67.434082, 23.946096 ], [ 67.939453, 23.770264 ], [ 67.939453, 21.534847 ], [ 59.342651, 21.534847 ], [ 59.809570, 22.309426 ], [ 59.809570, 22.532854 ], [ 59.458008, 22.654572 ], [ 58.732910, 23.563987 ], [ 58.139648, 23.745126 ], [ 57.392578, 23.885838 ], [ 56.843262, 24.246965 ], [ 56.403809, 24.926295 ], [ 56.271973, 25.720735 ], [ 56.381836, 25.898762 ], [ 56.491699, 26.313113 ], [ 56.359863, 26.391870 ], [ 56.074219, 26.056783 ], [ 55.437012, 25.443275 ], [ 54.689941, 24.806681 ], [ 54.008789, 24.126702 ], [ 52.580566, 24.186847 ], [ 51.789551, 24.026397 ], [ 51.767578, 24.287027 ], [ 51.569824, 24.246965 ], [ 51.394043, 24.627045 ], [ 51.613770, 25.224820 ], [ 51.591797, 25.799891 ], [ 51.284180, 26.115986 ], [ 51.020508, 25.997550 ], [ 50.734863, 25.482951 ], [ 50.800781, 24.746831 ], [ 50.537109, 25.324167 ], [ 50.229492, 25.601902 ], [ 50.119629, 25.938287 ], [ 50.207520, 26.273714 ], [ 50.141602, 26.686730 ], [ 49.460449, 27.117813 ], [ 49.306641, 27.469287 ], [ 48.801270, 27.683528 ], [ 48.098145, 29.305561 ], [ 48.186035, 29.535230 ], [ 47.966309, 29.973970 ], [ 48.559570, 29.935895 ], [ 48.933105, 30.315988 ] ] ] } } +, +{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 54.305420, 41.310824 ], [ 54.733887, 40.946714 ], [ 53.854980, 40.630630 ], [ 52.910156, 40.880295 ], [ 52.690430, 40.027614 ], [ 53.349609, 39.977120 ], [ 53.107910, 39.283294 ], [ 53.876953, 38.959409 ], [ 53.745117, 37.909534 ], [ 53.920898, 37.195331 ], [ 53.833008, 36.967449 ], [ 52.272949, 36.703660 ], [ 50.844727, 36.879621 ], [ 50.141602, 37.370157 ], [ 49.196777, 37.579413 ], [ 48.889160, 38.324420 ], [ 48.867188, 38.822591 ], [ 49.218750, 39.044786 ], [ 49.394531, 39.402244 ], [ 49.570312, 40.178873 ], [ 50.383301, 40.262761 ], [ 50.075684, 40.530502 ], [ 49.614258, 40.580585 ], [ 49.108887, 41.277806 ], [ 49.075928, 41.310824 ], [ 52.734375, 41.310824 ], [ 52.822266, 41.129021 ], [ 52.844238, 41.310824 ], [ 54.305420, 41.310824 ] ] ] } } +, { "type": "Feature", "properties": { "name": "Georgia" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 45.527344, 41.310824 ], [ 46.582031, 41.310824 ], [ 46.669922, 41.178654 ], [ 46.494141, 41.046217 ], [ 45.966797, 41.112469 ], [ 45.527344, 41.310824 ] ] ], [ [ [ 45.527344, 41.310824 ], [ 44.560547, 41.244772 ], [ 44.560547, 41.310824 ], [ 45.527344, 41.310824 ] ] ] ] } } , { "type": "Feature", "properties": { "name": "Turkey" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 44.560547, 39.571822 ], [ 44.560547, 39.842286 ], [ 44.824219, 39.707187 ], [ 44.560547, 39.571822 ] ] ], [ [ [ 44.560547, 37.439974 ], [ 44.736328, 37.160317 ], [ 44.560547, 37.090240 ], [ 44.560547, 37.439974 ] ] ] ] } } @@ -4178,10 +4182,6 @@ { "type": "Feature", "properties": { "name": "Pakistan" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 67.939453, 31.578535 ], [ 67.939453, 23.805450 ], [ 67.500000, 23.966176 ], [ 67.148438, 24.686952 ], [ 66.357422, 25.403585 ], [ 61.523438, 25.085599 ], [ 61.875000, 26.273714 ], [ 63.281250, 26.745610 ], [ 63.193359, 27.215556 ], [ 62.753906, 27.371767 ], [ 62.753906, 28.226970 ], [ 61.787109, 28.690588 ], [ 60.908203, 29.840644 ], [ 62.578125, 29.305561 ], [ 63.544922, 29.458731 ], [ 64.160156, 29.305561 ], [ 64.335938, 29.535230 ], [ 65.039062, 29.458731 ], [ 66.357422, 29.916852 ], [ 66.357422, 30.751278 ], [ 66.972656, 31.278551 ], [ 67.675781, 31.278551 ], [ 67.763672, 31.578535 ], [ 67.939453, 31.578535 ] ] ] } } , { "type": "Feature", "properties": { "name": "Russia" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 47.900391, 41.310824 ], [ 47.812500, 41.178654 ], [ 47.285156, 41.310824 ], [ 47.900391, 41.310824 ] ] ] } } -, -{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 48.933105, 30.315988 ], [ 49.570312, 29.993002 ], [ 50.119629, 30.145127 ], [ 50.844727, 28.806174 ], [ 51.525879, 27.858504 ], [ 52.492676, 27.586198 ], [ 53.503418, 26.804461 ], [ 54.711914, 26.490240 ], [ 55.722656, 26.961246 ], [ 56.491699, 27.137368 ], [ 56.975098, 26.961246 ], [ 57.392578, 25.740529 ], [ 58.535156, 25.601902 ], [ 59.611816, 25.383735 ], [ 61.501465, 25.085599 ], [ 62.907715, 25.224820 ], [ 64.533691, 25.244696 ], [ 66.379395, 25.423431 ], [ 67.148438, 24.666986 ], [ 67.434082, 23.946096 ], [ 67.939453, 23.770264 ], [ 67.939453, 21.534847 ], [ 59.342651, 21.534847 ], [ 59.809570, 22.309426 ], [ 59.809570, 22.532854 ], [ 59.458008, 22.654572 ], [ 58.732910, 23.563987 ], [ 58.139648, 23.745126 ], [ 57.392578, 23.885838 ], [ 56.843262, 24.246965 ], [ 56.403809, 24.926295 ], [ 56.271973, 25.720735 ], [ 56.381836, 25.898762 ], [ 56.491699, 26.313113 ], [ 56.359863, 26.391870 ], [ 56.074219, 26.056783 ], [ 55.437012, 25.443275 ], [ 54.689941, 24.806681 ], [ 54.008789, 24.126702 ], [ 52.580566, 24.186847 ], [ 51.789551, 24.026397 ], [ 51.767578, 24.287027 ], [ 51.569824, 24.246965 ], [ 51.394043, 24.627045 ], [ 51.613770, 25.224820 ], [ 51.591797, 25.799891 ], [ 51.284180, 26.115986 ], [ 51.020508, 25.997550 ], [ 50.734863, 25.482951 ], [ 50.800781, 24.746831 ], [ 50.537109, 25.324167 ], [ 50.229492, 25.601902 ], [ 50.119629, 25.938287 ], [ 50.207520, 26.273714 ], [ 50.141602, 26.686730 ], [ 49.460449, 27.117813 ], [ 49.306641, 27.469287 ], [ 48.801270, 27.683528 ], [ 48.098145, 29.305561 ], [ 48.186035, 29.535230 ], [ 47.966309, 29.973970 ], [ 48.559570, 29.935895 ], [ 48.933105, 30.315988 ] ] ] } } -, -{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 54.305420, 41.310824 ], [ 54.733887, 40.946714 ], [ 53.854980, 40.630630 ], [ 52.910156, 40.880295 ], [ 52.690430, 40.027614 ], [ 53.349609, 39.977120 ], [ 53.107910, 39.283294 ], [ 53.876953, 38.959409 ], [ 53.745117, 37.909534 ], [ 53.920898, 37.195331 ], [ 53.833008, 36.967449 ], [ 52.272949, 36.703660 ], [ 50.844727, 36.879621 ], [ 50.141602, 37.370157 ], [ 49.196777, 37.579413 ], [ 48.889160, 38.324420 ], [ 48.867188, 38.822591 ], [ 49.218750, 39.044786 ], [ 49.394531, 39.402244 ], [ 49.570312, 40.178873 ], [ 50.383301, 40.262761 ], [ 50.075684, 40.530502 ], [ 49.614258, 40.580585 ], [ 49.108887, 41.277806 ], [ 49.075928, 41.310824 ], [ 52.734375, 41.310824 ], [ 52.822266, 41.129021 ], [ 52.844238, 41.310824 ], [ 54.305420, 41.310824 ] ] ] } } ] } ] } , @@ -4271,17 +4271,17 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 11, "y": 11 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Antarctica" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 87.978516, -66.196009 ], [ 88.330078, -66.513260 ], [ 88.593750, -66.687784 ], [ 87.626953, -66.687784 ], [ 87.714844, -66.513260 ], [ 87.978516, -66.196009 ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 90.439453, -55.528631 ], [ 90.439453, -66.687784 ], [ 88.555298, -66.687784 ], [ 88.374023, -66.513260 ], [ 87.978516, -66.213739 ], [ 87.758789, -66.513260 ], [ 87.621460, -66.687784 ], [ 67.060547, -66.687784 ], [ 67.060547, -55.528631 ], [ 90.439453, -55.528631 ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Antarctica" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 87.978516, -66.196009 ], [ 88.330078, -66.513260 ], [ 88.593750, -66.687784 ], [ 87.626953, -66.687784 ], [ 87.714844, -66.513260 ], [ 87.978516, -66.196009 ] ] ] } } ] } ] } , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 11, "y": 10 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Fr. S. Antarctic Lands" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 68.906250, -48.632909 ], [ 69.609375, -48.922499 ], [ 70.488281, -49.037868 ], [ 70.576172, -49.267805 ], [ 70.312500, -49.724479 ], [ 68.730469, -49.781264 ], [ 68.906250, -48.632909 ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 90.439453, -40.647304 ], [ 90.439453, -56.022948 ], [ 67.060547, -56.022948 ], [ 67.060547, -40.647304 ], [ 90.439453, -40.647304 ] ], [ [ 68.928223, -48.618385 ], [ 68.730469, -49.239121 ], [ 68.752441, -49.781264 ], [ 70.290527, -49.710273 ], [ 70.554199, -49.253465 ], [ 70.532227, -49.066668 ], [ 69.587402, -48.936935 ], [ 68.928223, -48.618385 ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Fr. S. Antarctic Lands" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 68.906250, -48.632909 ], [ 69.609375, -48.922499 ], [ 70.488281, -49.037868 ], [ 70.576172, -49.267805 ], [ 70.312500, -49.724479 ], [ 68.730469, -49.781264 ], [ 68.906250, -48.632909 ] ] ] } } ] } ] } , @@ -4311,6 +4311,8 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 11, "y": 6 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ +{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 67.060547, 24.751820 ], [ 67.148438, 24.666986 ], [ 67.434082, 23.946096 ], [ 68.181152, 23.684774 ], [ 69.345703, 22.836946 ], [ 69.653320, 22.451649 ], [ 69.169922, 22.085640 ], [ 69.763184, 21.534847 ], [ 67.060547, 21.534847 ], [ 67.060547, 24.751820 ] ] ], [ [ [ 87.214966, 21.534847 ], [ 88.198242, 21.698265 ], [ 88.879395, 21.698265 ], [ 89.033203, 22.065278 ], [ 89.692383, 21.861499 ], [ 89.846191, 22.044913 ], [ 90.000000, 21.963425 ], [ 90.263672, 21.841105 ], [ 90.439453, 22.136532 ], [ 90.439453, 21.534847 ], [ 87.214966, 21.534847 ] ] ] ] } } +, { "type": "Feature", "properties": { "name": "Kazakhstan" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 69.082031, 41.310824 ], [ 68.818359, 40.979898 ], [ 68.642578, 40.647304 ], [ 68.291016, 40.647304 ], [ 68.115234, 40.979898 ], [ 68.027344, 41.112469 ], [ 67.060547, 41.178654 ], [ 67.060547, 41.310824 ], [ 69.082031, 41.310824 ] ] ] } } , { "type": "Feature", "properties": { "name": "Uzbekistan" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 72.070312, 41.310824 ], [ 72.773438, 40.979898 ], [ 73.037109, 40.847060 ], [ 71.806641, 40.178873 ], [ 70.576172, 40.245992 ], [ 70.488281, 40.513799 ], [ 70.664062, 40.979898 ], [ 69.345703, 40.713956 ], [ 68.554688, 39.504041 ], [ 67.675781, 39.571822 ], [ 67.500000, 39.300299 ], [ 67.500000, 39.164141 ], [ 68.203125, 38.891033 ], [ 68.378906, 38.134557 ], [ 67.851562, 37.160317 ], [ 67.500000, 37.230328 ], [ 67.060547, 37.370157 ], [ 67.060547, 41.178654 ], [ 68.027344, 41.112469 ], [ 68.115234, 40.979898 ], [ 68.291016, 40.647304 ], [ 68.642578, 40.647304 ], [ 68.818359, 40.979898 ], [ 69.082031, 41.310824 ], [ 70.839844, 41.310824 ], [ 71.191406, 41.112469 ], [ 71.718750, 41.310824 ], [ 72.070312, 41.310824 ] ] ] } } @@ -4332,8 +4334,6 @@ { "type": "Feature", "properties": { "name": "Bangladesh" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 88.593750, 26.431228 ], [ 89.384766, 26.037042 ], [ 89.824219, 25.958045 ], [ 90.000000, 25.244696 ], [ 90.439453, 25.165173 ], [ 90.439453, 22.105999 ], [ 90.263672, 21.861499 ], [ 90.000000, 21.943046 ], [ 89.384766, 21.943046 ], [ 89.033203, 22.024546 ], [ 88.857422, 22.917923 ], [ 88.505859, 23.644524 ], [ 88.681641, 24.206890 ], [ 88.066406, 24.527135 ], [ 88.945312, 25.244696 ], [ 88.242188, 25.799891 ], [ 88.593750, 26.431228 ] ] ] } } , { "type": "Feature", "properties": { "name": "China" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 90.439453, 41.310824 ], [ 90.439453, 28.149503 ], [ 90.000000, 28.304381 ], [ 89.472656, 28.071980 ], [ 88.857422, 27.293689 ], [ 88.769531, 28.071980 ], [ 88.154297, 27.839076 ], [ 85.781250, 28.226970 ], [ 84.199219, 28.844674 ], [ 83.935547, 29.305561 ], [ 83.320312, 29.458731 ], [ 82.353516, 30.145127 ], [ 81.562500, 30.448674 ], [ 81.123047, 30.221102 ], [ 78.750000, 31.503629 ], [ 78.486328, 32.620870 ], [ 79.189453, 32.472695 ], [ 79.189453, 32.990236 ], [ 78.837891, 33.504759 ], [ 78.925781, 34.307144 ], [ 77.871094, 35.460670 ], [ 76.201172, 35.889050 ], [ 75.937500, 36.668419 ], [ 75.146484, 37.160317 ], [ 74.970703, 37.439974 ], [ 74.794922, 37.996163 ], [ 74.882812, 38.410558 ], [ 74.267578, 38.616870 ], [ 73.916016, 38.479395 ], [ 73.652344, 39.436193 ], [ 74.003906, 39.639538 ], [ 73.828125, 39.909736 ], [ 74.794922, 40.380028 ], [ 75.498047, 40.580585 ], [ 76.552734, 40.446947 ], [ 76.904297, 40.979898 ], [ 78.222656, 41.178654 ], [ 78.310547, 41.310824 ], [ 90.439453, 41.310824 ] ] ] } } -, -{ "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 67.060547, 24.751820 ], [ 67.148438, 24.666986 ], [ 67.434082, 23.946096 ], [ 68.181152, 23.684774 ], [ 69.345703, 22.836946 ], [ 69.653320, 22.451649 ], [ 69.169922, 22.085640 ], [ 69.763184, 21.534847 ], [ 67.060547, 21.534847 ], [ 67.060547, 24.751820 ] ] ], [ [ [ 87.214966, 21.534847 ], [ 88.198242, 21.698265 ], [ 88.879395, 21.698265 ], [ 89.033203, 22.065278 ], [ 89.692383, 21.861499 ], [ 89.846191, 22.044913 ], [ 90.000000, 21.963425 ], [ 90.263672, 21.841105 ], [ 90.439453, 22.136532 ], [ 90.439453, 21.534847 ], [ 87.214966, 21.534847 ] ] ] ] } } ] } ] } , @@ -4411,9 +4411,9 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 12, "y": 12 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Antarctica" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 112.939453, -66.337505 ], [ 112.939453, -74.140084 ], [ 89.560547, -74.140084 ], [ 89.560547, -67.135829 ], [ 90.000000, -67.169955 ], [ 90.615234, -67.238062 ], [ 91.582031, -67.101656 ], [ 92.636719, -67.204032 ], [ 93.515625, -67.204032 ], [ 94.218750, -67.101656 ], [ 95.009766, -67.169955 ], [ 95.800781, -67.373698 ], [ 96.679688, -67.238062 ], [ 97.734375, -67.238062 ], [ 98.701172, -67.101656 ], [ 99.755859, -67.238062 ], [ 101.074219, -66.513260 ], [ 101.513672, -66.337505 ], [ 104.941406, -66.337505 ], [ 105.292969, -66.513260 ], [ 106.171875, -66.930060 ], [ 107.138672, -66.964476 ], [ 108.105469, -66.964476 ], [ 110.214844, -66.687784 ], [ 111.269531, -66.337505 ], [ 112.939453, -66.337505 ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 101.513672, -66.337505 ], [ 100.898438, -66.583217 ], [ 100.393066, -66.912834 ], [ 99.711914, -67.246561 ], [ 98.679199, -67.110204 ], [ 97.756348, -67.246561 ], [ 96.679688, -67.246561 ], [ 95.778809, -67.382150 ], [ 95.009766, -67.169955 ], [ 94.174805, -67.110204 ], [ 93.559570, -67.212544 ], [ 92.614746, -67.187000 ], [ 91.582031, -67.110204 ], [ 90.637207, -67.229559 ], [ 90.000000, -67.178479 ], [ 89.670410, -67.152898 ], [ 89.560547, -67.127290 ], [ 89.560547, -66.337505 ], [ 101.513672, -66.337505 ] ] ], [ [ [ 111.264038, -66.337505 ], [ 111.049805, -66.425537 ], [ 110.786133, -66.513260 ], [ 110.236816, -66.696478 ], [ 109.160156, -66.835165 ], [ 108.083496, -66.955877 ], [ 107.160645, -66.955877 ], [ 106.171875, -66.938669 ], [ 105.292969, -66.513260 ], [ 104.946899, -66.337505 ], [ 111.264038, -66.337505 ] ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Antarctica" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 112.939453, -66.337505 ], [ 112.939453, -74.140084 ], [ 89.560547, -74.140084 ], [ 89.560547, -67.135829 ], [ 90.000000, -67.169955 ], [ 90.615234, -67.238062 ], [ 91.582031, -67.101656 ], [ 92.636719, -67.204032 ], [ 93.515625, -67.204032 ], [ 94.218750, -67.101656 ], [ 95.009766, -67.169955 ], [ 95.800781, -67.373698 ], [ 96.679688, -67.238062 ], [ 97.734375, -67.238062 ], [ 98.701172, -67.101656 ], [ 99.755859, -67.238062 ], [ 101.074219, -66.513260 ], [ 101.513672, -66.337505 ], [ 104.941406, -66.337505 ], [ 105.292969, -66.513260 ], [ 106.171875, -66.930060 ], [ 107.138672, -66.964476 ], [ 108.105469, -66.964476 ], [ 110.214844, -66.687784 ], [ 111.269531, -66.337505 ], [ 112.939453, -66.337505 ] ] ] } } ] } ] } , @@ -4439,9 +4439,9 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 12, "y": 8 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Indonesia" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 106.083984, -5.878332 ], [ 107.226562, -5.965754 ], [ 108.457031, -6.402648 ], [ 108.632812, -6.751896 ], [ 110.566406, -6.839170 ], [ 110.742188, -6.489983 ], [ 112.500000, -6.926427 ], [ 112.939453, -7.623887 ], [ 112.939453, -8.407168 ], [ 112.500000, -8.407168 ], [ 110.566406, -8.146243 ], [ 109.423828, -7.710992 ], [ 108.720703, -7.623887 ], [ 108.281250, -7.798079 ], [ 106.435547, -7.362467 ], [ 106.259766, -6.926427 ], [ 105.380859, -6.839170 ], [ 106.083984, -5.878332 ] ] ], [ [ [ 103.271484, 0.439449 ], [ 103.798828, 0.087891 ], [ 103.798828, 0.000000 ], [ 103.447266, -0.703107 ], [ 103.974609, -1.054628 ], [ 104.326172, -1.054628 ], [ 104.501953, -1.757537 ], [ 104.853516, -2.372369 ], [ 105.644531, -2.460181 ], [ 106.083984, -3.074695 ], [ 105.820312, -4.302591 ], [ 105.820312, -5.878332 ], [ 104.677734, -5.878332 ], [ 103.886719, -5.003394 ], [ 102.568359, -4.214943 ], [ 101.425781, -2.811371 ], [ 100.107422, -0.615223 ], [ 99.404297, 0.000000 ], [ 99.140625, 0.439449 ], [ 103.271484, 0.439449 ] ] ], [ [ [ 112.939453, 0.439449 ], [ 112.939453, -3.250209 ], [ 112.500000, -3.425692 ], [ 112.060547, -3.513421 ], [ 111.708984, -2.986927 ], [ 111.005859, -3.074695 ], [ 110.214844, -2.899153 ], [ 110.039062, -1.581830 ], [ 109.599609, -1.318243 ], [ 109.072266, -0.439449 ], [ 109.072266, 0.000000 ], [ 108.984375, 0.439449 ], [ 112.939453, 0.439449 ] ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 112.939453, -8.369127 ], [ 112.939453, -22.350076 ], [ 89.560547, -22.350076 ], [ 89.560547, 0.439449 ], [ 99.179077, 0.439449 ], [ 99.272461, 0.175781 ], [ 99.448242, 0.000000 ], [ 100.151367, -0.659165 ], [ 100.898438, -2.043024 ], [ 101.403809, -2.789425 ], [ 102.150879, -3.623071 ], [ 102.590332, -4.214943 ], [ 103.864746, -5.047171 ], [ 104.699707, -5.878332 ], [ 105.820312, -5.856475 ], [ 105.864258, -4.302591 ], [ 106.105957, -3.052754 ], [ 105.622559, -2.438229 ], [ 104.897461, -2.350415 ], [ 104.545898, -1.779499 ], [ 104.370117, -1.076597 ], [ 104.018555, -1.054628 ], [ 103.447266, -0.703107 ], [ 103.798828, 0.000000 ], [ 103.842773, 0.109863 ], [ 103.293457, 0.439449 ], [ 108.962402, 0.439449 ], [ 108.962402, 0.417477 ], [ 109.028320, 0.000000 ], [ 109.094238, -0.461421 ], [ 109.577637, -1.318243 ], [ 110.061035, -1.603794 ], [ 110.214844, -2.943041 ], [ 111.049805, -3.052754 ], [ 111.708984, -2.986927 ], [ 112.060547, -3.469557 ], [ 112.939453, -3.211818 ], [ 112.939453, -7.525873 ], [ 112.609863, -6.948239 ], [ 110.764160, -6.468151 ], [ 110.544434, -6.882800 ], [ 108.632812, -6.773716 ], [ 108.479004, -6.424484 ], [ 108.061523, -6.337137 ], [ 107.270508, -5.965754 ], [ 106.062012, -5.900189 ], [ 105.358887, -6.860985 ], [ 106.281738, -6.926427 ], [ 106.457520, -7.362467 ], [ 108.281250, -7.776309 ], [ 108.698730, -7.645665 ], [ 109.423828, -7.732765 ], [ 110.588379, -8.124491 ], [ 111.511230, -8.298470 ], [ 112.565918, -8.385431 ], [ 112.939453, -8.369127 ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Indonesia" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 106.083984, -5.878332 ], [ 107.226562, -5.965754 ], [ 108.457031, -6.402648 ], [ 108.632812, -6.751896 ], [ 110.566406, -6.839170 ], [ 110.742188, -6.489983 ], [ 112.500000, -6.926427 ], [ 112.939453, -7.623887 ], [ 112.939453, -8.407168 ], [ 112.500000, -8.407168 ], [ 110.566406, -8.146243 ], [ 109.423828, -7.710992 ], [ 108.720703, -7.623887 ], [ 108.281250, -7.798079 ], [ 106.435547, -7.362467 ], [ 106.259766, -6.926427 ], [ 105.380859, -6.839170 ], [ 106.083984, -5.878332 ] ] ], [ [ [ 103.271484, 0.439449 ], [ 103.798828, 0.087891 ], [ 103.798828, 0.000000 ], [ 103.447266, -0.703107 ], [ 103.974609, -1.054628 ], [ 104.326172, -1.054628 ], [ 104.501953, -1.757537 ], [ 104.853516, -2.372369 ], [ 105.644531, -2.460181 ], [ 106.083984, -3.074695 ], [ 105.820312, -4.302591 ], [ 105.820312, -5.878332 ], [ 104.677734, -5.878332 ], [ 103.886719, -5.003394 ], [ 102.568359, -4.214943 ], [ 101.425781, -2.811371 ], [ 100.107422, -0.615223 ], [ 99.404297, 0.000000 ], [ 99.140625, 0.439449 ], [ 103.271484, 0.439449 ] ] ], [ [ [ 112.939453, 0.439449 ], [ 112.939453, -3.250209 ], [ 112.500000, -3.425692 ], [ 112.060547, -3.513421 ], [ 111.708984, -2.986927 ], [ 111.005859, -3.074695 ], [ 110.214844, -2.899153 ], [ 110.039062, -1.581830 ], [ 109.599609, -1.318243 ], [ 109.072266, -0.439449 ], [ 109.072266, 0.000000 ], [ 108.984375, 0.439449 ], [ 112.939453, 0.439449 ] ] ] ] } } ] } ] } , @@ -4579,9 +4579,9 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 13, "y": 9 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Australia" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 135.439453, -21.534847 ], [ 135.439453, -34.597042 ], [ 135.175781, -34.452218 ], [ 135.263672, -33.943360 ], [ 135.000000, -33.651208 ], [ 134.121094, -32.842674 ], [ 134.296875, -32.620870 ], [ 132.978516, -32.026706 ], [ 132.275391, -31.952162 ], [ 131.308594, -31.503629 ], [ 129.550781, -31.578535 ], [ 127.089844, -32.249974 ], [ 126.123047, -32.249974 ], [ 124.189453, -32.990236 ], [ 124.013672, -33.504759 ], [ 123.662109, -33.870416 ], [ 122.167969, -34.016242 ], [ 121.289062, -33.797409 ], [ 119.882812, -33.943360 ], [ 119.267578, -34.524661 ], [ 119.003906, -34.452218 ], [ 118.037109, -35.029996 ], [ 116.630859, -35.029996 ], [ 115.048828, -34.161818 ], [ 115.048828, -33.651208 ], [ 115.576172, -33.504759 ], [ 115.751953, -33.284620 ], [ 115.664062, -32.916485 ], [ 115.839844, -32.175612 ], [ 114.960938, -29.993002 ], [ 115.048828, -29.458731 ], [ 114.609375, -28.844674 ], [ 114.609375, -28.536275 ], [ 114.169922, -28.149503 ], [ 114.082031, -27.371767 ], [ 113.466797, -26.509905 ], [ 113.378906, -26.115986 ], [ 113.818359, -26.509905 ], [ 113.466797, -25.641526 ], [ 113.906250, -25.878994 ], [ 114.257812, -26.273714 ], [ 114.257812, -25.799891 ], [ 113.378906, -24.367114 ], [ 113.466797, -23.805450 ], [ 113.730469, -23.563987 ], [ 113.730469, -22.512557 ], [ 114.082031, -21.943046 ], [ 114.169922, -21.779905 ], [ 114.169922, -21.943046 ], [ 114.257812, -22.512557 ], [ 114.609375, -21.943046 ], [ 115.488281, -21.534847 ], [ 135.439453, -21.534847 ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 135.439453, -34.597042 ], [ 135.439453, -41.310824 ], [ 112.060547, -41.310824 ], [ 112.060547, -21.534847 ], [ 115.367432, -21.534847 ], [ 114.653320, -21.820708 ], [ 114.235840, -22.512557 ], [ 114.147949, -21.759500 ], [ 113.730469, -22.471955 ], [ 113.840332, -23.059516 ], [ 113.708496, -23.563987 ], [ 113.510742, -23.805450 ], [ 113.400879, -24.387127 ], [ 113.620605, -24.686952 ], [ 113.730469, -25.005973 ], [ 114.213867, -25.780107 ], [ 114.235840, -26.293415 ], [ 113.928223, -25.918526 ], [ 113.444824, -25.621716 ], [ 113.774414, -26.549223 ], [ 113.334961, -26.115986 ], [ 113.466797, -26.549223 ], [ 114.038086, -27.332735 ], [ 114.169922, -28.110749 ], [ 114.609375, -28.516969 ], [ 114.631348, -28.806174 ], [ 115.048828, -29.458731 ], [ 115.004883, -30.031055 ], [ 115.158691, -30.600094 ], [ 115.686035, -31.615966 ], [ 115.795898, -32.212801 ], [ 115.686035, -32.898038 ], [ 115.708008, -33.266250 ], [ 115.554199, -33.486435 ], [ 115.048828, -33.614619 ], [ 115.026855, -34.198173 ], [ 115.554199, -34.379713 ], [ 116.630859, -35.029996 ], [ 118.015137, -35.065973 ], [ 118.498535, -34.741612 ], [ 119.003906, -34.470335 ], [ 119.289551, -34.506557 ], [ 119.882812, -33.979809 ], [ 120.585938, -33.925130 ], [ 121.289062, -33.815666 ], [ 122.189941, -33.998027 ], [ 122.805176, -33.906896 ], [ 123.662109, -33.888658 ], [ 124.035645, -33.486435 ], [ 124.211426, -32.953368 ], [ 125.090332, -32.731841 ], [ 126.145020, -32.212801 ], [ 127.111816, -32.287133 ], [ 129.528809, -31.597253 ], [ 131.330566, -31.503629 ], [ 132.297363, -31.989442 ], [ 133.000488, -32.008076 ], [ 134.274902, -32.620870 ], [ 134.077148, -32.842674 ], [ 134.604492, -33.229498 ], [ 135.241699, -33.943360 ], [ 135.197754, -34.470335 ], [ 135.439453, -34.597042 ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Australia" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 135.439453, -21.534847 ], [ 135.439453, -34.597042 ], [ 135.175781, -34.452218 ], [ 135.263672, -33.943360 ], [ 135.000000, -33.651208 ], [ 134.121094, -32.842674 ], [ 134.296875, -32.620870 ], [ 132.978516, -32.026706 ], [ 132.275391, -31.952162 ], [ 131.308594, -31.503629 ], [ 129.550781, -31.578535 ], [ 127.089844, -32.249974 ], [ 126.123047, -32.249974 ], [ 124.189453, -32.990236 ], [ 124.013672, -33.504759 ], [ 123.662109, -33.870416 ], [ 122.167969, -34.016242 ], [ 121.289062, -33.797409 ], [ 119.882812, -33.943360 ], [ 119.267578, -34.524661 ], [ 119.003906, -34.452218 ], [ 118.037109, -35.029996 ], [ 116.630859, -35.029996 ], [ 115.048828, -34.161818 ], [ 115.048828, -33.651208 ], [ 115.576172, -33.504759 ], [ 115.751953, -33.284620 ], [ 115.664062, -32.916485 ], [ 115.839844, -32.175612 ], [ 114.960938, -29.993002 ], [ 115.048828, -29.458731 ], [ 114.609375, -28.844674 ], [ 114.609375, -28.536275 ], [ 114.169922, -28.149503 ], [ 114.082031, -27.371767 ], [ 113.466797, -26.509905 ], [ 113.378906, -26.115986 ], [ 113.818359, -26.509905 ], [ 113.466797, -25.641526 ], [ 113.906250, -25.878994 ], [ 114.257812, -26.273714 ], [ 114.257812, -25.799891 ], [ 113.378906, -24.367114 ], [ 113.466797, -23.805450 ], [ 113.730469, -23.563987 ], [ 113.730469, -22.512557 ], [ 114.082031, -21.943046 ], [ 114.169922, -21.779905 ], [ 114.169922, -21.943046 ], [ 114.257812, -22.512557 ], [ 114.609375, -21.943046 ], [ 115.488281, -21.534847 ], [ 135.439453, -21.534847 ] ] ] } } ] } ] } , @@ -4707,9 +4707,9 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 14, "y": 11 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Antarctica" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 135.087891, -65.293468 ], [ 135.703125, -65.585720 ], [ 135.878906, -66.018018 ], [ 136.318359, -66.513260 ], [ 136.494141, -66.687784 ], [ 134.560547, -66.687784 ], [ 134.560547, -66.231457 ], [ 134.736328, -66.196009 ], [ 135.000000, -65.730626 ], [ 135.087891, -65.293468 ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 157.939453, -55.528631 ], [ 157.939453, -66.687784 ], [ 136.516113, -66.687784 ], [ 136.208496, -66.443107 ], [ 135.878906, -66.035873 ], [ 135.703125, -65.585720 ], [ 135.065918, -65.311829 ], [ 135.021973, -65.721594 ], [ 134.758301, -66.213739 ], [ 134.560547, -66.229243 ], [ 134.560547, -55.528631 ], [ 157.939453, -55.528631 ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Antarctica" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 135.087891, -65.293468 ], [ 135.703125, -65.585720 ], [ 135.878906, -66.018018 ], [ 136.318359, -66.513260 ], [ 136.494141, -66.687784 ], [ 134.560547, -66.687784 ], [ 134.560547, -66.231457 ], [ 134.736328, -66.196009 ], [ 135.000000, -65.730626 ], [ 135.087891, -65.293468 ] ] ] } } ] } ] } , @@ -4723,9 +4723,9 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 14, "y": 9 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Australia" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 144.755859, -40.713956 ], [ 145.371094, -40.780541 ], [ 145.986328, -40.979898 ], [ 146.337891, -41.112469 ], [ 147.656250, -40.780541 ], [ 148.271484, -40.847060 ], [ 148.271484, -40.979898 ], [ 148.359375, -41.310824 ], [ 144.843750, -41.310824 ], [ 144.755859, -40.979898 ], [ 144.755859, -40.713956 ] ] ], [ [ [ 149.414062, -21.534847 ], [ 149.501953, -21.943046 ], [ 149.677734, -22.350076 ], [ 150.117188, -22.105999 ], [ 150.468750, -22.593726 ], [ 150.732422, -22.431340 ], [ 150.908203, -23.483401 ], [ 152.841797, -25.244696 ], [ 153.193359, -26.667096 ], [ 153.105469, -27.293689 ], [ 153.544922, -28.071980 ], [ 153.544922, -28.998532 ], [ 153.105469, -30.372875 ], [ 152.929688, -31.653381 ], [ 152.490234, -32.546813 ], [ 151.699219, -33.063924 ], [ 150.996094, -34.307144 ], [ 150.732422, -35.173808 ], [ 150.292969, -35.675147 ], [ 149.941406, -37.090240 ], [ 150.029297, -37.439974 ], [ 149.414062, -37.788081 ], [ 148.271484, -37.788081 ], [ 147.392578, -38.203655 ], [ 146.337891, -39.027719 ], [ 144.843750, -38.410558 ], [ 145.019531, -37.926868 ], [ 144.492188, -38.065392 ], [ 143.613281, -38.822591 ], [ 142.207031, -38.410558 ], [ 141.591797, -38.341656 ], [ 140.625000, -37.996163 ], [ 140.009766, -37.370157 ], [ 139.570312, -36.173357 ], [ 139.042969, -35.746512 ], [ 138.164062, -35.603719 ], [ 138.427734, -35.101934 ], [ 138.164062, -34.379713 ], [ 137.724609, -35.101934 ], [ 136.845703, -35.245619 ], [ 137.373047, -34.741612 ], [ 137.460938, -34.161818 ], [ 137.900391, -33.651208 ], [ 137.812500, -32.916485 ], [ 137.021484, -33.724340 ], [ 136.406250, -34.089061 ], [ 135.966797, -34.885931 ], [ 135.175781, -34.452218 ], [ 135.263672, -33.943360 ], [ 135.000000, -33.651208 ], [ 134.648438, -33.211116 ], [ 134.560547, -33.137551 ], [ 134.560547, -21.534847 ], [ 149.414062, -21.534847 ] ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 134.560547, -33.197328 ], [ 134.604492, -33.229498 ], [ 135.241699, -33.943360 ], [ 135.197754, -34.470335 ], [ 135.988770, -34.885931 ], [ 136.362305, -34.089061 ], [ 136.999512, -33.760882 ], [ 137.812500, -32.898038 ], [ 137.900391, -33.632916 ], [ 137.504883, -34.125448 ], [ 137.351074, -34.705493 ], [ 136.823730, -35.263562 ], [ 137.724609, -35.083956 ], [ 138.208008, -34.379713 ], [ 138.449707, -35.119909 ], [ 138.120117, -35.603719 ], [ 139.086914, -35.728677 ], [ 139.570312, -36.137875 ], [ 139.812012, -36.650793 ], [ 139.987793, -37.405074 ], [ 140.646973, -38.013476 ], [ 141.613770, -38.307181 ], [ 142.185059, -38.376115 ], [ 143.613281, -38.805470 ], [ 144.492188, -38.082690 ], [ 145.041504, -37.892196 ], [ 144.887695, -38.410558 ], [ 145.480957, -38.599700 ], [ 146.315918, -39.027719 ], [ 146.931152, -38.599700 ], [ 147.392578, -38.220920 ], [ 148.315430, -37.805444 ], [ 149.414062, -37.770715 ], [ 150.007324, -37.422526 ], [ 149.941406, -37.107765 ], [ 150.073242, -36.421282 ], [ 150.336914, -35.675147 ], [ 150.710449, -35.173808 ], [ 151.018066, -34.307144 ], [ 151.347656, -33.815666 ], [ 151.699219, -33.045508 ], [ 152.446289, -32.546813 ], [ 152.885742, -31.634676 ], [ 153.083496, -30.921076 ], [ 153.061523, -30.353916 ], [ 153.522949, -28.998532 ], [ 153.566895, -28.110749 ], [ 153.083496, -27.254630 ], [ 153.171387, -26.647459 ], [ 153.127441, -26.076521 ], [ 152.863770, -25.264568 ], [ 152.072754, -24.467151 ], [ 150.908203, -23.463246 ], [ 150.732422, -22.411029 ], [ 150.490723, -22.553147 ], [ 150.073242, -22.126355 ], [ 149.677734, -22.350076 ], [ 149.381104, -21.534847 ], [ 157.939453, -21.534847 ], [ 157.939453, -41.310824 ], [ 148.315430, -41.310824 ], [ 148.293457, -40.880295 ], [ 147.700195, -40.813809 ], [ 146.359863, -41.145570 ], [ 145.393066, -40.797177 ], [ 144.733887, -40.697299 ], [ 144.711914, -41.162114 ], [ 144.810791, -41.310824 ], [ 134.560547, -41.310824 ], [ 134.560547, -33.197328 ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Australia" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 144.755859, -40.713956 ], [ 145.371094, -40.780541 ], [ 145.986328, -40.979898 ], [ 146.337891, -41.112469 ], [ 147.656250, -40.780541 ], [ 148.271484, -40.847060 ], [ 148.271484, -40.979898 ], [ 148.359375, -41.310824 ], [ 144.843750, -41.310824 ], [ 144.755859, -40.979898 ], [ 144.755859, -40.713956 ] ] ], [ [ [ 149.414062, -21.534847 ], [ 149.501953, -21.943046 ], [ 149.677734, -22.350076 ], [ 150.117188, -22.105999 ], [ 150.468750, -22.593726 ], [ 150.732422, -22.431340 ], [ 150.908203, -23.483401 ], [ 152.841797, -25.244696 ], [ 153.193359, -26.667096 ], [ 153.105469, -27.293689 ], [ 153.544922, -28.071980 ], [ 153.544922, -28.998532 ], [ 153.105469, -30.372875 ], [ 152.929688, -31.653381 ], [ 152.490234, -32.546813 ], [ 151.699219, -33.063924 ], [ 150.996094, -34.307144 ], [ 150.732422, -35.173808 ], [ 150.292969, -35.675147 ], [ 149.941406, -37.090240 ], [ 150.029297, -37.439974 ], [ 149.414062, -37.788081 ], [ 148.271484, -37.788081 ], [ 147.392578, -38.203655 ], [ 146.337891, -39.027719 ], [ 144.843750, -38.410558 ], [ 145.019531, -37.926868 ], [ 144.492188, -38.065392 ], [ 143.613281, -38.822591 ], [ 142.207031, -38.410558 ], [ 141.591797, -38.341656 ], [ 140.625000, -37.996163 ], [ 140.009766, -37.370157 ], [ 139.570312, -36.173357 ], [ 139.042969, -35.746512 ], [ 138.164062, -35.603719 ], [ 138.427734, -35.101934 ], [ 138.164062, -34.379713 ], [ 137.724609, -35.101934 ], [ 136.845703, -35.245619 ], [ 137.373047, -34.741612 ], [ 137.460938, -34.161818 ], [ 137.900391, -33.651208 ], [ 137.812500, -32.916485 ], [ 137.021484, -33.724340 ], [ 136.406250, -34.089061 ], [ 135.966797, -34.885931 ], [ 135.175781, -34.452218 ], [ 135.263672, -33.943360 ], [ 135.000000, -33.651208 ], [ 134.648438, -33.211116 ], [ 134.560547, -33.137551 ], [ 134.560547, -21.534847 ], [ 149.414062, -21.534847 ] ] ] ] } } ] } ] } , @@ -4831,9 +4831,9 @@ , { "type": "FeatureCollection", "properties": { "zoom": 4, "x": 15, "y": 12 }, "features": [ { "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [ -{ "type": "Feature", "properties": { "name": "Antarctica" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 157.060547, -69.411242 ], [ 157.500000, -69.442128 ], [ 159.169922, -69.595890 ], [ 159.697266, -69.990535 ], [ 160.839844, -70.229744 ], [ 161.542969, -70.583418 ], [ 162.685547, -70.728979 ], [ 163.828125, -70.728979 ], [ 164.882812, -70.786910 ], [ 166.113281, -70.757966 ], [ 168.398438, -70.959697 ], [ 170.507812, -71.413177 ], [ 171.210938, -71.691293 ], [ 171.123047, -72.100944 ], [ 170.068359, -72.893802 ], [ 169.277344, -73.652545 ], [ 167.958984, -73.824820 ], [ 167.607422, -74.019543 ], [ 167.431641, -74.140084 ], [ 157.060547, -74.140084 ], [ 157.060547, -69.411242 ] ] ] } } -, { "type": "Feature", "properties": { "scalerank": 0, "featurecla": "Ocean", "min_zoom": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 180.439453, -66.337505 ], [ 180.439453, -74.140084 ], [ 167.426147, -74.140084 ], [ 167.980957, -73.812574 ], [ 169.277344, -73.658728 ], [ 169.760742, -73.245712 ], [ 170.551758, -72.442164 ], [ 171.079102, -72.087432 ], [ 171.210938, -71.698194 ], [ 170.507812, -71.399165 ], [ 169.453125, -71.208999 ], [ 168.420410, -70.974028 ], [ 167.299805, -70.837461 ], [ 166.113281, -70.757966 ], [ 164.926758, -70.772443 ], [ 163.850098, -70.714471 ], [ 162.685547, -70.736230 ], [ 161.564941, -70.576112 ], [ 160.795898, -70.229744 ], [ 159.675293, -69.990535 ], [ 159.191895, -69.603549 ], [ 158.027344, -69.480672 ], [ 157.060547, -69.407379 ], [ 157.060547, -66.337505 ], [ 180.439453, -66.337505 ] ] ] } } +, +{ "type": "Feature", "properties": { "name": "Antarctica" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 157.060547, -69.411242 ], [ 157.500000, -69.442128 ], [ 159.169922, -69.595890 ], [ 159.697266, -69.990535 ], [ 160.839844, -70.229744 ], [ 161.542969, -70.583418 ], [ 162.685547, -70.728979 ], [ 163.828125, -70.728979 ], [ 164.882812, -70.786910 ], [ 166.113281, -70.757966 ], [ 168.398438, -70.959697 ], [ 170.507812, -71.413177 ], [ 171.210938, -71.691293 ], [ 171.123047, -72.100944 ], [ 170.068359, -72.893802 ], [ 169.277344, -73.652545 ], [ 167.958984, -73.824820 ], [ 167.607422, -74.019543 ], [ 167.431641, -74.140084 ], [ 157.060547, -74.140084 ], [ 157.060547, -69.411242 ] ] ] } } ] } ] } , diff --git a/tile-cache.hpp b/tile-cache.hpp new file mode 100644 index 00000000..afc73b32 --- /dev/null +++ b/tile-cache.hpp @@ -0,0 +1,46 @@ +#include +#include "mvt.hpp" +#include "dirtiles.hpp" // for zxy + +struct mvt_tile_seq { + mvt_tile tile; + size_t seq; +}; + +struct tile_cache { + std::map overzoom_cache; + std::atomic seq; + size_t capacity = 1000; + + mvt_tile get(zxy parent_tile, std::function getter) { + mvt_tile source; + auto f = overzoom_cache.find(parent_tile); + if (f == overzoom_cache.end()) { + if (overzoom_cache.size() >= capacity) { + // evict the oldest tile to make room + + auto to_erase = overzoom_cache.begin(); + for (auto here = overzoom_cache.begin(); here != overzoom_cache.end(); ++here) { + if (here->second.seq < to_erase->second.seq) { + to_erase = here; + } + } + + overzoom_cache.erase(to_erase); + } + + source = getter(parent_tile); + + mvt_tile_seq to_cache; + to_cache.tile = source; + to_cache.seq = seq++; + + overzoom_cache.emplace(parent_tile, to_cache); + } else { + f->second.seq = seq++; + source = f->second.tile; + } + + return source; + } +}; diff --git a/tile-join.cpp b/tile-join.cpp index 125ae159..e4f46c00 100644 --- a/tile-join.cpp +++ b/tile-join.cpp @@ -33,6 +33,7 @@ #include "csv.hpp" #include "text.hpp" #include "tile.hpp" +#include "tile-cache.hpp" #include #include #include @@ -435,6 +436,9 @@ struct tileset_reader { std::vector> overzoomed_tiles; bool overzoom_consumed_at_this_zoom = false; + // parent tile cache + tile_cache cache; + // for iterating mbtiles sqlite3 *db = NULL; sqlite3_stmt *stmt = NULL; @@ -649,7 +653,7 @@ struct tileset_reader { overzoom_consumed_at_this_zoom = false; } - std::string get_tile(zxy tile) { + mvt_tile get_tile(zxy tile) { std::string source; if (db != NULL) { @@ -683,7 +687,23 @@ struct tileset_reader { source = dir_read_tile(dirbase, tile); } - return source; + mvt_tile content; + if (source.size() == 0) { + return content; + } + + try { + bool was_compressed; + if (!content.decode(source, was_compressed)) { + fprintf(stderr, "Couldn't parse tile %lld/%lld/%lld\n", tile.z, tile.x, tile.y); + exit(EXIT_MVT); + } + } catch (std::exception const &e) { + fprintf(stderr, "PBF decoding error in tile %lld/%lld/%lld\n", tile.z, tile.x, tile.y); + exit(EXIT_PROTOBUF); + } + + return content; } // Sort in z/x/tms_y order, because that is the order of the @@ -737,14 +757,18 @@ struct tileset_reader { perror("pthread_mutex_lock"); } - std::string source = get_tile(parent_tile); + std::function getter = [&](zxy tile) { + return get_tile(tile); + }; + + mvt_tile source = cache.get(parent_tile, getter); if (pthread_mutex_unlock(&retrieve_lock) != 0) { perror("pthread_mutex_unlock"); } - if (source.size() != 0) { - std::string ret = overzoom(source, parent_tile.z, parent_tile.x, parent_tile.y, tile.z, tile.x, tile.y, -1, buffer, std::set()); + if (source.layers.size() != 0) { + std::string ret = overzoom(source, parent_tile.z, parent_tile.x, parent_tile.y, tile.z, tile.x, tile.y, -1, buffer, std::set(), false); return ret; } @@ -1021,13 +1045,7 @@ void decode(struct tileset_reader *readers, std::mapsecond.push_back(current.second); } - if (readers == NULL || readers->zoom != current.first.z || readers->x != current.first.x || readers->y != current.first.y) { - if (tasks.size() > 100 * CPUS) { - dispatch_tasks(tasks, layermaps, outdb, outdir, header, mapping, exclude, include, ifmatched, keep_layers, remove_layers, filter, readers); - tasks.clear(); - } - } - + // Advance the tileset_reader that we just added as a task. // The reason this prefetches is so the tileset_reader queue can be // priority-ordered, so the one with the next relevant tile // is first in line. @@ -1039,6 +1057,16 @@ void decode(struct tileset_reader *readers, std::mapnext; r->next = NULL; + // Is the next tileset_reader on the tileset_reader queue looking at a different tile? + // Then this tile is done and we can safely run the output queue. + + if (readers == NULL || readers->zoom != current.first.z || readers->x != current.first.x || readers->y != current.first.y) { + if (tasks.size() > 10 * CPUS) { + dispatch_tasks(tasks, layermaps, outdb, outdir, header, mapping, exclude, include, ifmatched, keep_layers, remove_layers, filter, readers); + tasks.clear(); + } + } + // put the tileset_reader back onto the queue, // in whatever sequence its next tile calls for diff --git a/unit.cpp b/unit.cpp index 006dab32..0dc98f61 100644 --- a/unit.cpp +++ b/unit.cpp @@ -2,6 +2,7 @@ #include "catch/catch.hpp" #include "text.hpp" #include "sort.hpp" +#include "tile-cache.hpp" #include #include @@ -65,3 +66,36 @@ TEST_CASE("External quicksort", "fqsort") { fclose(f); REQUIRE(nread == written); } + +mvt_tile mock_get_tile(zxy tile) { + mvt_layer l; + l.name = std::to_string(tile.z) + "/" + std::to_string(tile.x) + "/" + std::to_string(tile.y); + mvt_tile t; + t.layers.push_back(l); + return t; +} + +TEST_CASE("Tile-join cache", "tile cache") { + tile_cache tc; + tc.capacity = 5; + + REQUIRE(tc.get(zxy(11, 327, 791), mock_get_tile).layers[0].name == "11/327/791"); + REQUIRE(tc.get(zxy(11, 5, 7), mock_get_tile).layers[0].name == "11/5/7"); + REQUIRE(tc.get(zxy(11, 5, 8), mock_get_tile).layers[0].name == "11/5/8"); + REQUIRE(tc.get(zxy(11, 5, 9), mock_get_tile).layers[0].name == "11/5/9"); + REQUIRE(tc.get(zxy(11, 5, 10), mock_get_tile).layers[0].name == "11/5/10"); + REQUIRE(tc.get(zxy(11, 327, 791), mock_get_tile).layers[0].name == "11/327/791"); + REQUIRE(tc.overzoom_cache.size() == 5); + REQUIRE(tc.overzoom_cache.find(zxy(11, 327, 791)) != tc.overzoom_cache.end()); + REQUIRE(tc.overzoom_cache.find(zxy(11, 5, 7)) != tc.overzoom_cache.end()); + + // verify that additional gets evict the least-recently-used elements + + REQUIRE(tc.get(zxy(11, 5, 11), mock_get_tile).layers[0].name == "11/5/11"); + REQUIRE(tc.overzoom_cache.size() == 5); + REQUIRE(tc.overzoom_cache.find(zxy(11, 5, 7)) == tc.overzoom_cache.end()); + + REQUIRE(tc.get(zxy(11, 5, 12), mock_get_tile).layers[0].name == "11/5/12"); + REQUIRE(tc.overzoom_cache.size() == 5); + REQUIRE(tc.overzoom_cache.find(zxy(11, 5, 8)) == tc.overzoom_cache.end()); +} diff --git a/version.hpp b/version.hpp index a88ebb88..9a15330d 100644 --- a/version.hpp +++ b/version.hpp @@ -1,6 +1,6 @@ #ifndef VERSION_HPP #define VERSION_HPP -#define VERSION "v2.33.0" +#define VERSION "v2.34.0" #endif From 0ca14086a9c92f81c4207c6a549276a9deef1688 Mon Sep 17 00:00:00 2001 From: Erica Fischer Date: Wed, 4 Oct 2023 14:59:19 -0700 Subject: [PATCH 4/4] Pull from the back of the list of tiles to overzoom, not the front (#149) --- CHANGELOG.md | 4 ++++ tile-join.cpp | 13 +++++++------ version.hpp | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9abda4a4..60e00f62 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 2.34.1 + +* Further improvements to tile-join speed + # 2.34.0 * Improve speed of overzooming in tile-join diff --git a/tile-join.cpp b/tile-join.cpp index e4f46c00..93264d06 100644 --- a/tile-join.cpp +++ b/tile-join.cpp @@ -380,13 +380,14 @@ double max(double a, double b) { struct tilecmp { bool operator()(std::pair const &a, std::pair const &b) { // must match behavior of tileset_reader::operator<() + // except backwards, since we are pulling from the end of the list - if (a.first < b.first) { + if (b.first < a.first) { return true; } - if (a.first == b.first) { + if (b.first == a.first) { // Y sorts backwards, in TMS order - if (a.second > b.second) { + if (b.second > a.second) { return true; } } @@ -555,8 +556,8 @@ struct tileset_reader { return; } - auto xy = overzoomed_tiles.front(); - overzoomed_tiles.erase(overzoomed_tiles.begin()); + auto xy = overzoomed_tiles.back(); + overzoomed_tiles.erase(overzoomed_tiles.begin() + overzoomed_tiles.size() - 1); x = xy.first; y = xy.second; @@ -1061,7 +1062,7 @@ void decode(struct tileset_reader *readers, std::mapzoom != current.first.z || readers->x != current.first.x || readers->y != current.first.y) { - if (tasks.size() > 10 * CPUS) { + if (tasks.size() > 100 * CPUS) { dispatch_tasks(tasks, layermaps, outdb, outdir, header, mapping, exclude, include, ifmatched, keep_layers, remove_layers, filter, readers); tasks.clear(); } diff --git a/version.hpp b/version.hpp index 9a15330d..e1c07973 100644 --- a/version.hpp +++ b/version.hpp @@ -1,6 +1,6 @@ #ifndef VERSION_HPP #define VERSION_HPP -#define VERSION "v2.34.0" +#define VERSION "v2.34.1" #endif