Merge branch 'master' into consistent-dropping

This commit is contained in:
Eric Fischer 2016-10-14 15:35:35 -07:00
commit 82377944ee
14 changed files with 1418 additions and 28 deletions

View File

@ -1,3 +1,7 @@
## 1.14.3
* Add --detect-shared-borders option for better polygon simplification
## 1.14.2
* Enforce that string feature attributes must be encoded as UTF-8

View File

@ -37,7 +37,6 @@ man/tippecanoe.1: README.md
PG=
ALL_H = $(shell find . '(' -name '*.h' -o -name '*.hpp' ')')
H = $(wildcard *.h) $(wildcard *.hpp)
C = $(wildcard *.c) $(wildcard *.cpp)
@ -48,7 +47,7 @@ tippecanoe: geojson.o jsonpull/jsonpull.o tile.o pool.o mbtiles.o geometry.o pro
$(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3 -lpthread
tippecanoe-enumerate: enumerate.o
$(CC) $(PG) $(LIBS) $(FINAL_FLAGS) $(CFLAGS) -o $@ $^ $(LDFLAGS) -lsqlite3
$(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CFLAGS) -o $@ $^ $(LDFLAGS) -lsqlite3
tippecanoe-decode: decode.o projection.o mvt.o
$(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3
@ -59,14 +58,16 @@ tile-join: tile-join.o projection.o pool.o mbtiles.o mvt.o memfile.o
unit: unit.o text.o
$(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3 -lpthread
%.o: %.c $(ALL_H)
$(CC) $(PG) $(INCLUDES) $(FINAL_FLAGS) $(CFLAGS) -c -o $@ $<
-include $(wildcard *.d)
%.o: %.cpp $(ALL_H)
$(CXX) $(PG) $(INCLUDES) $(FINAL_FLAGS) $(CXXFLAGS) -c -o $@ $<
%.o: %.c
$(CC) -MMD $(PG) $(INCLUDES) $(FINAL_FLAGS) $(CFLAGS) -c -o $@ $<
%.o: %.cpp
$(CXX) -MMD $(PG) $(INCLUDES) $(FINAL_FLAGS) $(CXXFLAGS) -c -o $@ $<
clean:
rm -f tippecanoe *.o
rm -f tippecanoe *.o *.d
indent:
clang-format -i -style="{BasedOnStyle: Google, IndentWidth: 8, UseTab: Always, AllowShortIfStatementsOnASingleLine: false, ColumnLimit: 0, ContinuationIndentWidth: 8, SpaceAfterCStyleCast: true, IndentCaseLabels: false, AllowShortBlocksOnASingleLine: false, AllowShortFunctionsOnASingleLine: false, SortIncludes: false}" $(C) $(H)
@ -74,7 +75,7 @@ indent:
TESTS = $(wildcard tests/*/out/*.json)
SPACE = $(NULL) $(NULL)
test: tippecanoe tippecanoe-decode $(addsuffix .check,$(TESTS)) parallel-test pbf-test join-test unit
test: tippecanoe tippecanoe-decode $(addsuffix .check,$(TESTS)) parallel-test pbf-test join-test enumerate-test unit
./unit
# Work around Makefile and filename punctuation limits: _ for space, @ for :, % for /
@ -115,6 +116,12 @@ 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:
./tippecanoe -z5 -f -o tests/ne_110m_admin_0_countries/out/enum.mbtiles tests/ne_110m_admin_0_countries/in.json
./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 tests/ne_110m_admin_0_countries/out/enum.check
rm tests/ne_110m_admin_0_countries/out/enum.mbtiles tests/ne_110m_admin_0_countries/out/enum.check
join-test:
./tippecanoe -f -z12 -o tests/join-population/tabblock_06001420.mbtiles tests/join-population/tabblock_06001420.json
./tippecanoe -f -z12 -o tests/join-population/tabblock_06001420.mbtiles tests/join-population/tabblock_06001420.json

View File

@ -125,6 +125,7 @@ resolution is obtained than by using a smaller _maxzoom_ or _detail_.
* -al or --drop-lines: Let "dot" dropping at lower zooms apply to lines too
* -ap or --drop-polygons: Let "dot" dropping at lower zooms apply to polygons too
* -ag or --calculate-feature-density: Add a new attribute, `tippecanoe_feature_density`, to each feature, to record how densely features are spaced in that area of the tile. You can use this attribute in the style to produce a glowing effect where points are densely packed. It can range from 0 in the sparsest areas to 255 in the densest.
* -ab or --detect-shared-borders: In the manner of [TopoJSON](https://github.com/mbostock/topojson/wiki/Introduction), detect borders that are shared between multiple polygons and simplify them identically in each polygon. This takes more time and memory than considering each polygon individually.
### Doing less
@ -253,12 +254,12 @@ lower resolutions before failing if it still doesn't fit.
Development
-----------
Requires sqlite3 (should already be installed on MacOS). Rebuilding the manpage
Requires sqlite3 and zlib (should already be installed on MacOS). Rebuilding the manpage
uses md2man (`gem install md2man`).
Linux:
sudo apt-get install libsqlite3-dev
sudo apt-get install libsqlite3-dev zlib1g-dev
Then build:

View File

@ -11,7 +11,7 @@ void enumerate(char *fname) {
exit(EXIT_FAILURE);
}
const char *sql = "SELECT zoom_level, tile_column, tile_row from tiles;";
const char *sql = "SELECT zoom_level, tile_column, tile_row from tiles order by zoom_level, tile_column, tile_row;";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) != SQLITE_OK) {

View File

@ -1042,17 +1042,19 @@ 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) {
drawvec simplify_lines(drawvec &geom, int z, int detail, bool mark_tile_bounds, double simplification, bool already_marked) {
int res = 1 << (32 - detail - z);
long long area = 1LL << (32 - z);
for (size_t i = 0; i < geom.size(); i++) {
if (geom[i].op == VT_MOVETO) {
geom[i].necessary = 1;
} else if (geom[i].op == VT_LINETO) {
geom[i].necessary = 0;
} else {
geom[i].necessary = 1;
if (!already_marked) {
for (size_t i = 0; i < geom.size(); i++) {
if (geom[i].op == VT_MOVETO) {
geom[i].necessary = 1;
} else if (geom[i].op == VT_LINETO) {
geom[i].necessary = 0;
} else {
geom[i].necessary = 1;
}
}
}
@ -1073,7 +1075,19 @@ drawvec simplify_lines(drawvec &geom, int z, int detail, bool mark_tile_bounds,
geom[j - 1].necessary = 1;
if (j - i > 1) {
douglas_peucker(geom, i, j - i, res * simplification);
if (already_marked && geom[j - 1] < geom[i]) {
drawvec dv;
for (size_t k = j; k > i; k--) {
dv.push_back(geom[k - 1]);
}
douglas_peucker(dv, 0, j - i, res * simplification);
size_t l = 0;
for (size_t k = j; k > i; k--) {
geom[k - 1] = dv[l++];
}
} else {
douglas_peucker(geom, i, j - i, res * simplification);
}
}
i = j - 1;
}

View File

@ -24,9 +24,30 @@ struct draw {
this->op = nop;
this->x = nx;
this->y = ny;
this->necessary = 0;
}
draw() {
this->op = 0;
this->x = 0;
this->y = 0;
this->necessary = 0;
}
bool operator<(draw const &s) const {
if (y < s.y || (y == s.y && x < s.x)) {
return true;
} else {
return false;
}
}
bool operator==(draw const &s) const {
return y == s.y && x == s.x;
}
bool operator!=(draw const &s) const {
return y != s.y || x != s.x;
}
};
@ -43,7 +64,7 @@ drawvec reduce_tiny_poly(drawvec &geom, int z, int detail, bool *reduced, double
drawvec clip_lines(drawvec &geom, int z, int detail, long long buffer);
bool point_within_tile(long long x, long long y, int z, int detail, long long buffer);
int quick_check(long long *bbox, int z, int detail, long long buffer);
drawvec simplify_lines(drawvec &geom, int z, int detail, bool mark_tile_bounds, double simplification);
drawvec simplify_lines(drawvec &geom, int z, int detail, bool mark_tile_bounds, double simplification, bool already_marked);
drawvec reorder_lines(drawvec &geom);
drawvec fix_polygon(drawvec &geom);
std::vector<drawvec> chop_polygon(std::vector<drawvec> &geoms);

View File

@ -1914,6 +1914,7 @@ int main(int argc, char **argv) {
{"drop-polygons", no_argument, &additional[A_POLYGON_DROP], 1},
{"prefer-radix-sort", no_argument, &additional[A_PREFER_RADIX_SORT], 1},
{"calculate-feature-density", no_argument, &additional[A_CALCULATE_FEATURE_DENSITY], 1},
{"detect-shared-borders", no_argument, &additional[A_DETECT_SHARED_BORDERS], 1},
{"no-line-simplification", no_argument, &prevent[P_SIMPLIFY], 1},
{"simplify-only-low-zooms", no_argument, &prevent[P_SIMPLIFY_LOW], 1},

View File

@ -148,6 +148,8 @@ which may not be what you want.
\-ap or \-\-drop\-polygons: Let "dot" dropping at lower zooms apply to polygons too
.IP \(bu 2
\-ag or \-\-calculate\-feature\-density: Add a new attribute, \fB\fCtippecanoe_feature_density\fR, to each feature, to record how densely features are spaced in that area of the tile. You can use this attribute in the style to produce a glowing effect where points are densely packed. It can range from 0 in the sparsest areas to 255 in the densest.
.IP \(bu 2
\-ab or \-\-detect\-shared\-borders: In the manner of TopoJSON \[la]https://github.com/mbostock/topojson/wiki/Introduction\[ra], detect borders that are shared between multiple polygons and simplify them identically in each polygon. This takes more time and memory than considering each polygon individually.
.RE
.SS Doing less
.RS
@ -289,14 +291,14 @@ If a tile is larger than 500K, it will try encoding that tile at progressively
lower resolutions before failing if it still doesn't fit.
.SH Development
.PP
Requires sqlite3 (should already be installed on MacOS). Rebuilding the manpage
Requires sqlite3 and zlib (should already be installed on MacOS). Rebuilding the manpage
uses md2man (\fB\fCgem install md2man\fR).
.PP
Linux:
.PP
.RS
.nf
sudo apt\-get install libsqlite3\-dev
sudo apt\-get install libsqlite3\-dev zlib1g\-dev
.fi
.RE
.PP

View File

@ -4,6 +4,7 @@
#define A_LINE_DROP ((int) 'l')
#define A_DEBUG_POLYGON ((int) 'd')
#define A_POLYGON_DROP ((int) 'p')
#define A_DETECT_SHARED_BORDERS ((int) 'b')
#define A_PREFER_RADIX_SORT ((int) 'R')
#define A_CALCULATE_FEATURE_DENSITY ((int) 'g')

8
tests/border/in.json Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,874 @@
tests/ne_110m_admin_0_countries/out/enum.mbtiles 0 0 0
tests/ne_110m_admin_0_countries/out/enum.mbtiles 1 0 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 1 0 0
tests/ne_110m_admin_0_countries/out/enum.mbtiles 1 1 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 1 1 0
tests/ne_110m_admin_0_countries/out/enum.mbtiles 2 0 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 2 0 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 2 0 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 2 0 0
tests/ne_110m_admin_0_countries/out/enum.mbtiles 2 1 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 2 1 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 2 1 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 2 1 0
tests/ne_110m_admin_0_countries/out/enum.mbtiles 2 2 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 2 2 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 2 2 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 2 2 0
tests/ne_110m_admin_0_countries/out/enum.mbtiles 2 3 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 2 3 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 2 3 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 2 3 0
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 0 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 0 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 0 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 0 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 0 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 0 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 1 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 1 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 1 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 1 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 1 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 1 0
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 2 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 2 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 2 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 2 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 2 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 2 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 2 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 2 0
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 3 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 3 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 3 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 3 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 3 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 3 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 3 0
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 4 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 4 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 4 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 4 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 4 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 4 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 4 0
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 5 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 5 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 5 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 5 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 5 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 5 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 5 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 5 0
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 6 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 6 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 6 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 6 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 6 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 6 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 6 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 6 0
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 7 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 7 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 7 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 7 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 7 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 7 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 3 7 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 0 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 0 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 0 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 0 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 0 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 0 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 0 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 0 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 0 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 1 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 1 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 1 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 1 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 1 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 1 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 1 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 2 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 2 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 2 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 2 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 2 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 2 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 2 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 2 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 2 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 3 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 3 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 3 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 3 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 3 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 3 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 3 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 3 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 3 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 3 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 3 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 4 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 4 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 4 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 4 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 4 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 4 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 4 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 4 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 4 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 4 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 4 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 4 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 4 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 4 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 4 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 4 0
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 5 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 5 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 5 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 5 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 5 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 5 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 5 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 5 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 5 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 5 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 5 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 5 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 5 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 5 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 5 0
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 6 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 6 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 6 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 6 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 6 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 6 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 6 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 6 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 6 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 6 0
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 7 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 7 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 7 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 7 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 7 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 7 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 7 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 7 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 7 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 7 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 7 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 7 0
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 8 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 8 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 8 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 8 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 8 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 8 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 8 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 8 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 8 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 8 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 8 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 8 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 8 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 9 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 9 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 9 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 9 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 9 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 9 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 9 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 9 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 9 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 9 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 9 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 9 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 9 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 10 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 10 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 10 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 10 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 10 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 10 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 10 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 10 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 10 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 10 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 10 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 10 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 10 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 10 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 11 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 11 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 11 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 11 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 11 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 11 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 11 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 11 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 11 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 11 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 11 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 11 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 12 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 12 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 12 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 12 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 12 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 12 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 12 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 12 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 12 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 12 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 12 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 12 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 12 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 13 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 13 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 13 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 13 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 13 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 13 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 13 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 13 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 13 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 13 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 13 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 13 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 13 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 14 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 14 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 14 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 14 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 14 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 14 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 14 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 14 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 14 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 14 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 14 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 14 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 14 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 15 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 15 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 15 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 15 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 15 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 15 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 15 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 15 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 15 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 4 15 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 0 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 0 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 0 17
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 0 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 0 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 0 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 1 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 1 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 1 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 1 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 1 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 1 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 1 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 1 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 1 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 1 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 1 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 2 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 2 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 2 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 2 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 2 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 2 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 2 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 2 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 2 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 2 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 2 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 3 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 3 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 3 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 3 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 3 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 3 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 3 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 3 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 3 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 4 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 4 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 4 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 4 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 4 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 4 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 4 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 4 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 4 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 4 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 4 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 4 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 4 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 4 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 4 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 5 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 5 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 5 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 5 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 5 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 5 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 5 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 5 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 5 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 5 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 5 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 5 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 5 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 5 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 5 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 5 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 5 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 6 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 6 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 6 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 6 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 6 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 6 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 6 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 6 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 6 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 6 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 6 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 6 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 6 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 6 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 6 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 6 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 6 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 6 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 6 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 7 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 7 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 7 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 7 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 7 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 7 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 7 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 7 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 7 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 7 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 7 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 7 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 7 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 7 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 7 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 7 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 7 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 7 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 7 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 7 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 8 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 8 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 8 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 8 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 8 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 8 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 8 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 8 16
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 8 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 8 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 8 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 8 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 8 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 8 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 8 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 8 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 8 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 8 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 8 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 8 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 8 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 8 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 8 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 24
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 21
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 20
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 19
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 18
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 17
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 16
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 9 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 24
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 23
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 21
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 20
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 19
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 18
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 17
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 16
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 10 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 11 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 11 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 11 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 11 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 11 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 11 19
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 11 18
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 11 17
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 11 16
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 11 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 11 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 11 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 11 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 11 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 11 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 11 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 11 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 11 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 11 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 11 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 11 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 12 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 12 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 12 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 12 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 12 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 12 18
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 12 17
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 12 16
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 12 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 12 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 12 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 12 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 12 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 12 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 12 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 12 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 12 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 13 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 13 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 13 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 13 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 13 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 13 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 13 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 13 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 13 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 13 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 13 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 13 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 13 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 13 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 14 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 14 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 14 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 14 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 14 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 14 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 14 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 14 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 14 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 14 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 14 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 14 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 14 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 14 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 14 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 14 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 14 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 14 1
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 15 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 15 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 15 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 15 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 15 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 15 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 15 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 15 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 15 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 15 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 15 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 15 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 15 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 15 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 16 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 16 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 16 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 16 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 16 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 16 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 16 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 16 24
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 16 16
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 16 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 16 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 16 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 16 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 16 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 16 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 16 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 16 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 16 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 16 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 17 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 17 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 17 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 17 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 17 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 17 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 17 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 17 24
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 17 19
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 17 18
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 17 17
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 17 16
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 17 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 17 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 17 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 17 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 17 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 17 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 17 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 17 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 17 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 17 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 17 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 17 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 18 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 18 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 18 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 18 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 18 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 18 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 18 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 18 24
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 18 19
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 18 18
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 18 17
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 18 16
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 18 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 18 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 18 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 18 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 18 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 18 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 18 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 18 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 18 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 18 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 18 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 18 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 19 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 19 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 19 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 19 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 19 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 19 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 19 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 19 24
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 19 18
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 19 17
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 19 16
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 19 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 19 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 19 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 19 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 19 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 19 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 19 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 19 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 19 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 19 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 20 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 20 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 20 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 20 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 20 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 20 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 20 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 20 24
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 20 23
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 20 18
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 20 17
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 20 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 20 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 20 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 20 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 20 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 20 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 20 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 20 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 20 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 20 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 20 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 20 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 21 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 21 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 21 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 21 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 21 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 21 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 21 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 21 24
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 21 23
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 21 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 21 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 21 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 21 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 21 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 21 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 21 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 21 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 21 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 21 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 21 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 22 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 22 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 22 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 22 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 22 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 22 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 22 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 22 24
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 22 21
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 22 20
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 22 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 22 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 22 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 22 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 22 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 22 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 22 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 22 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 22 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 22 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 22 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 22 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 23 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 23 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 23 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 23 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 23 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 23 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 23 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 23 24
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 23 23
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 23 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 23 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 23 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 23 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 23 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 23 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 23 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 23 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 23 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 23 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 23 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 24 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 24 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 24 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 24 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 24 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 24 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 24 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 24 24
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 24 23
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 24 16
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 24 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 24 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 24 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 24 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 24 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 24 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 24 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 24 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 24 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 24 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 24 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 24 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 24 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 24 2
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 25 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 25 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 25 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 25 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 25 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 25 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 25 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 25 24
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 25 23
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 25 16
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 25 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 25 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 25 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 25 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 25 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 25 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 25 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 25 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 25 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 25 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 25 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 25 4
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 25 3
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 26 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 26 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 26 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 26 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 26 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 26 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 26 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 26 24
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 26 23
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 26 19
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 26 18
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 26 17
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 26 16
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 26 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 26 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 26 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 26 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 26 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 26 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 26 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 26 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 26 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 26 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 26 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 27 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 27 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 27 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 27 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 27 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 27 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 27 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 27 24
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 27 23
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 27 19
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 27 18
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 27 17
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 27 16
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 27 15
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 27 14
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 27 13
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 27 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 27 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 27 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 27 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 27 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 27 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 27 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 28 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 28 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 28 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 28 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 28 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 28 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 28 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 28 24
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 28 23
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 28 20
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 28 19
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 28 18
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 28 17
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 28 16
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 28 12
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 28 11
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 28 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 28 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 28 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 28 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 28 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 28 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 29 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 29 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 29 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 29 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 29 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 29 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 29 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 29 24
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 29 20
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 29 19
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 29 18
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 29 17
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 29 16
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 29 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 29 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 29 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 29 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 29 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 29 5
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 30 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 30 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 30 29
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 30 28
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 30 27
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 30 26
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 30 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 30 24
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 30 20
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 30 18
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 30 17
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 30 16
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 30 10
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 30 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 30 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 30 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 30 6
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 31 31
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 31 30
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 31 25
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 31 20
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 31 19
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 31 17
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 31 9
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 31 8
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 31 7
tests/ne_110m_admin_0_countries/out/enum.mbtiles 5 31 6

413
tile.cpp
View File

@ -19,6 +19,7 @@
#include <sqlite3.h>
#include <pthread.h>
#include <errno.h>
#include <time.h>
#include "mvt.hpp"
#include "mbtiles.hpp"
#include "geometry.hpp"
@ -372,6 +373,7 @@ struct partial {
std::vector<drawvec> geoms;
std::vector<long long> keys;
std::vector<long long> values;
std::vector<ssize_t> arc_polygon;
char *meta;
long long layer;
long long original_seq;
@ -460,10 +462,17 @@ void *partial_feature_worker(void *v) {
geom = remove_noop(geom, t, 32 - z - line_detail);
}
drawvec ngeom = simplify_lines(geom, z, line_detail, !(prevent[P_CLIPPING] || prevent[P_DUPLICATION]), (*partials)[i].simplification);
bool already_marked = false;
if (additional[A_DETECT_SHARED_BORDERS] && t == VT_POLYGON) {
already_marked = true;
}
if (t != VT_POLYGON || ngeom.size() >= 3) {
geom = ngeom;
if (!already_marked) {
drawvec ngeom = simplify_lines(geom, z, line_detail, !(prevent[P_CLIPPING] || prevent[P_DUPLICATION]), (*partials)[i].simplification, already_marked);
if (t != VT_POLYGON || ngeom.size() >= 3) {
geom = ngeom;
}
}
}
}
@ -561,6 +570,398 @@ int manage_gap(unsigned long long index, unsigned long long *previndex, double s
return 0;
}
// Does not fix up moveto/lineto
static drawvec reverse_subring(drawvec const &dv) {
drawvec out;
for (size_t i = dv.size(); i > 0; i--) {
out.push_back(dv[i - 1]);
}
return out;
}
struct edge {
unsigned x1;
unsigned y1;
unsigned x2;
unsigned y2;
unsigned ring;
edge(unsigned _x1, unsigned _y1, unsigned _x2, unsigned _y2, unsigned _ring) {
x1 = _x1;
y1 = _y1;
x2 = _x2;
y2 = _y2;
ring = _ring;
}
bool operator<(const edge &s) const {
long long cmp = (long long) y1 - s.y1;
if (cmp == 0) {
cmp = (long long) x1 - s.x1;
}
if (cmp == 0) {
cmp = (long long) y2 - s.y2;
}
if (cmp == 0) {
cmp = (long long) x2 - s.x2;
}
return cmp < 0;
}
};
struct edgecmp_ring {
bool operator()(const edge &a, const edge &b) {
long long cmp = (long long) a.y1 - b.y1;
if (cmp == 0) {
cmp = (long long) a.x1 - b.x1;
}
if (cmp == 0) {
cmp = (long long) a.y2 - b.y2;
}
if (cmp == 0) {
cmp = (long long) a.x2 - b.x2;
}
if (cmp == 0) {
cmp = (long long) a.ring - b.ring;
}
return cmp < 0;
}
} edgecmp_ring;
bool edges_same(std::pair<std::vector<edge>::iterator, std::vector<edge>::iterator> e1, std::pair<std::vector<edge>::iterator, std::vector<edge>::iterator> e2) {
if ((e2.second - e2.first) != (e1.second - e1.first)) {
return false;
}
while (e1.first != e1.second) {
if (e1.first->ring != e2.first->ring) {
return false;
}
++e1.first;
++e2.first;
}
return true;
}
void find_common_edges(std::vector<partial> &partials, int z, int line_detail, double simplification, int maxzoom) {
for (size_t i = 0; i < partials.size(); i++) {
if (partials[i].t == VT_POLYGON) {
for (size_t j = 0; j < partials[i].geoms.size(); j++) {
drawvec &g = partials[i].geoms[j];
drawvec out;
for (size_t k = 0; k < g.size(); k++) {
if (g[k].op == VT_LINETO && k > 0 && g[k - 1] == g[k]) {
;
} else {
out.push_back(g[k]);
}
}
partials[i].geoms[j] = out;
}
}
}
// Construct a mapping from all polygon edges to the set of rings
// that each edge appears in. (The ring number is across all polygons;
// we don't need to look it back up, just to tell where it changes.)
std::vector<edge> edges;
size_t ring = 0;
for (size_t i = 0; i < partials.size(); i++) {
if (partials[i].t == VT_POLYGON) {
for (size_t j = 0; j < partials[i].geoms.size(); j++) {
for (size_t k = 0; k + 1 < partials[i].geoms[j].size(); k++) {
if (partials[i].geoms[j][k].op == VT_MOVETO) {
ring++;
}
if (partials[i].geoms[j][k + 1].op == VT_LINETO) {
drawvec dv;
if (partials[i].geoms[j][k] < partials[i].geoms[j][k + 1]) {
dv.push_back(partials[i].geoms[j][k]);
dv.push_back(partials[i].geoms[j][k + 1]);
} else {
dv.push_back(partials[i].geoms[j][k + 1]);
dv.push_back(partials[i].geoms[j][k]);
}
edges.push_back(edge(dv[0].x, dv[0].y, dv[1].x, dv[1].y, ring));
}
}
}
}
}
std::sort(edges.begin(), edges.end(), edgecmp_ring);
std::set<draw> necessaries;
// Now mark all the points where the set of rings using the edge on one side
// is not the same as the set of rings using the edge on the other side.
for (size_t i = 0; i < partials.size(); i++) {
if (partials[i].t == VT_POLYGON) {
for (size_t j = 0; j < partials[i].geoms.size(); j++) {
drawvec &g = partials[i].geoms[j];
for (size_t k = 0; k < g.size(); k++) {
g[k].necessary = 0;
}
for (size_t a = 0; a < g.size(); a++) {
if (g[a].op == VT_MOVETO) {
size_t b;
for (b = a + 1; b < g.size(); b++) {
if (g[b].op != VT_LINETO) {
break;
}
}
// -1 because of duplication at the end
size_t s = b - a - 1;
if (s > 0) {
drawvec left;
if (g[a + (0 - 1 + s) % s] < g[a + 0]) {
left.push_back(g[a + (0 - 1 + s) % s]);
left.push_back(g[a + 0]);
} else {
left.push_back(g[a + 0]);
left.push_back(g[a + (0 - 1 + s) % s]);
}
if (left[1] < left[0]) {
fprintf(stderr, "left misordered\n");
}
std::pair<std::vector<edge>::iterator, std::vector<edge>::iterator> e1 = std::equal_range(edges.begin(), edges.end(), edge(left[0].x, left[0].y, left[1].x, left[1].y, 0));
for (size_t k = 0; k < s; k++) {
drawvec right;
if (g[a + k] < g[a + k + 1]) {
right.push_back(g[a + k]);
right.push_back(g[a + k + 1]);
} else {
right.push_back(g[a + k + 1]);
right.push_back(g[a + k]);
}
std::pair<std::vector<edge>::iterator, std::vector<edge>::iterator> e2 = std::equal_range(edges.begin(), edges.end(), edge(right[0].x, right[0].y, right[1].x, right[1].y, 0));
if (right[1] < right[0]) {
fprintf(stderr, "left misordered\n");
}
if (e1.first == e1.second || e2.first == e2.second) {
fprintf(stderr, "Internal error: polygon edge lookup failed for %lld,%lld to %lld,%lld or %lld,%lld to %lld,%lld\n", left[0].x, left[0].y, left[1].x, left[1].y, right[0].x, right[0].y, right[1].x, right[1].y);
exit(EXIT_FAILURE);
}
if (!edges_same(e1, e2)) {
g[a + k].necessary = 1;
necessaries.insert(g[a + k]);
}
e1 = e2;
}
}
a = b - 1;
}
}
}
}
}
edges.clear();
std::map<drawvec, size_t> arcs;
// Roll rings that include a necessary point around so they start at one
for (size_t i = 0; i < partials.size(); i++) {
if (partials[i].t == VT_POLYGON) {
for (size_t j = 0; j < partials[i].geoms.size(); j++) {
drawvec &g = partials[i].geoms[j];
for (size_t k = 0; k < g.size(); k++) {
if (necessaries.count(g[k]) != 0) {
g[k].necessary = 1;
}
}
for (size_t k = 0; k < g.size(); k++) {
if (g[k].op == VT_MOVETO) {
ssize_t necessary = -1;
ssize_t lowest = k;
size_t l;
for (l = k + 1; l < g.size(); l++) {
if (g[l].op != VT_LINETO) {
break;
}
if (g[l].necessary) {
necessary = l;
}
if (g[l] < g[lowest]) {
lowest = l;
}
}
if (necessary < 0) {
necessary = lowest;
// Add a necessary marker if there was none in the ring,
// so the arc code below can find it.
g[lowest].necessary = 1;
}
{
drawvec tmp;
// l - 1 because the endpoint is duplicated
for (size_t m = necessary; m < l - 1; m++) {
tmp.push_back(g[m]);
}
for (size_t m = k; m < necessary; m++) {
tmp.push_back(g[m]);
}
// replace the endpoint
tmp.push_back(g[necessary]);
if (tmp.size() != l - k) {
fprintf(stderr, "internal error shifting ring\n");
exit(EXIT_FAILURE);
}
for (size_t m = 0; m < tmp.size(); m++) {
if (m == 0) {
tmp[m].op = VT_MOVETO;
} else {
tmp[m].op = VT_LINETO;
}
g[k + m] = tmp[m];
}
}
// Now peel off each set of segments from one necessary point to the next
// into an "arc" as in TopoJSON
for (size_t m = k; m < l; m++) {
if (!g[m].necessary) {
fprintf(stderr, "internal error in arc building\n");
exit(EXIT_FAILURE);
}
drawvec arc;
size_t n;
for (n = m; n < l; n++) {
arc.push_back(g[n]);
if (n > m && g[n].necessary) {
break;
}
}
auto f = arcs.find(arc);
if (f == arcs.end()) {
drawvec arc2 = reverse_subring(arc);
auto f2 = arcs.find(arc2);
if (f2 == arcs.end()) {
// Add new arc
size_t added = arcs.size() + 1;
arcs.insert(std::pair<drawvec, size_t>(arc, added));
partials[i].arc_polygon.push_back(added);
} else {
partials[i].arc_polygon.push_back(-f2->second);
}
} else {
partials[i].arc_polygon.push_back(f->second);
}
m = n - 1;
}
partials[i].arc_polygon.push_back(0);
k = l - 1;
}
}
}
}
}
std::vector<drawvec> simplified_arcs;
size_t count = 0;
for (auto ai = arcs.begin(); ai != arcs.end(); ++ai) {
if (simplified_arcs.size() < ai->second + 1) {
simplified_arcs.resize(ai->second + 1);
}
drawvec dv = ai->first;
for (size_t i = 0; i < dv.size(); i++) {
if (i == 0) {
dv[i].op = VT_MOVETO;
} else {
dv[i].op = VT_LINETO;
}
}
if (!(prevent[P_SIMPLIFY] || (z == maxzoom && prevent[P_SIMPLIFY_LOW]))) {
simplified_arcs[ai->second] = simplify_lines(dv, z, line_detail, !(prevent[P_CLIPPING] || prevent[P_DUPLICATION]), simplification, false);
} else {
simplified_arcs[ai->second] = dv;
}
count++;
}
for (size_t i = 0; i < partials.size(); i++) {
if (partials[i].t == VT_POLYGON) {
partials[i].geoms.resize(0);
partials[i].geoms.push_back(drawvec());
bool at_start = true;
draw first(-1, 0, 0);
for (size_t j = 0; j < partials[i].arc_polygon.size(); j++) {
ssize_t p = partials[i].arc_polygon[j];
if (p == 0) {
if (first.op >= 0) {
partials[i].geoms[0].push_back(first);
first = draw(-1, 0, 0);
}
at_start = true;
} else if (p > 0) {
for (size_t k = 0; k + 1 < simplified_arcs[p].size(); k++) {
if (at_start) {
partials[i].geoms[0].push_back(draw(VT_MOVETO, simplified_arcs[p][k].x, simplified_arcs[p][k].y));
first = draw(VT_LINETO, simplified_arcs[p][k].x, simplified_arcs[p][k].y);
} else {
partials[i].geoms[0].push_back(draw(VT_LINETO, simplified_arcs[p][k].x, simplified_arcs[p][k].y));
}
at_start = 0;
}
} else { /* p < 0 */
for (ssize_t k = simplified_arcs[-p].size() - 1; k > 0; k--) {
if (at_start) {
partials[i].geoms[0].push_back(draw(VT_MOVETO, simplified_arcs[-p][k].x, simplified_arcs[-p][k].y));
first = draw(VT_LINETO, simplified_arcs[-p][k].x, simplified_arcs[-p][k].y);
} else {
partials[i].geoms[0].push_back(draw(VT_LINETO, simplified_arcs[-p][k].x, simplified_arcs[-p][k].y));
}
at_start = 0;
}
}
}
}
}
}
long long write_tile(FILE *geoms, long long *geompos_in, char *metabase, char *stringpool, int z, unsigned tx, unsigned ty, int detail, int min_detail, int basezoom, sqlite3 *outdb, double droprate, int buffer, const char *fname, FILE **geomfile, int minzoom, int maxzoom, double todo, volatile long long *along, long long alongminus, double gamma, int child_shards, long long *meta_off, long long *pool_off, unsigned *initial_x, unsigned *initial_y, volatile int *running, double simplification, std::vector<std::map<std::string, layermap_entry>> *layermaps, std::vector<std::vector<std::string>> *layer_unmaps) {
int line_detail;
double fraction = 1;
@ -852,6 +1253,10 @@ long long write_tile(FILE *geoms, long long *geompos_in, char *metabase, char *s
}
}
if (additional[A_DETECT_SHARED_BORDERS]) {
find_common_edges(partials, z, line_detail, simplification, maxzoom);
}
int tasks = ceil((double) CPUS / *running);
if (tasks < 1) {
tasks = 1;
@ -971,7 +1376,7 @@ long long write_tile(FILE *geoms, long long *geompos_in, char *metabase, char *s
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);
layer_features[x].geom = simplify_lines(layer_features[x].geom, 32, 0,
!(prevent[P_CLIPPING] || prevent[P_DUPLICATION]), simplification);
!(prevent[P_CLIPPING] || prevent[P_DUPLICATION]), simplification, false);
}
if (layer_features[x].type == VT_POLYGON) {

View File

@ -1 +1 @@
#define VERSION "tippecanoe v1.14.2\n"
#define VERSION "tippecanoe v1.14.3\n"