Compare commits

..

40 Commits

Author SHA1 Message Date
6ad1497853 Stop expecting tiles to come out byte-for-byte identical 2018-02-16 14:40:48 -08:00
5d4e39d8b1 Feature dropping is very sensitive to the order of tile encoding 2018-02-16 14:32:01 -08:00
5d458a2a91 Fix multipoint features 2018-02-16 12:02:09 -08:00
91063d5af5 Set the ID before the geometry, since it doesn't work otherwise 2018-02-16 11:47:13 -08:00
ba102b0ea4 Close the polygon rings 2018-02-15 15:17:24 -08:00
a3e78a7846 Still wrong, but not crashing 2018-02-14 13:23:25 -08:00
b81b42879e Fix LineString generation with vtzero 2018-02-14 11:54:09 -08:00
9ac97fd0a2 Most of the way to encoding features with vtzero 2018-02-13 17:12:50 -08:00
1ba03b7f47 Decode geometry using vtzero 2018-02-13 16:19:01 -08:00
560a64c071 Decoding attributes with vtzero 2018-02-05 17:22:51 -08:00
21b9b1993f Merge pull request #515 from mapbox/vector-bounds
Fix out-of-bounds error when no threads were needed for a zoom level
2018-01-19 10:27:20 -08:00
d49606babf Fix opportunities for integer overflow 2018-01-18 12:37:15 -08:00
e07a4dd51b Fix out-of-bounds error when no threads were needed for a zoom level 2018-01-18 12:12:35 -08:00
eb966ae398 Merge pull request #511 from mapbox/cluster
Add an option for clustering features
2017-12-21 09:55:20 -08:00
aaf08a6c55 Add an option to specify the clustering distance directly 2017-12-20 17:33:30 -08:00
fc32a0e897 Add a test for the case that was getting stuck in a loop 2017-12-19 12:46:13 -08:00
01884a3bf6 Make sure the feature gap always increases when trying to reduce density 2017-12-19 12:09:30 -08:00
6524b6510e Credit dangling clustered count at the end of a tile to the last feature 2017-12-18 12:55:22 -08:00
b03dabe098 Add an option for clustering features 2017-12-14 14:30:08 -08:00
5687ee041f Merge pull request #503 from mapbox/geocsv
Add input support for CSV file format
2017-12-14 10:11:07 -08:00
be79d13cbc Add missing #include 2017-12-13 14:52:46 -08:00
2e32004589 Don't coalesce features that have different IDs.
Remove the 700-point limit on coalesced features, since
polygon merging is no longer a performance problem.
2017-12-13 12:05:53 -08:00
82a2b5dfdc Add CSV test and documentation 2017-12-13 11:32:19 -08:00
ed0b69a3c8 Fix check for non-numeric CSV data. Use same column name code as mapnik 2017-12-07 11:28:39 -08:00
ec475b3beb Check for strings vs numbers in CSV attributes 2017-12-06 15:20:01 -08:00
afb5cece96 Verify that CSV input is encoded as UTF-8 2017-12-06 13:32:44 -08:00
f3e6afa4e9 Basic geographic CSV parsing 2017-12-05 17:18:19 -08:00
f2f76082df Merge pull request #501 from mapbox/refactor-dirtiles
Clean up duplicated code for reading tiles from a directory
2017-12-01 14:35:03 -08:00
e4743d9527 Test successful and failed attempts to write to existing tilesets 2017-11-30 15:56:35 -08:00
d7f44ab082 Factor out code for reading metadata.json 2017-11-30 15:49:38 -08:00
1acd771743 Factor out code for enumerating the tiles in a directory 2017-11-30 15:37:46 -08:00
ad86d06cce Merge pull request #500 from mapbox/allow-existing-test
Make --allow-existing work on dirs; trim .geojson from layer names
2017-11-30 11:15:38 -08:00
1b1be9f872 Also trim .geobuf from layer names 2017-11-29 16:44:55 -08:00
ba1c343204 Make --allow-existing work on dirs; trim .geojson from layer names 2017-11-29 16:24:48 -08:00
ca028dd1cc Merge pull request #495 from mapbox/bare-geom-crash
Add null pointer check when checking for bare geometry. Fix coalescing of wrong features.
2017-11-22 17:53:25 -08:00
8ac7c46788 Make the same null pointer fix in jsontool.cpp as in geojson.cpp 2017-11-22 13:06:39 -08:00
2234e37883 Quadkey-order index is a better secondary key for --reorder anyway 2017-11-22 12:49:40 -08:00
8230987405 Fix a bug that could cause the wrong features to be coalesced 2017-11-22 11:54:25 -08:00
9964784e77 Add null pointer check when testing for bare geometry in GeoJSON 2017-11-21 15:01:33 -08:00
ac67013930 Merge pull request #473 from mapbox/json-join
Working on tools for joining CSV data to GeoJSON
2017-11-21 10:50:01 -08:00
83 changed files with 22302 additions and 2432 deletions

View File

@ -43,7 +43,7 @@ matrix:
# debug+leak+address-sanitizer build
- os: linux
compiler: clang
env: CLANG_VERSION='3.8.0' BUILDTYPE=Debug ASAN_OPTIONS=detect_leaks=1 CC="clang-3.8" CXX="clang++-3.8" CXXFLAGS="-fsanitize=address" CFLAGS="-fsanitize=address" LDFLAGS="-fsanitize=address" FEWER=true
env: CLANG_VERSION='3.8.0' BUILDTYPE=Debug ASAN_OPTIONS=detect_leaks=1 CC="clang-3.8" CXX="clang++-3.8" CXXFLAGS="-fsanitize=address,undefined" CFLAGS="-fsanitize=address,undefined" LDFLAGS="-fsanitize=address,undefined" FEWER=true
addons:
apt:
sources: ['ubuntu-toolchain-r-test' ]

View File

@ -1,3 +1,35 @@
## 1.27.6
* Fix opportunities for integer overflow and out-of-bounds references
## 1.27.5
* Add --cluster-densest-as-needed to cluster features
* Add --maximum-tile-features to set the maximum number of features in a tile
## 1.27.4
* Support CSV point input
* Don't coalesce features that have different IDs but are otherwise identical
* Remove the 700-point limit on coalesced features, since polygon merging
is no longer a performance problem
## 1.27.3
* Clean up duplicated code for reading tiles from a directory
## 1.27.2
* Tippecanoe-decode can decode directories of tiles, not just mbtiles
* The --allow-existing option works on directories of tiles
* Trim .geojson, not just .json, when making layer names from filenames
## 1.27.1
* Fix a potential null pointer when parsing GeoJSON with bare geometries
* Fix a bug that could cause the wrong features to be coalesced when
input was parsed in parallel
## 1.27.0
* Add tippecanoe-json-tool for sorting and joining GeoJSON files

View File

@ -44,22 +44,22 @@ PG=
H = $(wildcard *.h) $(wildcard *.hpp)
C = $(wildcard *.c) $(wildcard *.cpp)
INCLUDES = -I/usr/local/include -I.
INCLUDES = -I/usr/local/include -I. -I../vtzero/include
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 plugin.o read_json.o write_json.o geobuf.o evaluator.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 plugin.o read_json.o write_json.o geobuf.o evaluator.o geocsv.o csv.o
$(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3 -lpthread
tippecanoe-enumerate: enumerate.o
$(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CFLAGS) -o $@ $^ $(LDFLAGS) -lsqlite3
tippecanoe-decode: decode.o projection.o mvt.o write_json.o text.o
tippecanoe-decode: decode.o projection.o mvt.o write_json.o text.o jsonpull/jsonpull.o dirtiles.o
$(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3
tile-join: tile-join.o projection.o pool.o mbtiles.o mvt.o memfile.o dirtiles.o jsonpull/jsonpull.o text.o evaluator.o csv.o
$(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3 -lpthread
tippecanoe-json-tool: jsontool.o jsonpull/jsonpull.o csv.o
tippecanoe-json-tool: jsontool.o jsonpull/jsonpull.o csv.o text.o
$(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3 -lpthread
unit: unit.o text.o
@ -82,7 +82,7 @@ indent:
TESTS = $(wildcard tests/*/out/*.json)
SPACE = $(NULL) $(NULL)
test: tippecanoe tippecanoe-decode $(addsuffix .check,$(TESTS)) raw-tiles-test parallel-test pbf-test join-test enumerate-test decode-test join-filter-test unit json-tool-test
test: tippecanoe tippecanoe-decode $(addsuffix .check,$(TESTS)) raw-tiles-test parallel-test pbf-test join-test enumerate-test decode-test join-filter-test unit json-tool-test allow-existing-test csv-test
./unit
# Work around Makefile and filename punctuation limits: _ for space, @ for :, % for /
@ -135,8 +135,10 @@ parallel-test:
raw-tiles-test:
./tippecanoe -f -e tests/raw-tiles/raw-tiles tests/raw-tiles/hackspots.geojson -pC
diff -x '*.DS_Store' -rq tests/raw-tiles/raw-tiles tests/raw-tiles/compare
rm -rf tests/raw-tiles/raw-tiles
./tippecanoe-decode tests/raw-tiles/raw-tiles > tests/raw-tiles/raw-tiles/json
./tippecanoe-decode tests/raw-tiles/compare > tests/raw-tiles/compare/json
cmp tests/raw-tiles/raw-tiles/json tests/raw-tiles/compare/json
rm -rf tests/raw-tiles/raw-tiles tests/raw-tiles/compare/json
decode-test:
mkdir -p tests/muni/decode
@ -193,7 +195,10 @@ join-test:
cmp tests/join-population/just-macarthur.mbtiles.json.check tests/join-population/just-macarthur.mbtiles.json
cmp tests/join-population/no-macarthur.mbtiles.json.check tests/join-population/no-macarthur.mbtiles.json
./tile-join --no-tile-compression -f -e tests/join-population/raw-merged-folder tests/join-population/tabblock_06001420.mbtiles tests/join-population/macarthur.mbtiles tests/join-population/macarthur2.mbtiles
diff -x '*.DS_Store' -rq tests/join-population/raw-merged-folder tests/join-population/raw-merged-folder-compare
./tippecanoe-decode tests/join-population/raw-merged-folder > tests/join-population/raw-merged-folder/json
./tippecanoe-decode tests/join-population/raw-merged-folder-compare > tests/join-population/raw-merged-folder-compare/json
cmp tests/join-population/raw-merged-folder/json tests/join-population/raw-merged-folder-compare/json
rm tests/join-population/raw-merged-folder/json tests/join-population/raw-merged-folder-compare/json
./tippecanoe -z12 -f -e tests/join-population/tabblock_06001420-folder tests/join-population/tabblock_06001420.json
./tippecanoe -Z5 -z10 -f -e tests/join-population/macarthur-folder -l macarthur tests/join-population/macarthur.json
./tippecanoe -d10 -D10 -Z9 -z11 -f -e tests/join-population/macarthur2-folder -l macarthur tests/join-population/macarthur2.json
@ -202,7 +207,10 @@ join-test:
cmp tests/join-population/merged-folder.mbtiles.json.check tests/join-population/merged-folder.mbtiles.json
./tile-join -n "merged name" -N "merged description" -f -e tests/join-population/merged-mbtiles-to-folder tests/join-population/tabblock_06001420.mbtiles tests/join-population/macarthur.mbtiles tests/join-population/macarthur2.mbtiles
./tile-join -n "merged name" -N "merged description" -f -e tests/join-population/merged-folders-to-folder tests/join-population/tabblock_06001420-folder tests/join-population/macarthur-folder tests/join-population/macarthur2-folder
diff -x '*.DS_Store' -rq tests/join-population/merged-mbtiles-to-folder tests/join-population/merged-folders-to-folder
./tippecanoe-decode tests/join-population/merged-mbtiles-to-folder > tests/join-population/merged-mbtiles-to-folder/json
./tippecanoe-decode tests/join-population/merged-folders-to-folder > tests/join-population/merged-folders-to-folder/json
cmp tests/join-population/merged-mbtiles-to-folder/json tests/join-population/merged-folders-to-folder/json
rm tests/join-population/merged-mbtiles-to-folder/json tests/join-population/merged-folders-to-folder/json
./tile-join -f -c tests/join-population/windows.csv -o tests/join-population/windows-merged.mbtiles tests/join-population/macarthur.mbtiles tests/join-population/macarthur2-folder
./tile-join -c tests/join-population/windows.csv -f -e tests/join-population/windows-merged-folder tests/join-population/macarthur.mbtiles tests/join-population/macarthur2-folder
./tile-join -f -o tests/join-population/windows-merged2.mbtiles tests/join-population/windows-merged-folder
@ -239,6 +247,33 @@ json-tool-test: tippecanoe-json-tool
cmp tests/join-population/tabblock_06001420.json.sort.joined tests/join-population/tabblock_06001420.json.sort.joined.standard
rm -f tests/join-population/tabblock_06001420.json.sort tests/join-population/tabblock_06001420.json.sort.joined
allow-existing-test:
# Make a tileset
./tippecanoe -Z0 -z0 -f -o tests/allow-existing/both.mbtiles tests/coalesce-tract/tl_2010_06001_tract10.json
# Writing to existing should fail
if ./tippecanoe -Z1 -z1 -o tests/allow-existing/both.mbtiles tests/coalesce-tract/tl_2010_06001_tract10.json; then exit 1; else exit 0; fi
# Replace existing
./tippecanoe -Z8 -z9 -f -o tests/allow-existing/both.mbtiles tests/coalesce-tract/tl_2010_06001_tract10.json
./tippecanoe -Z10 -z11 -F -o tests/allow-existing/both.mbtiles tests/coalesce-tract/tl_2010_06001_tract10.json
./tippecanoe-decode tests/allow-existing/both.mbtiles > tests/allow-existing/both.mbtiles.json.check
cmp tests/allow-existing/both.mbtiles.json.check tests/allow-existing/both.mbtiles.json
# Make a tileset
./tippecanoe -Z0 -z0 -f -e tests/allow-existing/both.dir tests/coalesce-tract/tl_2010_06001_tract10.json
# Writing to existing should fail
if ./tippecanoe -Z1 -z1 -e tests/allow-existing/both.dir tests/coalesce-tract/tl_2010_06001_tract10.json; then exit 1; else exit 0; fi
# Replace existing
./tippecanoe -Z8 -z9 -f -e tests/allow-existing/both.dir tests/coalesce-tract/tl_2010_06001_tract10.json
./tippecanoe -Z10 -z11 -F -e tests/allow-existing/both.dir tests/coalesce-tract/tl_2010_06001_tract10.json
./tippecanoe-decode tests/allow-existing/both.dir | sed 's/both\.dir/both.mbtiles/g' > tests/allow-existing/both.dir.json.check
cmp tests/allow-existing/both.dir.json.check tests/allow-existing/both.mbtiles.json
rm -r 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:
./tippecanoe -zg -f -o tests/csv/out.mbtiles tests/csv/ne_110m_populated_places_simple.csv
./tippecanoe-decode tests/csv/out.mbtiles > tests/csv/out.mbtiles.json.check
cmp tests/csv/out.mbtiles.json.check tests/csv/out.mbtiles.json
rm -f tests/csv/out.mbtiles.json.check tests/csv/out.mbtiles
# Use this target to regenerate the standards that the tests are compared against
# after making a change that legitimately changes their output

View File

@ -1,7 +1,7 @@
tippecanoe
==========
Builds [vector tilesets](https://www.mapbox.com/developers/vector-tiles/) from large (or small) collections of [GeoJSON](http://geojson.org/) or [Geobuf](https://github.com/mapbox/geobuf) features,
Builds [vector tilesets](https://www.mapbox.com/developers/vector-tiles/) from large (or small) collections of [GeoJSON](http://geojson.org/), [Geobuf](https://github.com/mapbox/geobuf), or [CSV](https://en.wikipedia.org/wiki/Comma-separated_values) features,
[like these](MADE_WITH.md).
[![Build Status](https://travis-ci.org/mapbox/tippecanoe.svg)](https://travis-ci.org/mapbox/tippecanoe)
@ -127,11 +127,14 @@ If your input is formatted as newline-delimited GeoJSON, use `-P` to make input
### Input files and layer names
* _name_`.json` or _name_`.geojson`: Read the named GeoJSON input file into a layer called _name_.
* _name_`.geobuf` or _name_`.geobuf`: Read the named Geobuf input file into a layer called _name_.
* _name_`.geobuf`: Read the named Geobuf input file into a layer called _name_.
* _name_`.csv`: Read the named CSV input file into a layer called _name_.
* `-l` _name_ or `--layer=`_name_: Use the specified layer name instead of deriving a name from the input filename or output tileset. If there are multiple input files
specified, the files are all merged into the single named layer, even if they try to specify individual names with `-L`.
* `-L` _name_`:`_file.json_ or `--named-layer=`_name_`:`_file.json_: Specify layer names for individual files. If your shell supports it, you can use a subshell redirect like `-L` _name_`:<(cat dir/*.json)` to specify a layer name for the output of streamed input.
CSV input files currently support only Point geometries, from columns named `latitude`, `longitude`, `lat`, `lon`, `long`, `lng`, `x`, or `y`.
### Parallel processing of input
* `-P` or `--read-parallel`: Use multiple threads to read different parts of each GeoJSON input file at once.
@ -201,6 +204,7 @@ tippecanoe -z5 -o filtered.mbtiles -j '{ "ne_10m_admin_0_countries": [ "all", [
compensate for the larger marker, or `-Bf`*number* to allow at most *number* features in the densest tile.
* `-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
* `-K` _distance_ or `--cluster-distance=`_distance_: Cluster points (as with `--cluster-densest-as-needed`, but without the experimental discovery process) that are approximately within _distance_ of each other. The units are tile coordinates within a nominally 256-pixel tile, so the maximum value of 255 allows only one feature per tile. Values around 20 are probably appropriate for typical marker sizes.
### Dropping a fraction of features to keep under tile size limits
@ -209,6 +213,7 @@ tippecanoe -z5 -o filtered.mbtiles -j '{ "ne_10m_admin_0_countries": [ "all", [
* `-an` or `--drop-smallest-as-needed`: Dynamically drop the smallest features (physically smallest: the shortest lines or the smallest polygons) from each zoom level to keep large tiles under the 500K size limit. This option will not work for point features.
* `-aN` or `--coalesce-smallest-as-needed`: Dynamically combine the smallest features (physically smallest: the shortest lines or the smallest polygons) from each zoom level into other nearby features to keep large tiles under the 500K size limit. This option will not work for point features, and will probably not help very much with LineStrings. It is mostly intended for polygons, to maintain the full original area covered by polygons while still reducing the feature count somehow. The attributes of the small polygons are *not* preserved into the combined features, only their geometry.
* `-pd` or `--force-feature-limit`: Dynamically drop some fraction of features from large tiles to keep them under the 500K size limit. It will probably look ugly at the tile boundaries. (This is like `-ad` but applies to each tile individually, not to the entire zoom level.) You probably don't want to use this.
* `-aC` or `--cluster-densest-as-needed`: If a tile is too large, try to reduce its size by increasing the minimum spacing between features, and leaving one placeholder feature from each group. The remaining feature will be given a `"cluster": true` attribute to indicate that it represents a cluster and a `"point_count"` attribute to indicate the number of features that were clustered into it.
### Dropping tightly overlapping features
@ -237,8 +242,8 @@ tippecanoe -z5 -o filtered.mbtiles -j '{ "ne_10m_admin_0_countries": [ "all", [
### Reordering features within each tile
* `-pi` or `--preserve-input-order`: Preserve the original input order of features as the drawing order instead of ordering geographically. (This is implemented as a restoration of the original order at the end, so that dot-dropping is still geographic, which means it also undoes `-ao`).
* `-ao` or `--reorder`: Reorder features to put ones with the same properties in sequence, to try to get them to coalesce. You probably don't want to use this.
* `-ac` or `--coalesce`: Coalesce adjacent line and polygon features that have the same properties. You probably don't want to use this.
* `-ao` or `--reorder`: Reorder features to put ones with the same properties in sequence, to try to get them to coalesce. You probably want to use this if you use `--coalesce`.
* `-ac` or `--coalesce`: Coalesce adjacent line and polygon features that have the same properties. This can be useful if you have lots of small polygons with identical attributes and you would like to merge them together.
* `-ar` or `--reverse`: Try reversing the directions of lines to make them coalesce and compress better. You probably don't want to use this.
### Adding calculated attributes
@ -252,6 +257,7 @@ tippecanoe -z5 -o filtered.mbtiles -j '{ "ne_10m_admin_0_countries": [ "all", [
### Setting or disabling tile size limits
* `-M` _bytes_ or `--maximum-tile-bytes=`_bytes_: Use the specified number of _bytes_ as the maximum compressed tile size instead of 500K.
* `-O` _features_ or `--maximum-tile-features=`_features_: Use the specified number of _features_ as the maximum in a tile instead of 200,000.
* `-pf` or `--no-feature-limit`: Don't limit tiles to 200,000 features
* `-pk` or `--no-tile-size-limit`: Don't limit tiles to 500K bytes
* `-pC` or `--no-tile-compression`: Don't compress the PBF vector tile data.

20
csv.cpp
View File

@ -1,4 +1,5 @@
#include "csv.hpp"
#include "text.hpp"
std::vector<std::string> csv_split(const char *s) {
std::vector<std::string> ret;
@ -67,6 +68,12 @@ void readcsv(const char *fn, std::vector<std::string> &header, std::map<std::str
std::string s;
if ((s = csv_getline(f)).size() > 0) {
std::string err = check_utf8(s);
if (err != "") {
fprintf(stderr, "%s: %s\n", fn, err.c_str());
exit(EXIT_FAILURE);
}
header = csv_split(s.c_str());
for (size_t i = 0; i < header.size(); i++) {
@ -74,6 +81,12 @@ void readcsv(const char *fn, std::vector<std::string> &header, std::map<std::str
}
}
while ((s = csv_getline(f)).size() > 0) {
std::string err = check_utf8(s);
if (err != "") {
fprintf(stderr, "%s: %s\n", fn, err.c_str());
exit(EXIT_FAILURE);
}
std::vector<std::string> line = csv_split(s.c_str());
if (line.size() > 0) {
line[0] = csv_dequote(line[0]);
@ -144,7 +157,12 @@ bool is_number(std::string const &s) {
}
}
return true;
if (*cp == '\0') {
return true;
} else {
// Something non-numeric at the end
return false;
}
}
return false;

View File

@ -11,13 +11,17 @@
#include <zlib.h>
#include <math.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <protozero/pbf_reader.hpp>
#include <sys/stat.h>
#include "mvt.hpp"
#include "projection.hpp"
#include "geometry.hpp"
#include "write_json.hpp"
#include "jsonpull/jsonpull.h"
#include "dirtiles.hpp"
int minzoom = 0;
int maxzoom = 32;
@ -140,7 +144,8 @@ void handle(std::string message, int z, unsigned x, unsigned y, int describe, st
}
void decode(char *fname, int z, unsigned x, unsigned y, std::set<std::string> const &to_decode, bool pipeline, bool stats) {
sqlite3 *db;
sqlite3 *db = NULL;
bool isdir = false;
int oz = z;
unsigned ox = x, oy = y;
@ -176,9 +181,18 @@ void decode(char *fname, int z, unsigned x, unsigned y, std::set<std::string> co
perror(fname);
}
if (sqlite3_open(fname, &db) != SQLITE_OK) {
fprintf(stderr, "%s: %s\n", fname, sqlite3_errmsg(db));
exit(EXIT_FAILURE);
struct stat st;
std::vector<zxy> tiles;
if (stat(fname, &st) == 0 && (st.st_mode & S_IFDIR) != 0) {
isdir = true;
db = dirmeta2tmp(fname);
tiles = enumerate_dirtiles(fname);
} else {
if (sqlite3_open(fname, &db) != SQLITE_OK) {
fprintf(stderr, "%s: %s\n", fname, sqlite3_errmsg(db));
exit(EXIT_FAILURE);
}
}
if (z < 0) {
@ -220,49 +234,86 @@ void decode(char *fname, int z, unsigned x, unsigned y, std::set<std::string> co
printf("[\n");
}
const char *sql = "SELECT tile_data, zoom_level, tile_column, tile_row from tiles where zoom_level between ? and ? order by zoom_level, tile_column, tile_row;";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) != SQLITE_OK) {
fprintf(stderr, "%s: select failed: %s\n", fname, sqlite3_errmsg(db));
exit(EXIT_FAILURE);
}
sqlite3_bind_int(stmt, 1, minzoom);
sqlite3_bind_int(stmt, 2, maxzoom);
if (!pipeline && !stats) {
printf("\n}, \"features\": [\n");
}
within = 0;
while (sqlite3_step(stmt) == SQLITE_ROW) {
if (!pipeline && !stats) {
if (within) {
printf(",\n");
if (isdir) {
within = 0;
for (size_t i = 0; i < tiles.size(); i++) {
if (!pipeline && !stats) {
if (within) {
printf(",\n");
}
within = 1;
}
within = 1;
}
if (stats) {
if (within) {
printf(",\n");
if (stats) {
if (within) {
printf(",\n");
}
within = 1;
}
within = 1;
std::string fn = std::string(fname) + "/" + tiles[i].path();
FILE *f = fopen(fn.c_str(), "rb");
if (f == NULL) {
perror(fn.c_str());
exit(EXIT_FAILURE);
}
std::string s;
char buf[2000];
ssize_t n;
while ((n = fread(buf, 1, 2000, f)) > 0) {
s.append(std::string(buf, n));
}
fclose(f);
handle(s, tiles[i].z, tiles[i].x, tiles[i].y, 1, to_decode, pipeline, stats);
}
int len = sqlite3_column_bytes(stmt, 0);
int tz = sqlite3_column_int(stmt, 1);
int tx = sqlite3_column_int(stmt, 2);
int ty = sqlite3_column_int(stmt, 3);
if (tz < 0 || tz >= 32) {
fprintf(stderr, "Impossible zoom level %d in mbtiles\n", tz);
} else {
const char *sql = "SELECT tile_data, zoom_level, tile_column, tile_row from tiles where zoom_level between ? and ? order by zoom_level, tile_column, tile_row;";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) != SQLITE_OK) {
fprintf(stderr, "%s: select failed: %s\n", fname, sqlite3_errmsg(db));
exit(EXIT_FAILURE);
}
ty = (1LL << tz) - 1 - ty;
const char *s = (const char *) sqlite3_column_blob(stmt, 0);
sqlite3_bind_int(stmt, 1, minzoom);
sqlite3_bind_int(stmt, 2, maxzoom);
handle(std::string(s, len), tz, tx, ty, 1, to_decode, pipeline, stats);
within = 0;
while (sqlite3_step(stmt) == SQLITE_ROW) {
if (!pipeline && !stats) {
if (within) {
printf(",\n");
}
within = 1;
}
if (stats) {
if (within) {
printf(",\n");
}
within = 1;
}
int len = sqlite3_column_bytes(stmt, 0);
int tz = sqlite3_column_int(stmt, 1);
int tx = sqlite3_column_int(stmt, 2);
int ty = sqlite3_column_int(stmt, 3);
if (tz < 0 || tz >= 32) {
fprintf(stderr, "Impossible zoom level %d in mbtiles\n", tz);
exit(EXIT_FAILURE);
}
ty = (1LL << tz) - 1 - ty;
const char *s = (const char *) sqlite3_column_blob(stmt, 0);
handle(std::string(s, len), tz, tx, ty, 1, to_decode, pipeline, stats);
}
sqlite3_finalize(stmt);
}
if (!pipeline && !stats) {
@ -271,8 +322,6 @@ void decode(char *fname, int z, unsigned x, unsigned y, std::set<std::string> co
if (stats) {
printf("]\n");
}
sqlite3_finalize(stmt);
} else {
int handled = 0;
while (z >= 0 && !handled) {

View File

@ -2,15 +2,18 @@
#include <fstream>
#include <sstream>
#include <string>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sqlite3.h>
#include "jsonpull/jsonpull.h"
#include "dirtiles.hpp"
std::string dir_read_tile(std::string pbfPath) {
std::ifstream pbfFile(pbfPath, std::ios::in | std::ios::binary);
std::string dir_read_tile(std::string base, struct zxy tile) {
std::ifstream pbfFile(base + "/" + tile.path(), std::ios::in | std::ios::binary);
std::ostringstream contents;
contents << pbfFile.rdbuf();
pbfFile.close();
@ -39,7 +42,7 @@ void dir_write_tile(const char *outdir, int z, int tx, int ty, std::string const
pbfFile.close();
}
bool numeric(const char *s) {
static bool numeric(const char *s) {
if (*s == '\0') {
return false;
}
@ -51,7 +54,7 @@ bool numeric(const char *s) {
return true;
}
bool pbfname(const char *s) {
static bool pbfname(const char *s) {
while (*s >= '0' && *s <= '9') {
s++;
}
@ -59,25 +62,53 @@ bool pbfname(const char *s) {
return strcmp(s, ".pbf") == 0;
}
void check_dir(const char *dir, bool rm) {
void check_dir(const char *dir, bool force, bool forcetable) {
struct stat st;
std::string meta = std::string(dir) + "/" + "metadata.json";
if (rm) {
if (force) {
unlink(meta.c_str()); // error OK since it may not exist;
} else {
if (stat(meta.c_str(), &st) == 0) {
fprintf(stderr, "%s: file exists\n", meta.c_str());
exit(EXIT_FAILURE);
if (!forcetable) {
exit(EXIT_FAILURE);
}
}
}
DIR *d1 = opendir(dir);
if (forcetable) {
// Don't clear existing tiles
return;
}
std::vector<zxy> tiles = enumerate_dirtiles(dir);
for (size_t i = 0; i < tiles.size(); i++) {
std::string fn = std::string(dir) + "/" + tiles[i].path();
if (force) {
if (unlink(fn.c_str()) != 0) {
perror(fn.c_str());
exit(EXIT_FAILURE);
}
} else {
fprintf(stderr, "%s: file exists\n", fn.c_str());
exit(EXIT_FAILURE);
}
}
}
std::vector<zxy> enumerate_dirtiles(const char *fname) {
std::vector<zxy> tiles;
DIR *d1 = opendir(fname);
if (d1 != NULL) {
struct dirent *dp;
while ((dp = readdir(d1)) != NULL) {
if (numeric(dp->d_name)) {
std::string z = std::string(dir) + "/" + dp->d_name;
std::string z = std::string(fname) + "/" + dp->d_name;
int tz = atoi(dp->d_name);
DIR *d2 = opendir(z.c_str());
if (d2 == NULL) {
@ -89,6 +120,7 @@ void check_dir(const char *dir, bool rm) {
while ((dp2 = readdir(d2)) != NULL) {
if (numeric(dp2->d_name)) {
std::string x = z + "/" + dp2->d_name;
int tx = atoi(dp2->d_name);
DIR *d3 = opendir(x.c_str());
if (d3 == NULL) {
@ -99,17 +131,8 @@ void check_dir(const char *dir, bool rm) {
struct dirent *dp3;
while ((dp3 = readdir(d3)) != NULL) {
if (pbfname(dp3->d_name)) {
std::string y = x + "/" + dp3->d_name;
if (rm) {
if (unlink(y.c_str()) != 0) {
perror(y.c_str());
exit(EXIT_FAILURE);
}
} else {
fprintf(stderr, "%s: file exists\n", y.c_str());
exit(EXIT_FAILURE);
}
int ty = atoi(dp3->d_name);
tiles.push_back(zxy(tz, tx, ty));
}
}
@ -123,4 +146,54 @@ void check_dir(const char *dir, bool rm) {
closedir(d1);
}
std::sort(tiles.begin(), tiles.end());
return tiles;
}
sqlite3 *dirmeta2tmp(const char *fname) {
sqlite3 *db;
char *err = NULL;
if (sqlite3_open("", &db) != SQLITE_OK) {
fprintf(stderr, "Temporary db: %s\n", sqlite3_errmsg(db));
exit(EXIT_FAILURE);
}
if (sqlite3_exec(db, "CREATE TABLE metadata (name text, value text);", NULL, NULL, &err) != SQLITE_OK) {
fprintf(stderr, "Create metadata table: %s\n", err);
exit(EXIT_FAILURE);
}
std::string name = fname;
name += "/metadata.json";
FILE *f = fopen(name.c_str(), "r");
if (f == NULL) {
perror(name.c_str());
exit(EXIT_FAILURE);
}
json_pull *jp = json_begin_file(f);
json_object *o = json_read_tree(jp);
if (o->type != JSON_HASH) {
fprintf(stderr, "%s: bad metadata format\n", name.c_str());
exit(EXIT_FAILURE);
}
for (size_t i = 0; i < o->length; i++) {
if (o->keys[i]->type != JSON_STRING || o->values[i]->type != JSON_STRING) {
fprintf(stderr, "%s: non-string in metadata\n", name.c_str());
}
char *sql = sqlite3_mprintf("INSERT INTO metadata (name, value) VALUES (%Q, %Q);", o->keys[i]->string, o->values[i]->string);
if (sqlite3_exec(db, sql, NULL, NULL, &err) != SQLITE_OK) {
fprintf(stderr, "set %s in metadata: %s\n", o->keys[i]->string, err);
}
sqlite3_free(sql);
}
json_end(jp);
fclose(f);
return db;
}

View File

@ -1,12 +1,47 @@
#include <string>
#include <vector>
#ifndef DIRTILES_HPP
#define DIRTILES_HPP
std::string dir_read_tile(std::string pbfPath);
void dir_write_tile(const char *outdir, int z, int tx, int ty, std::string const &pbf);
void check_dir(const char *d, bool rm);
void check_dir(const char *d, bool force, bool forcetable);
struct zxy {
long long z;
long long x;
long long y;
zxy(int _z, int _x, int _y)
: z(_z), x(_x), y(_y) {
}
bool operator<(const zxy &other) const {
if (z < other.z) {
return true;
}
if (z == other.z) {
if (x < other.x) {
return true;
}
if (x == other.x) {
if (y > other.y) {
return true; // reversed for TMS
}
}
}
return false;
}
std::string path() {
return std::to_string(z) + "/" + std::to_string(x) + "/" + std::to_string(y) + ".pbf";
}
};
std::vector<zxy> enumerate_dirtiles(const char *fname);
sqlite3 *dirmeta2tmp(const char *fname);
std::string dir_read_tile(std::string pbfPath, struct zxy tile);
#endif

120
geocsv.cpp Normal file
View File

@ -0,0 +1,120 @@
#include <stdlib.h>
#include <algorithm>
#include "geocsv.hpp"
#include "mvt.hpp"
#include "serial.hpp"
#include "projection.hpp"
#include "main.hpp"
#include "text.hpp"
#include "csv.hpp"
#include "milo/dtoa_milo.h"
void parse_geocsv(std::vector<struct serialization_state> &sst, std::string fname, int layer, std::string layername) {
FILE *f = fopen(fname.c_str(), "r");
if (f == NULL) {
perror(fname.c_str());
exit(EXIT_FAILURE);
}
std::string s;
std::vector<std::string> header;
ssize_t latcol = -1, loncol = -1;
if ((s = csv_getline(f)).size() > 0) {
std::string err = check_utf8(s);
if (err != "") {
fprintf(stderr, "%s: %s\n", fname.c_str(), err.c_str());
exit(EXIT_FAILURE);
}
header = csv_split(s.c_str());
for (size_t i = 0; i < header.size(); i++) {
header[i] = csv_dequote(header[i]);
std::string lower(header[i]);
std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);
if (lower == "y" || lower == "lat" || (lower.find("latitude") != std::string::npos)) {
latcol = i;
}
if (lower == "x" || lower == "lon" || lower == "lng" || lower == "long" || (lower.find("longitude") != std::string::npos)) {
loncol = i;
}
}
}
if (latcol < 0 || loncol < 0) {
fprintf(stderr, "%s: Can't find \"lat\" and \"lon\" columns\n", fname.c_str());
exit(EXIT_FAILURE);
}
size_t seq = 0;
while ((s = csv_getline(f)).size() > 0) {
std::string err = check_utf8(s);
if (err != "") {
fprintf(stderr, "%s: %s\n", fname.c_str(), err.c_str());
exit(EXIT_FAILURE);
}
seq++;
std::vector<std::string> line = csv_split(s.c_str());
if (line.size() != header.size()) {
fprintf(stderr, "%s:%zu: Mismatched column count: %zu in line, %zu in header\n", fname.c_str(), seq, line.size(), header.size());
exit(EXIT_FAILURE);
}
double lon = atof(line[loncol].c_str());
double lat = atof(line[latcol].c_str());
long long x, y;
projection->project(lon, lat, 32, &x, &y);
drawvec dv;
dv.push_back(draw(VT_MOVETO, x, y));
std::vector<std::string> full_keys;
std::vector<serial_val> full_values;
for (size_t i = 0; i < line.size(); i++) {
if (i != (size_t) latcol && i != (size_t) loncol) {
line[i] = csv_dequote(line[i]);
serial_val sv;
if (is_number(line[i])) {
sv.type = mvt_double;
} else {
sv.type = mvt_string;
}
sv.s = line[i];
full_keys.push_back(header[i]);
full_values.push_back(sv);
}
}
serial_feature sf;
sf.layer = layer;
sf.layername = layername;
sf.segment = sst[0].segment;
sf.has_id = false;
sf.id = 0;
sf.has_tippecanoe_minzoom = false;
sf.has_tippecanoe_maxzoom = false;
sf.feature_minzoom = false;
sf.seq = *(sst[0].layer_seq);
sf.geometry = dv;
sf.t = 1; // POINT
sf.full_keys = full_keys;
sf.full_values = full_values;
sf.m = sf.full_values.size();
serialize_feature(&sst[0], sf);
}
if (fclose(f) != 0) {
perror("fclose");
exit(EXIT_FAILURE);
}
}

13
geocsv.hpp Normal file
View File

@ -0,0 +1,13 @@
#ifndef GEOCSV_HPP
#define GEOCSV_HPP
#include <stdio.h>
#include <set>
#include <map>
#include <string>
#include "mbtiles.hpp"
#include "serial.hpp"
void parse_geocsv(std::vector<struct serialization_state> &sst, std::string fname, int layer, std::string layername);
#endif

View File

@ -278,7 +278,7 @@ void parse_json(struct serialization_state *sst, json_pull *jp, int layer, std::
if (is_geometry) {
if (j->parent != NULL) {
if (j->parent->type == JSON_ARRAY) {
if (j->parent->type == JSON_ARRAY && j->parent->parent != NULL) {
if (j->parent->parent->type == JSON_HASH) {
json_object *geometries = json_hash_get(j->parent->parent, "geometries");
if (geometries != NULL) {

View File

@ -9,6 +9,7 @@
#include <vector>
#include "jsonpull/jsonpull.h"
#include "csv.hpp"
#include "text.hpp"
int fail = EXIT_SUCCESS;
bool wrap = false;
@ -208,6 +209,12 @@ void join_csv(json_object *j) {
exit(EXIT_FAILURE);
}
std::string err = check_utf8(s);
if (err != "") {
fprintf(stderr, "%s\n", err.c_str());
exit(EXIT_FAILURE);
}
header = csv_split(s.c_str());
for (size_t i = 0; i < header.size(); i++) {
@ -264,6 +271,12 @@ void join_csv(json_object *j) {
break;
}
std::string err = check_utf8(s);
if (err != "") {
fprintf(stderr, "%s\n", err.c_str());
exit(EXIT_FAILURE);
}
fields = csv_split(s.c_str());
for (size_t i = 0; i < fields.size(); i++) {
@ -380,7 +393,7 @@ void process(FILE *fp, const char *fname) {
int is_geometry = 1;
if (j->parent != NULL) {
if (j->parent->type == JSON_ARRAY) {
if (j->parent->type == JSON_ARRAY && j->parent->parent != NULL) {
if (j->parent->parent->type == JSON_HASH) {
json_object *geometries = json_hash_get(j->parent->parent, "geometries");
if (geometries != NULL) {

View File

@ -51,6 +51,7 @@
#include "main.hpp"
#include "geojson.hpp"
#include "geobuf.hpp"
#include "geocsv.hpp"
#include "geometry.hpp"
#include "serial.hpp"
#include "options.hpp"
@ -67,6 +68,8 @@ int quiet_progress = 0;
int geometry_scale = 0;
double simplification = 1;
size_t max_tile_size = 500000;
size_t max_tile_features = 200000;
int cluster_distance = 0;
int prevent[256];
int additional[256];
@ -1140,14 +1143,29 @@ int read_input(std::vector<source> &sources, char *fname, int maxzoom, int minzo
std::string trunc = std::string(use);
// Trim .json or .mbtiles from the name
ssize_t cp;
cp = trunc.find(".json");
if (cp >= 0) {
trunc = trunc.substr(0, cp);
}
cp = trunc.find(".mbtiles");
if (cp >= 0) {
trunc = trunc.substr(0, cp);
while (true) {
ssize_t cp;
cp = trunc.find(".json");
if (cp >= 0 && (size_t) cp + 5 == trunc.size()) {
trunc = trunc.substr(0, cp);
continue;
}
cp = trunc.find(".geojson");
if (cp >= 0 && (size_t) cp + 8 == trunc.size()) {
trunc = trunc.substr(0, cp);
continue;
}
cp = trunc.find(".geobuf");
if (cp >= 0 && (size_t) cp + 7 == trunc.size()) {
trunc = trunc.substr(0, cp);
continue;
}
cp = trunc.find(".mbtiles");
if (cp >= 0 && (size_t) cp + 8 == trunc.size()) {
trunc = trunc.substr(0, cp);
continue;
}
break;
}
// Trim out characters that can't be part of selector
@ -1275,6 +1293,51 @@ int read_input(std::vector<source> &sources, char *fname, int maxzoom, int minzo
continue;
}
if (sources[source].file.size() > 4 && sources[source].file.substr(sources[source].file.size() - 4) == std::string(".csv")) {
long long layer_seq[CPUS];
double dist_sums[CPUS];
size_t dist_counts[CPUS];
std::vector<struct serialization_state> sst;
sst.resize(CPUS);
// XXX factor out this duplicated setup
for (size_t i = 0; i < CPUS; i++) {
layer_seq[i] = overall_offset;
dist_sums[i] = 0;
dist_counts[i] = 0;
sst[i].fname = reading.c_str();
sst[i].line = 0;
sst[i].layer_seq = &layer_seq[i];
sst[i].progress_seq = &progress_seq;
sst[i].readers = &readers;
sst[i].segment = i;
sst[i].initial_x = &initial_x[i];
sst[i].initial_y = &initial_y[i];
sst[i].initialized = &initialized[i];
sst[i].dist_sum = &dist_sums[i];
sst[i].dist_count = &dist_counts[i];
sst[i].want_dist = guess_maxzoom;
sst[i].maxzoom = maxzoom;
sst[i].filters = prefilter != NULL || postfilter != NULL;
sst[i].uses_gamma = uses_gamma;
sst[i].layermap = &layermaps[i];
sst[i].exclude = exclude;
sst[i].include = include;
sst[i].exclude_all = exclude_all;
sst[i].filter = filter;
sst[i].basezoom = basezoom;
sst[i].attribute_types = attribute_types;
}
parse_geocsv(sst, sources[source].file, layer, sources[layer].layer);
overall_offset = layer_seq[0];
checkdisk(&readers);
continue;
}
struct stat st;
char *map = NULL;
off_t off = 0;
@ -2209,6 +2272,7 @@ int main(int argc, char **argv) {
{"base-zoom", required_argument, 0, 'B'},
{"drop-lines", no_argument, &additional[A_LINE_DROP], 1},
{"drop-polygons", no_argument, &additional[A_POLYGON_DROP], 1},
{"cluster-distance", required_argument, 0, 'K'},
{"Dropping a fraction of features to keep under tile size limits", 0, 0, 0},
{"drop-densest-as-needed", no_argument, &additional[A_DROP_DENSEST_AS_NEEDED], 1},
@ -2216,6 +2280,7 @@ int main(int argc, char **argv) {
{"drop-smallest-as-needed", no_argument, &additional[A_DROP_SMALLEST_AS_NEEDED], 1},
{"coalesce-smallest-as-needed", no_argument, &additional[A_COALESCE_SMALLEST_AS_NEEDED], 1},
{"force-feature-limit", no_argument, &prevent[P_DYNAMIC_DROP], 1},
{"cluster-densest-as-needed", no_argument, &additional[A_CLUSTER_DENSEST_AS_NEEDED], 1},
{"Dropping tightly overlapping features", 0, 0, 0},
{"gamma", required_argument, 0, 'g'},
@ -2254,6 +2319,7 @@ int main(int argc, char **argv) {
{"Setting or disabling tile size limits", 0, 0, 0},
{"maximum-tile-bytes", required_argument, 0, 'M'},
{"maximum-tile-features", required_argument, 0, 'O'},
{"no-feature-limit", no_argument, &prevent[P_FEATURE_LIMIT], 1},
{"no-tile-size-limit", no_argument, &prevent[P_KILOBYTE_LIMIT], 1},
{"no-tile-compression", no_argument, &prevent[P_TILE_COMPRESSION], 1},
@ -2385,6 +2451,14 @@ int main(int argc, char **argv) {
}
break;
case 'K':
cluster_distance = atoi(optarg);
if (cluster_distance > 255) {
fprintf(stderr, "%s: --cluster-distance %d is too big; limit is 255\n", argv[0], cluster_distance);
exit(EXIT_FAILURE);
}
break;
case 'd':
full_detail = atoi(optarg);
break;
@ -2540,6 +2614,10 @@ int main(int argc, char **argv) {
max_tile_size = atoll(optarg);
break;
case 'O':
max_tile_features = atoll(optarg);
break;
case 'c':
postfilter = optarg;
break;
@ -2664,10 +2742,7 @@ int main(int argc, char **argv) {
outdb = mbtiles_open(out_mbtiles, argv, forcetable);
}
if (out_dir != NULL) {
if (force) {
check_dir(out_dir, true);
}
check_dir(out_dir, false);
check_dir(out_dir, force, forcetable);
}
int ret = EXIT_SUCCESS;

View File

@ -27,6 +27,8 @@ extern size_t CPUS;
extern size_t TEMP_FILES;
extern size_t max_tile_size;
extern size_t max_tile_features;
extern int cluster_distance;
int mkstemp_cloexec(char *name);
FILE *fopen_oflag(const char *name, const char *mode, int oflag);

View File

@ -1,6 +1,6 @@
.TH tippecanoe
.PP
Builds vector tilesets \[la]https://www.mapbox.com/developers/vector-tiles/\[ra] from large (or small) collections of GeoJSON \[la]http://geojson.org/\[ra] or Geobuf \[la]https://github.com/mapbox/geobuf\[ra] features,
Builds vector tilesets \[la]https://www.mapbox.com/developers/vector-tiles/\[ra] from large (or small) collections of GeoJSON \[la]http://geojson.org/\[ra], Geobuf \[la]https://github.com/mapbox/geobuf\[ra], or CSV \[la]https://en.wikipedia.org/wiki/Comma-separated_values\[ra] features,
like these \[la]MADE_WITH.md\[ra]\&.
.PP
[Build Status](https://travis\-ci.org/mapbox/tippecanoe.svg) \[la]https://travis-ci.org/mapbox/tippecanoe\[ra]
@ -132,13 +132,17 @@ or if metadata fields can't be set. You probably don't want to use this.
.IP \(bu 2
\fIname\fP\fB\fC\&.json\fR or \fIname\fP\fB\fC\&.geojson\fR: Read the named GeoJSON input file into a layer called \fIname\fP\&.
.IP \(bu 2
\fIname\fP\fB\fC\&.geobuf\fR or \fIname\fP\fB\fC\&.geobuf\fR: Read the named Geobuf input file into a layer called \fIname\fP\&.
\fIname\fP\fB\fC\&.geobuf\fR: Read the named Geobuf input file into a layer called \fIname\fP\&.
.IP \(bu 2
\fIname\fP\fB\fC\&.csv\fR: Read the named CSV input file into a layer called \fIname\fP\&.
.IP \(bu 2
\fB\fC\-l\fR \fIname\fP or \fB\fC\-\-layer=\fR\fIname\fP: Use the specified layer name instead of deriving a name from the input filename or output tileset. If there are multiple input files
specified, the files are all merged into the single named layer, even if they try to specify individual names with \fB\fC\-L\fR\&.
.IP \(bu 2
\fB\fC\-L\fR \fIname\fP\fB\fC:\fR\fIfile.json\fP or \fB\fC\-\-named\-layer=\fR\fIname\fP\fB\fC:\fR\fIfile.json\fP: Specify layer names for individual files. If your shell supports it, you can use a subshell redirect like \fB\fC\-L\fR \fIname\fP\fB\fC:<(cat dir/*.json)\fR to specify a layer name for the output of streamed input.
.RE
.PP
CSV input files currently support only Point geometries, from columns named \fB\fClatitude\fR, \fB\fClongitude\fR, \fB\fClat\fR, \fB\fClon\fR, \fB\fClong\fR, \fB\fClng\fR, \fB\fCx\fR, or \fB\fCy\fR\&.
.SS Parallel processing of input
.RS
.IP \(bu 2
@ -229,6 +233,8 @@ compensate for the larger marker, or \fB\fC\-Bf\fR\fInumber\fP to allow at most
\fB\fC\-al\fR or \fB\fC\-\-drop\-lines\fR: Let "dot" dropping at lower zooms apply to lines too
.IP \(bu 2
\fB\fC\-ap\fR or \fB\fC\-\-drop\-polygons\fR: Let "dot" dropping at lower zooms apply to polygons too
.IP \(bu 2
\fB\fC\-K\fR \fIdistance\fP or \fB\fC\-\-cluster\-distance=\fR\fIdistance\fP: Cluster points (as with \fB\fC\-\-cluster\-densest\-as\-needed\fR, but without the experimental discovery process) that are approximately within \fIdistance\fP of each other. The units are tile coordinates within a nominally 256\-pixel tile, so the maximum value of 255 allows only one feature per tile. Values around 20 are probably appropriate for typical marker sizes.
.RE
.SS Dropping a fraction of features to keep under tile size limits
.RS
@ -242,6 +248,8 @@ compensate for the larger marker, or \fB\fC\-Bf\fR\fInumber\fP to allow at most
\fB\fC\-aN\fR or \fB\fC\-\-coalesce\-smallest\-as\-needed\fR: Dynamically combine the smallest features (physically smallest: the shortest lines or the smallest polygons) from each zoom level into other nearby features to keep large tiles under the 500K size limit. This option will not work for point features, and will probably not help very much with LineStrings. It is mostly intended for polygons, to maintain the full original area covered by polygons while still reducing the feature count somehow. The attributes of the small polygons are \fInot\fP preserved into the combined features, only their geometry.
.IP \(bu 2
\fB\fC\-pd\fR or \fB\fC\-\-force\-feature\-limit\fR: Dynamically drop some fraction of features from large tiles to keep them under the 500K size limit. It will probably look ugly at the tile boundaries. (This is like \fB\fC\-ad\fR but applies to each tile individually, not to the entire zoom level.) You probably don't want to use this.
.IP \(bu 2
\fB\fC\-aC\fR or \fB\fC\-\-cluster\-densest\-as\-needed\fR: If a tile is too large, try to reduce its size by increasing the minimum spacing between features, and leaving one placeholder feature from each group. The remaining feature will be given a \fB\fC"cluster": true\fR attribute to indicate that it represents a cluster and a \fB\fC"point_count"\fR attribute to indicate the number of features that were clustered into it.
.RE
.SS Dropping tightly overlapping features
.RS
@ -283,9 +291,9 @@ the line or polygon within one tile unit of its proper location. You can probabl
.IP \(bu 2
\fB\fC\-pi\fR or \fB\fC\-\-preserve\-input\-order\fR: Preserve the original input order of features as the drawing order instead of ordering geographically. (This is implemented as a restoration of the original order at the end, so that dot\-dropping is still geographic, which means it also undoes \fB\fC\-ao\fR).
.IP \(bu 2
\fB\fC\-ao\fR or \fB\fC\-\-reorder\fR: Reorder features to put ones with the same properties in sequence, to try to get them to coalesce. You probably don't want to use this.
\fB\fC\-ao\fR or \fB\fC\-\-reorder\fR: Reorder features to put ones with the same properties in sequence, to try to get them to coalesce. You probably want to use this if you use \fB\fC\-\-coalesce\fR\&.
.IP \(bu 2
\fB\fC\-ac\fR or \fB\fC\-\-coalesce\fR: Coalesce adjacent line and polygon features that have the same properties. You probably don't want to use this.
\fB\fC\-ac\fR or \fB\fC\-\-coalesce\fR: Coalesce adjacent line and polygon features that have the same properties. This can be useful if you have lots of small polygons with identical attributes and you would like to merge them together.
.IP \(bu 2
\fB\fC\-ar\fR or \fB\fC\-\-reverse\fR: Try reversing the directions of lines to make them coalesce and compress better. You probably don't want to use this.
.RE
@ -304,6 +312,8 @@ the line or polygon within one tile unit of its proper location. You can probabl
.IP \(bu 2
\fB\fC\-M\fR \fIbytes\fP or \fB\fC\-\-maximum\-tile\-bytes=\fR\fIbytes\fP: Use the specified number of \fIbytes\fP as the maximum compressed tile size instead of 500K.
.IP \(bu 2
\fB\fC\-O\fR \fIfeatures\fP or \fB\fC\-\-maximum\-tile\-features=\fR\fIfeatures\fP: Use the specified number of \fIfeatures\fP as the maximum in a tile instead of 200,000.
.IP \(bu 2
\fB\fC\-pf\fR or \fB\fC\-\-no\-feature\-limit\fR: Don't limit tiles to 200,000 features
.IP \(bu 2
\fB\fC\-pk\fR or \fB\fC\-\-no\-tile\-size\-limit\fR: Don't limit tiles to 500K bytes

View File

@ -11,6 +11,7 @@
#include <string>
#include <set>
#include <map>
#include <sys/stat.h>
#include "mvt.hpp"
#include "mbtiles.hpp"
#include "text.hpp"
@ -487,41 +488,47 @@ void mbtiles_write_metadata(sqlite3 *outdb, const char *outdir, const char *fnam
if (outdir != NULL) {
std::string metadata = std::string(outdir) + "/metadata.json";
FILE *fp = fopen(metadata.c_str(), "w");
if (fp == NULL) {
perror(metadata.c_str());
exit(EXIT_FAILURE);
}
fprintf(fp, "{\n");
sqlite3_stmt *stmt;
bool first = true;
if (sqlite3_prepare_v2(db, "SELECT name, value from metadata;", -1, &stmt, NULL) == SQLITE_OK) {
while (sqlite3_step(stmt) == SQLITE_ROW) {
std::string key, value;
const char *k = (const char *) sqlite3_column_text(stmt, 0);
const char *v = (const char *) sqlite3_column_text(stmt, 1);
if (k == NULL || v == NULL) {
fprintf(stderr, "Corrupt mbtiles file: null metadata\n");
exit(EXIT_FAILURE);
}
quote(key, k);
quote(value, v);
if (!first) {
fprintf(fp, ",\n");
}
fprintf(fp, " \"%s\": \"%s\"", key.c_str(), value.c_str());
first = false;
struct stat st;
if (stat(metadata.c_str(), &st) == 0) {
// Leave existing metadata in place with --allow-existing
} else {
FILE *fp = fopen(metadata.c_str(), "w");
if (fp == NULL) {
perror(metadata.c_str());
exit(EXIT_FAILURE);
}
sqlite3_finalize(stmt);
}
fprintf(fp, "\n}\n");
fclose(fp);
fprintf(fp, "{\n");
sqlite3_stmt *stmt;
bool first = true;
if (sqlite3_prepare_v2(db, "SELECT name, value from metadata;", -1, &stmt, NULL) == SQLITE_OK) {
while (sqlite3_step(stmt) == SQLITE_ROW) {
std::string key, value;
const char *k = (const char *) sqlite3_column_text(stmt, 0);
const char *v = (const char *) sqlite3_column_text(stmt, 1);
if (k == NULL || v == NULL) {
fprintf(stderr, "Corrupt mbtiles file: null metadata\n");
exit(EXIT_FAILURE);
}
quote(key, k);
quote(value, v);
if (!first) {
fprintf(fp, ",\n");
}
fprintf(fp, " \"%s\": \"%s\"", key.c_str(), value.c_str());
first = false;
}
sqlite3_finalize(stmt);
}
fprintf(fp, "\n}\n");
fclose(fp);
}
}
if (outdb == NULL) {
@ -554,7 +561,7 @@ std::map<std::string, layermap_entry> merge_layermaps(std::vector<std::map<std::
for (size_t i = 0; i < maps.size(); i++) {
for (auto map = maps[i].begin(); map != maps[i].end(); ++map) {
if (map->second.points + map->second.lines + map->second.polygons == 0) {
if (map->second.points + map->second.lines + map->second.polygons + map->second.retain == 0) {
continue;
}

View File

@ -29,6 +29,7 @@ struct layermap_entry {
size_t points = 0;
size_t lines = 0;
size_t polygons = 0;
size_t retain = 0; // keep for tilestats, even if no features directly here
layermap_entry(size_t _id) {
id = _id;

378
mvt.cpp
View File

@ -7,11 +7,14 @@
#include <errno.h>
#include <limits.h>
#include <ctype.h>
#include <vtzero/vector_tile.hpp>
#include <vtzero/builder.hpp>
#include <vtzero/index.hpp>
#include "mvt.hpp"
#include "geometry.hpp"
#include "protozero/varint.hpp"
#include "protozero/pbf_reader.hpp"
#include "protozero/pbf_writer.hpp"
#include <protozero/varint.hpp>
#include <protozero/pbf_reader.hpp>
#include <protozero/pbf_writer.hpp>
#include "milo/dtoa_milo.h"
mvt_geometry::mvt_geometry(int nop, long long nx, long long ny) {
@ -84,6 +87,56 @@ int compress(std::string const &input, std::string &output) {
return 0;
}
struct geom_decoder {
std::vector<mvt_geometry> geometry;
int type;
int state;
void points_begin(const uint32_t) {
type = mvt_point;
}
void points_point(const vtzero::point point) {
geometry.push_back(mvt_geometry(mvt_moveto, point.x, point.y));
}
void points_end() {
}
void linestring_begin(const uint32_t) {
type = mvt_linestring;
state = mvt_moveto;
}
void linestring_point(const vtzero::point point) {
geometry.push_back(mvt_geometry(state, point.x, point.y));
state = mvt_lineto;
}
void linestring_end() {
}
void ring_begin(const uint32_t) {
type = mvt_polygon;
state = mvt_moveto;
}
void ring_point(const vtzero::point point) {
geometry.push_back(mvt_geometry(state, point.x, point.y));
state = mvt_lineto;
}
void ring_end(const vtzero::ring_type) {
if (geometry.size() > 0) {
geometry.pop_back();
}
geometry.push_back(mvt_geometry(mvt_closepath, 0, 0));
}
};
bool mvt_tile::decode(std::string &message, bool &was_compressed) {
layers.clear();
std::string src;
@ -99,177 +152,203 @@ bool mvt_tile::decode(std::string &message, bool &was_compressed) {
}
protozero::pbf_reader reader(src);
vtzero::vector_tile vtz{src};
while (reader.next()) {
switch (reader.tag()) {
case 3: /* layer */
{
protozero::pbf_reader layer_reader(reader.get_message());
mvt_layer layer;
while (auto vtz_layer = vtz.next_layer()) {
mvt_layer layer;
while (layer_reader.next()) {
switch (layer_reader.tag()) {
case 1: /* name */
layer.name = layer_reader.get_string();
layer.name = vtz_layer.name().to_string();
layer.extent = vtz_layer.extent();
layer.version = vtz_layer.version();
while (auto vtz_feature = vtz_layer.next_feature()) {
mvt_feature feature;
if (vtz_feature.has_id()) {
feature.has_id = true;
feature.id = vtz_feature.id();
}
while (auto vtz_property = vtz_feature.next_property()) {
std::string pkey = vtz_property.key().to_string();
vtzero::property_value pvalue = vtz_property.value();
mvt_value value;
switch (pvalue.type()) {
case vtzero::property_value_type::string_value:
value.type = mvt_string;
value.string_value = pvalue.string_value().to_string();
break;
case 3: /* key */
layer.keys.push_back(layer_reader.get_string());
case vtzero::property_value_type::double_value:
value.type = mvt_double;
value.numeric_value.double_value = pvalue.double_value();
break;
case 4: /* value */
{
protozero::pbf_reader value_reader(layer_reader.get_message());
mvt_value value;
while (value_reader.next()) {
switch (value_reader.tag()) {
case 1: /* string */
value.type = mvt_string;
value.string_value = value_reader.get_string();
break;
case 2: /* float */
value.type = mvt_float;
value.numeric_value.float_value = value_reader.get_float();
break;
case 3: /* double */
value.type = mvt_double;
value.numeric_value.double_value = value_reader.get_double();
break;
case 4: /* int */
value.type = mvt_int;
value.numeric_value.int_value = value_reader.get_int64();
break;
case 5: /* uint */
value.type = mvt_uint;
value.numeric_value.uint_value = value_reader.get_uint64();
break;
case 6: /* sint */
value.type = mvt_sint;
value.numeric_value.sint_value = value_reader.get_sint64();
break;
case 7: /* bool */
value.type = mvt_bool;
value.numeric_value.bool_value = value_reader.get_bool();
break;
default:
value_reader.skip();
break;
}
}
layer.values.push_back(value);
break;
}
case 5: /* extent */
layer.extent = layer_reader.get_uint32();
case vtzero::property_value_type::float_value:
value.type = mvt_float;
value.numeric_value.float_value = pvalue.float_value();
break;
case 15: /* version */
layer.version = layer_reader.get_uint32();
case vtzero::property_value_type::int_value:
value.type = mvt_int;
value.numeric_value.int_value = pvalue.int_value();
break;
case 2: /* feature */
{
protozero::pbf_reader feature_reader(layer_reader.get_message());
mvt_feature feature;
std::vector<uint32_t> geoms;
while (feature_reader.next()) {
switch (feature_reader.tag()) {
case 1: /* id */
feature.id = feature_reader.get_uint64();
feature.has_id = true;
break;
case 2: /* tag */
{
auto pi = feature_reader.get_packed_uint32();
for (auto it = pi.first; it != pi.second; ++it) {
feature.tags.push_back(*it);
}
break;
}
case 3: /* feature type */
feature.type = feature_reader.get_enum();
break;
case 4: /* geometry */
{
auto pi = feature_reader.get_packed_uint32();
for (auto it = pi.first; it != pi.second; ++it) {
geoms.push_back(*it);
}
break;
}
default:
feature_reader.skip();
break;
}
}
long long px = 0, py = 0;
for (size_t g = 0; g < geoms.size(); g++) {
uint32_t geom = geoms[g];
uint32_t op = geom & 7;
uint32_t count = geom >> 3;
if (op == mvt_moveto || op == mvt_lineto) {
for (size_t k = 0; k < count && g + 2 < geoms.size(); k++) {
px += protozero::decode_zigzag32(geoms[g + 1]);
py += protozero::decode_zigzag32(geoms[g + 2]);
g += 2;
feature.geometry.push_back(mvt_geometry(op, px, py));
}
} else {
feature.geometry.push_back(mvt_geometry(op, 0, 0));
}
}
layer.features.push_back(feature);
case vtzero::property_value_type::sint_value:
value.type = mvt_sint;
value.numeric_value.sint_value = pvalue.sint_value();
break;
case vtzero::property_value_type::uint_value:
value.type = mvt_uint;
value.numeric_value.uint_value = pvalue.uint_value();
break;
case vtzero::property_value_type::bool_value:
value.type = mvt_bool;
value.numeric_value.bool_value = pvalue.bool_value();
break;
}
default:
layer_reader.skip();
break;
fprintf(stderr, "Unknown attribute type in tile\n");
exit(EXIT_FAILURE);
}
layer.tag(feature, pkey, value);
}
for (size_t i = 0; i < layer.keys.size(); i++) {
layer.key_map.insert(std::pair<std::string, size_t>(layer.keys[i], i));
}
for (size_t i = 0; i < layer.values.size(); i++) {
layer.value_map.insert(std::pair<mvt_value, size_t>(layer.values[i], i));
}
geom_decoder gd;
vtzero::decode_geometry(vtz_feature.geometry(), gd);
feature.geometry = gd.geometry;
feature.type = gd.type;
layers.push_back(layer);
break;
layer.features.push_back(feature);
}
default:
reader.skip();
break;
}
layers.push_back(layer);
}
return true;
}
std::string mvt_tile::encode() {
std::string data;
void preset_attrs(mvt_layer &, mvt_feature &feature, vtzero::key_index<std::unordered_map> &, vtzero::feature_builder &out) {
if (feature.has_id) {
out.set_id(feature.id);
}
}
void copy_attrs(mvt_layer &layer, mvt_feature &feature, vtzero::key_index<std::unordered_map> &index, vtzero::feature_builder &out) {
for (size_t i = 0; i + 1 < feature.tags.size(); i += 2) {
std::string key = layer.keys[feature.tags[i]];
mvt_value &pbv = layer.values[feature.tags[i + 1]];
const auto k = index(key);
if (pbv.type == mvt_string) {
out.add_property(k, pbv.string_value);
} else if (pbv.type == mvt_float) {
out.add_property(k, pbv.numeric_value.float_value);
} else if (pbv.type == mvt_double) {
out.add_property(k, pbv.numeric_value.double_value);
} else if (pbv.type == mvt_int) {
out.add_property(k, pbv.numeric_value.int_value);
} else if (pbv.type == mvt_uint) {
out.add_property(k, pbv.numeric_value.uint_value);
} else if (pbv.type == mvt_sint) {
out.add_property(k, pbv.numeric_value.sint_value);
} else if (pbv.type == mvt_bool) {
out.add_property(k, pbv.numeric_value.bool_value);
} else {
fprintf(stderr, "Unhandled attribute type %d\n", pbv.type);
exit(EXIT_FAILURE);
}
}
}
std::string mvt_tile::encode() {
#if 1
vtzero::tile_builder vtz_tile;
for (size_t i = 0; i < layers.size(); i++) {
vtzero::layer_builder vtz_layer{vtz_tile, layers[i].name, (unsigned) layers[i].version, (unsigned) layers[i].extent};
vtzero::key_index<std::unordered_map> vtz_index{vtz_layer};
// vtz_layer.set_version(layers[i].version);
// vtz_layer.set_extent(layers[i].extent);
for (size_t j = 0; j < layers[i].features.size(); j++) {
if (layers[i].features[j].type == mvt_point) {
vtzero::point_feature_builder vtz_feature{vtz_layer};
preset_attrs(layers[i], layers[i].features[j], vtz_index, vtz_feature);
vtz_feature.add_points(layers[i].features[j].geometry.size());
for (size_t k = 0; k < layers[i].features[j].geometry.size(); k++) {
vtz_feature.set_point(layers[i].features[j].geometry[k].x,
layers[i].features[j].geometry[k].y);
}
copy_attrs(layers[i], layers[i].features[j], vtz_index, vtz_feature);
vtz_feature.commit();
} else if (layers[i].features[j].type == mvt_linestring) {
vtzero::linestring_feature_builder vtz_feature{vtz_layer};
mvt_feature &f = layers[i].features[j];
preset_attrs(layers[i], layers[i].features[j], vtz_index, vtz_feature);
for (size_t k = 0; k < f.geometry.size(); k++) {
if (f.geometry[k].op == mvt_moveto) {
size_t l;
for (l = k + 1; l < f.geometry.size(); l++) {
if (f.geometry[l].op != mvt_lineto) {
break;
}
}
vtz_feature.add_linestring(l - k);
for (size_t m = k; m < l; m++) {
vtz_feature.set_point(f.geometry[m].x, f.geometry[m].y);
}
k = l - 1;
}
}
copy_attrs(layers[i], layers[i].features[j], vtz_index, vtz_feature);
vtz_feature.commit();
} else if (layers[i].features[j].type == mvt_polygon) {
vtzero::polygon_feature_builder vtz_feature{vtz_layer};
mvt_feature &f = layers[i].features[j];
preset_attrs(layers[i], layers[i].features[j], vtz_index, vtz_feature);
for (size_t k = 0; k < f.geometry.size(); k++) {
if (f.geometry[k].op == mvt_moveto) {
size_t l;
for (l = k + 1; l < f.geometry.size(); l++) {
if (f.geometry[l].op != mvt_lineto) {
break;
}
}
vtz_feature.add_ring(l - k + 1);
for (size_t m = k; m < l; m++) {
vtz_feature.set_point(f.geometry[m].x, f.geometry[m].y);
}
vtz_feature.close_ring();
k = l - 1;
}
}
copy_attrs(layers[i], layers[i].features[j], vtz_index, vtz_feature);
vtz_feature.commit();
}
}
}
std::string data = vtz_tile.serialize();
#else
std::string data;
protozero::pbf_writer writer(data);
for (size_t i = 0; i < layers.size(); i++) {
@ -373,6 +452,7 @@ std::string mvt_tile::encode() {
writer.add_message(3, layer_string);
}
#endif
return data;
}

View File

@ -19,6 +19,7 @@
#define A_GRID_LOW_ZOOMS ((int) 'L')
#define A_DETECT_WRAPAROUND ((int) 'w')
#define A_EXTEND_ZOOMS ((int) 'e')
#define A_CLUSTER_DENSEST_AS_NEEDED ((int) 'C')
#define P_SIMPLIFY ((int) 's')
#define P_SIMPLIFY_LOW ((int) 'S')

236
protozero/data_view.hpp Normal file
View File

@ -0,0 +1,236 @@
#ifndef PROTOZERO_DATA_VIEW_HPP
#define PROTOZERO_DATA_VIEW_HPP
/*****************************************************************************
protozero - Minimalistic protocol buffer decoder and encoder in C++.
This file is from https://github.com/mapbox/protozero where you can find more
documentation.
*****************************************************************************/
/**
* @file data_view.hpp
*
* @brief Contains the implementation of the data_view class.
*/
#include <algorithm>
#include <cstddef>
#include <cstring>
#include <string>
#include <utility>
#include <protozero/config.hpp>
namespace protozero {
#ifdef PROTOZERO_USE_VIEW
using data_view = PROTOZERO_USE_VIEW;
#else
/**
* Holds a pointer to some data and a length.
*
* This class is supposed to be compatible with the std::string_view
* that will be available in C++17.
*/
class data_view {
const char* m_data = nullptr;
std::size_t m_size = 0;
public:
/**
* Default constructor. Construct an empty data_view.
*/
constexpr data_view() noexcept = default;
/**
* Create data_view from pointer and size.
*
* @param ptr Pointer to the data.
* @param length Length of the data.
*/
constexpr data_view(const char* ptr, std::size_t length) noexcept
: m_data(ptr),
m_size(length) {
}
/**
* Create data_view from string.
*
* @param str String with the data.
*/
data_view(const std::string& str) noexcept // NOLINT clang-tidy: google-explicit-constructor
: m_data(str.data()),
m_size(str.size()) {
}
/**
* Create data_view from zero-terminated string.
*
* @param ptr Pointer to the data.
*/
data_view(const char* ptr) noexcept // NOLINT clang-tidy: google-explicit-constructor
: m_data(ptr),
m_size(std::strlen(ptr)) {
}
/**
* Swap the contents of this object with the other.
*
* @param other Other object to swap data with.
*/
void swap(data_view& other) noexcept {
using std::swap;
swap(m_data, other.m_data);
swap(m_size, other.m_size);
}
/// Return pointer to data.
constexpr const char* data() const noexcept {
return m_data;
}
/// Return length of data in bytes.
constexpr std::size_t size() const noexcept {
return m_size;
}
/// Returns true if size is 0.
constexpr bool empty() const noexcept {
return m_size == 0;
}
#ifndef PROTOZERO_STRICT_API
/**
* Convert data view to string.
*
* @pre Must not be default constructed data_view.
*
* @deprecated to_string() is not available in C++17 string_view so it
* should not be used to make conversion to that class easier
* in the future.
*/
std::string to_string() const {
protozero_assert(m_data);
return {m_data, m_size};
}
#endif
/**
* Convert data view to string.
*
* @pre Must not be default constructed data_view.
*/
explicit operator std::string() const {
protozero_assert(m_data);
return {m_data, m_size};
}
/**
* Compares the contents of this object with the given other object.
*
* @returns 0 if they are the same, <0 if this object is smaller than
* the other or >0 if it is larger. If both objects have the
* same size returns <0 if this object is lexicographically
* before the other, >0 otherwise.
*
* @pre Must not be default constructed data_view.
*/
int compare(data_view other) const {
protozero_assert(m_data && other.m_data);
const int cmp = std::memcmp(data(), other.data(),
std::min(size(), other.size()));
if (cmp == 0) {
if (size() == other.size()) {
return 0;
}
return size() < other.size() ? -1 : 1;
}
return cmp;
}
}; // class data_view
/**
* Swap two data_view objects.
*
* @param lhs First object.
* @param rhs Second object.
*/
inline void swap(data_view& lhs, data_view& rhs) noexcept {
lhs.swap(rhs);
}
/**
* Two data_view instances are equal if they have the same size and the
* same content.
*
* @param lhs First object.
* @param rhs Second object.
*/
inline constexpr bool operator==(const data_view lhs, const data_view rhs) noexcept {
return lhs.size() == rhs.size() &&
std::equal(lhs.data(), lhs.data() + lhs.size(), rhs.data());
}
/**
* Two data_view instances are not equal if they have different sizes or the
* content differs.
*
* @param lhs First object.
* @param rhs Second object.
*/
inline constexpr bool operator!=(const data_view lhs, const data_view rhs) noexcept {
return !(lhs == rhs);
}
/**
* Returns true if lhs.compare(rhs) < 0.
*
* @param lhs First object.
* @param rhs Second object.
*/
inline bool operator<(const data_view lhs, const data_view rhs) noexcept {
return lhs.compare(rhs) < 0;
}
/**
* Returns true if lhs.compare(rhs) <= 0.
*
* @param lhs First object.
* @param rhs Second object.
*/
inline bool operator<=(const data_view lhs, const data_view rhs) noexcept {
return lhs.compare(rhs) <= 0;
}
/**
* Returns true if lhs.compare(rhs) > 0.
*
* @param lhs First object.
* @param rhs Second object.
*/
inline bool operator>(const data_view lhs, const data_view rhs) noexcept {
return lhs.compare(rhs) > 0;
}
/**
* Returns true if lhs.compare(rhs) >= 0.
*
* @param lhs First object.
* @param rhs Second object.
*/
inline bool operator>=(const data_view lhs, const data_view rhs) noexcept {
return lhs.compare(rhs) >= 0;
}
#endif
} // end namespace protozero
#endif // PROTOZERO_DATA_VIEW_HPP

View File

@ -63,6 +63,27 @@ struct end_of_buffer_exception : exception {
const char* what() const noexcept override { return "end of buffer exception"; }
};
/**
* This exception is thrown when a tag has an invalid value. Tags must be
* unsigned integers between 1 and 2^29-1. Tags between 19000 and 19999 are
* not allowed. See
* https://developers.google.com/protocol-buffers/docs/proto#assigning-tags
*/
struct invalid_tag_exception : exception {
/// Returns the explanatory string.
const char* what() const noexcept override { return "invalid tag exception"; }
};
/**
* This exception is thrown when a length field of a packed repeated field is
* invalid. For fixed size types the length must be a multiple of the size of
* the type.
*/
struct invalid_length_exception : exception {
/// Returns the explanatory string.
const char* what() const noexcept override { return "invalid length exception"; }
};
} // end namespace protozero
#endif // PROTOZERO_EXCEPTION_HPP

View File

@ -16,6 +16,7 @@ documentation.
* @brief Contains the iterators for access to packed repeated fields.
*/
#include <algorithm>
#include <cstring>
#include <iterator>
#include <utility>
@ -61,8 +62,8 @@ public:
/**
* Create iterator range from two iterators.
*
* @param first_iterator Iterator to beginning or range.
* @param last_iterator Iterator to end or range.
* @param first_iterator Iterator to beginning of range.
* @param last_iterator Iterator to end of range.
*/
constexpr iterator_range(iterator&& first_iterator, iterator&& last_iterator) :
P(std::forward<iterator>(first_iterator),
@ -89,11 +90,24 @@ public:
return this->second;
}
/// Return true if this range is empty.
constexpr std::size_t empty() const noexcept {
/**
* Return true if this range is empty.
*
* Complexity: Constant.
*/
constexpr bool empty() const noexcept {
return begin() == end();
}
/**
* Get the size of the range, ie the number of elements it contains.
*
* Complexity: Constant or linear depending on the underlaying iterator.
*/
std::size_t size() const noexcept {
return static_cast<size_t>(std::distance(begin(), end()));
}
/**
* Get element at the beginning of the range.
*
@ -146,27 +160,20 @@ template <typename T>
class const_fixed_iterator {
/// Pointer to current iterator position
const char* m_data;
/// Pointer to end iterator position
const char* m_end;
const char* m_data = nullptr;
public:
using iterator_category = std::forward_iterator_tag;
using iterator_category = std::random_access_iterator_tag;
using value_type = T;
using difference_type = std::ptrdiff_t;
using pointer = value_type*;
using reference = value_type&;
const_fixed_iterator() noexcept :
m_data(nullptr),
m_end(nullptr) {
}
const_fixed_iterator() noexcept = default;
const_fixed_iterator(const char* data, const char* end) noexcept :
m_data(data),
m_end(end) {
explicit const_fixed_iterator(const char* data) noexcept :
m_data(data) {
}
const_fixed_iterator(const const_fixed_iterator&) noexcept = default;
@ -186,25 +193,89 @@ public:
return result;
}
const_fixed_iterator& operator++() {
const_fixed_iterator& operator++() noexcept {
m_data += sizeof(value_type);
return *this;
}
const_fixed_iterator operator++(int) {
const const_fixed_iterator tmp(*this);
const_fixed_iterator operator++(int) noexcept {
const const_fixed_iterator tmp{*this};
++(*this);
return tmp;
}
bool operator==(const const_fixed_iterator& rhs) const noexcept {
return m_data == rhs.m_data && m_end == rhs.m_end;
bool operator==(const_fixed_iterator rhs) const noexcept {
return m_data == rhs.m_data;
}
bool operator!=(const const_fixed_iterator& rhs) const noexcept {
bool operator!=(const_fixed_iterator rhs) const noexcept {
return !(*this == rhs);
}
const_fixed_iterator& operator--() noexcept {
m_data -= sizeof(value_type);
return *this;
}
const_fixed_iterator operator--(int) noexcept {
const const_fixed_iterator tmp{*this};
--(*this);
return tmp;
}
friend bool operator<(const_fixed_iterator lhs, const_fixed_iterator rhs) noexcept {
return lhs.m_data < rhs.m_data;
}
friend bool operator>(const_fixed_iterator lhs, const_fixed_iterator rhs) noexcept {
return rhs < lhs;
}
friend bool operator<=(const_fixed_iterator lhs, const_fixed_iterator rhs) noexcept {
return !(lhs > rhs);
}
friend bool operator>=(const_fixed_iterator lhs, const_fixed_iterator rhs) noexcept {
return !(lhs < rhs);
}
const_fixed_iterator& operator+=(difference_type val) noexcept {
m_data += (sizeof(value_type) * val);
return *this;
}
friend const_fixed_iterator operator+(const_fixed_iterator lhs, difference_type rhs) noexcept {
const_fixed_iterator tmp{lhs};
tmp.m_data += (sizeof(value_type) * rhs);
return tmp;
}
friend const_fixed_iterator operator+(difference_type lhs, const_fixed_iterator rhs) noexcept {
const_fixed_iterator tmp{rhs};
tmp.m_data += (sizeof(value_type) * lhs);
return tmp;
}
const_fixed_iterator& operator-=(difference_type val) noexcept {
m_data -= (sizeof(value_type) * val);
return *this;
}
friend const_fixed_iterator operator-(const_fixed_iterator lhs, difference_type rhs) noexcept {
const_fixed_iterator tmp{lhs};
tmp.m_data -= (sizeof(value_type) * rhs);
return tmp;
}
friend difference_type operator-(const_fixed_iterator lhs, const_fixed_iterator rhs) noexcept {
return static_cast<difference_type>(lhs.m_data - rhs.m_data) / static_cast<difference_type>(sizeof(T));
}
value_type operator[](difference_type n) const noexcept {
return *(*this + n);
}
}; // class const_fixed_iterator
/**
@ -217,10 +288,10 @@ class const_varint_iterator {
protected:
/// Pointer to current iterator position
const char* m_data;
const char* m_data = nullptr;
/// Pointer to end iterator position
const char* m_end;
const char* m_end = nullptr;
public:
@ -230,11 +301,17 @@ public:
using pointer = value_type*;
using reference = value_type&;
const_varint_iterator() noexcept :
m_data(nullptr),
m_end(nullptr) {
static difference_type distance(const_varint_iterator begin, const_varint_iterator end) noexcept {
// We know that each varint contains exactly one byte with the most
// significant bit not set. We can use this to quickly figure out
// how many varints there are without actually decoding the varints.
return std::count_if(begin.m_data, end.m_data, [](char c) noexcept {
return (static_cast<unsigned char>(c) & 0x80) == 0;
});
}
const_varint_iterator() noexcept = default;
const_varint_iterator(const char* data, const char* end) noexcept :
m_data(data),
m_end(end) {
@ -259,7 +336,7 @@ public:
}
const_varint_iterator operator++(int) {
const const_varint_iterator tmp(*this);
const const_varint_iterator tmp{*this};
++(*this);
return tmp;
}
@ -298,10 +375,10 @@ public:
}
const_svarint_iterator(const const_svarint_iterator&) = default;
const_svarint_iterator(const_svarint_iterator&&) = default;
const_svarint_iterator(const_svarint_iterator&&) noexcept = default;
const_svarint_iterator& operator=(const const_svarint_iterator&) = default;
const_svarint_iterator& operator=(const_svarint_iterator&&) = default;
const_svarint_iterator& operator=(const_svarint_iterator&&) noexcept = default;
~const_svarint_iterator() = default;
@ -316,7 +393,7 @@ public:
}
const_svarint_iterator operator++(int) {
const const_svarint_iterator tmp(*this);
const const_svarint_iterator tmp{*this};
++(*this);
return tmp;
}
@ -325,4 +402,54 @@ public:
} // end namespace protozero
namespace std {
// Specialize std::distance for all the protozero iterators. Because
// functions can't be partially specialized, we have to do this for
// every value_type we are using.
template <>
inline typename protozero::const_varint_iterator<int32_t>::difference_type
distance<protozero::const_varint_iterator<int32_t>>(protozero::const_varint_iterator<int32_t> first, // NOLINT clang-tidy: readability-inconsistent-declaration-parameter-name
protozero::const_varint_iterator<int32_t> last) {
return protozero::const_varint_iterator<int32_t>::distance(first, last);
}
template <>
inline typename protozero::const_varint_iterator<int64_t>::difference_type
distance<protozero::const_varint_iterator<int64_t>>(protozero::const_varint_iterator<int64_t> first, // NOLINT clang-tidy: readability-inconsistent-declaration-parameter-name
protozero::const_varint_iterator<int64_t> last) {
return protozero::const_varint_iterator<int64_t>::distance(first, last);
}
template <>
inline typename protozero::const_varint_iterator<uint32_t>::difference_type
distance<protozero::const_varint_iterator<uint32_t>>(protozero::const_varint_iterator<uint32_t> first, // NOLINT clang-tidy: readability-inconsistent-declaration-parameter-name
protozero::const_varint_iterator<uint32_t> last) {
return protozero::const_varint_iterator<uint32_t>::distance(first, last);
}
template <>
inline typename protozero::const_varint_iterator<uint64_t>::difference_type
distance<protozero::const_varint_iterator<uint64_t>>(protozero::const_varint_iterator<uint64_t> first, // NOLINT clang-tidy: readability-inconsistent-declaration-parameter-name
protozero::const_varint_iterator<uint64_t> last) {
return protozero::const_varint_iterator<uint64_t>::distance(first, last);
}
template <>
inline typename protozero::const_svarint_iterator<int32_t>::difference_type
distance<protozero::const_svarint_iterator<int32_t>>(protozero::const_svarint_iterator<int32_t> first, // NOLINT clang-tidy: readability-inconsistent-declaration-parameter-name
protozero::const_svarint_iterator<int32_t> last) {
return protozero::const_svarint_iterator<int32_t>::distance(first, last);
}
template <>
inline typename protozero::const_svarint_iterator<int64_t>::difference_type
distance<protozero::const_svarint_iterator<int64_t>>(protozero::const_svarint_iterator<int64_t> first, // NOLINT clang-tidy: readability-inconsistent-declaration-parameter-name
protozero::const_svarint_iterator<int64_t> last) {
return protozero::const_svarint_iterator<int64_t>::distance(first, last);
}
} // end namespace std
#endif // PROTOZERO_ITERATORS_HPP

View File

@ -44,12 +44,27 @@ class pbf_builder : public pbf_writer {
public:
/// The type of messages this class will build.
using enum_type = T;
pbf_builder() = default;
/**
* Create a builder using the given string as a data store. The object
* stores a reference to that string and adds all data to it. The string
* doesn't have to be empty. The pbf_message object will just append data.
*/
explicit pbf_builder(std::string& data) noexcept :
pbf_writer(data) {
}
/**
* Construct a pbf_builder for a submessage from the pbf_message or
* pbf_writer of the parent message.
*
* @param parent_writer The parent pbf_message or pbf_writer
* @param tag Tag of the field that will be written
*/
template <typename P>
pbf_builder(pbf_writer& parent_writer, P tag) noexcept :
pbf_writer(parent_writer, pbf_tag_type(tag)) {
@ -79,51 +94,141 @@ public:
#undef PROTOZERO_WRITER_WRAP_ADD_SCALAR
/// @endcond
/**
* Add "bytes" field to data.
*
* @param tag Tag of the field
* @param value Pointer to value to be written
* @param size Number of bytes to be written
*/
void add_bytes(T tag, const char* value, std::size_t size) {
pbf_writer::add_bytes(pbf_tag_type(tag), value, size);
}
/**
* Add "bytes" field to data.
*
* @param tag Tag of the field
* @param value Value to be written
*/
void add_bytes(T tag, const data_view& value) {
pbf_writer::add_bytes(pbf_tag_type(tag), value);
}
/**
* Add "bytes" field to data.
*
* @param tag Tag of the field
* @param value Value to be written
*/
void add_bytes(T tag, const std::string& value) {
pbf_writer::add_bytes(pbf_tag_type(tag), value);
}
/**
* Add "bytes" field to data. Bytes from the value are written until
* a null byte is encountered. The null byte is not added.
*
* @param tag Tag of the field
* @param value Pointer to zero-delimited value to be written
*/
void add_bytes(T tag, const char* value) {
pbf_writer::add_bytes(pbf_tag_type(tag), value);
}
/**
* Add "bytes" field to data using vectored input. All the data in the
* 2nd and further arguments is "concatenated" with only a single copy
* into the final buffer.
*
* This will work with objects of any type supporting the data() and
* size() methods like std::string or protozero::data_view.
*
* Example:
* @code
* std::string data1 = "abc";
* std::string data2 = "xyz";
* builder.add_bytes_vectored(1, data1, data2);
* @endcode
*
* @tparam Ts List of types supporting data() and size() methods.
* @param tag Tag of the field
* @param values List of objects of types Ts with data to be appended.
*/
template <typename... Ts>
void add_bytes_vectored(T tag, Ts&&... values) {
pbf_writer::add_bytes_vectored(pbf_tag_type(tag), std::forward<Ts>(values)...);
}
/**
* Add "string" field to data.
*
* @param tag Tag of the field
* @param value Pointer to value to be written
* @param size Number of bytes to be written
*/
void add_string(T tag, const char* value, std::size_t size) {
pbf_writer::add_string(pbf_tag_type(tag), value, size);
}
/**
* Add "string" field to data.
*
* @param tag Tag of the field
* @param value Value to be written
*/
void add_string(T tag, const data_view& value) {
pbf_writer::add_string(pbf_tag_type(tag), value);
}
/**
* Add "string" field to data.
*
* @param tag Tag of the field
* @param value Value to be written
*/
void add_string(T tag, const std::string& value) {
pbf_writer::add_string(pbf_tag_type(tag), value);
}
/**
* Add "string" field to data. Bytes from the value are written until
* a null byte is encountered. The null byte is not added.
*
* @param tag Tag of the field
* @param value Pointer to value to be written
*/
void add_string(T tag, const char* value) {
pbf_writer::add_string(pbf_tag_type(tag), value);
}
/**
* Add "message" field to data.
*
* @param tag Tag of the field
* @param value Pointer to message to be written
* @param size Length of the message
*/
void add_message(T tag, const char* value, std::size_t size) {
pbf_writer::add_message(pbf_tag_type(tag), value, size);
}
/**
* Add "message" field to data.
*
* @param tag Tag of the field
* @param value Value to be written. The value must be a complete message.
*/
void add_message(T tag, const data_view& value) {
pbf_writer::add_message(pbf_tag_type(tag), value);
}
/**
* Add "message" field to data.
*
* @param tag Tag of the field
* @param value Value to be written. The value must be a complete message.
*/
void add_message(T tag, const std::string& value) {
pbf_writer::add_message(pbf_tag_type(tag), value);
}

View File

@ -35,7 +35,7 @@ namespace protozero {
*
* std::string buffer;
* // fill buffer...
* pbf_message<Message> message(buffer.data(), buffer.size());
* pbf_message<Message> message{buffer.data(), buffer.size()};
* @endcode
*
* Sub-messages are created using get_message():
@ -45,7 +45,7 @@ namespace protozero {
* ...
* };
*
* pbf_message<Message> message(...);
* pbf_message<Message> message{...};
* message.next();
* pbf_message<SubMessage> submessage = message.get_message();
* @endcode
@ -64,29 +64,115 @@ namespace protozero {
template <typename T>
class pbf_message : public pbf_reader {
static_assert(std::is_same<pbf_tag_type, typename std::underlying_type<T>::type>::value, "T must be enum with underlying type protozero::pbf_tag_type");
static_assert(std::is_same<pbf_tag_type, typename std::underlying_type<T>::type>::value,
"T must be enum with underlying type protozero::pbf_tag_type");
public:
/// The type of messages this class will read.
using enum_type = T;
/**
* Construct a pbf_message. All arguments are forwarded to the pbf_reader
* parent class.
*/
template <typename... Args>
pbf_message(Args&&... args) noexcept :
pbf_message(Args&&... args) noexcept : // NOLINT clang-tidy: google-explicit-constructor
pbf_reader(std::forward<Args>(args)...) {
}
/**
* Set next field in the message as the current field. This is usually
* called in a while loop:
*
* @code
* pbf_message<...> message(...);
* while (message.next()) {
* // handle field
* }
* @endcode
*
* @returns `true` if there is a next field, `false` if not.
* @pre There must be no current field.
* @post If it returns `true` there is a current field now.
*/
bool next() {
return pbf_reader::next();
}
/**
* Set next field with given tag in the message as the current field.
* Fields with other tags are skipped. This is usually called in a while
* loop for repeated fields:
*
* @code
* pbf_message<Example1> message{...};
* while (message.next(Example1::repeated_fixed64_r)) {
* // handle field
* }
* @endcode
*
* or you can call it just once to get the one field with this tag:
*
* @code
* pbf_message<Example1> message{...};
* if (message.next(Example1::required_uint32_x)) {
* // handle field
* }
* @endcode
*
* Note that this will not check the wire type. The two-argument version
* of this function will also check the wire type.
*
* @returns `true` if there is a next field with this tag.
* @pre There must be no current field.
* @post If it returns `true` there is a current field now with the given tag.
*/
bool next(T next_tag) {
return pbf_reader::next(pbf_tag_type(next_tag));
}
/**
* Set next field with given tag and wire type in the message as the
* current field. Fields with other tags are skipped. This is usually
* called in a while loop for repeated fields:
*
* @code
* pbf_message<Example1> message{...};
* while (message.next(Example1::repeated_fixed64_r, pbf_wire_type::varint)) {
* // handle field
* }
* @endcode
*
* or you can call it just once to get the one field with this tag:
*
* @code
* pbf_message<Example1> message{...};
* if (message.next(Example1::required_uint32_x, pbf_wire_type::varint)) {
* // handle field
* }
* @endcode
*
* Note that this will also check the wire type. The one-argument version
* of this function will not check the wire type.
*
* @returns `true` if there is a next field with this tag.
* @pre There must be no current field.
* @post If it returns `true` there is a current field now with the given tag.
*/
bool next(T next_tag, pbf_wire_type type) {
return pbf_reader::next(pbf_tag_type(next_tag), type);
}
/**
* The tag of the current field. The tag is the enum value for the field
* number from the description in the .proto file.
*
* Call next() before calling this function to set the current field.
*
* @returns tag of the current field.
* @pre There must be a current field (ie. next() must have returned `true`).
*/
T tag() const noexcept {
return T(pbf_reader::tag());
}

View File

@ -18,10 +18,12 @@ documentation.
#include <cstddef>
#include <cstdint>
#include <cstring>
#include <string>
#include <utility>
#include <protozero/config.hpp>
#include <protozero/data_view.hpp>
#include <protozero/exception.hpp>
#include <protozero/iterators.hpp>
#include <protozero/types.hpp>
@ -41,13 +43,13 @@ namespace protozero {
* @code
* std::string buffer;
* // fill buffer...
* pbf_reader message(buffer.data(), buffer.size());
* pbf_reader message{buffer.data(), buffer.size()};
* @endcode
*
* Sub-messages are created using get_message():
*
* @code
* pbf_reader message(...);
* pbf_reader message{...};
* message.next();
* pbf_reader submessage = message.get_message();
* @endcode
@ -74,8 +76,9 @@ class pbf_reader {
template <typename T>
T get_fixed() {
T result;
const char* data = m_data;
skip_bytes(sizeof(T));
std::memcpy(&result, m_data - sizeof(T), sizeof(T));
std::memcpy(&result, data, sizeof(T));
#if PROTOZERO_BYTE_ORDER != PROTOZERO_LITTLE_ENDIAN
detail::byteswap_inplace(&result);
#endif
@ -86,9 +89,11 @@ class pbf_reader {
iterator_range<const_fixed_iterator<T>> packed_fixed() {
protozero_assert(tag() != 0 && "call next() before accessing field value");
const auto len = get_len_and_skip();
protozero_assert(len % sizeof(T) == 0);
return iterator_range<const_fixed_iterator<T>>{const_fixed_iterator<T>(m_data - len, m_data),
const_fixed_iterator<T>(m_data, m_data)};
if (len % sizeof(T) != 0) {
throw invalid_length_exception{};
}
return {const_fixed_iterator<T>(m_data - len),
const_fixed_iterator<T>(m_data)};
}
template <typename T>
@ -108,7 +113,7 @@ class pbf_reader {
void skip_bytes(pbf_length_type len) {
if (m_data + len > m_end) {
throw end_of_buffer_exception();
throw end_of_buffer_exception{};
}
m_data += len;
@ -129,8 +134,8 @@ class pbf_reader {
iterator_range<T> get_packed() {
protozero_assert(tag() != 0 && "call next() before accessing field value");
const auto len = get_len_and_skip();
return iterator_range<T>{T{m_data - len, m_data},
T{m_data, m_data}};
return {T{m_data - len, m_data},
T{m_data, m_data}};
}
public:
@ -147,9 +152,7 @@ public:
*/
explicit pbf_reader(const data_view& view) noexcept
: m_data(view.data()),
m_end(view.data() + view.size()),
m_wire_type(pbf_wire_type::unknown),
m_tag(0) {
m_end(view.data() + view.size()) {
}
/**
@ -164,11 +167,10 @@ public:
*/
pbf_reader(const char* data, std::size_t size) noexcept
: m_data(data),
m_end(data + size),
m_wire_type(pbf_wire_type::unknown),
m_tag(0) {
m_end(data + size) {
}
#ifndef PROTOZERO_STRICT_API
/**
* Construct a pbf_reader message from a data pointer and a length. The
* pointer will be stored inside the pbf_reader object, no data is copied.
@ -178,13 +180,13 @@ public:
* The buffer must contain a complete protobuf message.
*
* @post There is no current field.
* @deprecated Use one of the other constructors.
*/
explicit pbf_reader(const std::pair<const char*, std::size_t>& data) noexcept
: m_data(data.first),
m_end(data.first + data.second),
m_wire_type(pbf_wire_type::unknown),
m_tag(0) {
m_end(data.first + data.second) {
}
#endif
/**
* Construct a pbf_reader message from a std::string. A pointer to the
@ -198,9 +200,7 @@ public:
*/
explicit pbf_reader(const std::string& data) noexcept
: m_data(data.data()),
m_end(data.data() + data.size()),
m_wire_type(pbf_wire_type::unknown),
m_tag(0) {
m_end(data.data() + data.size()) {
}
/**
@ -241,7 +241,7 @@ public:
* are still fields available and to `false` if the last field has been
* read.
*/
operator bool() const noexcept {
operator bool() const noexcept { // NOLINT clang-tidy: google-explicit-constructor
return m_data < m_end;
}
@ -282,9 +282,10 @@ public:
m_tag = pbf_tag_type(value >> 3);
// tags 0 and 19000 to 19999 are not allowed as per
// https://developers.google.com/protocol-buffers/docs/proto
protozero_assert(((m_tag > 0 && m_tag < 19000) ||
(m_tag > 19999 && m_tag <= ((1 << 29) - 1))) && "tag out of range");
// https://developers.google.com/protocol-buffers/docs/proto#assigning-tags
if (m_tag == 0 || (m_tag >= 19000 && m_tag <= 19999)) {
throw invalid_tag_exception{};
}
m_wire_type = pbf_wire_type(value & 0x07);
switch (m_wire_type) {
@ -294,7 +295,7 @@ public:
case pbf_wire_type::fixed32:
break;
default:
throw unknown_pbf_wire_type_exception();
throw unknown_pbf_wire_type_exception{};
}
return true;
@ -306,7 +307,7 @@ public:
* loop for repeated fields:
*
* @code
* pbf_reader message(...);
* pbf_reader message{...};
* while (message.next(17)) {
* // handle field
* }
@ -315,7 +316,7 @@ public:
* or you can call it just once to get the one field with this tag:
*
* @code
* pbf_reader message(...);
* pbf_reader message{...};
* if (message.next(17)) {
* // handle field
* }
@ -332,9 +333,8 @@ public:
while (next()) {
if (m_tag == next_tag) {
return true;
} else {
skip();
}
skip();
}
return false;
}
@ -345,7 +345,7 @@ public:
* called in a while loop for repeated fields:
*
* @code
* pbf_reader message(...);
* pbf_reader message{...};
* while (message.next(17, pbf_wire_type::varint)) {
* // handle field
* }
@ -354,7 +354,7 @@ public:
* or you can call it just once to get the one field with this tag:
*
* @code
* pbf_reader message(...);
* pbf_reader message{...};
* if (message.next(17, pbf_wire_type::varint)) {
* // handle field
* }
@ -371,9 +371,8 @@ public:
while (next()) {
if (m_tag == next_tag && m_wire_type == type) {
return true;
} else {
skip();
}
skip();
}
return false;
}
@ -417,7 +416,7 @@ public:
* Use it like this:
*
* @code
* pbf_reader message(...);
* pbf_reader message{...};
* while (message.next()) {
* switch (message.tag_and_type()) {
* case tag_and_type(17, pbf_wire_type::length_delimited):
@ -468,7 +467,7 @@ public:
skip_bytes(4);
break;
default:
protozero_assert(false && "can not be here because next() should have thrown already");
break;
}
}
@ -487,9 +486,9 @@ public:
bool get_bool() {
protozero_assert(tag() != 0 && "call next() before accessing field value");
protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint");
protozero_assert((*m_data & 0x80) == 0 && "not a 1 byte varint");
skip_bytes(1);
return m_data[-1] != 0; // -1 okay because we incremented m_data the line before
const auto data = m_data;
skip_varint(&m_data, m_end);
return data[0] != 0;
}
/**
@ -667,7 +666,7 @@ public:
protozero_assert(tag() != 0 && "call next() before accessing field value");
protozero_assert(has_wire_type(pbf_wire_type::length_delimited) && "not of type string, bytes or message");
const auto len = get_len_and_skip();
return data_view{m_data - len, len};
return {m_data - len, len};
}
#ifndef PROTOZERO_STRICT_API
@ -683,7 +682,7 @@ public:
protozero_assert(tag() != 0 && "call next() before accessing field value");
protozero_assert(has_wire_type(pbf_wire_type::length_delimited) && "not of type string, bytes or message");
const auto len = get_len_and_skip();
return std::make_pair(m_data - len, len);
return {m_data - len, len};
}
#endif
@ -717,7 +716,7 @@ public:
* @post The current field was consumed and there is no current field now.
*/
pbf_reader get_message() {
return pbf_reader(get_view());
return pbf_reader{get_view()};
}
///@}
@ -746,6 +745,24 @@ public:
/// Forward iterator for iterating over uint64 (varint) values.
using const_uint64_iterator = const_varint_iterator<uint64_t>;
/// Forward iterator for iterating over fixed32 values.
using const_fixed32_iterator = const_fixed_iterator<uint32_t>;
/// Forward iterator for iterating over sfixed32 values.
using const_sfixed32_iterator = const_fixed_iterator<int32_t>;
/// Forward iterator for iterating over fixed64 values.
using const_fixed64_iterator = const_fixed_iterator<uint64_t>;
/// Forward iterator for iterating over sfixed64 values.
using const_sfixed64_iterator = const_fixed_iterator<int64_t>;
/// Forward iterator for iterating over float values.
using const_float_iterator = const_fixed_iterator<float>;
/// Forward iterator for iterating over double values.
using const_double_iterator = const_fixed_iterator<double>;
///@{
/**
* @name Repeated packed field accessor functions
@ -864,7 +881,7 @@ public:
* @pre The current field must be of type "repeated packed fixed32".
* @post The current field was consumed and there is no current field now.
*/
auto get_packed_fixed32() -> decltype(packed_fixed<uint32_t>()) {
iterator_range<pbf_reader::const_fixed32_iterator> get_packed_fixed32() {
return packed_fixed<uint32_t>();
}
@ -877,7 +894,7 @@ public:
* @pre The current field must be of type "repeated packed sfixed32".
* @post The current field was consumed and there is no current field now.
*/
auto get_packed_sfixed32() -> decltype(packed_fixed<int32_t>()) {
iterator_range<pbf_reader::const_sfixed32_iterator> get_packed_sfixed32() {
return packed_fixed<int32_t>();
}
@ -890,7 +907,7 @@ public:
* @pre The current field must be of type "repeated packed fixed64".
* @post The current field was consumed and there is no current field now.
*/
auto get_packed_fixed64() -> decltype(packed_fixed<uint64_t>()) {
iterator_range<pbf_reader::const_fixed64_iterator> get_packed_fixed64() {
return packed_fixed<uint64_t>();
}
@ -903,7 +920,7 @@ public:
* @pre The current field must be of type "repeated packed sfixed64".
* @post The current field was consumed and there is no current field now.
*/
auto get_packed_sfixed64() -> decltype(packed_fixed<int64_t>()) {
iterator_range<pbf_reader::const_sfixed64_iterator> get_packed_sfixed64() {
return packed_fixed<int64_t>();
}
@ -916,7 +933,7 @@ public:
* @pre The current field must be of type "repeated packed float".
* @post The current field was consumed and there is no current field now.
*/
auto get_packed_float() -> decltype(packed_fixed<float>()) {
iterator_range<pbf_reader::const_float_iterator> get_packed_float() {
return packed_fixed<float>();
}
@ -929,7 +946,7 @@ public:
* @pre The current field must be of type "repeated packed double".
* @post The current field was consumed and there is no current field now.
*/
auto get_packed_double() -> decltype(packed_fixed<double>()) {
iterator_range<pbf_reader::const_double_iterator> get_packed_double() {
return packed_fixed<double>();
}

View File

@ -19,12 +19,14 @@ documentation.
#include <cstddef>
#include <cstdint>
#include <cstring>
#include <initializer_list>
#include <iterator>
#include <limits>
#include <string>
#include <utility>
#include <protozero/config.hpp>
#include <protozero/data_view.hpp>
#include <protozero/types.hpp>
#include <protozero/varint.hpp>
@ -53,11 +55,11 @@ class pbf_writer {
// A pointer to a string buffer holding the data already written to the
// PBF message. For default constructed writers or writers that have been
// rolled back, this is a nullptr.
std::string* m_data;
std::string* m_data = nullptr;
// A pointer to a parent writer object if this is a submessage. If this
// is a top-level writer, it is a nullptr.
pbf_writer* m_parent_writer;
pbf_writer* m_parent_writer = nullptr;
// This is usually 0. If there is an open submessage, this is set in the
// parent to the rollback position, ie. the last position before the
@ -97,12 +99,12 @@ class pbf_writer {
}
template <typename T, typename It>
void add_packed_fixed(pbf_tag_type tag, It first, It last, std::input_iterator_tag) {
void add_packed_fixed(pbf_tag_type tag, It first, It last, std::input_iterator_tag /*unused*/) {
if (first == last) {
return;
}
pbf_writer sw(*this, tag);
pbf_writer sw{*this, tag};
while (first != last) {
sw.add_fixed<T>(*first++);
@ -110,7 +112,7 @@ class pbf_writer {
}
template <typename T, typename It>
void add_packed_fixed(pbf_tag_type tag, It first, It last, std::forward_iterator_tag) {
void add_packed_fixed(pbf_tag_type tag, It first, It last, std::forward_iterator_tag /*unused*/) {
if (first == last) {
return;
}
@ -130,7 +132,7 @@ class pbf_writer {
return;
}
pbf_writer sw(*this, tag);
pbf_writer sw{*this, tag};
while (first != last) {
sw.add_varint(uint64_t(*first++));
@ -143,7 +145,7 @@ class pbf_writer {
return;
}
pbf_writer sw(*this, tag);
pbf_writer sw{*this, tag};
while (first != last) {
sw.add_varint(encode_zigzag64(*first++));
@ -194,9 +196,9 @@ class pbf_writer {
const auto length = pbf_length_type(m_data->size() - m_pos);
protozero_assert(m_data->size() >= m_pos - reserve_bytes);
const auto n = write_varint(m_data->begin() + long(m_pos) - reserve_bytes, length);
const auto n = write_varint(m_data->begin() + int64_t(m_pos) - reserve_bytes, length);
m_data->erase(m_data->begin() + long(m_pos) - reserve_bytes + n, m_data->begin() + long(m_pos));
m_data->erase(m_data->begin() + int64_t(m_pos) - reserve_bytes + n, m_data->begin() + int64_t(m_pos));
m_pos = 0;
}
@ -225,18 +227,14 @@ public:
* doesn't have to be empty. The pbf_writer will just append data.
*/
explicit pbf_writer(std::string& data) noexcept :
m_data(&data),
m_parent_writer(nullptr) {
m_data(&data) {
}
/**
* Create a writer without a data store. In this form the writer can not
* be used!
*/
pbf_writer() noexcept :
m_data(nullptr),
m_parent_writer(nullptr) {
}
pbf_writer() noexcept = default;
/**
* Construct a pbf_writer for a submessage from the pbf_writer of the
@ -254,24 +252,58 @@ public:
m_parent_writer->open_submessage(tag, size);
}
/// A pbf_writer object can be copied
pbf_writer(const pbf_writer&) noexcept = default;
/// A pbf_writer object can not be copied
pbf_writer(const pbf_writer&) = delete;
/// A pbf_writer object can be copied
pbf_writer& operator=(const pbf_writer&) noexcept = default;
/// A pbf_writer object can not be copied
pbf_writer& operator=(const pbf_writer&) = delete;
/// A pbf_writer object can be moved
pbf_writer(pbf_writer&&) noexcept = default;
/**
* A pbf_writer object can be moved. After this the other pbf_writer will
* be invalid.
*/
pbf_writer(pbf_writer&& other) noexcept :
m_data(other.m_data),
m_parent_writer(other.m_parent_writer),
m_rollback_pos(other.m_rollback_pos),
m_pos(other.m_pos) {
other.m_data = nullptr;
other.m_parent_writer = nullptr;
other.m_rollback_pos = 0;
other.m_pos = 0;
}
/// A pbf_writer object can be moved
pbf_writer& operator=(pbf_writer&&) noexcept = default;
/**
* A pbf_writer object can be moved. After this the other pbf_writer will
* be invalid.
*/
pbf_writer& operator=(pbf_writer&& other) noexcept {
m_data = other.m_data;
m_parent_writer = other.m_parent_writer;
m_rollback_pos = other.m_rollback_pos;
m_pos = other.m_pos;
other.m_data = nullptr;
other.m_parent_writer = nullptr;
other.m_rollback_pos = 0;
other.m_pos = 0;
return *this;
}
~pbf_writer() {
if (m_parent_writer) {
if (m_parent_writer != nullptr) {
m_parent_writer->close_submessage();
}
}
/**
* Check if this writer is valid. A writer is invalid if it was default
* constructed, moved from, or if commit() has been called on it.
* Otherwise it is valid.
*/
bool valid() const noexcept {
return m_data != nullptr;
}
/**
* Swap the contents of this object with the other.
*
@ -298,17 +330,35 @@ public:
m_data->reserve(m_data->size() + size);
}
/**
* Commit this submessage. This does the same as when the pbf_writer
* goes out of scope and is destructed.
*
* @pre Must be a pbf_writer of a submessage, ie one opened with the
* pbf_writer constructor taking a parent message.
* @post The pbf_writer is invalid and can't be used any more.
*/
void commit() {
protozero_assert(m_parent_writer && "you can't call commit() on a pbf_writer without a parent");
protozero_assert(m_pos == 0 && "you can't call commit() on a pbf_writer that has an open nested submessage");
m_parent_writer->close_submessage();
m_parent_writer = nullptr;
m_data = nullptr;
}
/**
* Cancel writing of this submessage. The complete submessage will be
* removed as if it was never created and no fields were added.
*
* @pre Must be a pbf_writer of a submessage, ie one opened with the
* pbf_writer constructor taking a parent message.
* @post The pbf_writer is invalid and can't be used any more.
*/
void rollback() {
protozero_assert(m_parent_writer && "you can't call rollback() on a pbf_writer without a parent");
protozero_assert(m_pos == 0 && "you can't call rollback() on a pbf_writer that has an open nested submessage");
m_parent_writer->rollback_submessage();
m_parent_writer = nullptr;
m_data = nullptr;
}
@ -327,7 +377,7 @@ public:
add_field(tag, pbf_wire_type::varint);
protozero_assert(m_pos == 0 && "you can't add fields to a parent pbf_writer if there is an existing pbf_writer for a submessage");
protozero_assert(m_data);
m_data->append(1, value);
m_data->append(1, char(value));
}
/**
@ -849,15 +899,17 @@ namespace detail {
protected:
pbf_writer m_writer;
pbf_writer m_writer{};
public:
packed_field(const packed_field&) = delete;
packed_field& operator=(const packed_field&) = delete;
packed_field(packed_field&&) = default;
packed_field& operator=(packed_field&&) = default;
packed_field(packed_field&&) noexcept = default;
packed_field& operator=(packed_field&&) noexcept = default;
packed_field() = default;
packed_field(pbf_writer& parent_writer, pbf_tag_type tag) :
m_writer(parent_writer, tag) {
@ -867,6 +919,16 @@ namespace detail {
m_writer(parent_writer, tag, size) {
}
~packed_field() noexcept = default;
bool valid() const noexcept {
return m_writer.valid();
}
void commit() {
m_writer.commit();
}
void rollback() {
m_writer.rollback();
}
@ -878,6 +940,10 @@ namespace detail {
public:
packed_field_fixed() :
packed_field() {
}
template <typename P>
packed_field_fixed(pbf_writer& parent_writer, P tag) :
packed_field(parent_writer, static_cast<pbf_tag_type>(tag)) {
@ -899,6 +965,10 @@ namespace detail {
public:
packed_field_varint() :
packed_field() {
}
template <typename P>
packed_field_varint(pbf_writer& parent_writer, P tag) :
packed_field(parent_writer, static_cast<pbf_tag_type>(tag)) {
@ -915,6 +985,10 @@ namespace detail {
public:
packed_field_svarint() :
packed_field() {
}
template <typename P>
packed_field_svarint(pbf_writer& parent_writer, P tag) :
packed_field(parent_writer, static_cast<pbf_tag_type>(tag)) {

View File

@ -62,145 +62,6 @@ constexpr inline uint32_t tag_and_type(T tag, pbf_wire_type wire_type) noexcept
*/
using pbf_length_type = uint32_t;
#ifdef PROTOZERO_USE_VIEW
using data_view = PROTOZERO_USE_VIEW;
#else
/**
* Holds a pointer to some data and a length.
*
* This class is supposed to be compatible with the std::string_view
* that will be available in C++17.
*/
class data_view {
const char* m_data;
std::size_t m_size;
public:
/**
* Default constructor. Construct an empty data_view.
*/
constexpr data_view() noexcept
: m_data(nullptr),
m_size(0) {
}
/**
* Create data_view from pointer and size.
*
* @param ptr Pointer to the data.
* @param length Length of the data.
*/
constexpr data_view(const char* ptr, std::size_t length) noexcept
: m_data(ptr),
m_size(length) {
}
/**
* Create data_view from string.
*
* @param str String with the data.
*/
data_view(const std::string& str) noexcept
: m_data(str.data()),
m_size(str.size()) {
}
/**
* Create data_view from zero-terminated string.
*
* @param ptr Pointer to the data.
*/
data_view(const char* ptr) noexcept
: m_data(ptr),
m_size(std::strlen(ptr)) {
}
/**
* Swap the contents of this object with the other.
*
* @param other Other object to swap data with.
*/
void swap(data_view& other) noexcept {
using std::swap;
swap(m_data, other.m_data);
swap(m_size, other.m_size);
}
/// Return pointer to data.
constexpr const char* data() const noexcept {
return m_data;
}
/// Return length of data in bytes.
constexpr std::size_t size() const noexcept {
return m_size;
}
/// Returns true if size is 0.
constexpr bool empty() const noexcept {
return m_size == 0;
}
/**
* Convert data view to string.
*
* @pre Must not be default constructed data_view.
*/
std::string to_string() const {
protozero_assert(m_data);
return std::string{m_data, m_size};
}
/**
* Convert data view to string.
*
* @pre Must not be default constructed data_view.
*/
explicit operator std::string() const {
protozero_assert(m_data);
return std::string{m_data, m_size};
}
}; // class data_view
/**
* Swap two data_view objects.
*
* @param lhs First object.
* @param rhs Second object.
*/
inline void swap(data_view& lhs, data_view& rhs) noexcept {
lhs.swap(rhs);
}
/**
* Two data_view instances are equal if they have the same size and the
* same content.
*
* @param lhs First object.
* @param rhs Second object.
*/
inline bool operator==(const data_view& lhs, const data_view& rhs) noexcept {
return lhs.size() == rhs.size() && std::equal(lhs.data(), lhs.data() + lhs.size(), rhs.data());
}
/**
* Two data_view instances are not equal if they have different sizes or the
* content differs.
*
* @param lhs First object.
* @param rhs Second object.
*/
inline bool operator!=(const data_view& lhs, const data_view& rhs) noexcept {
return !(lhs == rhs);
}
#endif
} // end namespace protozero
#endif // PROTOZERO_TYPES_HPP

View File

@ -31,25 +31,25 @@ namespace detail {
// from https://github.com/facebook/folly/blob/master/folly/Varint.h
inline uint64_t decode_varint_impl(const char** data, const char* end) {
const int8_t* begin = reinterpret_cast<const int8_t*>(*data);
const int8_t* iend = reinterpret_cast<const int8_t*>(end);
const auto begin = reinterpret_cast<const int8_t*>(*data);
const auto iend = reinterpret_cast<const int8_t*>(end);
const int8_t* p = begin;
uint64_t val = 0;
if (iend - begin >= max_varint_length) { // fast path
do {
int64_t b;
b = *p++; val = uint64_t((b & 0x7f) ); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 7); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 14); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 21); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 28); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 35); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 42); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 49); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 56); if (b >= 0) break;
b = *p++; val |= uint64_t((b & 0x7f) << 63); if (b >= 0) break;
throw varint_too_long_exception();
b = *p++; val = uint64_t((b & 0x7f) ); if (b >= 0) { break; }
b = *p++; val |= uint64_t((b & 0x7f) << 7); if (b >= 0) { break; }
b = *p++; val |= uint64_t((b & 0x7f) << 14); if (b >= 0) { break; }
b = *p++; val |= uint64_t((b & 0x7f) << 21); if (b >= 0) { break; }
b = *p++; val |= uint64_t((b & 0x7f) << 28); if (b >= 0) { break; }
b = *p++; val |= uint64_t((b & 0x7f) << 35); if (b >= 0) { break; }
b = *p++; val |= uint64_t((b & 0x7f) << 42); if (b >= 0) { break; }
b = *p++; val |= uint64_t((b & 0x7f) << 49); if (b >= 0) { break; }
b = *p++; val |= uint64_t((b & 0x7f) << 56); if (b >= 0) { break; }
b = *p++; val |= uint64_t((b & 0x01) << 63); if (b >= 0) { break; }
throw varint_too_long_exception{};
} while (false);
} else {
int shift = 0;
@ -58,7 +58,7 @@ namespace detail {
shift += 7;
}
if (p == iend) {
throw end_of_buffer_exception();
throw end_of_buffer_exception{};
}
val |= uint64_t(*p++) << shift;
}
@ -89,7 +89,7 @@ namespace detail {
inline uint64_t decode_varint(const char** data, const char* end) {
// If this is a one-byte varint, decode it here.
if (end != *data && ((**data & 0x80) == 0)) {
uint64_t val = uint64_t(**data);
const auto val = static_cast<uint64_t>(**data);
++(*data);
return val;
}
@ -110,8 +110,8 @@ inline uint64_t decode_varint(const char** data, const char* end) {
* before the end of the varint.
*/
inline void skip_varint(const char** data, const char* end) {
const int8_t* begin = reinterpret_cast<const int8_t*>(*data);
const int8_t* iend = reinterpret_cast<const int8_t*>(end);
const auto begin = reinterpret_cast<const int8_t*>(*data);
const auto iend = reinterpret_cast<const int8_t*>(end);
const int8_t* p = begin;
while (p != iend && *p < 0) {
@ -119,11 +119,11 @@ inline void skip_varint(const char** data, const char* end) {
}
if (p >= begin + max_varint_length) {
throw varint_too_long_exception();
throw varint_too_long_exception{};
}
if (p == iend) {
throw end_of_buffer_exception();
throw end_of_buffer_exception{};
}
++p;
@ -138,6 +138,7 @@ inline void skip_varint(const char** data, const char* end) {
* @param data Output iterator the varint encoded value will be written to
* byte by byte.
* @param value The integer that will be encoded.
* @returns the number of bytes written
* @throws Any exception thrown by increment or dereference operator on data.
*/
template <typename T>

View File

@ -20,15 +20,15 @@ documentation.
#define PROTOZERO_VERSION_MAJOR 1
/// The minor version number
#define PROTOZERO_VERSION_MINOR 5
#define PROTOZERO_VERSION_MINOR 6
/// The patch number
#define PROTOZERO_VERSION_PATCH 2
#define PROTOZERO_VERSION_PATCH 1
/// The complete version number
#define PROTOZERO_VERSION_CODE (PROTOZERO_VERSION_MAJOR * 10000 + PROTOZERO_VERSION_MINOR * 100 + PROTOZERO_VERSION_PATCH)
/// Version number as string
#define PROTOZERO_VERSION_STRING "1.5.2"
#define PROTOZERO_VERSION_STRING "1.6.1"
#endif // PROTOZERO_VERSION_HPP

View File

@ -473,7 +473,11 @@ int serialize_feature(struct serialization_state *sst, serial_feature &sf) {
}
}
sf.extent = (long long) extent;
if (extent <= LLONG_MAX) {
sf.extent = (long long) extent;
} else {
sf.extent = LLONG_MAX;
}
if (!prevent[P_INPUT_ORDER]) {
sf.seq = 0;
@ -487,7 +491,7 @@ int serialize_feature(struct serialization_state *sst, serial_feature &sf) {
long long midy = (sf.bbox[1] / 2 + sf.bbox[3] / 2) & ((1LL << 32) - 1);
bbox_index = encode(midx, midy);
if (additional[A_DROP_DENSEST_AS_NEEDED] || additional[A_CALCULATE_FEATURE_DENSITY] || additional[A_INCREASE_GAMMA_AS_NEEDED] || sst->uses_gamma) {
if (additional[A_DROP_DENSEST_AS_NEEDED] || additional[A_CLUSTER_DENSEST_AS_NEEDED] || additional[A_CALCULATE_FEATURE_DENSITY] || additional[A_INCREASE_GAMMA_AS_NEEDED] || sst->uses_gamma || cluster_distance != 0) {
sf.index = bbox_index;
} else {
sf.index = 0;

File diff suppressed because one or more lines are too long

177
tests/coalesce-id/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

File diff suppressed because one or more lines are too long

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,244 @@
scalerank,natscale,labelrank,featurecla,name,namepar,namealt,diffascii,nameascii,adm0cap,capalt,capin,worldcity,megacity,sov0name,sov_a3,adm0name,adm0_a3,adm1name,iso_a2,note,latitude,longitude,changed,namediff,diffnote,pop_max,pop_min,pop_other,rank_max,rank_min,geonameid,meganame,ls_name,ls_match,checkme,min_zoom
8,10,3,Admin-0 capital,Vatican City,,,0,Vatican City,1.00000000000,,,1.00000000000,0,Vatican (Holy Sea),VAT,Vatican (Holy See),VAT,Lazio,VA,,41.90001222640,12.44780838890,4.00000000000,0,Changed scale rank.,832,832,562430,2,2,6691831.00000000000,,Vatican City,1,0,7.0
7,20,0,Admin-0 capital,San Marino,,,0,San Marino,1.00000000000,,,0.00000000000,0,San Marino,SMR,San Marino,SMR,,SM,,43.91715008450,12.46667028670,0.00000000000,0,,29579,29000,0,7,7,3168070.00000000000,,San Marino,1,5,6.1
7,20,0,Admin-0 capital,Vaduz,,,0,Vaduz,1.00000000000,,,0.00000000000,0,Liechtenstein,LIE,Liechtenstein,LIE,,LI,,47.13372377430,9.51666947291,0.00000000000,0,,36281,5342,33009,7,5,3042030.00000000000,,Vaduz,1,0,6.7
6,30,8,Admin-0 capital alt,Lobamba,,,0,Lobamba,0.00000000000,1,Legislative and,0.00000000000,0,Swaziland,SWZ,Swaziland,SWZ,Manzini,SZ,,-26.46666746140,31.19999710970,4.00000000000,0,Changed scale rank.,9782,4557,0,5,4,935048.00000000000,,Lobamba,1,5,6.0
6,30,8,Admin-0 capital,Luxembourg,,,0,Luxembourg,1.00000000000,,,0.00000000000,0,Luxembourg,LUX,Luxembourg,LUX,Luxembourg,LU,,49.61166037910,6.13000280623,4.00000000000,0,Changed scale rank.,107260,76684,106219,9,8,2960316.00000000000,,Luxembourg,1,0,6.0
6,30,0,Admin-0 capital,Palikir,,,0,Palikir,1.00000000000,,,0.00000000000,0,Federated States of Micronesia,FSM,Federated States of Micronesia,FSM,,FM,,6.91664369601,158.14997432400,4.00000000000,0,Changed scale rank.,4645,4645,0,4,4,2081986.00000000000,,Palikir,1,5,6.0
6,30,0,Admin-0 capital,Majuro,,,0,Majuro,1.00000000000,,,0.00000000000,0,Marshall Islands,MHL,Marshall Islands,MHL,,MH,,7.10300431122,171.38000017600,4.00000000000,0,Changed scale rank.,25400,20500,0,7,7,2113779.00000000000,,Majuro,1,5,6.0
6,30,0,Admin-0 capital,Funafuti,,,0,Funafuti,1.00000000000,,,0.00000000000,0,Tuvalu,TUV,Tuvalu,TUV,,TV,,-8.51665199904,179.21664709400,4.00000000000,0,Population from GeoNames. Changed scale rank.,4749,4749,0,4,4,2110394.00000000000,,Funafuti,0,5,6.0
6,30,0,Admin-0 capital,Melekeok,,,0,Melekeok,1.00000000000,,,0.00000000000,0,Palau,PLW,Palau,PLW,,PW,,7.48739617298,134.62654846700,4.00000000000,0,Location adjusted. Changed scale rank.,7026,7026,0,5,5,1559804.00000000000,,Melekeok,1,5,6.0
6,30,0,Admin-0 capital alt,Bir Lehlou,,,0,Bir Lehlou,0.00000000000,1,Claimed as inte,0.00000000000,0,Western Sahara,SAH,Western Sahara,SAH,,EH,,26.11916668600,-9.65252221825,4.00000000000,1,Added place.,500,200,0,2,1,-1.00000000000,,,2,0,6.0
6,30,0,Admin-0 capital,Monaco,,,0,Monaco,1.00000000000,,,0.00000000000,0,Monaco,MCO,Monaco,MCO,,MC,,43.73964568790,7.40691317347,4.00000000000,0,Location adjusted. Changed scale rank.,36371,36371,102371,7,7,2993458.00000000000,,Monaco,1,0,5.1
6,30,0,Admin-0 capital,Tarawa,,,0,Tarawa,1.00000000000,,,0.00000000000,0,Kiribati,KIR,Kiribati,KIR,,KI,,1.33818750562,173.01757082900,4.00000000000,0,Location adjusted. Changed scale rank.,28802,22534,0,7,7,2110079.00000000000,,Tarawa,1,5,6.0
6,30,0,Admin-0 capital,Moroni,,,0,Moroni,1.00000000000,,,0.00000000000,0,Comoros,COM,Comoros,COM,,KM,,-11.70415769570,43.24024409870,4.00000000000,0,Changed scale rank.,128698,42872,0,9,7,921772.00000000000,,Moroni,1,5,6.0
6,30,0,Admin-0 capital,Andorra,,,0,Andorra,1.00000000000,,,0.00000000000,0,Andorra,AND,Andorra,AND,,AD,,42.50000144350,1.51648596051,4.00000000000,0,Changed scale rank.,53998,22256,53371,8,7,3130067.00000000000,,Andorra,1,5,6.0
4,50,8,Admin-0 capital,Port-of-Spain,,,0,Port-of-Spain,1.00000000000,,,0.00000000000,0,Trinidad and Tobago,TTO,Trinidad and Tobago,TTO,Port of Spain,TT,,10.65199708960,-61.51703088540,4.00000000000,0,Changed scale rank.,294934,49031,419082,10,7,3573890.00000000000,,Port-of-Spain,1,5,5.1
4,50,0,Admin-0 capital,Kigali,,,0,Kigali,1.00000000000,,,0.00000000000,1,Rwanda,RWA,Rwanda,RWA,Kigali City,RW,,-1.95359006868,30.06053177770,4.00000000000,0,Changed scale rank.,860000,745261,1152904,11,11,202061.00000000000,Kigali,Kigali,1,0,5.1
4,50,8,Admin-0 capital,Mbabane,,,0,Mbabane,1.00000000000,,Administrative,0.00000000000,0,Swaziland,SWZ,Swaziland,SWZ,Hhohho,SZ,,-26.31665077840,31.13333451210,4.00000000000,0,Changed scale rank.,90138,76218,89979,8,8,934985.00000000000,,Mbabane,1,0,5.6
4,50,5,Admin-0 capital,Juba,,,0,Juba,0.00000000000,,,0.00000000000,0,South Sudan,SSD,South Sudan,SSD,Central Equatoria,SS,,4.82997519828,31.58002559280,20.00000000000,0,Changed country.,111975,111975,111975,9,9,373303.00000000000,,Juba,1,0,5.1
4,50,8,Admin-0 capital alt,The Hague,,,0,The Hague,0.00000000000,1,"Official, legis",0.00000000000,0,Kingdom of the Netherlands,NLD,Netherlands,NLD,Zuid-Holland,NL,,52.08003684400,4.26996130231,0.00000000000,0,,1406000,501725,688599,12,11,2747373.00000000000,,The Hague,1,0,5.6
4,50,8,Admin-0 capital,Ljubljana,,,0,Ljubljana,1.00000000000,,,0.00000000000,0,Slovenia,SVN,Slovenia,SVN,Osrednjeslovenska,SI,,46.05528830880,14.51496903350,4.00000000000,0,Changed scale rank.,314807,255115,256316,10,10,3196359.00000000000,,Ljubljana,1,0,5.6
4,50,7,Admin-0 capital,Bratislava,,,0,Bratislava,1.00000000000,,,0.00000000000,0,Slovakia,SVK,Slovakia,SVK,Bratislavský,SK,,48.15001833000,17.11698075220,4.00000000000,0,Changed scale rank.,423737,373687,361489,10,10,3060972.00000000000,,Bratislava,1,0,5.1
4,50,8,Admin-0 capital,Doha,,,0,Doha,1.00000000000,,,0.00000000000,0,Qatar,QAT,Qatar,QAT,Ad Dawhah,QA,,25.28655600890,51.53296789430,4.00000000000,0,Location adjusted. Changed scale rank.,1450000,731310,0,12,11,290030.00000000000,,Doha,1,5,5.6
4,50,8,Admin-0 capital,Podgorica,,,0,Podgorica,1.00000000000,,,0.00000000000,0,Montenegro,MNE,Montenegro,MNE,Podgorica,ME,,42.46597251290,19.26630692410,4.00000000000,0,Location adjusted. Changed scale rank.,145850,136473,0,9,9,3193044.00000000000,,Podgorica,1,0,5.6
4,50,6,Admin-0 capital alt,Sri Jawewardenepura Kotte,,,0,Sri Jawewardenepura Kotte,0.00000000000,1,Legislative cap,0.00000000000,0,Sri Lanka,LKA,Sri Lanka,LKA,Colombo,LK,,6.90000388481,79.94999304090,4.00000000000,1,Name changed.,115826,115826,2456292,9,9,1238992.00000000000,,Kotte,1,0,5.6
4,50,5,Admin-0 capital alt,Baguio City,,,0,Baguio City,0.00000000000,1,,0.00000000000,0,Philippines,PHL,Philippines,PHL,Benguet,PH,,16.42999066060,120.56994258500,40.00000000000,0,Changed scale rank.,447824,272714,164877,10,10,1728930.00000000000,,Baguio City,1,0,5.6
4,50,5,Admin-0 capital alt,Dodoma,,,0,Dodoma,0.00000000000,1,Offical capital,0.00000000000,0,United Republic of Tanzania,TZA,Tanzania,TZA,Dodoma,TZ,,-6.18330605177,35.75000362010,4.00000000000,0,Location adjusted.,218269,180541,0,10,9,160196.00000000000,,Dodoma,1,0,5.6
4,50,7,Admin-0 capital,Bern,,,0,Bern,1.00000000000,,,0.00000000000,0,Switzerland,CHE,Switzerland,CHE,Bern,CH,,46.91668275870,7.46697546248,4.00000000000,0,Changed scale rank.,275329,121631,267814,10,9,2661552.00000000000,,Bern,1,0,5.6
4,50,5,Admin-0 capital alt,Laayoune,,,0,Laayoune,0.00000000000,1,Claimed as capi,0.00000000000,0,Morocco,MAR,Morocco,MAR,Laâyoune - Boujdour - Sakia El Hamra,MA,,27.14998231910,-13.20000594220,0.00000000000,0,,188084,176365,176365,9,9,2462881.00000000000,,Laayoune,1,0,5.6
4,50,8,Admin-0 capital,Pristina,,,0,Pristina,1.00000000000,,,0.00000000000,0,Kosovo,KOS,Kosovo,KOS,Pristina,-99,,42.66670961410,21.16598425160,4.00000000000,0,Changed scale rank.,465186,198214,261783,10,9,786714.00000000000,,Pristina,1,0,5.6
4,50,8,Admin-0 capital,Roseau,,,0,Roseau,1.00000000000,,,0.00000000000,0,Dominica,DMA,Dominica,DMA,Saint George,DM,,15.30101564430,-61.38701298180,4.00000000000,0,Changed scale rank.,23336,16571,23336,7,6,3575635.00000000000,,Roseau,1,5,5.1
4,50,8,Admin-0 capital,Djibouti,,,0,Djibouti,1.00000000000,,,0.00000000000,0,Djibouti,DJI,Djibouti,DJI,Djibouti,DJ,,11.59501446430,43.14800166710,4.00000000000,0,Changed scale rank.,923000,604013,335001,11,11,223817.00000000000,,Djibouti,1,0,5.6
4,50,6,Admin-0 capital alt,Putrajaya,,,0,Putrajaya,0.00000000000,1,Administrative,0.00000000000,0,Malaysia,MYS,Malaysia,MYS,Selangor,MY,,2.91401979462,101.70194698000,0.00000000000,0,,67964,50000,956431,8,7,6697380.00000000000,,Putrajaya,1,5,5.6
4,50,2,Admin-0 capital alt,Kyoto,,,0,Kyoto,0.00000000000,1,Official capita,0.00000000000,1,Japan,JPN,Japan,JPN,Kyoto,JP,,35.02999228820,135.74999792400,0.00000000000,0,,1805000,1459640,1827367,12,12,1857910.00000000000,Kyoto,Kyoto,1,0,5.1
4,50,8,Admin-0 capital,Banjul,,,0,Banjul,1.00000000000,,,0.00000000000,0,"Gambia, The",GMB,The Gambia,GMB,Banjul,GM,,13.45387646030,-16.59170148920,4.00000000000,0,Location adjusted. Changed scale rank.,43094,34589,581300,7,7,2413876.00000000000,,Banjul,1,0,5.6
4,50,8,Admin-0 capital,Skopje,,,0,Skopje,1.00000000000,,,0.00000000000,0,Macedonia,MKD,Macedonia,MKD,Centar,MK,,42.00000612290,21.43346146510,4.00000000000,0,Changed scale rank.,494087,474889,491890,10,10,785842.00000000000,,Skopje,1,5,5.6
4,50,8,Admin-0 capital,Bridgetown,,,0,Bridgetown,1.00000000000,,,0.00000000000,0,Barbados,BRB,Barbados,BRB,Saint Michael,BB,,13.10200258280,-59.61652673510,4.00000000000,0,Changed scale rank.,191152,96578,191814,9,8,2075807.00000000000,,Bridgetown,1,5,5.6
4,50,8,Admin-0 capital alt,Porto-Novo,,,0,Porto-Novo,0.00000000000,1,Official capita,0.00000000000,0,Benin,BEN,Benin,BEN,Ouémé,BJ,,6.48331097302,2.61662552757,0.00000000000,0,,300000,234168,806945,10,10,2392087.00000000000,,Porto-Novo,1,0,5.6
4,50,8,Admin-0 capital,Bujumbura,,,0,Bujumbura,1.00000000000,,,0.00000000000,0,Burundi,BDI,Burundi,BDI,Bujumbura Mairie,BI,,-3.37608722037,29.36000606150,4.00000000000,0,Changed scale rank.,331700,331700,1208361,10,10,425378.00000000000,,Bujumbura,1,0,5.6
4,50,0,Admin-0 capital,Kingstown,,,0,Kingstown,1.00000000000,,,0.00000000000,0,Saint Vincent and the Grenadines,VCT,Saint Vincent and the Grenadines,VCT,,VC,,13.14827882790,-61.21206242030,4.00000000000,0,Location adjusted. Changed scale rank.,49485,24518,0,7,7,4359981.00000000000,,Kingstown,1,5,5.1
4,50,0,Admin-0 capital,Castries,,,0,Castries,1.00000000000,,,0.00000000000,0,Saint Lucia,LCA,Saint Lucia,LCA,,LC,,14.00197348930,-61.00000818040,4.00000000000,0,Changed scale rank.,37963,10634,0,7,6,3028258.00000000000,,Castries,1,5,5.6
4,50,0,Admin-0 capital,Basseterre,,,0,Basseterre,1.00000000000,,,0.00000000000,0,Saint Kitts and Nevis,KNA,Saint Kitts and Nevis,KNA,,KN,,17.30203045550,-62.71700931970,4.00000000000,0,Changed scale rank.,21887,15500,21887,7,6,3575551.00000000000,,Basseterre,1,5,5.6
4,50,0,Admin-0 capital,Port Louis,,,0,Port Louis,1.00000000000,,,0.00000000000,0,Mauritius,MUS,Mauritius,MUS,,MU,,-20.16663857140,57.49999385460,4.00000000000,0,Changed scale rank.,595491,148416,304613,11,9,934154.00000000000,,Port Louis,1,5,5.6
4,50,0,Admin-0 capital,Saint George's,,,0,Saint George's,1.00000000000,,,0.00000000000,0,Grenada,GRD,Grenada,GRD,,GD,,12.05263340170,-61.74164322610,4.00000000000,0,Changed scale rank.,33734,27343,27343,7,7,3579925.00000000000,,Saint Georgee۪s,1,5,5.1
4,50,0,Admin-0 capital,Manama,,,0,Manama,1.00000000000,,,0.00000000000,0,Bahrain,BHR,Bahrain,BHR,,BH,,26.23613629050,50.58305171590,4.00000000000,0,Changed scale rank.,563920,157474,563666,11,9,290340.00000000000,,Manama,1,5,5.6
4,50,0,Admin-0 capital,Saint John's,,,0,Saint John's,1.00000000000,,,0.00000000000,0,Antigua and Barbuda,ATG,Antigua and Barbuda,ATG,,AG,,17.11803651830,-61.85003381510,4.00000000000,0,Changed scale rank.,35499,24226,0,7,7,3576022.00000000000,,Saint John's,1,5,5.1
3,110,8,Admin-0 capital,Montevideo,,,0,Montevideo,1.00000000000,,,0.00000000000,1,Uruguay,URY,Uruguay,URY,Montevideo,UY,,-34.85804156620,-56.17105228840,0.00000000000,0,,1513000,5324,1276128,12,5,5038018.00000000000,Montevideo,Montevideo,1,0,4.0
3,110,8,Admin-0 capital,Lomé,,Lome,0,Lome,1.00000000000,,,0.00000000000,1,Togo,TGO,Togo,TGO,Maritime,TG,,6.13193707166,1.22275711936,0.00000000000,0,,1452000,749700,1256715,12,11,2365267.00000000000,Lomi,Lome,1,0,5.0
3,110,7,Admin-0 capital,Tunis,,,0,Tunis,1.00000000000,,,0.00000000000,0,Tunisia,TUN,Tunisia,TUN,Tunis,TN,,36.80277813620,10.17967809920,0.00000000000,0,,2412500,728453,1675117,12,11,2464470.00000000000,,Tunis,1,0,5.0
3,110,8,Admin-0 capital,Abu Dhabi,,,0,Abu Dhabi,1.00000000000,,,0.00000000000,0,United Arab Emirates,ARE,United Arab Emirates,ARE,Abu Dhabi,AE,,24.46668357240,54.36659338260,0.00000000000,0,,603492,560230,560230,11,11,292968.00000000000,,Abu Dhabi,1,0,5.0
3,110,8,Admin-0 capital,Ashgabat,,,0,Ashgabat,1.00000000000,,,0.00000000000,0,Turkmenistan,TKM,Turkmenistan,TKM,Ahal,TM,,37.94999493310,58.38329911180,0.00000000000,0,,727700,577982,556048,11,11,162183.00000000000,,Ashgabat,1,0,5.0
3,110,6,Admin-0 capital,Lusaka,,,0,Lusaka,1.00000000000,,,0.00000000000,1,Zambia,ZMB,Zambia,ZMB,Lusaka,ZM,,-15.41664426790,28.28332759470,0.00000000000,0,,1328000,1267440,1240558,12,12,909137.00000000000,Lusaka,Lusaka,1,0,4.0
3,110,6,Admin-0 capital,Harare,,,0,Harare,1.00000000000,,,0.00000000000,1,Zimbabwe,ZWE,Zimbabwe,ZWE,Harare,ZW,,-17.81778969440,31.04470943070,0.00000000000,0,,1572000,1542813,1831877,12,12,890299.00000000000,Harare,Harare,1,0,4.0
3,110,8,Admin-0 capital,Dili,,,0,Dili,1.00000000000,,,0.00000000000,0,East Timor,TLS,East Timor,TLS,Dili,TL,,-8.55938840855,125.57945593200,0.00000000000,0,,234331,193563,55154,10,9,1645457.00000000000,,Dili,1,0,5.0
3,110,8,Admin-0 capital,Port Vila,,,0,Port Vila,1.00000000000,,,0.00000000000,0,Vanuatu,VUT,Vanuatu,VUT,Shefa,VU,,-17.73335040400,168.31664058400,0.00000000000,0,,44040,35901,7702,7,7,2135171.00000000000,,Port-Vila,1,0,4.0
3,110,8,Admin-0 capital,Tegucigalpa,,,0,Tegucigalpa,1.00000000000,,,0.00000000000,1,Honduras,HND,Honduras,HND,Francisco Morazán,HN,,14.10204490050,-87.21752933930,0.00000000000,0,,946000,850848,1014546,11,11,3600949.00000000000,Tegucigalpa,Tegucigalpa,1,0,5.0
3,110,8,Admin-0 capital,Georgetown,,,0,Georgetown,1.00000000000,,,0.00000000000,0,Guyana,GUY,Guyana,GUY,East Berbice-Corentyne,GY,,6.80197369275,-58.16702864750,0.00000000000,0,,264350,235017,264350,10,10,3378644.00000000000,,Georgetown1,1,5,4.0
3,110,8,Admin-0 capital,Reykjavík,,,1,Reykjavik,1.00000000000,,,0.00000000000,0,Iceland,ISL,Iceland,ISL,Suðurnes,IS,,64.15002361970,-21.95001448720,0.00000000000,0,,166212,113906,160116,9,9,3413829.00000000000,,Reykjavik,1,0,3.7
3,110,8,Admin-0 capital,Port-au-Prince,,,0,Port-au-Prince,1.00000000000,,,0.00000000000,1,Haiti,HTI,Haiti,HTI,Ouest,HT,,18.54102459610,-72.33603458830,0.00000000000,0,,1998000,1234742,2385397,12,12,3718426.00000000000,Port-au-Prince,Port-au-Prince,1,0,5.0
3,110,5,Admin-0 capital,Kampala,,,0,Kampala,1.00000000000,,,0.00000000000,1,Uganda,UGA,Uganda,UGA,Kampala,UG,,0.31665895477,32.58332352570,0.00000000000,0,,1420000,1353189,2153702,12,12,232422.00000000000,Kampala,Kampala,1,0,5.0
3,110,8,Admin-0 capital,Paramaribo,,,0,Paramaribo,1.00000000000,,,0.00000000000,0,Suriname,SUR,Suriname,SUR,Paramaribo,SR,,5.83503012992,-55.16703088540,0.00000000000,0,,254169,223757,248161,10,10,3383330.00000000000,,Paramaribo,1,5,5.0
3,110,6,Admin-0 capital,Niamey,,,0,Niamey,1.00000000000,,,0.00000000000,1,Niger,NER,Niger,NER,Niamey,NE,,13.51670595190,2.11665604514,0.00000000000,0,,915000,742791,715325,11,11,2440485.00000000000,Niamey,Niamey,1,0,5.0
3,110,8,Admin-0 capital,Dushanbe,,,0,Dushanbe,1.00000000000,,,0.00000000000,0,Tajikistan,TJK,Tajikistan,TJK,Tadzhikistan Territories,TJ,,38.56003521630,68.77387935270,0.00000000000,0,,1086244,679400,1081361,12,11,1221874.00000000000,,Dushanbe,1,0,5.0
3,110,7,Admin-0 capital,Asunción,,Asuncion,1,Asuncion,1.00000000000,,,0.00000000000,1,Paraguay,PRY,Paraguay,PRY,Asunción,PY,,-25.29640297570,-57.64150516930,0.00000000000,0,,1870000,11693,636771,12,6,1730025.00000000000,Asuncian,Asuncion,1,5,4.0
3,110,8,Admin-0 capital,Managua,,,0,Managua,1.00000000000,,,0.00000000000,1,Nicaragua,NIC,Nicaragua,NIC,Managua,NI,,12.15301658010,-86.26849166030,0.00000000000,0,,920000,920000,1088194,11,11,3617763.00000000000,Managua,Managua,1,0,5.0
3,110,8,Admin-0 capital,Freetown,,,0,Freetown,1.00000000000,,,0.00000000000,1,Sierra Leone,SLE,Sierra Leone,SLE,Western,SL,,8.47001141249,-13.23421574040,0.00000000000,0,,827000,13768,1074640,11,6,2408770.00000000000,Freetown,Freetown,1,0,5.0
3,110,2,Admin-0 capital,Islamabad,,,0,Islamabad,1.00000000000,,,0.00000000000,1,Pakistan,PAK,Pakistan,PAK,F.C.T.,PK,,33.69999595030,73.16663447970,0.00000000000,0,,780000,601600,893673,11,11,1176615.00000000000,Islamabad,Islamabad,1,0,5.0
3,110,6,Admin-0 capital,Kathmandu,,,0,Kathmandu,1.00000000000,,,0.00000000000,1,Nepal,NPL,Nepal,NPL,Bhaktapur,NP,,27.71669191390,85.31664221080,0.00000000000,0,,895000,895000,1099610,11,11,1283240.00000000000,Kathmandu,Kathmandu,1,0,5.0
3,110,3,Admin-0 capital,Bloemfontein,,,0,Bloemfontein,1.00000000000,,Judicial capita,0.00000000000,0,South Africa,ZAF,South Africa,ZAF,Orange Free State,ZA,,-29.11999387740,26.22991288120,4.00000000000,0,Changed scale rank.,463064,456669,456513,10,10,1018725.00000000000,,Bloemfontein,1,0,5.0
3,110,3,Admin-0 capital,Pretoria,,,0,Pretoria,1.00000000000,,Administrative,0.00000000000,1,South Africa,ZAF,South Africa,ZAF,Gauteng,ZA,,-25.70692055380,28.22942907580,0.00000000000,0,,1338000,1338000,1443084,12,12,964137.00000000000,Pretoria,Pretoria,1,0,5.0
3,110,8,Admin-0 capital,Port Moresby,,,0,Port Moresby,1.00000000000,,,0.00000000000,0,Papua New Guinea,PNG,Papua New Guinea,PNG,Central,PG,,-9.46470782587,147.19250362100,0.00000000000,0,,283733,251136,251304,10,10,2088122.00000000000,,Port Moresby,1,0,4.0
3,110,8,Admin-0 capital,Honiara,,,0,Honiara,1.00000000000,,,0.00000000000,0,Solomon Islands,SLB,Solomon Islands,SLB,Guadalcanal,SB,,-9.43799429509,159.94976573400,0.00000000000,0,,76328,56298,76328,8,8,2108502.00000000000,,Honiara,1,0,5.0
3,110,8,Admin-0 capital,Panama City,,Ciudad de Panam,0,Panama City,1.00000000000,,,0.00000000000,1,Panama,PAN,Panama,PAN,Panama,PA,,8.96801719048,-79.53303715180,0.00000000000,0,,1281000,408168,939725,12,10,3703443.00000000000,Ciudad de Panam,Panama City1,1,0,5.0
3,110,5,Admin-0 capital,Rabat,,,0,Rabat,1.00000000000,,,0.00000000000,1,Morocco,MAR,Morocco,MAR,Rabat - Salé - Zemmour - Zaer,MA,,34.02529909160,-6.83613082013,0.00000000000,0,,1705000,1655753,2029349,12,12,2538475.00000000000,Rabat,Rabat,1,0,5.0
3,110,8,Admin-0 capital,Chișinău,,,0,Chisinau,1.00000000000,,,0.00000000000,0,Moldova,MDA,Moldova,MDA,Chisinau,MD,,47.00502361970,28.85771113970,0.00000000000,0,,688134,635994,664472,11,11,618426.00000000000,,Chisinau,1,5,5.0
3,110,6,Admin-0 capital,Maputo,,,0,Maputo,1.00000000000,,,0.00000000000,1,Mozambique,MOZ,Mozambique,MOZ,Maputo,MZ,,-25.95527748740,32.58916296260,0.00000000000,0,,1446000,1191613,1365454,12,12,1040652.00000000000,Maputo,Maputo,1,0,5.0
3,110,8,Admin-0 capital,Mogadishu,,Muqdisho,0,Mogadishu,1.00000000000,,,0.00000000000,1,Somalia,SOM,Somalia,SOM,Banaadir,SO,,2.06668133433,45.36667761110,0.00000000000,0,,1100000,875388,849392,12,11,53654.00000000000,Muqdisho,Mogadishu,1,5,4.0
3,110,8,Admin-0 capital,Muscat,,,0,Muscat,1.00000000000,,,0.00000000000,0,Oman,OMN,Oman,OMN,Muscat,OM,,23.61332480770,58.59331213260,0.00000000000,0,,734697,586861,586861,11,11,287286.00000000000,,Muscat,1,0,5.0
3,110,6,Admin-0 capital,Colombo,,,0,Colombo,1.00000000000,,"De facto, admin",0.00000000000,0,Sri Lanka,LKA,Sri Lanka,LKA,Colombo,LK,,6.93196575818,79.85775060930,0.00000000000,0,,217000,217000,2490974,10,10,3465927.00000000000,,Colombo,1,5,5.0
3,110,7,Admin-0 capital,Ulaanbaatar,,,0,Ulaanbaatar,1.00000000000,,,0.00000000000,1,Mongolia,MNG,Mongolia,MNG,Ulaanbaatar,MN,,47.91667339990,106.91661576200,0.00000000000,0,,885000,769612,765359,11,11,2028462.00000000000,Ulaanbaatar,Ulaanbaatar,1,0,4.0
3,110,6,Admin-0 capital,Windhoek,,,0,Windhoek,1.00000000000,,,0.00000000000,0,Namibia,NAM,Namibia,NAM,Khomas,NA,,-22.57000608440,17.08354610050,0.00000000000,0,,268132,262796,262796,10,10,3352136.00000000000,,Windhoek,1,0,5.0
3,110,2,Admin-0 capital,Abuja,,,0,Abuja,1.00000000000,,Official and ad,0.00000000000,1,Nigeria,NGA,Nigeria,NGA,Federal Capital Territory,NG,,9.08333314914,7.53332800155,4.00000000000,0,Changed scale rank.,1576000,162135,0,12,9,2322794.00000000000,Abuja,Abuja,1,5,4.0
3,110,8,Admin-0 capital,Bissau,,,0,Bissau,1.00000000000,,,0.00000000000,0,Guinea Bissau,GNB,Guinea Bissau,GNB,Bissau,GW,,11.86502382300,-15.59836084130,0.00000000000,0,,403339,388028,403339,10,10,2374775.00000000000,,Bissau,1,0,5.0
3,110,8,Admin-0 capital,Amman,,,0,Amman,1.00000000000,,,0.00000000000,1,Jordan,JOR,Jordan,JOR,Amman,JO,,31.95002524720,35.93329992550,0.00000000000,0,,1060000,1060000,2633729,12,12,250441.00000000000,Amman,Amman,1,0,5.0
3,110,8,Admin-0 capital,Vilnius,,,0,Vilnius,1.00000000000,,,0.00000000000,0,Lithuania,LTU,Lithuania,LTU,Vilniaus,LT,,54.68336631180,25.31663529330,0.00000000000,0,,542366,507029,494356,11,11,593116.00000000000,,Vilnius,1,0,5.0
3,110,8,Admin-0 capital,Riga,,,0,Riga,1.00000000000,,,0.00000000000,0,Latvia,LVA,Latvia,LVA,Riga,LV,,56.95002382320,24.09996537140,0.00000000000,0,,742572,705033,0,11,11,456172.00000000000,,Riga,1,0,4.0
3,110,8,Admin-0 capital,Bishkek,,,0,Bishkek,1.00000000000,,,0.00000000000,1,Kyrgyzstan,KGZ,Kyrgyzstan,KGZ,Bishkek,KG,,42.87307944650,74.58520422250,0.00000000000,0,,837000,804212,781714,11,11,1528675.00000000000,Bishkek,Bishkek,1,5,5.0
3,110,8,Admin-0 capital,Maseru,,,0,Maseru,1.00000000000,,,0.00000000000,0,Lesotho,LSO,Lesotho,LSO,Maseru,LS,,-29.31667437870,27.48327307000,0.00000000000,0,,361324,118355,356225,10,9,932505.00000000000,,Maseru,1,0,5.0
3,110,6,Admin-0 capital,Antananarivo,,,0,Antananarivo,1.00000000000,,,0.00000000000,1,Madagascar,MDG,Madagascar,MDG,Antananarivo,MG,,-18.91663735060,47.51662390010,0.00000000000,0,,1697000,1391433,1844658,12,12,1070940.00000000000,Antananarivo,Antananarivo,1,0,5.0
3,110,7,Admin-0 capital,Quito,,,0,Quito,1.00000000000,,,0.00000000000,1,Ecuador,ECU,Ecuador,ECU,Pichincha,EC,,-0.21498818065,-78.50005110850,0.00000000000,0,,1701000,1399814,1435528,12,12,3652462.00000000000,Quito,Quito,1,0,4.0
3,110,8,Admin-0 capital,San José,,San Jose,1,San Jose,1.00000000000,,,0.00000000000,1,Costa Rica,CRI,Costa Rica,CRI,San José,CR,,9.93501242974,-84.08405135270,0.00000000000,0,,1284000,1724,1434681,12,3,3669623.00000000000,San Josi,San Jose1,1,5,5.0
3,110,8,Admin-0 capital,San Salvador,,,0,San Salvador,1.00000000000,,,0.00000000000,1,El Salvador,SLV,El Salvador,SLV,San Salvador,SV,,13.71000164690,-89.20304122080,0.00000000000,0,,1433000,2807,2139587,12,4,1690681.00000000000,San Salvador,San Salvador,1,5,5.0
3,110,8,Admin-0 capital,Kingston,,,0,Kingston,1.00000000000,,,0.00000000000,0,Jamaica,JAM,Jamaica,JAM,Kingston,JM,,17.97707662380,-76.76743371370,4.00000000000,0,Location adjusted.,937700,664973,18171,11,11,3489854.00000000000,,Kingston1,1,5,5.0
3,110,7,Admin-0 capital,Ndjamena,,N'Djamnna,0,Ndjamena,1.00000000000,,,0.00000000000,1,Chad,TCD,Chad,TCD,Hadjer-Lamis,TD,,12.11309653620,15.04914831410,0.00000000000,0,,989000,681387,686347,11,11,2427123.00000000000,N'Djam-na,Ndjamena,1,0,5.0
3,110,8,Admin-0 capital,Malabo,,,0,Malabo,1.00000000000,,,0.00000000000,0,Equatorial Guinea,GNQ,Equatorial Guinea,GNQ,Bioko Norte,GQ,,3.75001527803,8.78327754582,4.00000000000,0,Location adjusted.,155963,155963,0,9,9,2309527.00000000000,,Malabo,1,0,5.0
3,110,8,Admin-0 capital,Asmara,,,0,Asmara,1.00000000000,,,0.00000000000,0,Eritrea,ERI,Eritrea,ERI,Anseba,ER,,15.33333925270,38.93332352580,0.00000000000,0,,620802,563930,587094,11,11,343300.00000000000,,Asmara,1,0,5.0
3,110,8,Admin-0 capital,Zagreb,,,0,Zagreb,1.00000000000,,,0.00000000000,0,Croatia,HRV,Croatia,HRV,Grad Zagreb,HR,,45.80000673330,15.99999466820,0.00000000000,0,,722526,698966,690638,11,11,3186886.00000000000,,Zagreb,1,0,5.0
3,110,8,Admin-0 capital,Tallinn,,,0,Tallinn,1.00000000000,,,0.00000000000,0,Estonia,EST,Estonia,EST,Harju,EE,,59.43387737950,24.72804072950,0.00000000000,0,,394024,340027,317949,10,10,588409.00000000000,,Tallinn,1,0,5.0
3,110,8,Admin-0 capital,Lilongwe,,,0,Lilongwe,1.00000000000,,,0.00000000000,0,Malawi,MWI,Malawi,MWI,Lilongwe,MW,,-13.98329506550,33.78330196000,0.00000000000,0,,646750,646750,1061388,11,11,927967.00000000000,,Lilongwe,1,0,5.0
3,110,8,Admin-0 capital,Guatemala,,Ciudad de Guatemala (Guatemala City),0,Guatemala,1.00000000000,,,0.00000000000,1,Guatemala,GTM,Guatemala,GTM,Guatemala,GT,,14.62113466280,-90.52696557790,0.00000000000,0,,1024000,994938,2391150,12,11,3598132.00000000000,Ciudad de Guatemala (Guatemala City),Guatemala,1,0,5.0
3,110,7,Admin-0 capital,Libreville,,,0,Libreville,1.00000000000,,,0.00000000000,0,Gabon,GAB,Gabon,GAB,Estuaire,GA,,0.38538860972,9.45796504582,0.00000000000,0,,578156,483355,483522,11,10,2399697.00000000000,,Libreville,1,0,5.0
3,110,8,Admin-0 capital,Suva,,,0,Suva,1.00000000000,,,0.00000000000,0,Fiji,FJI,Fiji,FJI,Central,FJ,,-18.13301593140,178.44170731500,4.00000000000,0,Location adjusted.,175399,88271,0,9,8,2198148.00000000000,,Suva,1,0,5.0
3,110,3,Admin-0 capital alt,Valparaíso,,Valparaiso,1,Valparaiso,0.00000000000,1,Legislative cap,0.00000000000,1,Chile,CHL,Chile,CHL,Valparaíso,CL,,-33.04776446660,-71.62101363290,4.00000000000,0,Changed scale rank.,854000,15938,130815,11,6,3445575.00000000000,Valpara so,Valparaiso2,1,0,5.0
3,110,7,Admin-0 capital,Nouakchott,,,0,Nouakchott,1.00000000000,,,0.00000000000,0,Mauritania,MRT,Mauritania,MRT,Nouakchott,MR,,18.08642702120,-15.97534041490,0.00000000000,0,,742144,661400,742144,11,11,2377450.00000000000,,Nouakchott,1,0,5.0
3,110,6,Admin-0 capital,Bamako,,,0,Bamako,1.00000000000,,,0.00000000000,1,Mali,MLI,Mali,MLI,Bamako,ML,,12.65001466770,-8.00003910464,0.00000000000,0,,1494000,1297281,1301407,12,12,2460596.00000000000,Bamako,Bamako,1,0,4.0
3,110,8,Admin-0 capital,Beirut,,Bayrut,0,Beirut,1.00000000000,,,0.00000000000,1,Lebanon,LBN,Lebanon,LBN,Beirut,LB,,33.87197511700,35.50970821000,0.00000000000,0,,1846000,1712125,1661980,12,12,276781.00000000000,Bayrut,Beirut,1,5,5.0
3,110,8,Admin-0 capital,Tbilisi,,T'Bilisi,0,Tbilisi,1.00000000000,,,0.00000000000,1,Georgia,GEO,Georgia,GEO,Tbilisi,GE,,41.72500998850,44.79079544960,0.00000000000,0,,1100000,1005257,977179,12,12,611717.00000000000,Tbilisi,Tbilisi,1,0,5.0
3,110,6,Admin-0 capital,Astana,,,0,Astana,1.00000000000,,,0.00000000000,0,Kazakhstan,KAZ,Kazakhstan,KAZ,Aqmola,KZ,,51.18112530430,71.42777420950,0.00000000000,0,,345604,325021,317445,10,10,1526273.00000000000,,Astana,1,0,4.0
3,110,8,Admin-0 capital,Vientiane,,,0,Vientiane,1.00000000000,,,0.00000000000,0,Laos,LAO,Laos,LAO,Vientiane [prefecture],LA,,17.96669272760,102.59998002000,0.00000000000,0,,754000,570348,469811,11,11,1651944.00000000000,,Vientiane,1,0,5.0
3,110,7,Admin-0 capital,Brazzaville,,,0,Brazzaville,1.00000000000,,,0.00000000000,1,Congo (Brazzaville),COG,Congo (Brazzaville),COG,Pool,CG,,-4.25918577181,15.28468949250,0.00000000000,0,,1355000,1163890,1174778,12,12,2260535.00000000000,Brazzaville,Brazzaville,1,0,5.0
3,110,8,Admin-0 capital,Conakry,,,0,Conakry,1.00000000000,,,0.00000000000,1,Guinea,GIN,Guinea,GIN,Conakry,GN,,9.53152284641,-13.68023502750,0.00000000000,0,,1494000,1494000,1498020,12,12,2422465.00000000000,Conakry,Conakry,1,5,5.0
3,110,8,Admin-0 capital,Yamoussoukro,,,0,Yamoussoukro,1.00000000000,1,Official capita,0.00000000000,0,Ivory Coast,CIV,Ivory Coast,CIV,Lacs,CI,,6.81838096000,-5.27550256491,4.00000000000,0,Changed scale rank.,206499,194530,206499,10,9,2279755.00000000000,,Yamoussoukro,1,0,5.0
3,110,2,Admin-0 capital,Ottawa,,Ottawa-Gatineau,0,Ottawa,1.00000000000,,,0.00000000000,1,Canada,CAN,Canada,CAN,Ontario,CA,,45.41669679670,-75.70001530120,0.00000000000,0,,1145000,812129,872781,12,11,6094817.00000000000,Ottawa-Gatineau,Ottawa,1,5,3.0
3,110,8,Admin-0 capital,Belgrade,Beograd,,0,Belgrade,1.00000000000,,,0.00000000000,1,Republic of Serbia,SRB,Serbia,SRB,Grad Beograd,RS,,44.81864544580,20.46799068060,0.00000000000,0,,1099000,1099000,1271541,12,12,792680.00000000000,Beograd,Belgrade,1,0,5.0
3,110,8,Admin-0 capital,Bandar Seri Begawan,,,0,Bandar Seri Begawan,1.00000000000,,,0.00000000000,0,Brunei,BRN,Brunei,BRN,Brunei and Muara,BN,,4.88333111462,114.93328405700,0.00000000000,0,,296500,140000,222513,10,9,1820906.00000000000,,Bandar Seri Begawan,1,0,5.0
3,110,6,Admin-0 capital,Sucre,,,0,Sucre,1.00000000000,,Official (const,0.00000000000,0,Bolivia,BOL,Bolivia,BOL,Chuquisaca,BO,,-19.04097084670,-65.25951562670,0.00000000000,0,,224838,221736,221736,10,10,3903987.00000000000,,Sucre,1,0,4.7
3,110,8,Admin-0 capital,Belmopan,,,0,Belmopan,1.00000000000,,,0.00000000000,0,Belize,BLZ,Belize,BLZ,Cayo,BZ,,17.25203350720,-88.76707299980,0.00000000000,0,,15220,13381,15220,6,6,3582672.00000000000,,Belmopan,1,0,5.0
3,110,7,Admin-0 capital,Bangui,,,0,Bangui,1.00000000000,,,0.00000000000,0,Central African Republic,CAF,Central African Republic,CAF,Bangui,CF,,4.36664430635,18.55828812530,0.00000000000,0,,831925,622771,782274,11,11,2389853.00000000000,,Bangui,1,0,5.0
3,110,6,Admin-0 capital,Yaounde,,Yaounde,0,Yaounde,1.00000000000,,,0.00000000000,1,Cameroon,CMR,Cameroon,CMR,Centre,CM,,3.86670066214,11.51665075550,0.00000000000,0,,1611000,1060587,1060747,12,12,2220957.00000000000,Yaound,Yaounde,1,0,5.0
3,110,8,Admin-0 capital,Tirana,,,0,Tirana,1.00000000000,,,0.00000000000,0,Albania,ALB,Albania,ALB,Durrës,AL,,41.32754070950,19.81888301460,0.00000000000,0,,895350,421286,517792,11,10,3183875.00000000000,,Tirana,1,0,5.0
3,110,8,Admin-0 capital,Yerevan,,,0,Yerevan,1.00000000000,,,0.00000000000,1,Armenia,ARM,Armenia,ARM,Erevan,AM,,40.18115073550,44.51355139040,0.00000000000,0,,1102000,1093485,1154748,12,12,616052.00000000000,Yerevan,Yerevan,1,5,5.0
3,110,8,Admin-0 capital,Baku,,,0,Baku,1.00000000000,,,0.00000000000,1,Azerbaijan,AZE,Azerbaijan,AZE,Baki,AZ,,40.39527203270,49.86221716190,0.00000000000,0,,2122300,1892000,1518801,12,12,587084.00000000000,Baku,Baku,1,0,5.0
3,110,8,Admin-0 capital,Phnom Penh,,Phnum Penh,0,Phnom Penh,1.00000000000,,,0.00000000000,1,Cambodia,KHM,Cambodia,KHM,Phnom Penh,KH,,11.55003012990,104.91663448000,0.00000000000,0,,1466000,1466000,1604086,12,12,1821306.00000000000,Phnum Penh,Phnom Penh,1,5,5.0
3,110,6,Admin-0 capital,La Paz,,,0,La Paz,1.00000000000,,Administrative,0.00000000000,1,Bolivia,BOL,Bolivia,BOL,La Paz,BO,,-16.49797361370,-68.14998519050,0.00000000000,0,,1590000,812799,4400,12,11,3911925.00000000000,La Paz,La Paz3,1,0,4.0
3,110,8,Admin-0 capital,Cotonou,,,0,Cotonou,1.00000000000,,"De facto, admin",0.00000000000,1,Benin,BEN,Benin,BEN,Ouémé,BJ,,6.40000856417,2.51999059918,0.00000000000,0,,762000,690584,1060640,11,11,2394819.00000000000,Cotonou,Cotonou,1,0,5.0
3,110,7,Admin-0 capital,Sofia,,,0,Sofia,1.00000000000,,,0.00000000000,1,Bulgaria,BGR,Bulgaria,BGR,Grad Sofiya,BG,,42.68334942530,23.31665401070,0.00000000000,0,,1185000,874827,871735,12,11,727011.00000000000,Sofia,Sofia,1,0,5.0
3,110,6,Admin-0 capital,Minsk,,,0,Minsk,1.00000000000,,,0.00000000000,1,Belarus,BLR,Belarus,BLR,Minsk,BY,,53.89997743640,27.56662715530,0.00000000000,0,,1805000,1577138,1557919,12,12,625144.00000000000,Minsk,Minsk,1,0,5.0
3,110,8,Admin-0 capital,Thimphu,,,0,Thimphu,1.00000000000,,,0.00000000000,0,Bhutan,BTN,Bhutan,BTN,Thimphu,BT,,27.47298585920,89.63901403700,4.00000000000,0,Location adjusted.,98676,79185,0,8,8,1252416.00000000000,,Thimphu,1,0,5.0
3,110,7,Admin-0 capital,Gaborone,,,0,Gaborone,1.00000000000,,,0.00000000000,0,Botswana,BWA,Botswana,BWA,South-East,BW,,-24.64631345740,25.91194779330,0.00000000000,0,,208411,159243,158896,10,9,933773.00000000000,,Gaborone,1,0,5.0
3,110,3,Admin-0 capital,Canberra,,,0,Canberra,1.00000000000,,,0.00000000000,0,Australia,AUS,Australia,AUS,Australian Capital Territory,AU,,-35.28302854540,149.12902624400,4.00000000000,0,Location adjusted.,327700,234032,0,10,10,2172517.00000000000,,Canberra,1,0,4.0
3,110,8,Admin-0 capital,Ouagadougou,,,0,Ouagadougou,1.00000000000,,,0.00000000000,1,Burkina Faso,BFA,Burkina Faso,BFA,Kadiogo,BF,,12.37031597790,-1.52472375630,0.00000000000,0,,1149000,835457,713874,12,11,2357048.00000000000,Ouagadougou,Ouagadougou,1,0,5.0
3,110,8,Admin-0 capital,Sarajevo,,,0,Sarajevo,1.00000000000,,,0.00000000000,0,Bosnia and Herzegovina,BIH,Bosnia and Herzegovina,BIH,Sarajevo,BA,,43.85002239900,18.38300166700,0.00000000000,0,,696731,628902,627065,11,11,3191281.00000000000,,Sarajevo,1,5,5.0
3,110,5,Admin-0 capital,Naypyidaw,,Nay Pyi Taw,0,Naypyidaw,1.00000000000,,,0.00000000000,1,Myanmar,MMR,Myanmar,MMR,Mandalay,MM,,19.76655702610,96.11861852920,4.00000000000,0,Location adjusted.,930000,194824,0,11,9,6611854.00000000000,Nay Pyi Taw,Naypyidaw,1,0,5.0
3,110,0,Admin-0 capital,Nukualofa,,,0,Nukualofa,1.00000000000,,,0.00000000000,0,Tonga,TON,Tonga,TON,,TO,,-21.13851235670,-175.22056447800,4.00000000000,0,Location adjusted.,42620,23658,42620,7,7,4032402.00000000000,,Nukualofa,1,5,5.0
3,110,0,Admin-0 capital,Hargeysa,,,0,Hargeysa,1.00000000000,,,0.00000000000,0,Somaliland,SOL,Somaliland,SOL,,-99,,9.56002239882,44.06531001670,4.00000000000,0,Changed scale rank.,477876,247018,247018,10,10,57289.00000000000,,Hargeysa,1,5,5.0
3,110,0,Admin-0 capital,Victoria,,,0,Victoria,1.00000000000,,,0.00000000000,0,Seychelles,SYC,Seychelles,SYC,,SC,,-4.61663165397,55.44998978560,0.00000000000,0,,33576,22881,33737,7,7,241131.00000000000,,Victoria4,1,5,5.0
3,110,0,Admin-0 capital,São Tomé,,,1,Sao Tome,1.00000000000,,,0.00000000000,0,Sao Tome and Principe,STP,Sao Tome and Principe,STP,,ST,,0.33340211883,6.73332515323,0.00000000000,0,,88219,56166,88219,8,8,3388092.00000000000,,Sao Tome,1,5,5.0
3,110,0,Admin-0 capital,Apia,,,0,Apia,1.00000000000,,,0.00000000000,0,Samoa,WSM,Samoa,WSM,,WS,,-13.84154504240,-171.73864160900,4.00000000000,0,Location adjusted.,61916,37708,0,8,7,3689793.00000000000,,Apia,1,5,5.0
3,110,0,Admin-0 capital,Valletta,,,0,Valletta,1.00000000000,,,0.00000000000,0,Malta,MLT,Malta,MLT,,MT,,35.89973248190,14.51471065130,0.00000000000,0,,368250,6966,336174,10,5,2562305.00000000000,,Valletta,1,5,5.0
3,110,0,Admin-0 capital,Malé,,,1,Male,1.00000000000,,,0.00000000000,0,Maldives,MDV,Maldives,MDV,,MV,,4.16670818981,73.49994746800,0.00000000000,0,,112927,103693,0,9,9,3174186.00000000000,,Male,1,5,5.0
3,110,0,Admin-0 capital,Jerusalem,,,0,Jerusalem,1.00000000000,,De facto capita,0.00000000000,0,Israel,IS1,Israel,ISR,Jerusalem,IL,,31.77840781560,35.20662593460,0.00000000000,0,,1029300,801000,1072567,12,11,281184.00000000000,,Jerusalem,1,0,3.7
3,110,0,Admin-0 capital,Praia,,,0,Praia,1.00000000000,,,0.00000000000,0,Cape Verde,CPV,Cape Verde,CPV,,CV,,14.91669801730,-23.51668888500,0.00000000000,0,,113364,88859,89205,9,8,3374333.00000000000,,Praia,1,5,5.0
3,110,0,Admin-0 capital,Nassau,,,0,Nassau,1.00000000000,,,0.00000000000,0,"Bahamas, The",BHS,The Bahamas,BHS,,BS,,25.08339011540,-77.35004378430,0.00000000000,0,,227940,160966,0,10,9,3571824.00000000000,,Nassau,1,5,5.0
3,110,0,Admin-0 capital,Nicosia,,,0,Nicosia,1.00000000000,,Capital of both,0.00000000000,0,Cyprus,CYP,Cyprus,CYP,,CY,,35.16667645170,33.36663488640,0.00000000000,0,,224300,200452,222985,10,10,146268.00000000000,,Nicosia,1,5,5.0
3,110,8,Admin-0 capital,Wellington,,,0,Wellington,1.00000000000,,,0.00000000000,0,New Zealand,NZL,New Zealand,NZL,Manawatu-Wanganui,NZ,Wellington metropolitan area,-41.29998785369,174.78326585928,0.00000000000,0,,393400,393400,0,10,9,2144168.00000000000,,Wellington,1,0,4.0
2,200,5,Admin-0 capital,Hanoi,,H,0,Hanoi,1.00000000000,,,0.00000000000,1,Vietnam,VNM,Vietnam,VNM,Thái Nguyên,VN,,21.03332724910,105.85001420000,5.00000000000,0,Changed scale rank.,4378000,1431270,5466347,12,12,1581130.00000000000,Hh Noi,Hanoi,1,0,4.0
2,200,5,Admin-0 capital,Ankara,,,0,Ankara,1.00000000000,,,0.00000000000,1,Turkey,TUR,Turkey,TUR,Ankara,TR,,39.92723858550,32.86439164100,5.00000000000,0,Changed scale rank.,3716000,3307379,3267576,12,12,323786.00000000000,Ankara,Ankara,1,0,4.0
2,200,6,Admin-0 capital,Budapest,,,0,Budapest,1.00000000000,,,1.00000000000,1,Hungary,HUN,Hungary,HUN,Budapest,HU,,47.50000632640,19.08332067740,4.00000000000,0,Changed scale rank.,1679000,1679000,1718895,12,12,3054643.00000000000,Budapest,Budapest,1,0,4.7
2,200,6,Admin-0 capital,Sanaa,,Sana'a',0,Sanaa,1.00000000000,,,0.00000000000,1,Yemen,YEM,Yemen,YEM,Amanat Al Asimah,YE,,15.35473329570,44.20659338260,5.00000000000,0,Changed scale rank.,2008000,1835853,1742507,12,12,71137.00000000000,Sana'a',Sanaa,1,0,4.0
2,200,6,Admin-0 capital,Bucharest,Bucuresti,,0,Bucharest,1.00000000000,,,1.00000000000,1,Romania,ROU,Romania,ROU,Bucharest,RO,,44.43337180490,26.09994665400,4.00000000000,0,Changed scale rank.,1942000,1742194,1636574,12,12,683506.00000000000,Bucuresti,Bucharest,1,0,4.0
2,200,6,Admin-0 capital,Damascus,,Dimashq,0,Damascus,1.00000000000,,,0.00000000000,1,Syria,SYR,Syria,SYR,Damascus,SY,,33.50003399560,36.29999588900,5.00000000000,0,Changed scale rank.,2466000,2466000,3344577,12,12,170654.00000000000,Dimashq,Damascus,1,0,4.7
2,200,6,Admin-0 capital,Lisbon,Lisboa,,0,Lisbon,1.00000000000,,,1.00000000000,1,Portugal,PRT,Portugal,PRT,Lisboa,PT,,38.72272287790,-9.14486630549,4.00000000000,0,Location adjusted. Changed scale rank.,2812000,517802,1795582,12,11,2267057.00000000000,Lisboa,Lisbon,1,0,4.0
2,200,5,Admin-0 capital,Khartoum,,Al-Khartum,0,Khartoum,1.00000000000,,,0.00000000000,1,Sudan,SDN,Sudan,SDN,Khartoum,SD,,15.58807822570,32.53417923860,5.00000000000,0,Changed scale rank.,4754000,1974647,2325931,12,12,379252.00000000000,Al-Khartum,Khartoum,1,0,4.0
2,200,7,Admin-0 capital,Oslo,,,0,Oslo,1.00000000000,,,1.00000000000,1,Kingdom of Norway,NOR,Norway,NOR,Oslo,NO,,59.91669028640,10.74997920600,4.00000000000,0,Changed scale rank.,835000,580000,701804,11,11,3143244.00000000000,Oslo,Oslo,1,0,4.0
2,200,5,Admin-0 capital,Warsaw,Warszawa,,0,Warsaw,1.00000000000,,,1.00000000000,1,Poland,POL,Poland,POL,Masovian,PL,,52.25000062980,20.99999955110,4.00000000000,0,Changed scale rank.,1707000,1702139,2012431,12,12,756135.00000000000,Warszawa,Warsaw,1,0,4.0
2,200,6,Admin-0 capital,Pyongyang,,P'yongyang,0,Pyongyang,1.00000000000,,,0.00000000000,1,"Korea, North",PRK,North Korea,PRK,P'yongyang,KP,,39.01943869940,125.75469071400,5.00000000000,0,Changed scale rank.,3300000,2498797,2483216,12,12,1871859.00000000000,P'yongyang,Pyongyang,1,0,4.7
2,200,5,Admin-0 capital,Dar es Salaam,,,0,Dar es Salaam,1.00000000000,,De facto capita,0.00000000000,1,United Republic of Tanzania,TZA,Tanzania,TZA,Dar-Es-Salaam,TZ,,-6.80001259474,39.26834183630,5.00000000000,0,Changed scale rank.,2930000,2698652,2757835,12,12,160263.00000000000,Dar es Salaam,Dar es Salaam,1,0,4.0
2,200,8,Admin-0 capital,Dublin,,,0,Dublin,1.00000000000,,,1.00000000000,1,Ireland,IRL,Ireland,IRL,Dublin,IE,,53.33306113600,-6.24890568178,0.00000000000,0,,1059000,968976,22478,12,11,2964574.00000000000,Dublin,Dublin2,1,0,4.0
2,200,8,Admin-0 capital,Monrovia,,,0,Monrovia,1.00000000000,,,0.00000000000,1,Liberia,LBR,Liberia,LBR,Montserrado,LR,,6.31055665987,-10.80475162910,0.00000000000,0,,1041000,785662,806416,12,11,2274895.00000000000,Monrovia,Monrovia,1,0,4.0
2,200,6,Admin-0 capital,Kuala Lumpur,,,0,Kuala Lumpur,1.00000000000,,Official and le,1.00000000000,1,Malaysia,MYS,Malaysia,MYS,Selangor,MY,,3.16666587210,101.69998327500,0.00000000000,0,,1448000,1448000,2667990,12,12,1735161.00000000000,Kuala Lumpur,Kuala Lumpur,1,0,4.0
2,200,6,Admin-0 capital,Havana,,La Habana,0,Havana,1.00000000000,,,0.00000000000,1,Cuba,CUB,Cuba,CUB,Ciudad de la Habana,CU,,23.13195884090,-82.36418217130,5.00000000000,0,Changed scale rank.,2174000,1990917,1930305,12,12,3553478.00000000000,La Habana,Havana,1,0,4.0
2,200,7,Admin-0 capital,Prague,Praha,,0,Prague,1.00000000000,,,1.00000000000,1,Czech Republic,CZE,Czech Republic,CZE,Prague,CZ,,50.08333701490,14.46597977570,4.00000000000,0,Changed scale rank.,1162000,2087,1088042,12,4,4548393.00000000000,Praha,Prague,1,0,4.7
2,200,8,Admin-0 capital,Kuwait,,Al Kuwayt|Kuwait City,0,Kuwait,1.00000000000,,,0.00000000000,1,Kuwait,KWT,Kuwait,KWT,Al Kuwayt,KW,,29.36971763000,47.97830114620,5.00000000000,0,Changed scale rank.,2063000,60064,1682968,12,8,285787.00000000000,Al Kuwayt (Kuwait City),Kuwait,1,5,4.0
2,200,8,Admin-0 capital,Santo Domingo,,,0,Santo Domingo,1.00000000000,,,0.00000000000,1,Dominican Republic,DOM,Dominican Republic,DOM,Distrito Nacional,DO,,18.47007285460,-69.90008508470,5.00000000000,0,Changed scale rank.,2154000,2873,3322037,12,4,3668373.00000000000,Santo Domingo,Santo Domingo,1,5,4.0
2,200,6,Admin-0 capital,Accra,,,0,Accra,1.00000000000,,,0.00000000000,1,Ghana,GHA,Ghana,GHA,Greater Accra,GH,,5.55003460583,-0.21671574035,5.00000000000,0,Changed scale rank.,2121000,1963264,2334371,12,12,2306104.00000000000,Accra,Accra,1,0,4.0
2,200,7,Admin-0 capital,Tripoli,,,0,Tripoli,1.00000000000,,,0.00000000000,1,Libya,LBY,Libya,LBY,Tajura' wa an Nawahi al Arba,LY,,32.89250001940,13.18001175810,5.00000000000,0,Changed scale rank.,2189000,229398,1149981,12,10,-1.00000000000,Tarabulus,Tripoli1,1,0,4.0
2,200,8,Admin-0 capital alt,Tel Aviv-Yafo,,Tel Aviv-Jaffa,0,Tel Aviv-Yafo,0.00000000000,1,While Jerulsale,0.00000000000,1,Israel,IS1,Israel,ISR,Tel Aviv,IL,,32.07999147440,34.77001175820,4.00000000000,0,Changed scale rank.,3112000,378358,2306851,12,10,293394.00000000000,Tel Aviv-Yafo,Tel Aviv-Yafo,1,0,4.0
2,200,7,Admin-0 capital,Helsinki,,,0,Helsinki,1.00000000000,,,1.00000000000,1,Finland,FIN,Finland,FIN,Southern Finland,FI,,60.17556337400,24.93412634150,4.00000000000,0,Changed scale rank.,1115000,558457,762958,12,11,658225.00000000000,Helsinki,Helsinki,1,0,4.0
2,200,8,Admin-0 capital,København,Copenhagen,,1,Kobenhavn,1.00000000000,,,1.00000000000,1,Denmark,DNK,Denmark,DNK,Hovedstaden,DK,,55.67856419040,12.56348574730,0.00000000000,0,,1085000,1085000,1038288,12,12,2618425.00000000000,K,Copenhagen,1,0,4.0
2,200,8,Admin-0 capital,Abidjan,,,0,Abidjan,1.00000000000,,"De facto, admin",0.00000000000,1,Ivory Coast,CIV,Ivory Coast,CIV,Lagunes,CI,,5.31999696749,-4.04004825989,5.00000000000,0,Changed scale rank.,3802000,3190395,3181637,12,12,2293538.00000000000,Abidjan,Abidjan,1,0,4.0
2,200,1,Admin-0 capital,Brasília,,Brasilia,0,Brasilia,1.00000000000,,,0.00000000000,1,Brazil,BRA,Brazil,BRA,Distrito Federal,BR,,-15.78334023150,-47.91605228840,5.00000000000,0,Changed scale rank.,3716996,2562963,1772679,12,12,3469058.00000000000,Brasglia,Brasilia,1,0,3.7
2,200,8,Admin-0 capital,Brussels,,Bruxelles-Brussel,0,Brussels,1.00000000000,,,1.00000000000,1,Belgium,BEL,Belgium,BEL,Brussels,BE,,50.83331707670,4.33331660830,0.00000000000,0,,1743000,1019022,1490164,12,12,2800866.00000000000,Bruxelles-Brussel,Brussels,1,5,4.7
2,200,2,Admin-0 capital,Dhaka,,,0,Dhaka,1.00000000000,,,0.00000000000,1,Bangladesh,BGD,Bangladesh,BGD,Dhaka,BD,,23.72305971170,90.40857946670,5.00000000000,0,Changed scale rank.,12797394,7000940,14995538,14,13,1185241.00000000000,Dhaka,Dhaka,1,0,4.0
2,200,6,Admin-0 capital,Luanda,,,0,Luanda,1.00000000000,,,0.00000000000,1,Angola,AGO,Angola,AGO,Luanda,AO,,-8.83828611363,13.23442704130,5.00000000000,0,Changed scale rank.,5172900,1951272,1951272,13,12,2240449.00000000000,Luanda,Luanda,1,0,4.0
2,200,5,Admin-0 capital,Algiers,,El Djazacr,0,Algiers,1.00000000000,,,0.00000000000,1,Algeria,DZA,Algeria,DZA,Alger,DZ,,36.76306479800,3.05055252952,5.00000000000,0,Changed scale rank.,3354000,1977663,3332619,12,12,2507480.00000000000,El Djazasr,Algiers,1,5,4.0
2,200,5,Admin-0 capital,Rangoon,,Yangon,0,Rangoon,0.00000000000,,Former capital,0.00000000000,1,Myanmar,MMR,Myanmar,MMR,Yangon,MM,,16.78335410460,96.16667761130,5.00000000000,0,Changed scale rank.,4088000,3301820,3124090,12,12,1298824.00000000000,Yangon,Rangoon,1,0,4.0
1,300,1,Populated place,San Francisco,,San Francisco-Oakland,0,San Francisco,0.00000000000,,,1.00000000000,1,United States,USA,United States of America,USA,California,US,,37.74000775050,-122.45997766300,0.00000000000,0,,3450000,732072,27400,12,11,5391959.00000000000,San Francisco-Oakland,San Francisco1,1,0,2.7
1,300,1,Admin-1 capital,Denver,,Denver-Aurora,0,Denver,0.00000000000,,,0.00000000000,1,United States,USA,United States of America,USA,Colorado,US,,39.73918804840,-104.98401595200,5.00000000000,0,Changed scale rank.,2313000,1548599,1521278,12,12,5419384.00000000000,Denver-Aurora,Denver,1,0,3.7
1,300,1,Populated place,Houston,,,0,Houston,0.00000000000,,,0.00000000000,1,United States,USA,United States of America,USA,Texas,US,,29.81997438460,-95.33997929050,5.00000000000,0,Changed scale rank.,4459000,3647574,3607616,12,12,4699066.00000000000,Houston,Houston,1,0,3.0
1,300,1,Populated place,Miami,,,0,Miami,0.00000000000,,,1.00000000000,1,United States,USA,United States of America,USA,Florida,US,,25.78761069640,-80.22410608080,0.00000000000,0,,5585000,382894,1037811,13,10,4164138.00000000000,Miami,Miami,1,0,2.1
1,300,1,Admin-1 capital,Atlanta,,,0,Atlanta,0.00000000000,,,1.00000000000,1,United States,USA,United States of America,USA,Georgia,US,,33.83001385400,-84.39994938330,0.00000000000,0,,4506000,422908,2874096,12,10,4180439.00000000000,Atlanta,Atlanta,1,0,3.0
1,300,1,Populated place,Chicago,,,0,Chicago,0.00000000000,,,1.00000000000,1,United States,USA,United States of America,USA,Illinois,US,,41.82999066070,-87.75005497410,0.00000000000,0,,8990000,2841952,3635101,13,12,4887398.00000000000,Chicago,Chicago,1,0,3.0
1,300,6,Admin-0 capital,Caracas,,,0,Caracas,1.00000000000,,,1.00000000000,1,Venezuela,VEN,Venezuela,VEN,Distrito Capital,VE,,10.50099855440,-66.91703719240,4.00000000000,0,Changed scale rank.,2985000,1815679,2764555,12,12,3646738.00000000000,Caracas,Caracas,1,0,3.0
1,300,5,Admin-0 capital,Kiev,,Kyiv,0,Kiev,1.00000000000,,,0.00000000000,1,Ukraine,UKR,Ukraine,UKR,Kiev,UA,,50.43336732900,30.51662796910,5.00000000000,0,Changed scale rank.,2709000,1662508,1611692,12,12,703448.00000000000,Kyiv,Kiev,1,0,3.7
1,300,8,Admin-1 capital,Dubai,Dubayy,,0,Dubai,0.00000000000,,,1.00000000000,1,United Arab Emirates,ARE,United Arab Emirates,ARE,Dubay,AE,,25.22999615380,55.27997432340,1.00000000000,1,Name changed.,1379000,1137347,1166878,12,12,292223.00000000000,Dubayy,Dubayy,1,0,3.7
1,300,6,Admin-0 capital,Tashkent,,,0,Tashkent,1.00000000000,,,0.00000000000,1,Uzbekistan,UZB,Uzbekistan,UZB,Tashkent,UZ,,41.31170188300,69.29493281950,5.00000000000,0,Changed scale rank.,2184000,1978028,2806287,12,12,1512569.00000000000,Tashkent,Tashkent,1,0,3.7
1,300,3,Admin-0 capital,Madrid,,,0,Madrid,1.00000000000,,,1.00000000000,1,Kingdom of Spain,ESP,Spain,ESP,Comunidad de Madrid,ES,,40.40002626450,-3.68335168600,0.00000000000,0,,5567000,50437,3673427,13,8,3117735.00000000000,Madrid,Madrid,1,0,3.0
1,300,7,Admin-1 capital,Geneva,,,0,Geneva,0.00000000000,,,1.00000000000,0,Switzerland,CHE,Switzerland,CHE,Genève,CH,,46.21000754710,6.14002803409,4.00000000000,0,Changed scale rank.,1240000,192385,508284,12,9,2660646.00000000000,,Geneva,1,0,3.7
1,300,7,Admin-0 capital,Stockholm,,,0,Stockholm,1.00000000000,,,1.00000000000,1,Sweden,SWE,Sweden,SWE,Stockholm,SE,,59.35075995430,18.09733473280,4.00000000000,0,Location adjusted.,1264000,1253309,0,12,12,2673730.00000000000,Stockholm,Stockholm,1,0,3.0
1,300,5,Admin-0 capital,Bangkok,,Krung Thep,0,Bangkok,1.00000000000,,,1.00000000000,1,Thailand,THA,Thailand,THA,Bangkok Metropolis,TH,,13.74999920550,100.51664465200,0.00000000000,0,,6704000,5104476,5082758,13,13,1609350.00000000000,Krung Thep,Bangkok,1,0,3.0
1,300,5,Admin-0 capital,Lima,,,0,Lima,1.00000000000,,,0.00000000000,1,Peru,PER,Peru,PER,Lima,PE,,-12.04801267610,-77.05006209480,5.00000000000,0,Changed scale rank.,8012000,6758234,6068380,13,13,3936456.00000000000,Lima,Lima2,1,0,3.0
1,300,8,Admin-0 capital,Dakar,,,0,Dakar,1.00000000000,,,0.00000000000,1,Senegal,SEN,Senegal,SEN,Dakar,SN,,14.71583172500,-17.47313012840,5.00000000000,0,Changed scale rank.,2604000,2476400,2470140,12,12,2253354.00000000000,Dakar,Dakar,1,0,3.0
1,300,3,Admin-0 capital,Johannesburg,,,0,Johannesburg,0.00000000000,,,1.00000000000,1,South Africa,ZAF,South Africa,ZAF,Gauteng,ZA,,-26.17004474000,28.03000972360,4.00000000000,0,Changed feature class.,3435000,2026469,3852246,12,12,993800.00000000000,Johannesburg,Johannesburg,1,0,3.0
1,300,8,Admin-0 capital,Amsterdam,,,0,Amsterdam,1.00000000000,,De facto capita,1.00000000000,1,Kingdom of the Netherlands,NLD,Netherlands,NLD,Noord-Holland,NL,,52.34996868810,4.91664017601,0.00000000000,0,,1031000,741636,962488,12,11,2759794.00000000000,Amsterdam,Amsterdam,1,0,3.7
1,300,5,Admin-1 capital,Casablanca,,Dar-el-Beida,0,Casablanca,0.00000000000,,,1.00000000000,1,Morocco,MAR,Morocco,MAR,Grand Casablanca,MA,,33.59997621560,-7.61636743309,4.00000000000,0,Changed scale rank.,3181000,3144909,3718797,12,12,2553604.00000000000,Dar-el-Beida,Casablanca,1,0,3.7
1,300,3,Admin-0 capital,Seoul,,,0,Seoul,1.00000000000,,,1.00000000000,1,"Korea, South",KOR,South Korea,KOR,Seoul,KR,,37.56634909980,126.99973099700,0.00000000000,0,,9796000,9796000,12018058,13,13,1835848.00000000000,Seoul,Seoul,1,0,3.0
1,300,5,Admin-0 capital,Manila,,,0,Manila,1.00000000000,,"Official, de fa",1.00000000000,1,Philippines,PHL,Philippines,PHL,Metropolitan Manila,PH,,14.60415895480,120.98221716200,0.00000000000,0,,11100000,3077575,2381280,14,12,1701668.00000000000,Manila,Manila,1,0,2.7
1,300,2,Admin-1 capital,Monterrey,,,0,Monterrey,0.00000000000,,,0.00000000000,1,Mexico,MEX,Mexico,MEX,Nuevo León,MX,,25.66999513650,-100.32998478400,5.00000000000,0,Changed scale rank.,3712000,1122874,3225636,12,12,3995465.00000000000,Monterrey,Monterrey,1,0,3.7
1,300,3,Admin-0 capital,Berlin,,,0,Berlin,1.00000000000,,,1.00000000000,1,Germany,DEU,Germany,DEU,Berlin,DE,,52.52181866360,13.40154862330,0.00000000000,0,,3406000,3094014,3013258,12,12,2950159.00000000000,Berlin,Berlin,1,0,2.7
1,300,1,Admin-1 capital,Ürümqi,,rumqi|Wulumqi,0,Urumqi,0.00000000000,,,0.00000000000,1,China,CHN,China,CHN,Xinjiang Uygur,CN,,43.80501222640,87.57500565490,5.00000000000,0,Changed scale rank.,2151000,1508225,2044401,12,12,1529102.00000000000,Cramqi (Wulumqi),Urumqi,1,0,3.7
1,300,1,Admin-1 capital,Chengdu,,,0,Chengdu,0.00000000000,,,0.00000000000,1,China,CHN,China,CHN,Sichuan,CN,,30.67000001930,104.07001949000,5.00000000000,0,Changed scale rank.,4123000,3950437,11622929,12,12,1815286.00000000000,Chengdu,Chengdu,1,0,3.0
1,300,2,Admin-1 region capital,Ōsaka,,Osaka-Kobe,0,Osaka,0.00000000000,,,1.00000000000,1,Japan,JPN,Japan,JPN,Osaka,JP,,34.75003521630,135.46014481500,4.00000000000,0,Changed feature to Admin-0 region capital.,11294000,2592413,9630783,14,12,1853909.00000000000,Osaka-Kobe,Osaka,1,5,3.0
1,300,3,Admin-0 capital,Kinshasa,,,0,Kinshasa,1.00000000000,,,0.00000000000,1,Congo (Kinshasa),COD,Congo (Kinshasa),COD,Kinshasa City,CD,,-4.32972410189,15.31497188180,5.00000000000,0,Changed scale rank.,7843000,5565703,4738154,13,13,2314302.00000000000,Kinshasa,Kinshasa,1,0,3.0
1,300,1,Admin-0 capital,New Delhi,,,0,New Delhi,1.00000000000,,,1.00000000000,0,India,IND,India,IND,Delhi,IN,,28.60002300920,77.19998002010,0.00000000000,0,,317797,317797,8060107,10,10,1261481.00000000000,,New Delhi,1,0,2.1
1,300,1,Admin-1 capital,Bangalore,,Bengaluru,0,Bangalore,0.00000000000,,,0.00000000000,1,India,IND,India,IND,Karnataka,IN,,12.96999513650,77.56000972380,3.00000000000,1,Name changed. Changed scale rank.,6787000,5104047,8102712,13,13,1277333.00000000000,Bangalore,Bangalore,1,0,3.7
1,300,6,Admin-0 capital,Athens,Athenai,Athinai,0,Athens,1.00000000000,,,1.00000000000,1,Greece,GRC,Greece,GRC,Attiki,GR,,37.98332623190,23.73332108430,4.00000000000,0,Changed scale rank.,3242000,729137,112572,12,11,264371.00000000000,Athnnai,Athens2,1,0,3.7
1,300,5,Admin-0 capital,Baghdad,,,0,Baghdad,1.00000000000,,,0.00000000000,1,Iraq,IRQ,Iraq,IRQ,Baghdad,IQ,,33.33864849750,44.39386877320,5.00000000000,0,Changed scale rank.,5054000,5054000,4959534,13,13,98182.00000000000,Baghdad,Baghdad,1,0,3.7
1,300,3,Admin-0 capital,Addis Ababa,,,0,Addis Ababa,1.00000000000,,,0.00000000000,1,Ethiopia,ETH,Ethiopia,ETH,Addis Ababa,ET,,9.03331036268,38.70000443400,5.00000000000,0,Changed scale rank.,3100000,2757729,3013653,12,12,344979.00000000000,Addis Ababa,Addis Ababa,1,5,3.0
1,300,5,Admin-0 capital,Tehran,,,0,Tehran,1.00000000000,,,0.00000000000,1,Iran,IRN,Iran,IRN,Tehran,IR,,35.67194276840,51.42434403360,5.00000000000,0,Changed scale rank.,7873000,7153309,8209012,13,13,112931.00000000000,Tehran,Tehran,1,0,3.0
1,300,2,Populated place,Vancouver,,,0,Vancouver,0.00000000000,,,0.00000000000,1,Canada,CAN,Canada,CAN,British Columbia,CA,,49.27341658410,-123.12164421800,5.00000000000,0,Changed scale rank.,2313328,603502,482002,12,11,6173331.00000000000,Vancouver,Vancouver2,1,0,2.1
1,300,2,Admin-1 capital,Toronto,,,0,Toronto,0.00000000000,,,1.00000000000,1,Canada,CAN,Canada,CAN,Ontario,CA,,43.69997987780,-79.42002079440,0.00000000000,0,,5213000,3934421,3749229,13,12,6167865.00000000000,Toronto,Toronto,1,0,2.1
1,300,3,Admin-0 capital,Buenos Aires,,,0,Buenos Aires,1.00000000000,,,1.00000000000,1,Argentina,ARG,Argentina,ARG,Ciudad de Buenos Aires,AR,,-34.60250160850,-58.39753137370,0.00000000000,0,,12795000,10929146,10271457,14,14,3435910.00000000000,Buenos Aires,Buenos Aires,1,0,2.1
1,300,5,Admin-0 capital,Kabul,,,0,Kabul,1.00000000000,,,0.00000000000,1,Afghanistan,AFG,Afghanistan,AFG,Kabul,AF,,34.51669028630,69.18326004930,5.00000000000,0,Changed scale rank.,3277000,3043532,3475519,12,12,1138958.00000000000,Kabul,Kabul,1,0,3.7
1,300,7,Admin-0 capital,Vienna,Wien,,0,Vienna,1.00000000000,,,1.00000000000,1,Austria,AUT,Austria,AUT,Wien,AT,,48.20001527820,16.36663895540,0.00000000000,0,,2400000,1731000,1480886,12,12,2761369.00000000000,Wien,Vienna,1,0,3.7
1,300,3,Admin-1 capital,Melbourne,,,0,Melbourne,0.00000000000,,,1.00000000000,1,Australia,AUS,Australia,AUS,Victoria,AU,,-37.82003131230,144.97501623500,4.00000000000,0,Changed feature class. Changed scale rank.,4170000,93625,1805353,12,8,2158177.00000000000,Melbourne,Melbourne2,1,0,3.0
1,300,8,Admin-0 capital,Taipei,,,0,Taipei,1.00000000000,,,1.00000000000,1,Taiwan,TWN,Taiwan,TWN,Taipei City,TW,,25.03583333333,121.56833333333,1.00000000000,0,Corrected coordinates.,6900273,2618772,5698241,13,12,1668341.00000000000,Taipei,Taipei,1,0,3.7
1,300,8,Admin-1 capital,Auckland,,,0,Auckland,0.00000000000,,,1.00000000000,1,New Zealand,NZL,New Zealand,NZL,Auckland,NZ,Auckland metropolitan area,-36.84805489493,174.76302698708,4.00000000000,0,Changed scale rank.,1377200,395982,0,12,10,2193733.00000000000,Auckland,Auckland,1,0,3.0
0,600,1,Populated place,Los Angeles,,Los Angeles-Long Beach-Santa Ana,0,Los Angeles,0.00000000000,,,1.00000000000,1,United States,USA,United States of America,USA,California,US,,33.98997825020,-118.17998051100,0.00000000000,0,,12500000,3694820,142265,14,12,5368361.00000000000,Los Angeles-Long Beach-Santa Ana,Los Angeles1,1,0,2.0
0,600,1,Admin-0 capital,"Washington, D.C.",,Washington D.C.,0,"Washington, D.C.",1.00000000000,,,1.00000000000,1,United States,USA,United States of America,USA,District of Columbia,US,,38.89954937650,-77.00941858080,0.00000000000,0,,4338000,552433,2175991,12,11,4140963.00000000000,"Washington, D.C.","Washington, D.C.",1,5,2.1
0,600,1,Populated place,New York,,New York-Newark,0,New York,0.00000000000,,UN Headquarters,1.00000000000,1,United States,USA,United States of America,USA,New York,US,,40.74997906400,-73.98001692880,0.00000000000,0,,19040000,8008278,9292603,14,13,5128581.00000000000,New York-Newark,New York,1,0,1.7
0,600,5,Admin-0 capital,London,,,0,London,1.00000000000,,,1.00000000000,1,United Kingdom,GBR,United Kingdom,GBR,Westminster,GB,,51.49999472970,-0.11672184386,0.00000000000,0,,8567000,7421209,326670,13,13,2643743.00000000000,London,London2,1,5,1.7
0,600,5,Admin-1 capital,Istanbul,,,0,Istanbul,0.00000000000,,,1.00000000000,1,Turkey,TUR,Turkey,TUR,Istanbul,TR,,41.10499615380,29.01000158560,0.00000000000,0,,10061000,9945610,9651488,14,13,745044.00000000000,Istanbul,Istanbul,1,0,3.0
0,600,5,Admin-0 capital,Riyadh,,Ar-Riyadh,0,Riyadh,1.00000000000,,,1.00000000000,1,Saudi Arabia,SAU,Saudi Arabia,SAU,Ar Riyad,SA,,24.64083314920,46.77274165730,4.00000000000,0,Changed scale rank.,4465000,4205961,5148778,12,12,108410.00000000000,Ar-Riyadh,Riyadh,1,0,3.7
0,600,3,Admin-0 capital,Cape Town,,,0,Cape Town,1.00000000000,1,Legislative cap,1.00000000000,1,South Africa,ZAF,South Africa,ZAF,Western Cape,ZA,,-33.92001096720,18.43498815780,4.00000000000,0,Changed scale rank.,3215000,2432858,2401318,12,12,3369157.00000000000,Cape Town,Cape Town,1,0,1.7
0,600,2,Admin-0 capital,Moscow,Moskva,,0,Moscow,1.00000000000,,,1.00000000000,1,Russia,RUS,Russia,RUS,Moskva,RU,,55.75216412260,37.61552282590,0.00000000000,0,,10452000,10452000,10585385,14,14,524901.00000000000,Moskva,Moscow,1,0,1.7
0,600,2,Admin-0 capital,Mexico City,,Ciudad de M,0,Mexico City,1.00000000000,,,1.00000000000,1,Mexico,MEX,Mexico,MEX,Distrito Federal,MX,,19.44244244280,-99.13098820170,0.00000000000,0,,19028000,10811002,10018444,14,14,3530597.00000000000,Ciudad de Mdxico,Mexico City,1,0,2.1
0,600,2,Admin-0 capital alt,Lagos,,,0,Lagos,0.00000000000,1,Former capital,1.00000000000,1,Nigeria,NGA,Nigeria,NGA,Lagos,NG,,6.44326165348,3.39153107121,4.00000000000,0,Location adjusted. Changed scale rank.,9466000,1536,6567892,13,3,2332459.00000000000,Lagos,Lagos,1,0,2.0
0,600,3,Admin-0 capital,Rome,,,0,Rome,1.00000000000,,,1.00000000000,1,Italy,ITA,Italy,ITA,Lazio,IT,,41.89595562650,12.48325842150,0.00000000000,0,,3339000,35452,2050212,12,7,3169070.00000000000,Rome,Rome,1,0,2.7
0,600,1,Admin-0 capital,Beijing,,,0,Beijing,1.00000000000,,,1.00000000000,1,China,CHN,China,CHN,Beijing,CN,,39.92889223130,116.38828568400,0.00000000000,0,,11106000,7480601,9033231,14,13,1816670.00000000000,Beijing,Beijing,1,0,1.7
0,600,5,Admin-0 capital,Nairobi,,,0,Nairobi,1.00000000000,,,1.00000000000,1,Kenya,KEN,Kenya,KEN,Nairobi,KE,,-1.28334674185,36.81665685910,4.00000000000,0,Changed scale rank.,3010000,2750547,3400962,12,12,184745.00000000000,Nairobi,Nairobi,1,0,2.0
0,600,1,Admin-0 capital,Jakarta,,,0,Jakarta,1.00000000000,,,1.00000000000,1,Indonesia,IDN,Indonesia,IDN,Jakarta Raya,ID,,-6.17441770541,106.82943762100,0.00000000000,0,,9125000,8540121,9129613,13,13,1642911.00000000000,Jakarta,Jakarta,1,0,2.1
0,600,5,Admin-0 capital,Bogota,,Bogota,0,Bogota,1.00000000000,,,1.00000000000,1,Colombia,COL,Colombia,COL,Bogota,CO,,4.59642356253,-74.08334395520,0.00000000000,0,,7772000,6333661,5754084,13,13,3688689.00000000000,Bogota,Bogota,1,0,2.1
0,600,3,Admin-0 capital,Cairo,,Al-Qahirah,0,Cairo,1.00000000000,,,1.00000000000,1,Egypt,EGY,Egypt,EGY,Al Qahirah,EG,,30.04996034650,31.24996821970,0.00000000000,0,,11893000,7734614,13720557,14,13,360630.00000000000,Al-Qahirah,Cairo,1,5,1.7
0,600,1,Admin-1 capital,Shanghai,,,0,Shanghai,0.00000000000,,,1.00000000000,1,China,CHN,China,CHN,Shanghai,CN,,31.21645245260,121.43650467800,0.00000000000,0,,14987000,14608512,16803572,14,14,1796236.00000000000,Shanghai,Shanghai,1,0,2.0
0,600,2,Admin-0 capital,Tokyo,,,0,Tokyo,1.00000000000,,De facto capita,1.00000000000,1,Japan,JPN,Japan,JPN,Tokyo,JP,,35.68501690580,139.75140742900,0.00000000000,0,,35676000,8336599,12945252,14,13,1850147.00000000000,Tokyo,Tokyo,1,0,1.7
0,600,1,Admin-1 capital,Mumbai,Bombay,,0,Mumbai,0.00000000000,,,1.00000000000,1,India,IND,India,IND,Maharashtra,IN,,19.01699037570,72.85698929740,0.00000000000,0,,18978000,12691836,12426085,14,14,1275339.00000000000,Mumbai,Mumbai,1,0,1.7
0,600,3,Admin-0 capital,Paris,,,0,Paris,1.00000000000,,,1.00000000000,1,French Republic,FRA,France,FRA,Île-de-France,FR,,48.86669293120,2.33333532574,0.00000000000,0,,9904000,11177,7142744,13,6,2988507.00000000000,Paris,Paris,1,0,1.7
0,600,3,Admin-0 capital,Santiago,,,0,Santiago,1.00000000000,,"Official, admin",1.00000000000,1,Chile,CHL,Chile,CHL,Región Metropolitana de Santiago,CL,,-33.45001381550,-70.66704085460,4.00000000000,0,Changed scale rank.,5720000,46611,3066651,13,7,3449741.00000000000,Santiago,Santiago3,1,0,2.0
0,600,1,Admin-1 capital,Kolkata,Calcutta,,0,Kolkata,0.00000000000,,,0.00000000000,1,India,IND,India,IND,West Bengal,IN,,22.49496929830,88.32467565810,4.00000000000,1,Name changed. Changed scale rank.,14787000,4631392,7783716,14,12,1275004.00000000000,Kolkata,Calcutta,1,0,3.7
0,600,1,Admin-1 capital,Rio de Janeiro,,,0,Rio de Janeiro,0.00000000000,,,1.00000000000,1,Brazil,BRA,Brazil,BRA,Rio de Janeiro,BR,,-22.92502317420,-43.22502079420,0.00000000000,0,,11748000,2010175,1821489,14,12,3451190.00000000000,Rio de Janeiro,Rio de Janeiro,1,0,1.7
0,600,1,Admin-1 capital,São Paulo,,Sao Paulo|Sio Paulo,0,Sao Paulo,0.00000000000,,,1.00000000000,1,Brazil,BRA,Brazil,BRA,São Paulo,BR,,-23.55867958700,-46.62501998040,0.00000000000,0,,18845000,10021295,11522944,14,14,3448439.00000000000,S,Sao Paolo,1,0,3.0
0,600,3,Admin-1 capital,Sydney,,,0,Sydney,0.00000000000,,,1.00000000000,1,Australia,AUS,Australia,AUS,New South Wales,AU,,-33.92001096720,151.18517980900,4.00000000000,0,Changed feature class.,4630000,3641422,2669348,12,12,2147714.00000000000,Sydney,Sydney1,1,0,1.7
0,600,0,Admin-0 capital,Singapore,,,0,Singapore,1.00000000000,,,1.00000000000,1,Singapore,SGP,Singapore,SGP,,SG,,1.29303346649,103.85582067800,0.00000000000,0,,5183700,3289529,3314179,13,12,1880252.00000000000,Singapore,Singapore,1,5,2.1
0,600,0,Admin-0 region capital,Hong Kong,,,0,Hong Kong,0.00000000000,,,1.00000000000,1,China,CHN,Hong Kong S.A.R.,HKG,,HK,,22.30498089500,114.18500931700,0.00000000000,0,,7206000,4551579,4549026,13,12,1819729.00000000000,Hong Kong,Hong Kong,1,0,3.0
1 scalerank natscale labelrank featurecla name namepar namealt diffascii nameascii adm0cap capalt capin worldcity megacity sov0name sov_a3 adm0name adm0_a3 adm1name iso_a2 note latitude longitude changed namediff diffnote pop_max pop_min pop_other rank_max rank_min geonameid meganame ls_name ls_match checkme min_zoom
2 8 10 3 Admin-0 capital Vatican City 0 Vatican City 1.00000000000 1.00000000000 0 Vatican (Holy Sea) VAT Vatican (Holy See) VAT Lazio VA 41.90001222640 12.44780838890 4.00000000000 0 Changed scale rank. 832 832 562430 2 2 6691831.00000000000 Vatican City 1 0 7.0
3 7 20 0 Admin-0 capital San Marino 0 San Marino 1.00000000000 0.00000000000 0 San Marino SMR San Marino SMR SM 43.91715008450 12.46667028670 0.00000000000 0 29579 29000 0 7 7 3168070.00000000000 San Marino 1 5 6.1
4 7 20 0 Admin-0 capital Vaduz 0 Vaduz 1.00000000000 0.00000000000 0 Liechtenstein LIE Liechtenstein LIE LI 47.13372377430 9.51666947291 0.00000000000 0 36281 5342 33009 7 5 3042030.00000000000 Vaduz 1 0 6.7
5 6 30 8 Admin-0 capital alt Lobamba 0 Lobamba 0.00000000000 1 Legislative and 0.00000000000 0 Swaziland SWZ Swaziland SWZ Manzini SZ -26.46666746140 31.19999710970 4.00000000000 0 Changed scale rank. 9782 4557 0 5 4 935048.00000000000 Lobamba 1 5 6.0
6 6 30 8 Admin-0 capital Luxembourg 0 Luxembourg 1.00000000000 0.00000000000 0 Luxembourg LUX Luxembourg LUX Luxembourg LU 49.61166037910 6.13000280623 4.00000000000 0 Changed scale rank. 107260 76684 106219 9 8 2960316.00000000000 Luxembourg 1 0 6.0
7 6 30 0 Admin-0 capital Palikir 0 Palikir 1.00000000000 0.00000000000 0 Federated States of Micronesia FSM Federated States of Micronesia FSM FM 6.91664369601 158.14997432400 4.00000000000 0 Changed scale rank. 4645 4645 0 4 4 2081986.00000000000 Palikir 1 5 6.0
8 6 30 0 Admin-0 capital Majuro 0 Majuro 1.00000000000 0.00000000000 0 Marshall Islands MHL Marshall Islands MHL MH 7.10300431122 171.38000017600 4.00000000000 0 Changed scale rank. 25400 20500 0 7 7 2113779.00000000000 Majuro 1 5 6.0
9 6 30 0 Admin-0 capital Funafuti 0 Funafuti 1.00000000000 0.00000000000 0 Tuvalu TUV Tuvalu TUV TV -8.51665199904 179.21664709400 4.00000000000 0 Population from GeoNames. Changed scale rank. 4749 4749 0 4 4 2110394.00000000000 Funafuti 0 5 6.0
10 6 30 0 Admin-0 capital Melekeok 0 Melekeok 1.00000000000 0.00000000000 0 Palau PLW Palau PLW PW 7.48739617298 134.62654846700 4.00000000000 0 Location adjusted. Changed scale rank. 7026 7026 0 5 5 1559804.00000000000 Melekeok 1 5 6.0
11 6 30 0 Admin-0 capital alt Bir Lehlou 0 Bir Lehlou 0.00000000000 1 Claimed as inte 0.00000000000 0 Western Sahara SAH Western Sahara SAH EH 26.11916668600 -9.65252221825 4.00000000000 1 Added place. 500 200 0 2 1 -1.00000000000 2 0 6.0
12 6 30 0 Admin-0 capital Monaco 0 Monaco 1.00000000000 0.00000000000 0 Monaco MCO Monaco MCO MC 43.73964568790 7.40691317347 4.00000000000 0 Location adjusted. Changed scale rank. 36371 36371 102371 7 7 2993458.00000000000 Monaco 1 0 5.1
13 6 30 0 Admin-0 capital Tarawa 0 Tarawa 1.00000000000 0.00000000000 0 Kiribati KIR Kiribati KIR KI 1.33818750562 173.01757082900 4.00000000000 0 Location adjusted. Changed scale rank. 28802 22534 0 7 7 2110079.00000000000 Tarawa 1 5 6.0
14 6 30 0 Admin-0 capital Moroni 0 Moroni 1.00000000000 0.00000000000 0 Comoros COM Comoros COM KM -11.70415769570 43.24024409870 4.00000000000 0 Changed scale rank. 128698 42872 0 9 7 921772.00000000000 Moroni 1 5 6.0
15 6 30 0 Admin-0 capital Andorra 0 Andorra 1.00000000000 0.00000000000 0 Andorra AND Andorra AND AD 42.50000144350 1.51648596051 4.00000000000 0 Changed scale rank. 53998 22256 53371 8 7 3130067.00000000000 Andorra 1 5 6.0
16 4 50 8 Admin-0 capital Port-of-Spain 0 Port-of-Spain 1.00000000000 0.00000000000 0 Trinidad and Tobago TTO Trinidad and Tobago TTO Port of Spain TT 10.65199708960 -61.51703088540 4.00000000000 0 Changed scale rank. 294934 49031 419082 10 7 3573890.00000000000 Port-of-Spain 1 5 5.1
17 4 50 0 Admin-0 capital Kigali 0 Kigali 1.00000000000 0.00000000000 1 Rwanda RWA Rwanda RWA Kigali City RW -1.95359006868 30.06053177770 4.00000000000 0 Changed scale rank. 860000 745261 1152904 11 11 202061.00000000000 Kigali Kigali 1 0 5.1
18 4 50 8 Admin-0 capital Mbabane 0 Mbabane 1.00000000000 Administrative 0.00000000000 0 Swaziland SWZ Swaziland SWZ Hhohho SZ -26.31665077840 31.13333451210 4.00000000000 0 Changed scale rank. 90138 76218 89979 8 8 934985.00000000000 Mbabane 1 0 5.6
19 4 50 5 Admin-0 capital Juba 0 Juba 0.00000000000 0.00000000000 0 South Sudan SSD South Sudan SSD Central Equatoria SS 4.82997519828 31.58002559280 20.00000000000 0 Changed country. 111975 111975 111975 9 9 373303.00000000000 Juba 1 0 5.1
20 4 50 8 Admin-0 capital alt The Hague 0 The Hague 0.00000000000 1 Official, legis 0.00000000000 0 Kingdom of the Netherlands NLD Netherlands NLD Zuid-Holland NL 52.08003684400 4.26996130231 0.00000000000 0 1406000 501725 688599 12 11 2747373.00000000000 The Hague 1 0 5.6
21 4 50 8 Admin-0 capital Ljubljana 0 Ljubljana 1.00000000000 0.00000000000 0 Slovenia SVN Slovenia SVN Osrednjeslovenska SI 46.05528830880 14.51496903350 4.00000000000 0 Changed scale rank. 314807 255115 256316 10 10 3196359.00000000000 Ljubljana 1 0 5.6
22 4 50 7 Admin-0 capital Bratislava 0 Bratislava 1.00000000000 0.00000000000 0 Slovakia SVK Slovakia SVK Bratislavský SK 48.15001833000 17.11698075220 4.00000000000 0 Changed scale rank. 423737 373687 361489 10 10 3060972.00000000000 Bratislava 1 0 5.1
23 4 50 8 Admin-0 capital Doha 0 Doha 1.00000000000 0.00000000000 0 Qatar QAT Qatar QAT Ad Dawhah QA 25.28655600890 51.53296789430 4.00000000000 0 Location adjusted. Changed scale rank. 1450000 731310 0 12 11 290030.00000000000 Doha 1 5 5.6
24 4 50 8 Admin-0 capital Podgorica 0 Podgorica 1.00000000000 0.00000000000 0 Montenegro MNE Montenegro MNE Podgorica ME 42.46597251290 19.26630692410 4.00000000000 0 Location adjusted. Changed scale rank. 145850 136473 0 9 9 3193044.00000000000 Podgorica 1 0 5.6
25 4 50 6 Admin-0 capital alt Sri Jawewardenepura Kotte 0 Sri Jawewardenepura Kotte 0.00000000000 1 Legislative cap 0.00000000000 0 Sri Lanka LKA Sri Lanka LKA Colombo LK 6.90000388481 79.94999304090 4.00000000000 1 Name changed. 115826 115826 2456292 9 9 1238992.00000000000 Kotte 1 0 5.6
26 4 50 5 Admin-0 capital alt Baguio City 0 Baguio City 0.00000000000 1 0.00000000000 0 Philippines PHL Philippines PHL Benguet PH 16.42999066060 120.56994258500 40.00000000000 0 Changed scale rank. 447824 272714 164877 10 10 1728930.00000000000 Baguio City 1 0 5.6
27 4 50 5 Admin-0 capital alt Dodoma 0 Dodoma 0.00000000000 1 Offical capital 0.00000000000 0 United Republic of Tanzania TZA Tanzania TZA Dodoma TZ -6.18330605177 35.75000362010 4.00000000000 0 Location adjusted. 218269 180541 0 10 9 160196.00000000000 Dodoma 1 0 5.6
28 4 50 7 Admin-0 capital Bern 0 Bern 1.00000000000 0.00000000000 0 Switzerland CHE Switzerland CHE Bern CH 46.91668275870 7.46697546248 4.00000000000 0 Changed scale rank. 275329 121631 267814 10 9 2661552.00000000000 Bern 1 0 5.6
29 4 50 5 Admin-0 capital alt Laayoune 0 Laayoune 0.00000000000 1 Claimed as capi 0.00000000000 0 Morocco MAR Morocco MAR Laâyoune - Boujdour - Sakia El Hamra MA 27.14998231910 -13.20000594220 0.00000000000 0 188084 176365 176365 9 9 2462881.00000000000 Laayoune 1 0 5.6
30 4 50 8 Admin-0 capital Pristina 0 Pristina 1.00000000000 0.00000000000 0 Kosovo KOS Kosovo KOS Pristina -99 42.66670961410 21.16598425160 4.00000000000 0 Changed scale rank. 465186 198214 261783 10 9 786714.00000000000 Pristina 1 0 5.6
31 4 50 8 Admin-0 capital Roseau 0 Roseau 1.00000000000 0.00000000000 0 Dominica DMA Dominica DMA Saint George DM 15.30101564430 -61.38701298180 4.00000000000 0 Changed scale rank. 23336 16571 23336 7 6 3575635.00000000000 Roseau 1 5 5.1
32 4 50 8 Admin-0 capital Djibouti 0 Djibouti 1.00000000000 0.00000000000 0 Djibouti DJI Djibouti DJI Djibouti DJ 11.59501446430 43.14800166710 4.00000000000 0 Changed scale rank. 923000 604013 335001 11 11 223817.00000000000 Djibouti 1 0 5.6
33 4 50 6 Admin-0 capital alt Putrajaya 0 Putrajaya 0.00000000000 1 Administrative 0.00000000000 0 Malaysia MYS Malaysia MYS Selangor MY 2.91401979462 101.70194698000 0.00000000000 0 67964 50000 956431 8 7 6697380.00000000000 Putrajaya 1 5 5.6
34 4 50 2 Admin-0 capital alt Kyoto 0 Kyoto 0.00000000000 1 Official capita 0.00000000000 1 Japan JPN Japan JPN Kyoto JP 35.02999228820 135.74999792400 0.00000000000 0 1805000 1459640 1827367 12 12 1857910.00000000000 Kyoto Kyoto 1 0 5.1
35 4 50 8 Admin-0 capital Banjul 0 Banjul 1.00000000000 0.00000000000 0 Gambia, The GMB The Gambia GMB Banjul GM 13.45387646030 -16.59170148920 4.00000000000 0 Location adjusted. Changed scale rank. 43094 34589 581300 7 7 2413876.00000000000 Banjul 1 0 5.6
36 4 50 8 Admin-0 capital Skopje 0 Skopje 1.00000000000 0.00000000000 0 Macedonia MKD Macedonia MKD Centar MK 42.00000612290 21.43346146510 4.00000000000 0 Changed scale rank. 494087 474889 491890 10 10 785842.00000000000 Skopje 1 5 5.6
37 4 50 8 Admin-0 capital Bridgetown 0 Bridgetown 1.00000000000 0.00000000000 0 Barbados BRB Barbados BRB Saint Michael BB 13.10200258280 -59.61652673510 4.00000000000 0 Changed scale rank. 191152 96578 191814 9 8 2075807.00000000000 Bridgetown 1 5 5.6
38 4 50 8 Admin-0 capital alt Porto-Novo 0 Porto-Novo 0.00000000000 1 Official capita 0.00000000000 0 Benin BEN Benin BEN Ouémé BJ 6.48331097302 2.61662552757 0.00000000000 0 300000 234168 806945 10 10 2392087.00000000000 Porto-Novo 1 0 5.6
39 4 50 8 Admin-0 capital Bujumbura 0 Bujumbura 1.00000000000 0.00000000000 0 Burundi BDI Burundi BDI Bujumbura Mairie BI -3.37608722037 29.36000606150 4.00000000000 0 Changed scale rank. 331700 331700 1208361 10 10 425378.00000000000 Bujumbura 1 0 5.6
40 4 50 0 Admin-0 capital Kingstown 0 Kingstown 1.00000000000 0.00000000000 0 Saint Vincent and the Grenadines VCT Saint Vincent and the Grenadines VCT VC 13.14827882790 -61.21206242030 4.00000000000 0 Location adjusted. Changed scale rank. 49485 24518 0 7 7 4359981.00000000000 Kingstown 1 5 5.1
41 4 50 0 Admin-0 capital Castries 0 Castries 1.00000000000 0.00000000000 0 Saint Lucia LCA Saint Lucia LCA LC 14.00197348930 -61.00000818040 4.00000000000 0 Changed scale rank. 37963 10634 0 7 6 3028258.00000000000 Castries 1 5 5.6
42 4 50 0 Admin-0 capital Basseterre 0 Basseterre 1.00000000000 0.00000000000 0 Saint Kitts and Nevis KNA Saint Kitts and Nevis KNA KN 17.30203045550 -62.71700931970 4.00000000000 0 Changed scale rank. 21887 15500 21887 7 6 3575551.00000000000 Basseterre 1 5 5.6
43 4 50 0 Admin-0 capital Port Louis 0 Port Louis 1.00000000000 0.00000000000 0 Mauritius MUS Mauritius MUS MU -20.16663857140 57.49999385460 4.00000000000 0 Changed scale rank. 595491 148416 304613 11 9 934154.00000000000 Port Louis 1 5 5.6
44 4 50 0 Admin-0 capital Saint George's 0 Saint George's 1.00000000000 0.00000000000 0 Grenada GRD Grenada GRD GD 12.05263340170 -61.74164322610 4.00000000000 0 Changed scale rank. 33734 27343 27343 7 7 3579925.00000000000 Saint Georgee۪s 1 5 5.1
45 4 50 0 Admin-0 capital Manama 0 Manama 1.00000000000 0.00000000000 0 Bahrain BHR Bahrain BHR BH 26.23613629050 50.58305171590 4.00000000000 0 Changed scale rank. 563920 157474 563666 11 9 290340.00000000000 Manama 1 5 5.6
46 4 50 0 Admin-0 capital Saint John's 0 Saint John's 1.00000000000 0.00000000000 0 Antigua and Barbuda ATG Antigua and Barbuda ATG AG 17.11803651830 -61.85003381510 4.00000000000 0 Changed scale rank. 35499 24226 0 7 7 3576022.00000000000 Saint John's 1 5 5.1
47 3 110 8 Admin-0 capital Montevideo 0 Montevideo 1.00000000000 0.00000000000 1 Uruguay URY Uruguay URY Montevideo UY -34.85804156620 -56.17105228840 0.00000000000 0 1513000 5324 1276128 12 5 5038018.00000000000 Montevideo Montevideo 1 0 4.0
48 3 110 8 Admin-0 capital Lomé Lome 0 Lome 1.00000000000 0.00000000000 1 Togo TGO Togo TGO Maritime TG 6.13193707166 1.22275711936 0.00000000000 0 1452000 749700 1256715 12 11 2365267.00000000000 Lomi Lome 1 0 5.0
49 3 110 7 Admin-0 capital Tunis 0 Tunis 1.00000000000 0.00000000000 0 Tunisia TUN Tunisia TUN Tunis TN 36.80277813620 10.17967809920 0.00000000000 0 2412500 728453 1675117 12 11 2464470.00000000000 Tunis 1 0 5.0
50 3 110 8 Admin-0 capital Abu Dhabi 0 Abu Dhabi 1.00000000000 0.00000000000 0 United Arab Emirates ARE United Arab Emirates ARE Abu Dhabi AE 24.46668357240 54.36659338260 0.00000000000 0 603492 560230 560230 11 11 292968.00000000000 Abu Dhabi 1 0 5.0
51 3 110 8 Admin-0 capital Ashgabat 0 Ashgabat 1.00000000000 0.00000000000 0 Turkmenistan TKM Turkmenistan TKM Ahal TM 37.94999493310 58.38329911180 0.00000000000 0 727700 577982 556048 11 11 162183.00000000000 Ashgabat 1 0 5.0
52 3 110 6 Admin-0 capital Lusaka 0 Lusaka 1.00000000000 0.00000000000 1 Zambia ZMB Zambia ZMB Lusaka ZM -15.41664426790 28.28332759470 0.00000000000 0 1328000 1267440 1240558 12 12 909137.00000000000 Lusaka Lusaka 1 0 4.0
53 3 110 6 Admin-0 capital Harare 0 Harare 1.00000000000 0.00000000000 1 Zimbabwe ZWE Zimbabwe ZWE Harare ZW -17.81778969440 31.04470943070 0.00000000000 0 1572000 1542813 1831877 12 12 890299.00000000000 Harare Harare 1 0 4.0
54 3 110 8 Admin-0 capital Dili 0 Dili 1.00000000000 0.00000000000 0 East Timor TLS East Timor TLS Dili TL -8.55938840855 125.57945593200 0.00000000000 0 234331 193563 55154 10 9 1645457.00000000000 Dili 1 0 5.0
55 3 110 8 Admin-0 capital Port Vila 0 Port Vila 1.00000000000 0.00000000000 0 Vanuatu VUT Vanuatu VUT Shefa VU -17.73335040400 168.31664058400 0.00000000000 0 44040 35901 7702 7 7 2135171.00000000000 Port-Vila 1 0 4.0
56 3 110 8 Admin-0 capital Tegucigalpa 0 Tegucigalpa 1.00000000000 0.00000000000 1 Honduras HND Honduras HND Francisco Morazán HN 14.10204490050 -87.21752933930 0.00000000000 0 946000 850848 1014546 11 11 3600949.00000000000 Tegucigalpa Tegucigalpa 1 0 5.0
57 3 110 8 Admin-0 capital Georgetown 0 Georgetown 1.00000000000 0.00000000000 0 Guyana GUY Guyana GUY East Berbice-Corentyne GY 6.80197369275 -58.16702864750 0.00000000000 0 264350 235017 264350 10 10 3378644.00000000000 Georgetown1 1 5 4.0
58 3 110 8 Admin-0 capital Reykjavík 1 Reykjavik 1.00000000000 0.00000000000 0 Iceland ISL Iceland ISL Suðurnes IS 64.15002361970 -21.95001448720 0.00000000000 0 166212 113906 160116 9 9 3413829.00000000000 Reykjavik 1 0 3.7
59 3 110 8 Admin-0 capital Port-au-Prince 0 Port-au-Prince 1.00000000000 0.00000000000 1 Haiti HTI Haiti HTI Ouest HT 18.54102459610 -72.33603458830 0.00000000000 0 1998000 1234742 2385397 12 12 3718426.00000000000 Port-au-Prince Port-au-Prince 1 0 5.0
60 3 110 5 Admin-0 capital Kampala 0 Kampala 1.00000000000 0.00000000000 1 Uganda UGA Uganda UGA Kampala UG 0.31665895477 32.58332352570 0.00000000000 0 1420000 1353189 2153702 12 12 232422.00000000000 Kampala Kampala 1 0 5.0
61 3 110 8 Admin-0 capital Paramaribo 0 Paramaribo 1.00000000000 0.00000000000 0 Suriname SUR Suriname SUR Paramaribo SR 5.83503012992 -55.16703088540 0.00000000000 0 254169 223757 248161 10 10 3383330.00000000000 Paramaribo 1 5 5.0
62 3 110 6 Admin-0 capital Niamey 0 Niamey 1.00000000000 0.00000000000 1 Niger NER Niger NER Niamey NE 13.51670595190 2.11665604514 0.00000000000 0 915000 742791 715325 11 11 2440485.00000000000 Niamey Niamey 1 0 5.0
63 3 110 8 Admin-0 capital Dushanbe 0 Dushanbe 1.00000000000 0.00000000000 0 Tajikistan TJK Tajikistan TJK Tadzhikistan Territories TJ 38.56003521630 68.77387935270 0.00000000000 0 1086244 679400 1081361 12 11 1221874.00000000000 Dushanbe 1 0 5.0
64 3 110 7 Admin-0 capital Asunción Asuncion 1 Asuncion 1.00000000000 0.00000000000 1 Paraguay PRY Paraguay PRY Asunción PY -25.29640297570 -57.64150516930 0.00000000000 0 1870000 11693 636771 12 6 1730025.00000000000 Asuncian Asuncion 1 5 4.0
65 3 110 8 Admin-0 capital Managua 0 Managua 1.00000000000 0.00000000000 1 Nicaragua NIC Nicaragua NIC Managua NI 12.15301658010 -86.26849166030 0.00000000000 0 920000 920000 1088194 11 11 3617763.00000000000 Managua Managua 1 0 5.0
66 3 110 8 Admin-0 capital Freetown 0 Freetown 1.00000000000 0.00000000000 1 Sierra Leone SLE Sierra Leone SLE Western SL 8.47001141249 -13.23421574040 0.00000000000 0 827000 13768 1074640 11 6 2408770.00000000000 Freetown Freetown 1 0 5.0
67 3 110 2 Admin-0 capital Islamabad 0 Islamabad 1.00000000000 0.00000000000 1 Pakistan PAK Pakistan PAK F.C.T. PK 33.69999595030 73.16663447970 0.00000000000 0 780000 601600 893673 11 11 1176615.00000000000 Islamabad Islamabad 1 0 5.0
68 3 110 6 Admin-0 capital Kathmandu 0 Kathmandu 1.00000000000 0.00000000000 1 Nepal NPL Nepal NPL Bhaktapur NP 27.71669191390 85.31664221080 0.00000000000 0 895000 895000 1099610 11 11 1283240.00000000000 Kathmandu Kathmandu 1 0 5.0
69 3 110 3 Admin-0 capital Bloemfontein 0 Bloemfontein 1.00000000000 Judicial capita 0.00000000000 0 South Africa ZAF South Africa ZAF Orange Free State ZA -29.11999387740 26.22991288120 4.00000000000 0 Changed scale rank. 463064 456669 456513 10 10 1018725.00000000000 Bloemfontein 1 0 5.0
70 3 110 3 Admin-0 capital Pretoria 0 Pretoria 1.00000000000 Administrative 0.00000000000 1 South Africa ZAF South Africa ZAF Gauteng ZA -25.70692055380 28.22942907580 0.00000000000 0 1338000 1338000 1443084 12 12 964137.00000000000 Pretoria Pretoria 1 0 5.0
71 3 110 8 Admin-0 capital Port Moresby 0 Port Moresby 1.00000000000 0.00000000000 0 Papua New Guinea PNG Papua New Guinea PNG Central PG -9.46470782587 147.19250362100 0.00000000000 0 283733 251136 251304 10 10 2088122.00000000000 Port Moresby 1 0 4.0
72 3 110 8 Admin-0 capital Honiara 0 Honiara 1.00000000000 0.00000000000 0 Solomon Islands SLB Solomon Islands SLB Guadalcanal SB -9.43799429509 159.94976573400 0.00000000000 0 76328 56298 76328 8 8 2108502.00000000000 Honiara 1 0 5.0
73 3 110 8 Admin-0 capital Panama City Ciudad de Panam 0 Panama City 1.00000000000 0.00000000000 1 Panama PAN Panama PAN Panama PA 8.96801719048 -79.53303715180 0.00000000000 0 1281000 408168 939725 12 10 3703443.00000000000 Ciudad de Panam Panama City1 1 0 5.0
74 3 110 5 Admin-0 capital Rabat 0 Rabat 1.00000000000 0.00000000000 1 Morocco MAR Morocco MAR Rabat - Salé - Zemmour - Zaer MA 34.02529909160 -6.83613082013 0.00000000000 0 1705000 1655753 2029349 12 12 2538475.00000000000 Rabat Rabat 1 0 5.0
75 3 110 8 Admin-0 capital Chișinău 0 Chisinau 1.00000000000 0.00000000000 0 Moldova MDA Moldova MDA Chisinau MD 47.00502361970 28.85771113970 0.00000000000 0 688134 635994 664472 11 11 618426.00000000000 Chisinau 1 5 5.0
76 3 110 6 Admin-0 capital Maputo 0 Maputo 1.00000000000 0.00000000000 1 Mozambique MOZ Mozambique MOZ Maputo MZ -25.95527748740 32.58916296260 0.00000000000 0 1446000 1191613 1365454 12 12 1040652.00000000000 Maputo Maputo 1 0 5.0
77 3 110 8 Admin-0 capital Mogadishu Muqdisho 0 Mogadishu 1.00000000000 0.00000000000 1 Somalia SOM Somalia SOM Banaadir SO 2.06668133433 45.36667761110 0.00000000000 0 1100000 875388 849392 12 11 53654.00000000000 Muqdisho Mogadishu 1 5 4.0
78 3 110 8 Admin-0 capital Muscat 0 Muscat 1.00000000000 0.00000000000 0 Oman OMN Oman OMN Muscat OM 23.61332480770 58.59331213260 0.00000000000 0 734697 586861 586861 11 11 287286.00000000000 Muscat 1 0 5.0
79 3 110 6 Admin-0 capital Colombo 0 Colombo 1.00000000000 De facto, admin 0.00000000000 0 Sri Lanka LKA Sri Lanka LKA Colombo LK 6.93196575818 79.85775060930 0.00000000000 0 217000 217000 2490974 10 10 3465927.00000000000 Colombo 1 5 5.0
80 3 110 7 Admin-0 capital Ulaanbaatar 0 Ulaanbaatar 1.00000000000 0.00000000000 1 Mongolia MNG Mongolia MNG Ulaanbaatar MN 47.91667339990 106.91661576200 0.00000000000 0 885000 769612 765359 11 11 2028462.00000000000 Ulaanbaatar Ulaanbaatar 1 0 4.0
81 3 110 6 Admin-0 capital Windhoek 0 Windhoek 1.00000000000 0.00000000000 0 Namibia NAM Namibia NAM Khomas NA -22.57000608440 17.08354610050 0.00000000000 0 268132 262796 262796 10 10 3352136.00000000000 Windhoek 1 0 5.0
82 3 110 2 Admin-0 capital Abuja 0 Abuja 1.00000000000 Official and ad 0.00000000000 1 Nigeria NGA Nigeria NGA Federal Capital Territory NG 9.08333314914 7.53332800155 4.00000000000 0 Changed scale rank. 1576000 162135 0 12 9 2322794.00000000000 Abuja Abuja 1 5 4.0
83 3 110 8 Admin-0 capital Bissau 0 Bissau 1.00000000000 0.00000000000 0 Guinea Bissau GNB Guinea Bissau GNB Bissau GW 11.86502382300 -15.59836084130 0.00000000000 0 403339 388028 403339 10 10 2374775.00000000000 Bissau 1 0 5.0
84 3 110 8 Admin-0 capital Amman 0 Amman 1.00000000000 0.00000000000 1 Jordan JOR Jordan JOR Amman JO 31.95002524720 35.93329992550 0.00000000000 0 1060000 1060000 2633729 12 12 250441.00000000000 Amman Amman 1 0 5.0
85 3 110 8 Admin-0 capital Vilnius 0 Vilnius 1.00000000000 0.00000000000 0 Lithuania LTU Lithuania LTU Vilniaus LT 54.68336631180 25.31663529330 0.00000000000 0 542366 507029 494356 11 11 593116.00000000000 Vilnius 1 0 5.0
86 3 110 8 Admin-0 capital Riga 0 Riga 1.00000000000 0.00000000000 0 Latvia LVA Latvia LVA Riga LV 56.95002382320 24.09996537140 0.00000000000 0 742572 705033 0 11 11 456172.00000000000 Riga 1 0 4.0
87 3 110 8 Admin-0 capital Bishkek 0 Bishkek 1.00000000000 0.00000000000 1 Kyrgyzstan KGZ Kyrgyzstan KGZ Bishkek KG 42.87307944650 74.58520422250 0.00000000000 0 837000 804212 781714 11 11 1528675.00000000000 Bishkek Bishkek 1 5 5.0
88 3 110 8 Admin-0 capital Maseru 0 Maseru 1.00000000000 0.00000000000 0 Lesotho LSO Lesotho LSO Maseru LS -29.31667437870 27.48327307000 0.00000000000 0 361324 118355 356225 10 9 932505.00000000000 Maseru 1 0 5.0
89 3 110 6 Admin-0 capital Antananarivo 0 Antananarivo 1.00000000000 0.00000000000 1 Madagascar MDG Madagascar MDG Antananarivo MG -18.91663735060 47.51662390010 0.00000000000 0 1697000 1391433 1844658 12 12 1070940.00000000000 Antananarivo Antananarivo 1 0 5.0
90 3 110 7 Admin-0 capital Quito 0 Quito 1.00000000000 0.00000000000 1 Ecuador ECU Ecuador ECU Pichincha EC -0.21498818065 -78.50005110850 0.00000000000 0 1701000 1399814 1435528 12 12 3652462.00000000000 Quito Quito 1 0 4.0
91 3 110 8 Admin-0 capital San José San Jose 1 San Jose 1.00000000000 0.00000000000 1 Costa Rica CRI Costa Rica CRI San José CR 9.93501242974 -84.08405135270 0.00000000000 0 1284000 1724 1434681 12 3 3669623.00000000000 San Josi San Jose1 1 5 5.0
92 3 110 8 Admin-0 capital San Salvador 0 San Salvador 1.00000000000 0.00000000000 1 El Salvador SLV El Salvador SLV San Salvador SV 13.71000164690 -89.20304122080 0.00000000000 0 1433000 2807 2139587 12 4 1690681.00000000000 San Salvador San Salvador 1 5 5.0
93 3 110 8 Admin-0 capital Kingston 0 Kingston 1.00000000000 0.00000000000 0 Jamaica JAM Jamaica JAM Kingston JM 17.97707662380 -76.76743371370 4.00000000000 0 Location adjusted. 937700 664973 18171 11 11 3489854.00000000000 Kingston1 1 5 5.0
94 3 110 7 Admin-0 capital Ndjamena N'Djamnna 0 Ndjamena 1.00000000000 0.00000000000 1 Chad TCD Chad TCD Hadjer-Lamis TD 12.11309653620 15.04914831410 0.00000000000 0 989000 681387 686347 11 11 2427123.00000000000 N'Djam-na Ndjamena 1 0 5.0
95 3 110 8 Admin-0 capital Malabo 0 Malabo 1.00000000000 0.00000000000 0 Equatorial Guinea GNQ Equatorial Guinea GNQ Bioko Norte GQ 3.75001527803 8.78327754582 4.00000000000 0 Location adjusted. 155963 155963 0 9 9 2309527.00000000000 Malabo 1 0 5.0
96 3 110 8 Admin-0 capital Asmara 0 Asmara 1.00000000000 0.00000000000 0 Eritrea ERI Eritrea ERI Anseba ER 15.33333925270 38.93332352580 0.00000000000 0 620802 563930 587094 11 11 343300.00000000000 Asmara 1 0 5.0
97 3 110 8 Admin-0 capital Zagreb 0 Zagreb 1.00000000000 0.00000000000 0 Croatia HRV Croatia HRV Grad Zagreb HR 45.80000673330 15.99999466820 0.00000000000 0 722526 698966 690638 11 11 3186886.00000000000 Zagreb 1 0 5.0
98 3 110 8 Admin-0 capital Tallinn 0 Tallinn 1.00000000000 0.00000000000 0 Estonia EST Estonia EST Harju EE 59.43387737950 24.72804072950 0.00000000000 0 394024 340027 317949 10 10 588409.00000000000 Tallinn 1 0 5.0
99 3 110 8 Admin-0 capital Lilongwe 0 Lilongwe 1.00000000000 0.00000000000 0 Malawi MWI Malawi MWI Lilongwe MW -13.98329506550 33.78330196000 0.00000000000 0 646750 646750 1061388 11 11 927967.00000000000 Lilongwe 1 0 5.0
100 3 110 8 Admin-0 capital Guatemala Ciudad de Guatemala (Guatemala City) 0 Guatemala 1.00000000000 0.00000000000 1 Guatemala GTM Guatemala GTM Guatemala GT 14.62113466280 -90.52696557790 0.00000000000 0 1024000 994938 2391150 12 11 3598132.00000000000 Ciudad de Guatemala (Guatemala City) Guatemala 1 0 5.0
101 3 110 7 Admin-0 capital Libreville 0 Libreville 1.00000000000 0.00000000000 0 Gabon GAB Gabon GAB Estuaire GA 0.38538860972 9.45796504582 0.00000000000 0 578156 483355 483522 11 10 2399697.00000000000 Libreville 1 0 5.0
102 3 110 8 Admin-0 capital Suva 0 Suva 1.00000000000 0.00000000000 0 Fiji FJI Fiji FJI Central FJ -18.13301593140 178.44170731500 4.00000000000 0 Location adjusted. 175399 88271 0 9 8 2198148.00000000000 Suva 1 0 5.0
103 3 110 3 Admin-0 capital alt Valparaíso Valparaiso 1 Valparaiso 0.00000000000 1 Legislative cap 0.00000000000 1 Chile CHL Chile CHL Valparaíso CL -33.04776446660 -71.62101363290 4.00000000000 0 Changed scale rank. 854000 15938 130815 11 6 3445575.00000000000 Valpara so Valparaiso2 1 0 5.0
104 3 110 7 Admin-0 capital Nouakchott 0 Nouakchott 1.00000000000 0.00000000000 0 Mauritania MRT Mauritania MRT Nouakchott MR 18.08642702120 -15.97534041490 0.00000000000 0 742144 661400 742144 11 11 2377450.00000000000 Nouakchott 1 0 5.0
105 3 110 6 Admin-0 capital Bamako 0 Bamako 1.00000000000 0.00000000000 1 Mali MLI Mali MLI Bamako ML 12.65001466770 -8.00003910464 0.00000000000 0 1494000 1297281 1301407 12 12 2460596.00000000000 Bamako Bamako 1 0 4.0
106 3 110 8 Admin-0 capital Beirut Bayrut 0 Beirut 1.00000000000 0.00000000000 1 Lebanon LBN Lebanon LBN Beirut LB 33.87197511700 35.50970821000 0.00000000000 0 1846000 1712125 1661980 12 12 276781.00000000000 Bayrut Beirut 1 5 5.0
107 3 110 8 Admin-0 capital Tbilisi T'Bilisi 0 Tbilisi 1.00000000000 0.00000000000 1 Georgia GEO Georgia GEO Tbilisi GE 41.72500998850 44.79079544960 0.00000000000 0 1100000 1005257 977179 12 12 611717.00000000000 Tbilisi Tbilisi 1 0 5.0
108 3 110 6 Admin-0 capital Astana 0 Astana 1.00000000000 0.00000000000 0 Kazakhstan KAZ Kazakhstan KAZ Aqmola KZ 51.18112530430 71.42777420950 0.00000000000 0 345604 325021 317445 10 10 1526273.00000000000 Astana 1 0 4.0
109 3 110 8 Admin-0 capital Vientiane 0 Vientiane 1.00000000000 0.00000000000 0 Laos LAO Laos LAO Vientiane [prefecture] LA 17.96669272760 102.59998002000 0.00000000000 0 754000 570348 469811 11 11 1651944.00000000000 Vientiane 1 0 5.0
110 3 110 7 Admin-0 capital Brazzaville 0 Brazzaville 1.00000000000 0.00000000000 1 Congo (Brazzaville) COG Congo (Brazzaville) COG Pool CG -4.25918577181 15.28468949250 0.00000000000 0 1355000 1163890 1174778 12 12 2260535.00000000000 Brazzaville Brazzaville 1 0 5.0
111 3 110 8 Admin-0 capital Conakry 0 Conakry 1.00000000000 0.00000000000 1 Guinea GIN Guinea GIN Conakry GN 9.53152284641 -13.68023502750 0.00000000000 0 1494000 1494000 1498020 12 12 2422465.00000000000 Conakry Conakry 1 5 5.0
112 3 110 8 Admin-0 capital Yamoussoukro 0 Yamoussoukro 1.00000000000 1 Official capita 0.00000000000 0 Ivory Coast CIV Ivory Coast CIV Lacs CI 6.81838096000 -5.27550256491 4.00000000000 0 Changed scale rank. 206499 194530 206499 10 9 2279755.00000000000 Yamoussoukro 1 0 5.0
113 3 110 2 Admin-0 capital Ottawa Ottawa-Gatineau 0 Ottawa 1.00000000000 0.00000000000 1 Canada CAN Canada CAN Ontario CA 45.41669679670 -75.70001530120 0.00000000000 0 1145000 812129 872781 12 11 6094817.00000000000 Ottawa-Gatineau Ottawa 1 5 3.0
114 3 110 8 Admin-0 capital Belgrade Beograd 0 Belgrade 1.00000000000 0.00000000000 1 Republic of Serbia SRB Serbia SRB Grad Beograd RS 44.81864544580 20.46799068060 0.00000000000 0 1099000 1099000 1271541 12 12 792680.00000000000 Beograd Belgrade 1 0 5.0
115 3 110 8 Admin-0 capital Bandar Seri Begawan 0 Bandar Seri Begawan 1.00000000000 0.00000000000 0 Brunei BRN Brunei BRN Brunei and Muara BN 4.88333111462 114.93328405700 0.00000000000 0 296500 140000 222513 10 9 1820906.00000000000 Bandar Seri Begawan 1 0 5.0
116 3 110 6 Admin-0 capital Sucre 0 Sucre 1.00000000000 Official (const 0.00000000000 0 Bolivia BOL Bolivia BOL Chuquisaca BO -19.04097084670 -65.25951562670 0.00000000000 0 224838 221736 221736 10 10 3903987.00000000000 Sucre 1 0 4.7
117 3 110 8 Admin-0 capital Belmopan 0 Belmopan 1.00000000000 0.00000000000 0 Belize BLZ Belize BLZ Cayo BZ 17.25203350720 -88.76707299980 0.00000000000 0 15220 13381 15220 6 6 3582672.00000000000 Belmopan 1 0 5.0
118 3 110 7 Admin-0 capital Bangui 0 Bangui 1.00000000000 0.00000000000 0 Central African Republic CAF Central African Republic CAF Bangui CF 4.36664430635 18.55828812530 0.00000000000 0 831925 622771 782274 11 11 2389853.00000000000 Bangui 1 0 5.0
119 3 110 6 Admin-0 capital Yaounde Yaounde 0 Yaounde 1.00000000000 0.00000000000 1 Cameroon CMR Cameroon CMR Centre CM 3.86670066214 11.51665075550 0.00000000000 0 1611000 1060587 1060747 12 12 2220957.00000000000 Yaound Yaounde 1 0 5.0
120 3 110 8 Admin-0 capital Tirana 0 Tirana 1.00000000000 0.00000000000 0 Albania ALB Albania ALB Durrës AL 41.32754070950 19.81888301460 0.00000000000 0 895350 421286 517792 11 10 3183875.00000000000 Tirana 1 0 5.0
121 3 110 8 Admin-0 capital Yerevan 0 Yerevan 1.00000000000 0.00000000000 1 Armenia ARM Armenia ARM Erevan AM 40.18115073550 44.51355139040 0.00000000000 0 1102000 1093485 1154748 12 12 616052.00000000000 Yerevan Yerevan 1 5 5.0
122 3 110 8 Admin-0 capital Baku 0 Baku 1.00000000000 0.00000000000 1 Azerbaijan AZE Azerbaijan AZE Baki AZ 40.39527203270 49.86221716190 0.00000000000 0 2122300 1892000 1518801 12 12 587084.00000000000 Baku Baku 1 0 5.0
123 3 110 8 Admin-0 capital Phnom Penh Phnum Penh 0 Phnom Penh 1.00000000000 0.00000000000 1 Cambodia KHM Cambodia KHM Phnom Penh KH 11.55003012990 104.91663448000 0.00000000000 0 1466000 1466000 1604086 12 12 1821306.00000000000 Phnum Penh Phnom Penh 1 5 5.0
124 3 110 6 Admin-0 capital La Paz 0 La Paz 1.00000000000 Administrative 0.00000000000 1 Bolivia BOL Bolivia BOL La Paz BO -16.49797361370 -68.14998519050 0.00000000000 0 1590000 812799 4400 12 11 3911925.00000000000 La Paz La Paz3 1 0 4.0
125 3 110 8 Admin-0 capital Cotonou 0 Cotonou 1.00000000000 De facto, admin 0.00000000000 1 Benin BEN Benin BEN Ouémé BJ 6.40000856417 2.51999059918 0.00000000000 0 762000 690584 1060640 11 11 2394819.00000000000 Cotonou Cotonou 1 0 5.0
126 3 110 7 Admin-0 capital Sofia 0 Sofia 1.00000000000 0.00000000000 1 Bulgaria BGR Bulgaria BGR Grad Sofiya BG 42.68334942530 23.31665401070 0.00000000000 0 1185000 874827 871735 12 11 727011.00000000000 Sofia Sofia 1 0 5.0
127 3 110 6 Admin-0 capital Minsk 0 Minsk 1.00000000000 0.00000000000 1 Belarus BLR Belarus BLR Minsk BY 53.89997743640 27.56662715530 0.00000000000 0 1805000 1577138 1557919 12 12 625144.00000000000 Minsk Minsk 1 0 5.0
128 3 110 8 Admin-0 capital Thimphu 0 Thimphu 1.00000000000 0.00000000000 0 Bhutan BTN Bhutan BTN Thimphu BT 27.47298585920 89.63901403700 4.00000000000 0 Location adjusted. 98676 79185 0 8 8 1252416.00000000000 Thimphu 1 0 5.0
129 3 110 7 Admin-0 capital Gaborone 0 Gaborone 1.00000000000 0.00000000000 0 Botswana BWA Botswana BWA South-East BW -24.64631345740 25.91194779330 0.00000000000 0 208411 159243 158896 10 9 933773.00000000000 Gaborone 1 0 5.0
130 3 110 3 Admin-0 capital Canberra 0 Canberra 1.00000000000 0.00000000000 0 Australia AUS Australia AUS Australian Capital Territory AU -35.28302854540 149.12902624400 4.00000000000 0 Location adjusted. 327700 234032 0 10 10 2172517.00000000000 Canberra 1 0 4.0
131 3 110 8 Admin-0 capital Ouagadougou 0 Ouagadougou 1.00000000000 0.00000000000 1 Burkina Faso BFA Burkina Faso BFA Kadiogo BF 12.37031597790 -1.52472375630 0.00000000000 0 1149000 835457 713874 12 11 2357048.00000000000 Ouagadougou Ouagadougou 1 0 5.0
132 3 110 8 Admin-0 capital Sarajevo 0 Sarajevo 1.00000000000 0.00000000000 0 Bosnia and Herzegovina BIH Bosnia and Herzegovina BIH Sarajevo BA 43.85002239900 18.38300166700 0.00000000000 0 696731 628902 627065 11 11 3191281.00000000000 Sarajevo 1 5 5.0
133 3 110 5 Admin-0 capital Naypyidaw Nay Pyi Taw 0 Naypyidaw 1.00000000000 0.00000000000 1 Myanmar MMR Myanmar MMR Mandalay MM 19.76655702610 96.11861852920 4.00000000000 0 Location adjusted. 930000 194824 0 11 9 6611854.00000000000 Nay Pyi Taw Naypyidaw 1 0 5.0
134 3 110 0 Admin-0 capital Nukualofa 0 Nukualofa 1.00000000000 0.00000000000 0 Tonga TON Tonga TON TO -21.13851235670 -175.22056447800 4.00000000000 0 Location adjusted. 42620 23658 42620 7 7 4032402.00000000000 Nukualofa 1 5 5.0
135 3 110 0 Admin-0 capital Hargeysa 0 Hargeysa 1.00000000000 0.00000000000 0 Somaliland SOL Somaliland SOL -99 9.56002239882 44.06531001670 4.00000000000 0 Changed scale rank. 477876 247018 247018 10 10 57289.00000000000 Hargeysa 1 5 5.0
136 3 110 0 Admin-0 capital Victoria 0 Victoria 1.00000000000 0.00000000000 0 Seychelles SYC Seychelles SYC SC -4.61663165397 55.44998978560 0.00000000000 0 33576 22881 33737 7 7 241131.00000000000 Victoria4 1 5 5.0
137 3 110 0 Admin-0 capital São Tomé 1 Sao Tome 1.00000000000 0.00000000000 0 Sao Tome and Principe STP Sao Tome and Principe STP ST 0.33340211883 6.73332515323 0.00000000000 0 88219 56166 88219 8 8 3388092.00000000000 Sao Tome 1 5 5.0
138 3 110 0 Admin-0 capital Apia 0 Apia 1.00000000000 0.00000000000 0 Samoa WSM Samoa WSM WS -13.84154504240 -171.73864160900 4.00000000000 0 Location adjusted. 61916 37708 0 8 7 3689793.00000000000 Apia 1 5 5.0
139 3 110 0 Admin-0 capital Valletta 0 Valletta 1.00000000000 0.00000000000 0 Malta MLT Malta MLT MT 35.89973248190 14.51471065130 0.00000000000 0 368250 6966 336174 10 5 2562305.00000000000 Valletta 1 5 5.0
140 3 110 0 Admin-0 capital Malé 1 Male 1.00000000000 0.00000000000 0 Maldives MDV Maldives MDV MV 4.16670818981 73.49994746800 0.00000000000 0 112927 103693 0 9 9 3174186.00000000000 Male 1 5 5.0
141 3 110 0 Admin-0 capital Jerusalem 0 Jerusalem 1.00000000000 De facto capita 0.00000000000 0 Israel IS1 Israel ISR Jerusalem IL 31.77840781560 35.20662593460 0.00000000000 0 1029300 801000 1072567 12 11 281184.00000000000 Jerusalem 1 0 3.7
142 3 110 0 Admin-0 capital Praia 0 Praia 1.00000000000 0.00000000000 0 Cape Verde CPV Cape Verde CPV CV 14.91669801730 -23.51668888500 0.00000000000 0 113364 88859 89205 9 8 3374333.00000000000 Praia 1 5 5.0
143 3 110 0 Admin-0 capital Nassau 0 Nassau 1.00000000000 0.00000000000 0 Bahamas, The BHS The Bahamas BHS BS 25.08339011540 -77.35004378430 0.00000000000 0 227940 160966 0 10 9 3571824.00000000000 Nassau 1 5 5.0
144 3 110 0 Admin-0 capital Nicosia 0 Nicosia 1.00000000000 Capital of both 0.00000000000 0 Cyprus CYP Cyprus CYP CY 35.16667645170 33.36663488640 0.00000000000 0 224300 200452 222985 10 10 146268.00000000000 Nicosia 1 5 5.0
145 3 110 8 Admin-0 capital Wellington 0 Wellington 1.00000000000 0.00000000000 0 New Zealand NZL New Zealand NZL Manawatu-Wanganui NZ Wellington metropolitan area -41.29998785369 174.78326585928 0.00000000000 0 393400 393400 0 10 9 2144168.00000000000 Wellington 1 0 4.0
146 2 200 5 Admin-0 capital Hanoi H 0 Hanoi 1.00000000000 0.00000000000 1 Vietnam VNM Vietnam VNM Thái Nguyên VN 21.03332724910 105.85001420000 5.00000000000 0 Changed scale rank. 4378000 1431270 5466347 12 12 1581130.00000000000 Hh Noi Hanoi 1 0 4.0
147 2 200 5 Admin-0 capital Ankara 0 Ankara 1.00000000000 0.00000000000 1 Turkey TUR Turkey TUR Ankara TR 39.92723858550 32.86439164100 5.00000000000 0 Changed scale rank. 3716000 3307379 3267576 12 12 323786.00000000000 Ankara Ankara 1 0 4.0
148 2 200 6 Admin-0 capital Budapest 0 Budapest 1.00000000000 1.00000000000 1 Hungary HUN Hungary HUN Budapest HU 47.50000632640 19.08332067740 4.00000000000 0 Changed scale rank. 1679000 1679000 1718895 12 12 3054643.00000000000 Budapest Budapest 1 0 4.7
149 2 200 6 Admin-0 capital Sanaa Sana'a' 0 Sanaa 1.00000000000 0.00000000000 1 Yemen YEM Yemen YEM Amanat Al Asimah YE 15.35473329570 44.20659338260 5.00000000000 0 Changed scale rank. 2008000 1835853 1742507 12 12 71137.00000000000 Sana'a' Sanaa 1 0 4.0
150 2 200 6 Admin-0 capital Bucharest Bucuresti 0 Bucharest 1.00000000000 1.00000000000 1 Romania ROU Romania ROU Bucharest RO 44.43337180490 26.09994665400 4.00000000000 0 Changed scale rank. 1942000 1742194 1636574 12 12 683506.00000000000 Bucuresti Bucharest 1 0 4.0
151 2 200 6 Admin-0 capital Damascus Dimashq 0 Damascus 1.00000000000 0.00000000000 1 Syria SYR Syria SYR Damascus SY 33.50003399560 36.29999588900 5.00000000000 0 Changed scale rank. 2466000 2466000 3344577 12 12 170654.00000000000 Dimashq Damascus 1 0 4.7
152 2 200 6 Admin-0 capital Lisbon Lisboa 0 Lisbon 1.00000000000 1.00000000000 1 Portugal PRT Portugal PRT Lisboa PT 38.72272287790 -9.14486630549 4.00000000000 0 Location adjusted. Changed scale rank. 2812000 517802 1795582 12 11 2267057.00000000000 Lisboa Lisbon 1 0 4.0
153 2 200 5 Admin-0 capital Khartoum Al-Khartum 0 Khartoum 1.00000000000 0.00000000000 1 Sudan SDN Sudan SDN Khartoum SD 15.58807822570 32.53417923860 5.00000000000 0 Changed scale rank. 4754000 1974647 2325931 12 12 379252.00000000000 Al-Khartum Khartoum 1 0 4.0
154 2 200 7 Admin-0 capital Oslo 0 Oslo 1.00000000000 1.00000000000 1 Kingdom of Norway NOR Norway NOR Oslo NO 59.91669028640 10.74997920600 4.00000000000 0 Changed scale rank. 835000 580000 701804 11 11 3143244.00000000000 Oslo Oslo 1 0 4.0
155 2 200 5 Admin-0 capital Warsaw Warszawa 0 Warsaw 1.00000000000 1.00000000000 1 Poland POL Poland POL Masovian PL 52.25000062980 20.99999955110 4.00000000000 0 Changed scale rank. 1707000 1702139 2012431 12 12 756135.00000000000 Warszawa Warsaw 1 0 4.0
156 2 200 6 Admin-0 capital Pyongyang P'yongyang 0 Pyongyang 1.00000000000 0.00000000000 1 Korea, North PRK North Korea PRK P'yongyang KP 39.01943869940 125.75469071400 5.00000000000 0 Changed scale rank. 3300000 2498797 2483216 12 12 1871859.00000000000 P'yongyang Pyongyang 1 0 4.7
157 2 200 5 Admin-0 capital Dar es Salaam 0 Dar es Salaam 1.00000000000 De facto capita 0.00000000000 1 United Republic of Tanzania TZA Tanzania TZA Dar-Es-Salaam TZ -6.80001259474 39.26834183630 5.00000000000 0 Changed scale rank. 2930000 2698652 2757835 12 12 160263.00000000000 Dar es Salaam Dar es Salaam 1 0 4.0
158 2 200 8 Admin-0 capital Dublin 0 Dublin 1.00000000000 1.00000000000 1 Ireland IRL Ireland IRL Dublin IE 53.33306113600 -6.24890568178 0.00000000000 0 1059000 968976 22478 12 11 2964574.00000000000 Dublin Dublin2 1 0 4.0
159 2 200 8 Admin-0 capital Monrovia 0 Monrovia 1.00000000000 0.00000000000 1 Liberia LBR Liberia LBR Montserrado LR 6.31055665987 -10.80475162910 0.00000000000 0 1041000 785662 806416 12 11 2274895.00000000000 Monrovia Monrovia 1 0 4.0
160 2 200 6 Admin-0 capital Kuala Lumpur 0 Kuala Lumpur 1.00000000000 Official and le 1.00000000000 1 Malaysia MYS Malaysia MYS Selangor MY 3.16666587210 101.69998327500 0.00000000000 0 1448000 1448000 2667990 12 12 1735161.00000000000 Kuala Lumpur Kuala Lumpur 1 0 4.0
161 2 200 6 Admin-0 capital Havana La Habana 0 Havana 1.00000000000 0.00000000000 1 Cuba CUB Cuba CUB Ciudad de la Habana CU 23.13195884090 -82.36418217130 5.00000000000 0 Changed scale rank. 2174000 1990917 1930305 12 12 3553478.00000000000 La Habana Havana 1 0 4.0
162 2 200 7 Admin-0 capital Prague Praha 0 Prague 1.00000000000 1.00000000000 1 Czech Republic CZE Czech Republic CZE Prague CZ 50.08333701490 14.46597977570 4.00000000000 0 Changed scale rank. 1162000 2087 1088042 12 4 4548393.00000000000 Praha Prague 1 0 4.7
163 2 200 8 Admin-0 capital Kuwait Al Kuwayt|Kuwait City 0 Kuwait 1.00000000000 0.00000000000 1 Kuwait KWT Kuwait KWT Al Kuwayt KW 29.36971763000 47.97830114620 5.00000000000 0 Changed scale rank. 2063000 60064 1682968 12 8 285787.00000000000 Al Kuwayt (Kuwait City) Kuwait 1 5 4.0
164 2 200 8 Admin-0 capital Santo Domingo 0 Santo Domingo 1.00000000000 0.00000000000 1 Dominican Republic DOM Dominican Republic DOM Distrito Nacional DO 18.47007285460 -69.90008508470 5.00000000000 0 Changed scale rank. 2154000 2873 3322037 12 4 3668373.00000000000 Santo Domingo Santo Domingo 1 5 4.0
165 2 200 6 Admin-0 capital Accra 0 Accra 1.00000000000 0.00000000000 1 Ghana GHA Ghana GHA Greater Accra GH 5.55003460583 -0.21671574035 5.00000000000 0 Changed scale rank. 2121000 1963264 2334371 12 12 2306104.00000000000 Accra Accra 1 0 4.0
166 2 200 7 Admin-0 capital Tripoli 0 Tripoli 1.00000000000 0.00000000000 1 Libya LBY Libya LBY Tajura' wa an Nawahi al Arba LY 32.89250001940 13.18001175810 5.00000000000 0 Changed scale rank. 2189000 229398 1149981 12 10 -1.00000000000 Tarabulus Tripoli1 1 0 4.0
167 2 200 8 Admin-0 capital alt Tel Aviv-Yafo Tel Aviv-Jaffa 0 Tel Aviv-Yafo 0.00000000000 1 While Jerulsale 0.00000000000 1 Israel IS1 Israel ISR Tel Aviv IL 32.07999147440 34.77001175820 4.00000000000 0 Changed scale rank. 3112000 378358 2306851 12 10 293394.00000000000 Tel Aviv-Yafo Tel Aviv-Yafo 1 0 4.0
168 2 200 7 Admin-0 capital Helsinki 0 Helsinki 1.00000000000 1.00000000000 1 Finland FIN Finland FIN Southern Finland FI 60.17556337400 24.93412634150 4.00000000000 0 Changed scale rank. 1115000 558457 762958 12 11 658225.00000000000 Helsinki Helsinki 1 0 4.0
169 2 200 8 Admin-0 capital København Copenhagen 1 Kobenhavn 1.00000000000 1.00000000000 1 Denmark DNK Denmark DNK Hovedstaden DK 55.67856419040 12.56348574730 0.00000000000 0 1085000 1085000 1038288 12 12 2618425.00000000000 K Copenhagen 1 0 4.0
170 2 200 8 Admin-0 capital Abidjan 0 Abidjan 1.00000000000 De facto, admin 0.00000000000 1 Ivory Coast CIV Ivory Coast CIV Lagunes CI 5.31999696749 -4.04004825989 5.00000000000 0 Changed scale rank. 3802000 3190395 3181637 12 12 2293538.00000000000 Abidjan Abidjan 1 0 4.0
171 2 200 1 Admin-0 capital Brasília Brasilia 0 Brasilia 1.00000000000 0.00000000000 1 Brazil BRA Brazil BRA Distrito Federal BR -15.78334023150 -47.91605228840 5.00000000000 0 Changed scale rank. 3716996 2562963 1772679 12 12 3469058.00000000000 Brasglia Brasilia 1 0 3.7
172 2 200 8 Admin-0 capital Brussels Bruxelles-Brussel 0 Brussels 1.00000000000 1.00000000000 1 Belgium BEL Belgium BEL Brussels BE 50.83331707670 4.33331660830 0.00000000000 0 1743000 1019022 1490164 12 12 2800866.00000000000 Bruxelles-Brussel Brussels 1 5 4.7
173 2 200 2 Admin-0 capital Dhaka 0 Dhaka 1.00000000000 0.00000000000 1 Bangladesh BGD Bangladesh BGD Dhaka BD 23.72305971170 90.40857946670 5.00000000000 0 Changed scale rank. 12797394 7000940 14995538 14 13 1185241.00000000000 Dhaka Dhaka 1 0 4.0
174 2 200 6 Admin-0 capital Luanda 0 Luanda 1.00000000000 0.00000000000 1 Angola AGO Angola AGO Luanda AO -8.83828611363 13.23442704130 5.00000000000 0 Changed scale rank. 5172900 1951272 1951272 13 12 2240449.00000000000 Luanda Luanda 1 0 4.0
175 2 200 5 Admin-0 capital Algiers El Djazacr 0 Algiers 1.00000000000 0.00000000000 1 Algeria DZA Algeria DZA Alger DZ 36.76306479800 3.05055252952 5.00000000000 0 Changed scale rank. 3354000 1977663 3332619 12 12 2507480.00000000000 El Djazasr Algiers 1 5 4.0
176 2 200 5 Admin-0 capital Rangoon Yangon 0 Rangoon 0.00000000000 Former capital 0.00000000000 1 Myanmar MMR Myanmar MMR Yangon MM 16.78335410460 96.16667761130 5.00000000000 0 Changed scale rank. 4088000 3301820 3124090 12 12 1298824.00000000000 Yangon Rangoon 1 0 4.0
177 1 300 1 Populated place San Francisco San Francisco-Oakland 0 San Francisco 0.00000000000 1.00000000000 1 United States USA United States of America USA California US 37.74000775050 -122.45997766300 0.00000000000 0 3450000 732072 27400 12 11 5391959.00000000000 San Francisco-Oakland San Francisco1 1 0 2.7
178 1 300 1 Admin-1 capital Denver Denver-Aurora 0 Denver 0.00000000000 0.00000000000 1 United States USA United States of America USA Colorado US 39.73918804840 -104.98401595200 5.00000000000 0 Changed scale rank. 2313000 1548599 1521278 12 12 5419384.00000000000 Denver-Aurora Denver 1 0 3.7
179 1 300 1 Populated place Houston 0 Houston 0.00000000000 0.00000000000 1 United States USA United States of America USA Texas US 29.81997438460 -95.33997929050 5.00000000000 0 Changed scale rank. 4459000 3647574 3607616 12 12 4699066.00000000000 Houston Houston 1 0 3.0
180 1 300 1 Populated place Miami 0 Miami 0.00000000000 1.00000000000 1 United States USA United States of America USA Florida US 25.78761069640 -80.22410608080 0.00000000000 0 5585000 382894 1037811 13 10 4164138.00000000000 Miami Miami 1 0 2.1
181 1 300 1 Admin-1 capital Atlanta 0 Atlanta 0.00000000000 1.00000000000 1 United States USA United States of America USA Georgia US 33.83001385400 -84.39994938330 0.00000000000 0 4506000 422908 2874096 12 10 4180439.00000000000 Atlanta Atlanta 1 0 3.0
182 1 300 1 Populated place Chicago 0 Chicago 0.00000000000 1.00000000000 1 United States USA United States of America USA Illinois US 41.82999066070 -87.75005497410 0.00000000000 0 8990000 2841952 3635101 13 12 4887398.00000000000 Chicago Chicago 1 0 3.0
183 1 300 6 Admin-0 capital Caracas 0 Caracas 1.00000000000 1.00000000000 1 Venezuela VEN Venezuela VEN Distrito Capital VE 10.50099855440 -66.91703719240 4.00000000000 0 Changed scale rank. 2985000 1815679 2764555 12 12 3646738.00000000000 Caracas Caracas 1 0 3.0
184 1 300 5 Admin-0 capital Kiev Kyiv 0 Kiev 1.00000000000 0.00000000000 1 Ukraine UKR Ukraine UKR Kiev UA 50.43336732900 30.51662796910 5.00000000000 0 Changed scale rank. 2709000 1662508 1611692 12 12 703448.00000000000 Kyiv Kiev 1 0 3.7
185 1 300 8 Admin-1 capital Dubai Dubayy 0 Dubai 0.00000000000 1.00000000000 1 United Arab Emirates ARE United Arab Emirates ARE Dubay AE 25.22999615380 55.27997432340 1.00000000000 1 Name changed. 1379000 1137347 1166878 12 12 292223.00000000000 Dubayy Dubayy 1 0 3.7
186 1 300 6 Admin-0 capital Tashkent 0 Tashkent 1.00000000000 0.00000000000 1 Uzbekistan UZB Uzbekistan UZB Tashkent UZ 41.31170188300 69.29493281950 5.00000000000 0 Changed scale rank. 2184000 1978028 2806287 12 12 1512569.00000000000 Tashkent Tashkent 1 0 3.7
187 1 300 3 Admin-0 capital Madrid 0 Madrid 1.00000000000 1.00000000000 1 Kingdom of Spain ESP Spain ESP Comunidad de Madrid ES 40.40002626450 -3.68335168600 0.00000000000 0 5567000 50437 3673427 13 8 3117735.00000000000 Madrid Madrid 1 0 3.0
188 1 300 7 Admin-1 capital Geneva 0 Geneva 0.00000000000 1.00000000000 0 Switzerland CHE Switzerland CHE Genève CH 46.21000754710 6.14002803409 4.00000000000 0 Changed scale rank. 1240000 192385 508284 12 9 2660646.00000000000 Geneva 1 0 3.7
189 1 300 7 Admin-0 capital Stockholm 0 Stockholm 1.00000000000 1.00000000000 1 Sweden SWE Sweden SWE Stockholm SE 59.35075995430 18.09733473280 4.00000000000 0 Location adjusted. 1264000 1253309 0 12 12 2673730.00000000000 Stockholm Stockholm 1 0 3.0
190 1 300 5 Admin-0 capital Bangkok Krung Thep 0 Bangkok 1.00000000000 1.00000000000 1 Thailand THA Thailand THA Bangkok Metropolis TH 13.74999920550 100.51664465200 0.00000000000 0 6704000 5104476 5082758 13 13 1609350.00000000000 Krung Thep Bangkok 1 0 3.0
191 1 300 5 Admin-0 capital Lima 0 Lima 1.00000000000 0.00000000000 1 Peru PER Peru PER Lima PE -12.04801267610 -77.05006209480 5.00000000000 0 Changed scale rank. 8012000 6758234 6068380 13 13 3936456.00000000000 Lima Lima2 1 0 3.0
192 1 300 8 Admin-0 capital Dakar 0 Dakar 1.00000000000 0.00000000000 1 Senegal SEN Senegal SEN Dakar SN 14.71583172500 -17.47313012840 5.00000000000 0 Changed scale rank. 2604000 2476400 2470140 12 12 2253354.00000000000 Dakar Dakar 1 0 3.0
193 1 300 3 Admin-0 capital Johannesburg 0 Johannesburg 0.00000000000 1.00000000000 1 South Africa ZAF South Africa ZAF Gauteng ZA -26.17004474000 28.03000972360 4.00000000000 0 Changed feature class. 3435000 2026469 3852246 12 12 993800.00000000000 Johannesburg Johannesburg 1 0 3.0
194 1 300 8 Admin-0 capital Amsterdam 0 Amsterdam 1.00000000000 De facto capita 1.00000000000 1 Kingdom of the Netherlands NLD Netherlands NLD Noord-Holland NL 52.34996868810 4.91664017601 0.00000000000 0 1031000 741636 962488 12 11 2759794.00000000000 Amsterdam Amsterdam 1 0 3.7
195 1 300 5 Admin-1 capital Casablanca Dar-el-Beida 0 Casablanca 0.00000000000 1.00000000000 1 Morocco MAR Morocco MAR Grand Casablanca MA 33.59997621560 -7.61636743309 4.00000000000 0 Changed scale rank. 3181000 3144909 3718797 12 12 2553604.00000000000 Dar-el-Beida Casablanca 1 0 3.7
196 1 300 3 Admin-0 capital Seoul 0 Seoul 1.00000000000 1.00000000000 1 Korea, South KOR South Korea KOR Seoul KR 37.56634909980 126.99973099700 0.00000000000 0 9796000 9796000 12018058 13 13 1835848.00000000000 Seoul Seoul 1 0 3.0
197 1 300 5 Admin-0 capital Manila 0 Manila 1.00000000000 Official, de fa 1.00000000000 1 Philippines PHL Philippines PHL Metropolitan Manila PH 14.60415895480 120.98221716200 0.00000000000 0 11100000 3077575 2381280 14 12 1701668.00000000000 Manila Manila 1 0 2.7
198 1 300 2 Admin-1 capital Monterrey 0 Monterrey 0.00000000000 0.00000000000 1 Mexico MEX Mexico MEX Nuevo León MX 25.66999513650 -100.32998478400 5.00000000000 0 Changed scale rank. 3712000 1122874 3225636 12 12 3995465.00000000000 Monterrey Monterrey 1 0 3.7
199 1 300 3 Admin-0 capital Berlin 0 Berlin 1.00000000000 1.00000000000 1 Germany DEU Germany DEU Berlin DE 52.52181866360 13.40154862330 0.00000000000 0 3406000 3094014 3013258 12 12 2950159.00000000000 Berlin Berlin 1 0 2.7
200 1 300 1 Admin-1 capital Ürümqi rumqi|Wulumqi 0 Urumqi 0.00000000000 0.00000000000 1 China CHN China CHN Xinjiang Uygur CN 43.80501222640 87.57500565490 5.00000000000 0 Changed scale rank. 2151000 1508225 2044401 12 12 1529102.00000000000 Cramqi (Wulumqi) Urumqi 1 0 3.7
201 1 300 1 Admin-1 capital Chengdu 0 Chengdu 0.00000000000 0.00000000000 1 China CHN China CHN Sichuan CN 30.67000001930 104.07001949000 5.00000000000 0 Changed scale rank. 4123000 3950437 11622929 12 12 1815286.00000000000 Chengdu Chengdu 1 0 3.0
202 1 300 2 Admin-1 region capital Ōsaka Osaka-Kobe 0 Osaka 0.00000000000 1.00000000000 1 Japan JPN Japan JPN Osaka JP 34.75003521630 135.46014481500 4.00000000000 0 Changed feature to Admin-0 region capital. 11294000 2592413 9630783 14 12 1853909.00000000000 Osaka-Kobe Osaka 1 5 3.0
203 1 300 3 Admin-0 capital Kinshasa 0 Kinshasa 1.00000000000 0.00000000000 1 Congo (Kinshasa) COD Congo (Kinshasa) COD Kinshasa City CD -4.32972410189 15.31497188180 5.00000000000 0 Changed scale rank. 7843000 5565703 4738154 13 13 2314302.00000000000 Kinshasa Kinshasa 1 0 3.0
204 1 300 1 Admin-0 capital New Delhi 0 New Delhi 1.00000000000 1.00000000000 0 India IND India IND Delhi IN 28.60002300920 77.19998002010 0.00000000000 0 317797 317797 8060107 10 10 1261481.00000000000 New Delhi 1 0 2.1
205 1 300 1 Admin-1 capital Bangalore Bengaluru 0 Bangalore 0.00000000000 0.00000000000 1 India IND India IND Karnataka IN 12.96999513650 77.56000972380 3.00000000000 1 Name changed. Changed scale rank. 6787000 5104047 8102712 13 13 1277333.00000000000 Bangalore Bangalore 1 0 3.7
206 1 300 6 Admin-0 capital Athens Athenai Athinai 0 Athens 1.00000000000 1.00000000000 1 Greece GRC Greece GRC Attiki GR 37.98332623190 23.73332108430 4.00000000000 0 Changed scale rank. 3242000 729137 112572 12 11 264371.00000000000 Athnnai Athens2 1 0 3.7
207 1 300 5 Admin-0 capital Baghdad 0 Baghdad 1.00000000000 0.00000000000 1 Iraq IRQ Iraq IRQ Baghdad IQ 33.33864849750 44.39386877320 5.00000000000 0 Changed scale rank. 5054000 5054000 4959534 13 13 98182.00000000000 Baghdad Baghdad 1 0 3.7
208 1 300 3 Admin-0 capital Addis Ababa 0 Addis Ababa 1.00000000000 0.00000000000 1 Ethiopia ETH Ethiopia ETH Addis Ababa ET 9.03331036268 38.70000443400 5.00000000000 0 Changed scale rank. 3100000 2757729 3013653 12 12 344979.00000000000 Addis Ababa Addis Ababa 1 5 3.0
209 1 300 5 Admin-0 capital Tehran 0 Tehran 1.00000000000 0.00000000000 1 Iran IRN Iran IRN Tehran IR 35.67194276840 51.42434403360 5.00000000000 0 Changed scale rank. 7873000 7153309 8209012 13 13 112931.00000000000 Tehran Tehran 1 0 3.0
210 1 300 2 Populated place Vancouver 0 Vancouver 0.00000000000 0.00000000000 1 Canada CAN Canada CAN British Columbia CA 49.27341658410 -123.12164421800 5.00000000000 0 Changed scale rank. 2313328 603502 482002 12 11 6173331.00000000000 Vancouver Vancouver2 1 0 2.1
211 1 300 2 Admin-1 capital Toronto 0 Toronto 0.00000000000 1.00000000000 1 Canada CAN Canada CAN Ontario CA 43.69997987780 -79.42002079440 0.00000000000 0 5213000 3934421 3749229 13 12 6167865.00000000000 Toronto Toronto 1 0 2.1
212 1 300 3 Admin-0 capital Buenos Aires 0 Buenos Aires 1.00000000000 1.00000000000 1 Argentina ARG Argentina ARG Ciudad de Buenos Aires AR -34.60250160850 -58.39753137370 0.00000000000 0 12795000 10929146 10271457 14 14 3435910.00000000000 Buenos Aires Buenos Aires 1 0 2.1
213 1 300 5 Admin-0 capital Kabul 0 Kabul 1.00000000000 0.00000000000 1 Afghanistan AFG Afghanistan AFG Kabul AF 34.51669028630 69.18326004930 5.00000000000 0 Changed scale rank. 3277000 3043532 3475519 12 12 1138958.00000000000 Kabul Kabul 1 0 3.7
214 1 300 7 Admin-0 capital Vienna Wien 0 Vienna 1.00000000000 1.00000000000 1 Austria AUT Austria AUT Wien AT 48.20001527820 16.36663895540 0.00000000000 0 2400000 1731000 1480886 12 12 2761369.00000000000 Wien Vienna 1 0 3.7
215 1 300 3 Admin-1 capital Melbourne 0 Melbourne 0.00000000000 1.00000000000 1 Australia AUS Australia AUS Victoria AU -37.82003131230 144.97501623500 4.00000000000 0 Changed feature class. Changed scale rank. 4170000 93625 1805353 12 8 2158177.00000000000 Melbourne Melbourne2 1 0 3.0
216 1 300 8 Admin-0 capital Taipei 0 Taipei 1.00000000000 1.00000000000 1 Taiwan TWN Taiwan TWN Taipei City TW 25.03583333333 121.56833333333 1.00000000000 0 Corrected coordinates. 6900273 2618772 5698241 13 12 1668341.00000000000 Taipei Taipei 1 0 3.7
217 1 300 8 Admin-1 capital Auckland 0 Auckland 0.00000000000 1.00000000000 1 New Zealand NZL New Zealand NZL Auckland NZ Auckland metropolitan area -36.84805489493 174.76302698708 4.00000000000 0 Changed scale rank. 1377200 395982 0 12 10 2193733.00000000000 Auckland Auckland 1 0 3.0
218 0 600 1 Populated place Los Angeles Los Angeles-Long Beach-Santa Ana 0 Los Angeles 0.00000000000 1.00000000000 1 United States USA United States of America USA California US 33.98997825020 -118.17998051100 0.00000000000 0 12500000 3694820 142265 14 12 5368361.00000000000 Los Angeles-Long Beach-Santa Ana Los Angeles1 1 0 2.0
219 0 600 1 Admin-0 capital Washington, D.C. Washington D.C. 0 Washington, D.C. 1.00000000000 1.00000000000 1 United States USA United States of America USA District of Columbia US 38.89954937650 -77.00941858080 0.00000000000 0 4338000 552433 2175991 12 11 4140963.00000000000 Washington, D.C. Washington, D.C. 1 5 2.1
220 0 600 1 Populated place New York New York-Newark 0 New York 0.00000000000 UN Headquarters 1.00000000000 1 United States USA United States of America USA New York US 40.74997906400 -73.98001692880 0.00000000000 0 19040000 8008278 9292603 14 13 5128581.00000000000 New York-Newark New York 1 0 1.7
221 0 600 5 Admin-0 capital London 0 London 1.00000000000 1.00000000000 1 United Kingdom GBR United Kingdom GBR Westminster GB 51.49999472970 -0.11672184386 0.00000000000 0 8567000 7421209 326670 13 13 2643743.00000000000 London London2 1 5 1.7
222 0 600 5 Admin-1 capital Istanbul 0 Istanbul 0.00000000000 1.00000000000 1 Turkey TUR Turkey TUR Istanbul TR 41.10499615380 29.01000158560 0.00000000000 0 10061000 9945610 9651488 14 13 745044.00000000000 Istanbul Istanbul 1 0 3.0
223 0 600 5 Admin-0 capital Riyadh Ar-Riyadh 0 Riyadh 1.00000000000 1.00000000000 1 Saudi Arabia SAU Saudi Arabia SAU Ar Riyad SA 24.64083314920 46.77274165730 4.00000000000 0 Changed scale rank. 4465000 4205961 5148778 12 12 108410.00000000000 Ar-Riyadh Riyadh 1 0 3.7
224 0 600 3 Admin-0 capital Cape Town 0 Cape Town 1.00000000000 1 Legislative cap 1.00000000000 1 South Africa ZAF South Africa ZAF Western Cape ZA -33.92001096720 18.43498815780 4.00000000000 0 Changed scale rank. 3215000 2432858 2401318 12 12 3369157.00000000000 Cape Town Cape Town 1 0 1.7
225 0 600 2 Admin-0 capital Moscow Moskva 0 Moscow 1.00000000000 1.00000000000 1 Russia RUS Russia RUS Moskva RU 55.75216412260 37.61552282590 0.00000000000 0 10452000 10452000 10585385 14 14 524901.00000000000 Moskva Moscow 1 0 1.7
226 0 600 2 Admin-0 capital Mexico City Ciudad de M 0 Mexico City 1.00000000000 1.00000000000 1 Mexico MEX Mexico MEX Distrito Federal MX 19.44244244280 -99.13098820170 0.00000000000 0 19028000 10811002 10018444 14 14 3530597.00000000000 Ciudad de Mdxico Mexico City 1 0 2.1
227 0 600 2 Admin-0 capital alt Lagos 0 Lagos 0.00000000000 1 Former capital 1.00000000000 1 Nigeria NGA Nigeria NGA Lagos NG 6.44326165348 3.39153107121 4.00000000000 0 Location adjusted. Changed scale rank. 9466000 1536 6567892 13 3 2332459.00000000000 Lagos Lagos 1 0 2.0
228 0 600 3 Admin-0 capital Rome 0 Rome 1.00000000000 1.00000000000 1 Italy ITA Italy ITA Lazio IT 41.89595562650 12.48325842150 0.00000000000 0 3339000 35452 2050212 12 7 3169070.00000000000 Rome Rome 1 0 2.7
229 0 600 1 Admin-0 capital Beijing 0 Beijing 1.00000000000 1.00000000000 1 China CHN China CHN Beijing CN 39.92889223130 116.38828568400 0.00000000000 0 11106000 7480601 9033231 14 13 1816670.00000000000 Beijing Beijing 1 0 1.7
230 0 600 5 Admin-0 capital Nairobi 0 Nairobi 1.00000000000 1.00000000000 1 Kenya KEN Kenya KEN Nairobi KE -1.28334674185 36.81665685910 4.00000000000 0 Changed scale rank. 3010000 2750547 3400962 12 12 184745.00000000000 Nairobi Nairobi 1 0 2.0
231 0 600 1 Admin-0 capital Jakarta 0 Jakarta 1.00000000000 1.00000000000 1 Indonesia IDN Indonesia IDN Jakarta Raya ID -6.17441770541 106.82943762100 0.00000000000 0 9125000 8540121 9129613 13 13 1642911.00000000000 Jakarta Jakarta 1 0 2.1
232 0 600 5 Admin-0 capital Bogota Bogota 0 Bogota 1.00000000000 1.00000000000 1 Colombia COL Colombia COL Bogota CO 4.59642356253 -74.08334395520 0.00000000000 0 7772000 6333661 5754084 13 13 3688689.00000000000 Bogota Bogota 1 0 2.1
233 0 600 3 Admin-0 capital Cairo Al-Qahirah 0 Cairo 1.00000000000 1.00000000000 1 Egypt EGY Egypt EGY Al Qahirah EG 30.04996034650 31.24996821970 0.00000000000 0 11893000 7734614 13720557 14 13 360630.00000000000 Al-Qahirah Cairo 1 5 1.7
234 0 600 1 Admin-1 capital Shanghai 0 Shanghai 0.00000000000 1.00000000000 1 China CHN China CHN Shanghai CN 31.21645245260 121.43650467800 0.00000000000 0 14987000 14608512 16803572 14 14 1796236.00000000000 Shanghai Shanghai 1 0 2.0
235 0 600 2 Admin-0 capital Tokyo 0 Tokyo 1.00000000000 De facto capita 1.00000000000 1 Japan JPN Japan JPN Tokyo JP 35.68501690580 139.75140742900 0.00000000000 0 35676000 8336599 12945252 14 13 1850147.00000000000 Tokyo Tokyo 1 0 1.7
236 0 600 1 Admin-1 capital Mumbai Bombay 0 Mumbai 0.00000000000 1.00000000000 1 India IND India IND Maharashtra IN 19.01699037570 72.85698929740 0.00000000000 0 18978000 12691836 12426085 14 14 1275339.00000000000 Mumbai Mumbai 1 0 1.7
237 0 600 3 Admin-0 capital Paris 0 Paris 1.00000000000 1.00000000000 1 French Republic FRA France FRA Île-de-France FR 48.86669293120 2.33333532574 0.00000000000 0 9904000 11177 7142744 13 6 2988507.00000000000 Paris Paris 1 0 1.7
238 0 600 3 Admin-0 capital Santiago 0 Santiago 1.00000000000 Official, admin 1.00000000000 1 Chile CHL Chile CHL Región Metropolitana de Santiago CL -33.45001381550 -70.66704085460 4.00000000000 0 Changed scale rank. 5720000 46611 3066651 13 7 3449741.00000000000 Santiago Santiago3 1 0 2.0
239 0 600 1 Admin-1 capital Kolkata Calcutta 0 Kolkata 0.00000000000 0.00000000000 1 India IND India IND West Bengal IN 22.49496929830 88.32467565810 4.00000000000 1 Name changed. Changed scale rank. 14787000 4631392 7783716 14 12 1275004.00000000000 Kolkata Calcutta 1 0 3.7
240 0 600 1 Admin-1 capital Rio de Janeiro 0 Rio de Janeiro 0.00000000000 1.00000000000 1 Brazil BRA Brazil BRA Rio de Janeiro BR -22.92502317420 -43.22502079420 0.00000000000 0 11748000 2010175 1821489 14 12 3451190.00000000000 Rio de Janeiro Rio de Janeiro 1 0 1.7
241 0 600 1 Admin-1 capital São Paulo Sao Paulo|Sio Paulo 0 Sao Paulo 0.00000000000 1.00000000000 1 Brazil BRA Brazil BRA São Paulo BR -23.55867958700 -46.62501998040 0.00000000000 0 18845000 10021295 11522944 14 14 3448439.00000000000 S Sao Paolo 1 0 3.0
242 0 600 3 Admin-1 capital Sydney 0 Sydney 0.00000000000 1.00000000000 1 Australia AUS Australia AUS New South Wales AU -33.92001096720 151.18517980900 4.00000000000 0 Changed feature class. 4630000 3641422 2669348 12 12 2147714.00000000000 Sydney Sydney1 1 0 1.7
243 0 600 0 Admin-0 capital Singapore 0 Singapore 1.00000000000 1.00000000000 1 Singapore SGP Singapore SGP SG 1.29303346649 103.85582067800 0.00000000000 0 5183700 3289529 3314179 13 12 1880252.00000000000 Singapore Singapore 1 5 2.1
244 0 600 0 Admin-0 region capital Hong Kong 0 Hong Kong 0.00000000000 1.00000000000 1 China CHN Hong Kong S.A.R. HKG HK 22.30498089500 114.18500931700 0.00000000000 0 7206000 4551579 4549026 13 12 1819729.00000000000 Hong Kong Hong Kong 1 0 3.0

502
tests/csv/out.mbtiles.json Normal file

File diff suppressed because one or more lines are too long

View File

@ -1,3 +1,7 @@
{ "type": "LineString", "coordinates": [ [ 2.460937, 46.073230 ], [ 43.242187, 59.9 ] ] }
{ "something": [ { "type": "LineString", "coordinates": [ [ -1.40625, 28.921631 ], [ 26.71875, 17.978733 ], [ 22.148437, -23.563987 ] ] } ] }
{ "something": { "type": "LineString", "coordinates": [ [ 1, 2 ], [ 3, 4 ] ] } }
[ { "type": "LineString", "coordinates": [ [ 5, 6 ], [ 7, 8 ] ] } ]

View File

@ -3,7 +3,7 @@
"center": "22.500000,20.489949,3",
"description": "tests/geometry/out/-z3.json.check.mbtiles",
"format": "pbf",
"json": "{\"vector_layers\": [ { \"id\": \"bare\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 3, \"fields\": {} }, { \"id\": \"geometrycollection\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 3, \"fields\": {\"collection\": \"Boolean\"} }, { \"id\": \"multipoint\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 3, \"fields\": {\"point\": \"String\"} }, { \"id\": \"onebare\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 3, \"fields\": {} } ],\"tilestats\": {\"layerCount\": 4,\"layers\": [{\"layer\": \"bare\",\"count\": 2,\"geometry\": \"LineString\",\"attributeCount\": 0,\"attributes\": []},{\"layer\": \"geometrycollection\",\"count\": 2,\"geometry\": \"Point\",\"attributeCount\": 1,\"attributes\": [{\"attribute\": \"collection\",\"count\": 1,\"type\": \"boolean\",\"values\": [true]}]},{\"layer\": \"multipoint\",\"count\": 1,\"geometry\": \"Point\",\"attributeCount\": 1,\"attributes\": [{\"attribute\": \"point\",\"count\": 1,\"type\": \"string\",\"values\": [\"multi\"]}]},{\"layer\": \"onebare\",\"count\": 1,\"geometry\": \"LineString\",\"attributeCount\": 0,\"attributes\": []}]}}",
"json": "{\"vector_layers\": [ { \"id\": \"bare\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 3, \"fields\": {} }, { \"id\": \"geometrycollection\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 3, \"fields\": {\"collection\": \"Boolean\"} }, { \"id\": \"multipoint\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 3, \"fields\": {\"point\": \"String\"} }, { \"id\": \"onebare\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 3, \"fields\": {} } ],\"tilestats\": {\"layerCount\": 4,\"layers\": [{\"layer\": \"bare\",\"count\": 4,\"geometry\": \"LineString\",\"attributeCount\": 0,\"attributes\": []},{\"layer\": \"geometrycollection\",\"count\": 2,\"geometry\": \"Point\",\"attributeCount\": 1,\"attributes\": [{\"attribute\": \"collection\",\"count\": 1,\"type\": \"boolean\",\"values\": [true]}]},{\"layer\": \"multipoint\",\"count\": 1,\"geometry\": \"Point\",\"attributeCount\": 1,\"attributes\": [{\"attribute\": \"point\",\"count\": 1,\"type\": \"string\",\"values\": [\"multi\"]}]},{\"layer\": \"onebare\",\"count\": 1,\"geometry\": \"LineString\",\"attributeCount\": 0,\"attributes\": []}]}}",
"maxzoom": "3",
"minzoom": "0",
"name": "tests/geometry/out/-z3.json.check.mbtiles",
@ -14,6 +14,10 @@
{ "type": "FeatureCollection", "properties": { "layer": "bare", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 2.373047, 46.073231 ], [ 43.154297, 59.933000 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.966797, 2.021065 ], [ 2.988281, 4.039618 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 4.921875, 6.053161 ], [ 6.943359, 8.059230 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -1.406250, 28.921631 ], [ 26.718750, 17.978733 ], [ 22.060547, -23.483401 ] ] } }
] }
,
@ -31,6 +35,10 @@
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 1, "x": 0, "y": 1 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "bare", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.966797, 2.021065 ], [ 2.504883, 3.513421 ] ] } }
] }
,
{ "type": "FeatureCollection", "properties": { "layer": "multipoint", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "point": "multi" }, "geometry": { "type": "Point", "coordinates": [ -60.468750, -6.970049 ] } }
] }
@ -40,6 +48,8 @@
{ "type": "FeatureCollection", "properties": { "layer": "bare", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 2.416992, 46.073231 ], [ 3.515625, 46.498392 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.966797, 2.021065 ], [ 2.988281, 4.039618 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -1.406250, 28.921631 ], [ 0.000000, 28.420391 ], [ 3.515625, 27.098254 ] ] } }
] }
,
@ -54,6 +64,8 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 1, "x": 1, "y": 1 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "bare", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.966797, 2.021065 ], [ 2.504883, 3.513421 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 25.092773, 3.513421 ], [ 24.741211, 0.000000 ], [ 22.104492, -23.523700 ] ] } }
] }
,
@ -72,6 +84,10 @@
{ "type": "FeatureCollection", "properties": { "layer": "bare", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 2.416992, 46.073231 ], [ 43.198242, 59.910976 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.966797, 2.021065 ], [ 2.988281, 4.039618 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 4.965820, 6.009459 ], [ 6.987305, 8.015716 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -1.406250, 28.921631 ], [ 0.000000, 28.420391 ], [ 26.718750, 17.978733 ], [ 24.741211, 0.000000 ], [ 24.345703, -3.513421 ] ] } }
] }
,
@ -100,6 +116,8 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 2, "x": 1, "y": 1 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "bare", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.988770, 2.021065 ], [ 1.757812, 2.767478 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -1.406250, 28.921631 ], [ 0.000000, 28.401065 ], [ 1.757812, 27.741885 ] ] } }
] }
,
@ -122,6 +140,10 @@
{ "type": "FeatureCollection", "properties": { "layer": "bare", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 2.438965, 46.073231 ], [ 43.220215, 59.910976 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.988770, 2.021065 ], [ 2.988281, 4.017699 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 4.987793, 6.009459 ], [ 6.987305, 8.015716 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -1.406250, 28.921631 ], [ 0.000000, 28.401065 ], [ 26.718750, 17.978733 ], [ 24.741211, 0.000000 ], [ 24.543457, -1.757537 ] ] } }
] }
,
@ -182,6 +204,10 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 3, "x": 4, "y": 3 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "bare", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 0.999756, 2.010086 ], [ 2.999268, 4.006740 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ 4.998779, 6.009459 ], [ 6.998291, 8.004837 ] ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -0.878906, 28.729130 ], [ 0.000000, 28.401065 ], [ 26.718750, 17.978733 ], [ 24.741211, 0.000000 ], [ 24.642334, -0.878872 ] ] } }
] }
] }

1000
tests/loop/in.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,18 @@
{ "type": "FeatureCollection", "properties": {
"bounds": "1.000000,1.000000,1.000000,1.000000",
"center": "1.000000,1.000000,0",
"description": "tests/loop/out/-z0_-O200_--cluster-densest-as-needed.json.check.mbtiles",
"format": "pbf",
"json": "{\"vector_layers\": [ { \"id\": \"in\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 0, \"fields\": {\"clustered\": \"Boolean\", \"point_count\": \"Number\"} } ],\"tilestats\": {\"layerCount\": 1,\"layers\": [{\"layer\": \"in\",\"count\": 1000,\"geometry\": \"Point\",\"attributeCount\": 2,\"attributes\": [{\"attribute\": \"clustered\",\"count\": 1,\"type\": \"boolean\",\"values\": [true]},{\"attribute\": \"point_count\",\"count\": 1,\"type\": \"number\",\"values\": [1000],\"min\": 1000,\"max\": 1000}]}]}}",
"maxzoom": "0",
"minzoom": "0",
"name": "tests/loop/out/-z0_-O200_--cluster-densest-as-needed.json.check.mbtiles",
"type": "overlay",
"version": "2"
}, "features": [
{ "type": "FeatureCollection", "properties": { "zoom": 0, "x": 0, "y": 0 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "clustered": true, "point_count": 1000 }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
] }
] }
] }

View File

@ -0,0 +1,18 @@
{ "type": "FeatureCollection", "properties": {
"bounds": "1.000000,1.000000,1.000000,1.000000",
"center": "1.000000,1.000000,0",
"description": "tests/loop/out/-z0_-O200_--drop-densest-as-needed.json.check.mbtiles",
"format": "pbf",
"json": "{\"vector_layers\": [ { \"id\": \"in\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 0, \"fields\": {} } ],\"tilestats\": {\"layerCount\": 1,\"layers\": [{\"layer\": \"in\",\"count\": 1000,\"geometry\": \"Point\",\"attributeCount\": 0,\"attributes\": []}]}}",
"maxzoom": "0",
"minzoom": "0",
"name": "tests/loop/out/-z0_-O200_--drop-densest-as-needed.json.check.mbtiles",
"type": "overlay",
"version": "2"
}, "features": [
{ "type": "FeatureCollection", "properties": { "zoom": 0, "x": 0, "y": 0 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
] }
] }
] }

View File

@ -0,0 +1,394 @@
{ "type": "FeatureCollection", "properties": {
"bounds": "1.000000,1.000000,1.000000,1.000000",
"center": "1.000000,1.000000,0",
"description": "tests/loop/out/-z0_-O200_--drop-fraction-as-needed.json.check.mbtiles",
"format": "pbf",
"json": "{\"vector_layers\": [ { \"id\": \"in\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 0, \"fields\": {} } ],\"tilestats\": {\"layerCount\": 1,\"layers\": [{\"layer\": \"in\",\"count\": 1000,\"geometry\": \"Point\",\"attributeCount\": 0,\"attributes\": []}]}}",
"maxzoom": "0",
"minzoom": "0",
"name": "tests/loop/out/-z0_-O200_--drop-fraction-as-needed.json.check.mbtiles",
"type": "overlay",
"version": "2"
}, "features": [
{ "type": "FeatureCollection", "properties": { "zoom": 0, "x": 0, "y": 0 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
,
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 1.054628 ] } }
] }
] }
] }

View File

@ -1,9 +1,9 @@
[
{ "zoom": 11, "x": 326, "y": 791, "bytes": 372, "compressed": true, "layers": { "muni": { "points": 14, "lines": 0, "polygons": 0, "extent": 4096 } } }
,
{ "zoom": 11, "x": 327, "y": 792, "bytes": 6481, "compressed": true, "layers": { "muni": { "points": 528, "lines": 0, "polygons": 0, "extent": 4096 } } }
{ "zoom": 11, "x": 327, "y": 792, "bytes": 6428, "compressed": true, "layers": { "muni": { "points": 528, "lines": 0, "polygons": 0, "extent": 4096 } } }
,
{ "zoom": 11, "x": 327, "y": 791, "bytes": 44376, "compressed": true, "layers": { "muni": { "points": 4285, "lines": 0, "polygons": 0, "extent": 4096 }, "subway": { "points": 19, "lines": 0, "polygons": 0, "extent": 4096 } } }
{ "zoom": 11, "x": 327, "y": 791, "bytes": 43423, "compressed": true, "layers": { "muni": { "points": 4285, "lines": 0, "polygons": 0, "extent": 4096 }, "subway": { "points": 19, "lines": 0, "polygons": 0, "extent": 4096 } } }
,
{ "zoom": 11, "x": 954, "y": 791, "bytes": 75, "compressed": true, "layers": { "muni": { "points": 12, "lines": 0, "polygons": 0, "extent": 4096 } } }
]

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -850,6 +850,8 @@
,
{ "type": "Feature", "properties": { "name": "Sunset Blvd & Quintara St" }, "geometry": { "type": "Point", "coordinates": [ -122.494919, 37.747592 ] } }
,
{ "type": "Feature", "properties": { "name": "Sunset Blvd & Rivera St" }, "geometry": { "type": "Point", "coordinates": [ -122.494812, 37.746082 ] } }
,
{ "type": "Feature", "properties": { "name": "Quintara St & 33rd Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.490971, 37.748051 ] } }
,
{ "type": "Feature", "properties": { "name": "30th Ave & Quintara St" }, "geometry": { "type": "Point", "coordinates": [ -122.487817, 37.748000 ] } }
@ -1044,7 +1046,7 @@
,
{ "type": "Feature", "properties": { "name": "Duboce Ave & Noe St" }, "geometry": { "type": "Point", "coordinates": [ -122.433658, 37.769222 ] } }
,
{ "type": "Feature", "properties": { "name": "Castro St & 16th St" }, "geometry": { "type": "Point", "coordinates": [ -122.435460, 37.764286 ] } }
{ "type": "Feature", "properties": { "name": "Castro St & 15th St" }, "geometry": { "type": "Point", "coordinates": [ -122.435589, 37.765847 ] } }
,
{ "type": "Feature", "properties": { "name": "Market St & 16th St" }, "geometry": { "type": "Point", "coordinates": [ -122.433679, 37.763913 ] } }
,
@ -1646,7 +1648,7 @@
,
{ "type": "Feature", "properties": { "name": "24th St & South Van Ness Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.416170, 37.752462 ] } }
,
{ "type": "Feature", "properties": { "name": "Valencia St & Duncan St" }, "geometry": { "type": "Point", "coordinates": [ -122.420247, 37.746744 ] } }
{ "type": "Feature", "properties": { "name": "Cesar Chavez St & Mission St" }, "geometry": { "type": "Point", "coordinates": [ -122.418101, 37.748101 ] } }
,
{ "type": "Feature", "properties": { "name": "Folsom St & 24th St" }, "geometry": { "type": "Point", "coordinates": [ -122.414217, 37.752598 ] } }
,
@ -2216,6 +2218,8 @@
,
{ "type": "Feature", "properties": { "name": "30th Ave & Santiago St" }, "geometry": { "type": "Point", "coordinates": [ -122.487656, 37.744513 ] } }
,
{ "type": "Feature", "properties": { "name": "Taraval St & 30th Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.487345, 37.742596 ] } }
,
{ "type": "Feature", "properties": { "name": "Taraval St & 30th Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.487624, 37.742468 ] } }
,
{ "type": "Feature", "properties": { "name": "Ulloa St & 30th Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.487227, 37.740721 ] } }
@ -2974,7 +2978,7 @@
,
{ "type": "Feature", "properties": { "name": "Ulloa St & Lenox Way" }, "geometry": { "type": "Point", "coordinates": [ -122.466263, 37.741179 ] } }
,
{ "type": "Feature", "properties": { "name": "West Portal Ave & Ulloa St" }, "geometry": { "type": "Point", "coordinates": [ -122.465855, 37.740899 ] } }
{ "type": "Feature", "properties": { "name": "West Portal Station" }, "geometry": { "type": "Point", "coordinates": [ -122.465941, 37.740890 ] } }
,
{ "type": "Feature", "properties": { "name": "West Portal Ave & 14th Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.469063, 37.738107 ] } }
,
@ -4996,7 +5000,9 @@
,
{ "type": "Feature", "properties": { "name": "Geary Blvd & Taylor St" }, "geometry": { "type": "Point", "coordinates": [ -122.411685, 37.786988 ] } }
,
{ "type": "Feature", "properties": { "name": "O'Farrell St & Mason St" }, "geometry": { "type": "Point", "coordinates": [ -122.410655, 37.786046 ] } }
{ "type": "Feature", "properties": { "name": "Mason St & Geary Blvd" }, "geometry": { "type": "Point", "coordinates": [ -122.409968, 37.787217 ] } }
,
{ "type": "Feature", "properties": { "name": "Ellis St & Taylor St" }, "geometry": { "type": "Point", "coordinates": [ -122.411460, 37.785097 ] } }
,
{ "type": "Feature", "properties": { "name": "Eddy St & Taylor St" }, "geometry": { "type": "Point", "coordinates": [ -122.410794, 37.784105 ] } }
,
@ -5796,6 +5802,8 @@
,
{ "type": "Feature", "properties": { "name": "Market St & Sansome St" }, "geometry": { "type": "Point", "coordinates": [ -122.400420, 37.790159 ] } }
,
{ "type": "Feature", "properties": { "name": "2nd St & Stevenson St" }, "geometry": { "type": "Point", "coordinates": [ -122.400076, 37.788285 ] } }
,
{ "type": "Feature", "properties": { "name": "Broadway & Davis St" }, "geometry": { "type": "Point", "coordinates": [ -122.398585, 37.798976 ] } }
,
{ "type": "Feature", "properties": { "name": "THE EMBARCADERO & BROADWAY" }, "geometry": { "type": "Point", "coordinates": [ -122.397437, 37.798908 ] } }

File diff suppressed because it is too large Load Diff

7688
tests/muni/out/-r1_-K20.json Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -70,6 +70,8 @@
,
{ "type": "Feature", "properties": { "scalerank": 1, "featurecla": "Admin-0 country", "labelrank": 3, "sovereignt": "Kazakhstan", "sov_a3": "KAZ", "adm0_dif": 0, "level": 2, "type": "Sovereign country", "admin": "Kazakhstan", "adm0_a3": "KAZ", "geou_dif": 0, "geounit": "Kazakhstan", "gu_a3": "KAZ", "su_dif": 0, "subunit": "Kazakhstan", "su_a3": "KAZ", "brk_diff": 0, "name": "Kazakhstan", "name_long": "Kazakhstan", "brk_a3": "KAZ", "brk_name": "Kazakhstan", "abbrev": "Kaz.", "postal": "KZ", "formal_en": "Republic of Kazakhstan", "name_sort": "Kazakhstan", "mapcolor7": 6, "mapcolor8": 1, "mapcolor9": 6, "mapcolor13": 1, "pop_est": 15399437, "gdp_md_est": 175800, "pop_year": -99, "lastcensus": 2009, "gdp_year": -99, "economy": "6. Developing region", "income_grp": "3. Upper middle income", "wikipedia": -99, "iso_a2": "KZ", "iso_a3": "KAZ", "iso_n3": "398", "un_a3": "398", "wb_a2": "KZ", "wb_a3": "KAZ", "woe_id": -99, "adm0_a3_is": "KAZ", "adm0_a3_us": "KAZ", "adm0_a3_un": -99, "adm0_a3_wb": -99, "continent": "Asia", "region_un": "Asia", "subregion": "Central Asia", "region_wb": "Europe & Central Asia", "name_len": 10, "long_len": 10, "abbrev_len": 4, "tiny": -99, "homepart": 1 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 69.038086, 55.404070 ], [ 70.839844, 55.178868 ], [ 71.147461, 54.136696 ], [ 72.202148, 54.393352 ], [ 73.476562, 54.059388 ], [ 73.388672, 53.514185 ], [ 74.355469, 53.566414 ], [ 76.860352, 54.495568 ], [ 76.508789, 54.188155 ], [ 77.783203, 53.409532 ], [ 80.024414, 50.875311 ], [ 80.551758, 51.399206 ], [ 81.914062, 50.819818 ], [ 83.364258, 51.096623 ], [ 83.891602, 50.903033 ], [ 84.375000, 50.317408 ], [ 85.078125, 50.120578 ], [ 85.517578, 49.696062 ], [ 86.791992, 49.837982 ], [ 87.319336, 49.239121 ], [ 86.572266, 48.574790 ], [ 85.737305, 48.458352 ], [ 85.693359, 47.457809 ], [ 85.122070, 47.010226 ], [ 83.144531, 47.338823 ], [ 82.441406, 45.552525 ], [ 81.914062, 45.336702 ], [ 79.936523, 44.933696 ], [ 80.859375, 43.197167 ], [ 80.156250, 42.940339 ], [ 80.244141, 42.358544 ], [ 79.628906, 42.520700 ], [ 79.101562, 42.875964 ], [ 77.651367, 42.972502 ], [ 75.981445, 43.004647 ], [ 75.629883, 42.908160 ], [ 74.179688, 43.325178 ], [ 73.608398, 43.100983 ], [ 73.476562, 42.520700 ], [ 71.806641, 42.875964 ], [ 71.147461, 42.714732 ], [ 70.927734, 42.293564 ], [ 70.356445, 42.098222 ], [ 69.038086, 41.409776 ], [ 68.598633, 40.680638 ], [ 68.247070, 40.680638 ], [ 67.983398, 41.145570 ], [ 66.708984, 41.178654 ], [ 66.489258, 42.000325 ], [ 66.005859, 42.000325 ], [ 66.093750, 43.004647 ], [ 64.863281, 43.739352 ], [ 63.149414, 43.675818 ], [ 62.006836, 43.516689 ], [ 61.040039, 44.433780 ], [ 58.491211, 45.614037 ], [ 55.898438, 44.995883 ], [ 55.942383, 41.310824 ], [ 55.415039, 41.277806 ], [ 54.711914, 42.065607 ], [ 54.052734, 42.326062 ], [ 52.910156, 42.130821 ], [ 52.470703, 41.804078 ], [ 52.426758, 42.032974 ], [ 52.690430, 42.455888 ], [ 52.470703, 42.811522 ], [ 51.328125, 43.133061 ], [ 50.888672, 44.056012 ], [ 50.317383, 44.308127 ], [ 50.273438, 44.621754 ], [ 51.240234, 44.527843 ], [ 51.284180, 45.274886 ], [ 52.163086, 45.429299 ], [ 52.998047, 45.274886 ], [ 53.217773, 46.255847 ], [ 53.041992, 46.860191 ], [ 52.031250, 46.830134 ], [ 51.152344, 47.070122 ], [ 50.009766, 46.619261 ], [ 49.086914, 46.407564 ], [ 48.559570, 46.589069 ], [ 48.691406, 47.100045 ], [ 48.032227, 47.754098 ], [ 47.285156, 47.724545 ], [ 46.450195, 48.400032 ], [ 47.021484, 49.152970 ], [ 46.713867, 49.382373 ], [ 47.548828, 50.457504 ], [ 48.559570, 49.894634 ], [ 48.691406, 50.625073 ], [ 50.756836, 51.699800 ], [ 52.294922, 51.727028 ], [ 55.678711, 50.625073 ], [ 56.777344, 51.069017 ], [ 58.359375, 51.069017 ], [ 59.633789, 50.569283 ], [ 59.897461, 50.847573 ], [ 61.303711, 50.819818 ], [ 61.567383, 51.289406 ], [ 59.941406, 51.971346 ], [ 60.908203, 52.456009 ], [ 60.732422, 52.722986 ], [ 61.699219, 52.988337 ], [ 60.952148, 53.670680 ], [ 61.435547, 54.007769 ], [ 65.170898, 54.367759 ], [ 65.654297, 54.622978 ], [ 68.159180, 54.977614 ], [ 69.038086, 55.404070 ] ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 1, "featurecla": "Admin-0 country", "labelrank": 2, "sovereignt": "Iran", "sov_a3": "IRN", "adm0_dif": 0, "level": 2, "type": "Sovereign country", "admin": "Iran", "adm0_a3": "IRN", "geou_dif": 0, "geounit": "Iran", "gu_a3": "IRN", "su_dif": 0, "subunit": "Iran", "su_a3": "IRN", "brk_diff": 0, "name": "Iran", "name_long": "Iran", "brk_a3": "IRN", "brk_name": "Iran", "abbrev": "Iran", "postal": "IRN", "formal_en": "Islamic Republic of Iran", "name_sort": "Iran, Islamic Rep.", "mapcolor7": 4, "mapcolor8": 3, "mapcolor9": 4, "mapcolor13": 13, "pop_est": 66429284, "gdp_md_est": 841700, "pop_year": -99, "lastcensus": 2006, "gdp_year": -99, "economy": "5. Emerging region: G20", "income_grp": "3. Upper middle income", "wikipedia": -99, "iso_a2": "IR", "iso_a3": "IRN", "iso_n3": "364", "un_a3": "364", "wb_a2": "IR", "wb_a3": "IRN", "woe_id": -99, "adm0_a3_is": "IRN", "adm0_a3_us": "IRN", "adm0_a3_un": -99, "adm0_a3_wb": -99, "continent": "Asia", "region_un": "Asia", "subregion": "Southern Asia", "region_wb": "Middle East & North Africa", "name_len": 4, "long_len": 4, "abbrev_len": 4, "tiny": -99, "homepart": 1 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 44.780273, 39.740986 ], [ 44.912109, 39.368279 ], [ 45.439453, 38.891033 ], [ 46.142578, 38.754083 ], [ 46.494141, 38.788345 ], [ 47.680664, 39.537940 ], [ 48.032227, 39.605688 ], [ 48.339844, 39.300299 ], [ 47.988281, 38.822591 ], [ 48.603516, 38.272689 ], [ 48.867188, 38.341656 ], [ 49.174805, 37.614231 ], [ 50.141602, 37.405074 ], [ 50.800781, 36.879621 ], [ 52.250977, 36.703660 ], [ 53.789062, 36.985003 ], [ 53.920898, 37.230328 ], [ 54.799805, 37.405074 ], [ 55.502930, 37.996163 ], [ 56.162109, 37.961523 ], [ 56.601562, 38.134557 ], [ 57.304688, 38.030786 ], [ 58.403320, 37.544577 ], [ 59.194336, 37.439974 ], [ 60.336914, 36.562600 ], [ 61.083984, 36.491973 ], [ 61.171875, 35.675147 ], [ 60.512695, 33.687782 ], [ 60.952148, 33.541395 ], [ 60.512695, 32.990236 ], [ 60.820312, 32.212801 ], [ 60.908203, 31.578535 ], [ 61.699219, 31.391158 ], [ 61.743164, 30.751278 ], [ 60.864258, 29.840644 ], [ 61.347656, 29.305561 ], [ 61.743164, 28.729130 ], [ 62.709961, 28.265682 ], [ 62.753906, 27.410786 ], [ 63.193359, 27.254630 ], [ 63.281250, 26.784847 ], [ 61.831055, 26.273714 ], [ 61.479492, 25.085599 ], [ 58.491211, 25.641526 ], [ 57.392578, 25.760320 ], [ 56.953125, 26.980829 ], [ 56.469727, 27.176469 ], [ 55.722656, 26.980829 ], [ 54.711914, 26.509905 ], [ 53.481445, 26.824071 ], [ 52.470703, 27.605671 ], [ 51.503906, 27.877928 ], [ 50.844727, 28.844674 ], [ 50.097656, 30.183122 ], [ 49.570312, 29.993002 ], [ 48.911133, 30.334954 ], [ 48.559570, 29.954935 ], [ 47.988281, 30.486551 ], [ 47.988281, 31.015279 ], [ 47.680664, 31.015279 ], [ 47.812500, 31.728167 ], [ 47.329102, 32.472695 ], [ 46.098633, 33.027088 ], [ 45.395508, 33.979809 ], [ 45.615234, 34.777716 ], [ 46.142578, 35.101934 ], [ 46.054688, 35.710838 ], [ 45.395508, 35.995785 ], [ 44.736328, 37.195331 ], [ 44.208984, 37.996163 ], [ 44.384766, 38.307181 ], [ 44.077148, 39.436193 ], [ 44.780273, 39.740986 ] ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 1, "featurecla": "Admin-0 country", "labelrank": 2, "sovereignt": "Saudi Arabia", "sov_a3": "SAU", "adm0_dif": 0, "level": 2, "type": "Sovereign country", "admin": "Saudi Arabia", "adm0_a3": "SAU", "geou_dif": 0, "geounit": "Saudi Arabia", "gu_a3": "SAU", "su_dif": 0, "subunit": "Saudi Arabia", "su_a3": "SAU", "brk_diff": 0, "name": "Saudi Arabia", "name_long": "Saudi Arabia", "brk_a3": "SAU", "brk_name": "Saudi Arabia", "abbrev": "Saud.", "postal": "SA", "formal_en": "Kingdom of Saudi Arabia", "name_sort": "Saudi Arabia", "mapcolor7": 6, "mapcolor8": 1, "mapcolor9": 6, "mapcolor13": 7, "pop_est": 28686633, "gdp_md_est": 576500, "pop_year": -99, "lastcensus": 2010, "gdp_year": -99, "economy": "2. Developed region: nonG7", "income_grp": "2. High income: nonOECD", "wikipedia": -99, "iso_a2": "SA", "iso_a3": "SAU", "iso_n3": "682", "un_a3": "682", "wb_a2": "SA", "wb_a3": "SAU", "woe_id": -99, "adm0_a3_is": "SAU", "adm0_a3_us": "SAU", "adm0_a3_un": -99, "adm0_a3_wb": -99, "continent": "Asia", "region_un": "Asia", "subregion": "Western Asia", "region_wb": "Middle East & North Africa", "name_len": 12, "long_len": 12, "abbrev_len": 5, "tiny": -99, "homepart": 1 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 39.155273, 32.175612 ], [ 40.385742, 31.914868 ], [ 41.879883, 31.203405 ], [ 44.692383, 29.190533 ], [ 46.538086, 29.113775 ], [ 47.416992, 29.036961 ], [ 47.680664, 28.536275 ], [ 48.383789, 28.574874 ], [ 48.779297, 27.722436 ], [ 49.262695, 27.488781 ], [ 49.438477, 27.137368 ], [ 50.141602, 26.706360 ], [ 50.185547, 26.313113 ], [ 50.097656, 25.958045 ], [ 50.229492, 25.641526 ], [ 50.493164, 25.363882 ], [ 50.800781, 24.766785 ], [ 51.108398, 24.567108 ], [ 51.372070, 24.647017 ], [ 51.987305, 23.039298 ], [ 54.975586, 22.512557 ], [ 55.195312, 22.715390 ], [ 55.634766, 22.024546 ], [ 54.975586, 20.014645 ], [ 51.987305, 19.020577 ], [ 49.086914, 18.646245 ], [ 48.164062, 18.187607 ], [ 47.460938, 17.140790 ], [ 46.977539, 16.972741 ], [ 46.713867, 17.308688 ], [ 46.362305, 17.266728 ], [ 45.395508, 17.350638 ], [ 45.175781, 17.434511 ], [ 44.033203, 17.434511 ], [ 43.769531, 17.350638 ], [ 43.374023, 17.602139 ], [ 43.110352, 17.098792 ], [ 43.198242, 16.678293 ], [ 42.758789, 16.383391 ], [ 42.626953, 16.804541 ], [ 42.319336, 17.098792 ], [ 42.231445, 17.476432 ], [ 41.748047, 17.853290 ], [ 41.220703, 18.687879 ], [ 40.913086, 19.518375 ], [ 40.209961, 20.179724 ], [ 39.770508, 20.344627 ], [ 39.111328, 21.330315 ], [ 39.023438, 22.024546 ], [ 39.023438, 22.593726 ], [ 38.452148, 23.725012 ], [ 38.012695, 24.086589 ], [ 37.441406, 24.287027 ], [ 37.133789, 24.886436 ], [ 37.177734, 25.085599 ], [ 36.914062, 25.641526 ], [ 36.606445, 25.839449 ], [ 36.210938, 26.588527 ], [ 35.112305, 28.071980 ], [ 34.628906, 28.071980 ], [ 34.936523, 29.382175 ], [ 36.035156, 29.228890 ], [ 36.474609, 29.535230 ], [ 36.738281, 29.878755 ], [ 37.485352, 30.031055 ], [ 37.661133, 30.372875 ], [ 37.968750, 30.524413 ], [ 37.001953, 31.541090 ], [ 38.979492, 32.026706 ], [ 39.155273, 32.175612 ] ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 1, "featurecla": "Admin-0 country", "labelrank": 2, "sovereignt": "India", "sov_a3": "IND", "adm0_dif": 0, "level": 2, "type": "Sovereign country", "admin": "India", "adm0_a3": "IND", "geou_dif": 0, "geounit": "India", "gu_a3": "IND", "su_dif": 0, "subunit": "India", "su_a3": "IND", "brk_diff": 0, "name": "India", "name_long": "India", "brk_a3": "IND", "brk_name": "India", "abbrev": "India", "postal": "IND", "formal_en": "Republic of India", "name_sort": "India", "mapcolor7": 1, "mapcolor8": 3, "mapcolor9": 2, "mapcolor13": 2, "pop_est": 1166079220, "gdp_md_est": 3297000, "pop_year": -99, "lastcensus": 2011, "gdp_year": -99, "economy": "3. Emerging region: BRIC", "income_grp": "4. Lower middle income", "wikipedia": -99, "iso_a2": "IN", "iso_a3": "IND", "iso_n3": "356", "un_a3": "356", "wb_a2": "IN", "wb_a3": "IND", "woe_id": -99, "adm0_a3_is": "IND", "adm0_a3_us": "IND", "adm0_a3_un": -99, "adm0_a3_wb": -99, "continent": "Asia", "region_un": "Asia", "subregion": "Southern Asia", "region_wb": "South Asia", "name_len": 5, "long_len": 5, "abbrev_len": 5, "tiny": -99, "homepart": 1 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 77.827148, 35.496456 ], [ 78.881836, 34.343436 ], [ 78.793945, 33.541395 ], [ 79.189453, 33.027088 ], [ 79.145508, 32.509762 ], [ 78.442383, 32.620870 ], [ 78.706055, 31.541090 ], [ 79.716797, 30.902225 ], [ 81.079102, 30.221102 ], [ 80.463867, 29.764377 ], [ 80.068359, 28.806174 ], [ 81.035156, 28.420391 ], [ 81.958008, 27.955591 ], [ 83.276367, 27.371767 ], [ 84.638672, 27.254630 ], [ 85.209961, 26.745610 ], [ 87.187500, 26.431228 ], [ 88.022461, 26.431228 ], [ 88.154297, 26.824071 ], [ 88.022461, 27.449790 ], [ 88.110352, 27.877928 ], [ 88.725586, 28.110749 ], [ 88.813477, 27.137368 ], [ 89.736328, 26.745610 ], [ 90.351562, 26.902477 ], [ 91.186523, 26.824071 ], [ 92.021484, 26.863281 ], [ 92.065430, 27.488781 ], [ 91.669922, 27.800210 ], [ 92.460938, 27.916767 ], [ 93.383789, 28.652031 ], [ 94.526367, 29.305561 ], [ 95.361328, 29.036961 ], [ 96.108398, 29.458731 ], [ 96.547852, 28.844674 ], [ 96.240234, 28.420391 ], [ 97.294922, 28.265682 ], [ 97.382812, 27.916767 ], [ 97.031250, 27.722436 ], [ 97.119141, 27.098254 ], [ 96.416016, 27.293689 ], [ 95.097656, 26.588527 ], [ 95.141602, 26.037042 ], [ 94.570312, 25.165173 ], [ 94.526367, 24.686952 ], [ 94.086914, 23.885838 ], [ 93.295898, 24.086589 ], [ 93.251953, 23.079732 ], [ 93.032227, 22.715390 ], [ 93.164062, 22.309426 ], [ 92.636719, 22.065278 ], [ 92.109375, 23.644524 ], [ 91.845703, 23.644524 ], [ 91.669922, 22.998852 ], [ 91.142578, 23.523700 ], [ 91.450195, 24.086589 ], [ 91.889648, 24.166802 ], [ 92.373047, 25.005973 ], [ 91.757812, 25.165173 ], [ 90.834961, 25.165173 ], [ 89.912109, 25.284438 ], [ 89.824219, 25.997550 ], [ 89.340820, 26.037042 ], [ 88.549805, 26.470573 ], [ 88.198242, 25.799891 ], [ 88.901367, 25.244696 ], [ 88.286133, 24.886436 ], [ 88.066406, 24.527135 ], [ 88.681641, 24.246965 ], [ 88.505859, 23.644524 ], [ 88.857422, 22.917923 ], [ 88.989258, 22.065278 ], [ 88.857422, 21.698265 ], [ 88.198242, 21.739091 ], [ 86.967773, 21.534847 ], [ 87.011719, 20.756114 ], [ 86.484375, 20.179724 ], [ 85.034180, 19.518375 ], [ 83.935547, 18.312811 ], [ 83.188477, 17.685895 ], [ 82.177734, 17.056785 ], [ 82.177734, 16.594081 ], [ 80.771484, 15.961329 ], [ 80.288086, 15.919074 ], [ 80.024414, 15.156974 ], [ 80.200195, 13.838080 ], [ 80.244141, 13.025966 ], [ 79.848633, 12.082296 ], [ 79.848633, 10.358151 ], [ 79.321289, 10.314919 ], [ 78.881836, 9.579084 ], [ 79.189453, 9.232249 ], [ 78.266602, 8.971897 ], [ 77.915039, 8.276727 ], [ 77.519531, 7.972198 ], [ 76.552734, 8.928487 ], [ 75.717773, 11.350797 ], [ 75.366211, 11.781325 ], [ 74.838867, 12.768946 ], [ 74.443359, 14.647368 ], [ 73.520508, 16.003576 ], [ 72.817383, 19.228177 ], [ 72.817383, 20.427013 ], [ 72.597656, 21.371244 ], [ 71.147461, 20.797201 ], [ 70.444336, 20.879343 ], [ 69.125977, 22.105999 ], [ 69.609375, 22.471955 ], [ 69.345703, 22.877440 ], [ 68.159180, 23.725012 ], [ 68.818359, 24.367114 ], [ 71.015625, 24.367114 ], [ 70.839844, 25.244696 ], [ 70.268555, 25.760320 ], [ 70.136719, 26.509905 ], [ 69.477539, 26.941660 ], [ 70.576172, 27.994401 ], [ 71.762695, 27.916767 ], [ 72.817383, 28.998532 ], [ 73.432617, 29.993002 ], [ 74.399414, 31.015279 ], [ 74.399414, 31.728167 ], [ 75.234375, 32.287133 ], [ 74.443359, 32.768800 ], [ 73.740234, 34.343436 ], [ 74.223633, 34.777716 ], [ 75.717773, 34.524661 ], [ 76.860352, 34.669359 ], [ 77.827148, 35.496456 ] ] ] } }

View File

@ -54,7 +54,7 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 4, "x": 2, "y": 6 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -114.032593, 36.998166 ], [ -112.148438, 37.011326 ] ], [ [ -114.642334, 35.056980 ], [ -116.323242, 36.323977 ], [ -120.003662, 38.997841 ], [ -120.003662, 41.244772 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -114.642334, 35.056980 ], [ -116.323242, 36.323977 ], [ -120.003662, 38.997841 ], [ -120.003662, 41.244772 ] ], [ [ -114.032593, 36.998166 ], [ -112.148438, 37.011326 ] ] ] } }
] }
] }
,
@ -78,13 +78,13 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 4, "x": 4, "y": 6 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -88.055420, 37.822802 ], [ -88.022461, 38.022131 ], [ -87.879639, 38.294248 ], [ -87.676392, 38.509490 ], [ -87.599487, 38.676933 ], [ -87.517090, 38.736946 ], [ -87.511597, 38.869652 ], [ -87.561035, 39.040520 ], [ -87.643433, 39.117276 ], [ -87.533569, 39.393755 ], [ -87.528076, 41.244772 ] ], [ [ -84.325562, 34.989504 ], [ -84.303589, 35.200745 ], [ -84.089355, 35.263562 ], [ -84.017944, 35.371135 ], [ -83.880615, 35.491984 ], [ -83.677368, 35.518814 ], [ -83.441162, 35.563512 ], [ -83.210449, 35.652833 ], [ -83.111572, 35.737595 ], [ -82.924805, 35.817813 ], [ -82.930298, 35.893500 ], [ -82.677612, 36.026889 ], [ -82.595215, 35.937988 ], [ -82.227173, 36.129002 ], [ -82.056885, 36.106815 ], [ -81.897583, 36.275279 ], [ -81.694336, 36.319551 ], [ -81.705322, 36.461054 ], [ -81.683350, 36.589068 ] ], [ [ -75.789185, 39.724089 ], [ -75.712280, 39.804316 ], [ -75.624390, 39.850721 ], [ -75.410156, 39.795876 ] ], [ [ -90.351562, 38.929502 ], [ -90.159302, 38.771216 ], [ -90.214233, 38.586820 ], [ -90.307617, 38.440682 ], [ -90.351562, 38.315801 ] ], [ [ -90.351562, 38.246809 ], [ -90.230713, 38.117272 ], [ -90.032959, 37.974515 ], [ -89.917603, 37.970185 ], [ -89.659424, 37.749001 ], [ -89.555054, 37.722935 ], [ -89.483643, 37.479217 ], [ -89.516602, 37.330857 ], [ -89.390259, 37.081476 ], [ -89.280396, 37.107765 ], [ -89.104614, 36.954282 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -90.351562, 38.929502 ], [ -90.159302, 38.771216 ], [ -90.214233, 38.586820 ], [ -90.307617, 38.440682 ], [ -90.351562, 38.315801 ] ], [ [ -90.351562, 38.246809 ], [ -90.230713, 38.117272 ], [ -90.032959, 37.974515 ], [ -89.917603, 37.970185 ], [ -89.659424, 37.749001 ], [ -89.555054, 37.722935 ], [ -89.483643, 37.479217 ], [ -89.516602, 37.330857 ], [ -89.390259, 37.081476 ], [ -89.280396, 37.107765 ], [ -89.104614, 36.954282 ] ], [ [ -88.055420, 37.822802 ], [ -88.022461, 38.022131 ], [ -87.879639, 38.294248 ], [ -87.676392, 38.509490 ], [ -87.599487, 38.676933 ], [ -87.517090, 38.736946 ], [ -87.511597, 38.869652 ], [ -87.561035, 39.040520 ], [ -87.643433, 39.117276 ], [ -87.533569, 39.393755 ], [ -87.528076, 41.244772 ] ], [ [ -84.325562, 34.989504 ], [ -84.303589, 35.200745 ], [ -84.089355, 35.263562 ], [ -84.017944, 35.371135 ], [ -83.880615, 35.491984 ], [ -83.677368, 35.518814 ], [ -83.441162, 35.563512 ], [ -83.210449, 35.652833 ], [ -83.111572, 35.737595 ], [ -82.924805, 35.817813 ], [ -82.930298, 35.893500 ], [ -82.677612, 36.026889 ], [ -82.595215, 35.937988 ], [ -82.227173, 36.129002 ], [ -82.056885, 36.106815 ], [ -81.897583, 36.275279 ], [ -81.694336, 36.319551 ], [ -81.705322, 36.461054 ], [ -81.683350, 36.589068 ] ], [ [ -75.789185, 39.724089 ], [ -75.712280, 39.804316 ], [ -75.624390, 39.850721 ], [ -75.410156, 39.795876 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 4, "x": 4, "y": 5 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -87.599487, 45.108423 ], [ -87.615967, 45.112300 ], [ -87.747803, 45.228481 ], [ -87.676392, 45.390735 ], [ -87.896118, 45.398450 ], [ -87.852173, 45.560218 ], [ -87.791748, 45.640928 ], [ -87.879639, 45.782848 ], [ -88.115845, 45.844108 ], [ -88.170776, 46.008409 ], [ -88.363037, 46.023668 ], [ -88.648682, 46.023668 ], [ -89.225464, 46.202646 ], [ -90.098877, 46.381044 ], [ -90.181274, 46.562637 ], [ -90.335083, 46.600393 ], [ -90.351562, 46.592844 ] ], [ [ -87.522583, 41.709829 ], [ -87.528076, 40.713956 ] ], [ [ -71.801147, 42.016652 ], [ -71.383667, 42.024814 ], [ -71.306763, 41.763117 ], [ -71.152954, 41.648288 ], [ -71.125488, 41.496235 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -87.599487, 45.108423 ], [ -87.615967, 45.112300 ], [ -87.747803, 45.228481 ], [ -87.676392, 45.390735 ], [ -87.896118, 45.398450 ], [ -87.852173, 45.560218 ], [ -87.791748, 45.640928 ], [ -87.879639, 45.782848 ], [ -88.115845, 45.844108 ], [ -88.170776, 46.008409 ], [ -88.363037, 46.023668 ], [ -88.648682, 46.023668 ], [ -89.225464, 46.202646 ], [ -90.098877, 46.381044 ], [ -90.181274, 46.562637 ], [ -90.335083, 46.600393 ], [ -90.351562, 46.592844 ] ], [ [ -71.801147, 42.016652 ], [ -71.383667, 42.024814 ], [ -71.306763, 41.763117 ], [ -71.152954, 41.648288 ], [ -71.125488, 41.496235 ] ], [ [ -87.522583, 41.709829 ], [ -87.528076, 40.713956 ] ] ] } }
] }
] }
,
@ -96,25 +96,25 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 5, "x": 5, "y": 12 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -114.032593, 36.995972 ], [ -112.324219, 37.011326 ] ], [ [ -114.642334, 35.054732 ], [ -116.323242, 36.323977 ], [ -118.116760, 37.644685 ], [ -120.000916, 38.995707 ], [ -120.000916, 41.112469 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -114.642334, 35.054732 ], [ -116.323242, 36.323977 ], [ -118.116760, 37.644685 ], [ -120.000916, 38.995707 ], [ -120.000916, 41.112469 ] ], [ [ -114.032593, 36.995972 ], [ -112.324219, 37.011326 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 5, "x": 5, "y": 11 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -120.000916, 41.994202 ], [ -120.000916, 40.847060 ] ], [ [ -116.916504, 46.000778 ], [ -118.979187, 45.993145 ], [ -119.338989, 45.890008 ], [ -119.594421, 45.933960 ], [ -119.789429, 45.851760 ], [ -120.160217, 45.740693 ], [ -120.610657, 45.754110 ], [ -120.838623, 45.673563 ], [ -121.047363, 45.639007 ], [ -121.203918, 45.690833 ], [ -121.563721, 45.733025 ], [ -121.788940, 45.702343 ], [ -122.176208, 45.596744 ], [ -122.420654, 45.592900 ], [ -122.654114, 45.631326 ], [ -122.728271, 45.771355 ], [ -122.752991, 45.939691 ], [ -122.939758, 46.130363 ], [ -123.230896, 46.187437 ], [ -123.472595, 46.278631 ], [ -123.777466, 46.282428 ], [ -123.925781, 46.272936 ] ], [ [ -114.035339, 41.994202 ], [ -112.324219, 41.998284 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -116.916504, 46.000778 ], [ -118.979187, 45.993145 ], [ -119.338989, 45.890008 ], [ -119.594421, 45.933960 ], [ -119.789429, 45.851760 ], [ -120.160217, 45.740693 ], [ -120.610657, 45.754110 ], [ -120.838623, 45.673563 ], [ -121.047363, 45.639007 ], [ -121.203918, 45.690833 ], [ -121.563721, 45.733025 ], [ -121.788940, 45.702343 ], [ -122.176208, 45.596744 ], [ -122.420654, 45.592900 ], [ -122.654114, 45.631326 ], [ -122.728271, 45.771355 ], [ -122.752991, 45.939691 ], [ -122.939758, 46.130363 ], [ -123.230896, 46.187437 ], [ -123.472595, 46.278631 ], [ -123.777466, 46.282428 ], [ -123.925781, 46.272936 ] ], [ [ -114.035339, 41.994202 ], [ -112.324219, 41.998284 ] ], [ [ -120.000916, 41.994202 ], [ -120.000916, 40.847060 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 5, "x": 6, "y": 12 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -109.047546, 37.000359 ], [ -110.497742, 37.009133 ], [ -112.675781, 37.009133 ] ], [ [ -102.052002, 40.002372 ], [ -101.074219, 40.002372 ] ], [ [ -103.005066, 36.995972 ], [ -102.043762, 36.993778 ] ], [ [ -104.046021, 41.112469 ], [ -104.046021, 41.004775 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -104.046021, 41.112469 ], [ -104.046021, 41.004775 ] ], [ [ -109.047546, 37.000359 ], [ -110.497742, 37.009133 ], [ -112.675781, 37.009133 ] ], [ [ -103.005066, 36.995972 ], [ -102.043762, 36.993778 ] ], [ [ -102.052002, 40.002372 ], [ -101.074219, 40.002372 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 5, "x": 6, "y": 11 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -111.085510, 44.506300 ], [ -111.049805, 44.488668 ], [ -111.052551, 42.002366 ], [ -112.675781, 41.998284 ] ], [ [ -104.026794, 45.956878 ], [ -101.074219, 45.964515 ] ], [ [ -104.054260, 43.000630 ], [ -104.046021, 41.004775 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -111.052551, 42.002366 ], [ -112.675781, 41.998284 ] ], [ [ -111.085510, 44.506300 ], [ -111.049805, 44.488668 ], [ -111.052551, 42.002366 ] ], [ [ -104.054260, 43.000630 ], [ -104.046021, 41.004775 ] ], [ [ -104.026794, 45.956878 ], [ -101.074219, 45.964515 ] ] ] } }
] }
] }
,
@ -126,7 +126,7 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 5, "x": 7, "y": 12 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -95.325623, 40.002372 ], [ -101.425781, 40.002372 ] ], [ [ -91.430969, 40.369566 ], [ -91.518860, 40.120090 ], [ -91.428223, 39.821194 ], [ -91.263428, 39.616268 ], [ -91.073914, 39.446799 ], [ -90.843201, 39.310925 ], [ -90.749817, 39.266284 ], [ -90.667419, 39.076776 ], [ -90.650940, 38.908133 ], [ -90.535583, 38.867513 ], [ -90.348816, 38.931639 ], [ -90.156555, 38.771216 ], [ -90.214233, 38.586820 ], [ -90.307617, 38.440682 ], [ -90.370789, 38.264063 ], [ -90.230713, 38.115111 ], [ -90.030212, 37.972350 ], [ -89.917603, 37.970185 ], [ -89.824219, 37.892196 ] ], [ [ -94.062195, 33.013270 ], [ -93.999023, 31.942840 ], [ -93.836975, 31.830899 ], [ -93.825989, 31.802893 ] ], [ [ -90.249939, 35.021000 ], [ -89.824219, 35.023249 ] ], [ [ -90.249939, 35.021000 ], [ -90.269165, 34.942237 ], [ -90.447693, 34.867905 ], [ -90.450439, 34.723555 ], [ -90.585022, 34.454483 ], [ -90.700378, 34.397845 ], [ -90.878906, 34.261757 ], [ -90.983276, 34.057211 ], [ -91.203003, 33.708347 ], [ -91.224976, 33.470399 ], [ -91.109619, 33.208818 ], [ -91.156311, 33.010967 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -95.325623, 40.002372 ], [ -101.425781, 40.002372 ] ], [ [ -91.430969, 40.369566 ], [ -91.518860, 40.120090 ], [ -91.428223, 39.821194 ], [ -91.263428, 39.616268 ], [ -91.073914, 39.446799 ], [ -90.843201, 39.310925 ], [ -90.749817, 39.266284 ], [ -90.667419, 39.076776 ], [ -90.650940, 38.908133 ], [ -90.535583, 38.867513 ], [ -90.348816, 38.931639 ], [ -90.156555, 38.771216 ], [ -90.214233, 38.586820 ], [ -90.307617, 38.440682 ], [ -90.370789, 38.264063 ], [ -90.230713, 38.115111 ], [ -90.030212, 37.972350 ], [ -89.917603, 37.970185 ], [ -89.824219, 37.892196 ] ], [ [ -90.249939, 35.021000 ], [ -90.269165, 34.942237 ], [ -90.447693, 34.867905 ], [ -90.450439, 34.723555 ], [ -90.585022, 34.454483 ], [ -90.700378, 34.397845 ], [ -90.878906, 34.261757 ], [ -90.983276, 34.057211 ], [ -91.203003, 33.708347 ], [ -91.224976, 33.470399 ], [ -91.109619, 33.208818 ], [ -91.156311, 33.010967 ] ], [ [ -94.062195, 33.013270 ], [ -93.999023, 31.942840 ], [ -93.836975, 31.830899 ], [ -93.825989, 31.802893 ] ], [ [ -90.249939, 35.021000 ], [ -89.824219, 35.023249 ] ] ] } }
] }
] }
,
@ -138,19 +138,19 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 5, "x": 8, "y": 13 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -87.530823, 30.275672 ], [ -87.459412, 30.413150 ], [ -87.407227, 30.609550 ], [ -87.635193, 30.852721 ], [ -87.618713, 30.928145 ], [ -87.047424, 30.987028 ], [ -85.006714, 30.991737 ], [ -85.056152, 31.109389 ], [ -85.119324, 31.236289 ], [ -85.067139, 31.578535 ], [ -85.122070, 31.765537 ], [ -85.064392, 32.084902 ], [ -85.050659, 32.101190 ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -85.006714, 30.991737 ], [ -85.056152, 31.109389 ], [ -85.119324, 31.236289 ], [ -85.067139, 31.578535 ], [ -85.122070, 31.765537 ], [ -85.064392, 32.084902 ], [ -85.050659, 32.101190 ] ], [ [ -87.530823, 30.275672 ], [ -87.459412, 30.413150 ], [ -87.407227, 30.609550 ], [ -87.635193, 30.852721 ], [ -87.618713, 30.928145 ], [ -87.047424, 30.987028 ], [ -85.006714, 30.991737 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 5, "x": 8, "y": 12 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -88.052673, 37.820633 ], [ -88.019714, 38.022131 ], [ -87.879639, 38.292092 ], [ -87.673645, 38.509490 ], [ -87.599487, 38.674789 ], [ -87.517090, 38.736946 ], [ -87.508850, 38.869652 ], [ -87.561035, 39.040520 ], [ -87.643433, 39.115145 ], [ -87.530823, 39.393755 ], [ -87.528076, 41.112469 ] ], [ [ -88.168030, 35.000754 ], [ -89.266663, 35.023249 ], [ -90.175781, 35.023249 ] ], [ [ -85.627441, 34.987253 ], [ -85.366516, 33.744897 ], [ -85.130310, 32.752633 ], [ -84.987488, 32.440249 ], [ -84.899597, 32.259265 ], [ -85.064392, 32.084902 ], [ -85.113831, 31.802893 ] ], [ [ -79.477844, 39.721976 ], [ -79.486084, 39.215231 ], [ -79.335022, 39.304550 ], [ -79.161987, 39.419221 ], [ -78.964233, 39.459523 ], [ -78.829651, 39.563353 ], [ -78.574219, 39.529467 ] ], [ [ -84.322815, 34.987253 ], [ -84.300842, 35.200745 ], [ -84.089355, 35.263562 ], [ -84.017944, 35.371135 ], [ -83.877869, 35.491984 ], [ -83.674622, 35.518814 ], [ -83.438416, 35.563512 ], [ -83.210449, 35.650601 ], [ -83.111572, 35.737595 ], [ -82.922058, 35.817813 ], [ -82.927551, 35.891275 ], [ -82.674866, 36.026889 ], [ -82.595215, 35.937988 ], [ -82.224426, 36.126783 ], [ -82.054138, 36.106815 ], [ -81.897583, 36.275279 ], [ -81.694336, 36.317338 ], [ -81.705322, 36.461054 ], [ -81.680603, 36.586863 ] ], [ [ -90.175781, 38.786204 ], [ -90.156555, 38.771216 ], [ -90.175781, 38.706946 ] ], [ [ -90.175781, 38.076204 ], [ -90.030212, 37.972350 ], [ -89.917603, 37.970185 ], [ -89.656677, 37.749001 ], [ -89.555054, 37.720763 ], [ -89.480896, 37.479217 ], [ -89.516602, 37.328673 ], [ -89.390259, 37.081476 ], [ -89.280396, 37.107765 ], [ -89.104614, 36.954282 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -90.175781, 38.786204 ], [ -90.156555, 38.771216 ], [ -90.175781, 38.706946 ] ], [ [ -90.175781, 38.076204 ], [ -90.030212, 37.972350 ], [ -89.917603, 37.970185 ], [ -89.656677, 37.749001 ], [ -89.555054, 37.720763 ], [ -89.480896, 37.479217 ], [ -89.516602, 37.328673 ], [ -89.390259, 37.081476 ], [ -89.280396, 37.107765 ], [ -89.104614, 36.954282 ] ], [ [ -88.052673, 37.820633 ], [ -88.019714, 38.022131 ], [ -87.879639, 38.292092 ], [ -87.673645, 38.509490 ], [ -87.599487, 38.674789 ], [ -87.517090, 38.736946 ], [ -87.508850, 38.869652 ], [ -87.561035, 39.040520 ], [ -87.643433, 39.115145 ], [ -87.530823, 39.393755 ], [ -87.528076, 41.112469 ] ], [ [ -88.168030, 35.000754 ], [ -89.266663, 35.023249 ], [ -90.175781, 35.023249 ] ], [ [ -85.627441, 34.987253 ], [ -85.366516, 33.744897 ], [ -85.130310, 32.752633 ], [ -84.987488, 32.440249 ], [ -84.899597, 32.259265 ], [ -85.064392, 32.084902 ], [ -85.113831, 31.802893 ] ], [ [ -84.322815, 34.987253 ], [ -84.300842, 35.200745 ], [ -84.089355, 35.263562 ], [ -84.017944, 35.371135 ], [ -83.877869, 35.491984 ], [ -83.674622, 35.518814 ], [ -83.438416, 35.563512 ], [ -83.210449, 35.650601 ], [ -83.111572, 35.737595 ], [ -82.922058, 35.817813 ], [ -82.927551, 35.891275 ], [ -82.674866, 36.026889 ], [ -82.595215, 35.937988 ], [ -82.224426, 36.126783 ], [ -82.054138, 36.106815 ], [ -81.897583, 36.275279 ], [ -81.694336, 36.317338 ], [ -81.705322, 36.461054 ], [ -81.680603, 36.586863 ] ], [ [ -79.477844, 39.721976 ], [ -79.486084, 39.215231 ], [ -79.335022, 39.304550 ], [ -79.161987, 39.419221 ], [ -78.964233, 39.459523 ], [ -78.829651, 39.563353 ], [ -78.574219, 39.529467 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 5, "x": 8, "y": 11 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -87.599487, 45.106485 ], [ -87.613220, 45.112300 ], [ -87.615967, 45.110362 ], [ -87.747803, 45.228481 ], [ -87.673645, 45.388806 ], [ -87.896118, 45.398450 ], [ -87.849426, 45.560218 ], [ -87.789001, 45.640928 ], [ -87.876892, 45.780933 ], [ -88.113098, 45.844108 ], [ -88.168030, 46.008409 ], [ -88.363037, 46.021761 ], [ -88.645935, 46.023668 ], [ -89.222717, 46.202646 ], [ -90.098877, 46.381044 ], [ -90.175781, 46.558860 ] ], [ [ -87.522583, 41.709829 ], [ -87.528076, 41.709829 ], [ -87.528076, 40.847060 ] ], [ [ -79.760742, 42.238685 ], [ -79.760742, 42.000325 ], [ -78.574219, 42.000325 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -87.599487, 45.106485 ], [ -87.613220, 45.112300 ], [ -87.615967, 45.110362 ], [ -87.747803, 45.228481 ], [ -87.673645, 45.388806 ], [ -87.896118, 45.398450 ], [ -87.849426, 45.560218 ], [ -87.789001, 45.640928 ], [ -87.876892, 45.780933 ], [ -88.113098, 45.844108 ], [ -88.168030, 46.008409 ], [ -88.363037, 46.021761 ], [ -88.645935, 46.023668 ], [ -89.222717, 46.202646 ], [ -90.098877, 46.381044 ], [ -90.175781, 46.558860 ] ], [ [ -79.760742, 42.238685 ], [ -79.760742, 42.000325 ], [ -78.574219, 42.000325 ] ], [ [ -87.522583, 41.709829 ], [ -87.528076, 41.709829 ], [ -87.528076, 40.847060 ] ] ] } }
] }
] }
,
@ -198,13 +198,13 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 11, "y": 25 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -114.642334, 35.053608 ], [ -114.581909, 35.250105 ], [ -114.631348, 35.446127 ], [ -114.651947, 35.639441 ], [ -114.650574, 35.854553 ], [ -114.739838, 35.991341 ], [ -114.672546, 36.115690 ], [ -114.461060, 36.115690 ], [ -114.270172, 36.044658 ], [ -114.132843, 36.004673 ], [ -114.066925, 36.156727 ], [ -114.024353, 36.189984 ], [ -114.028473, 36.668419 ] ], [ [ -114.642334, 35.053608 ], [ -116.321869, 36.322871 ], [ -116.788788, 36.668419 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -114.642334, 35.053608 ], [ -116.321869, 36.322871 ], [ -116.788788, 36.668419 ] ], [ [ -114.642334, 35.053608 ], [ -114.581909, 35.250105 ], [ -114.631348, 35.446127 ], [ -114.651947, 35.639441 ], [ -114.650574, 35.854553 ], [ -114.739838, 35.991341 ], [ -114.672546, 36.115690 ], [ -114.461060, 36.115690 ], [ -114.270172, 36.044658 ], [ -114.132843, 36.004673 ], [ -114.066925, 36.156727 ], [ -114.024353, 36.189984 ], [ -114.028473, 36.668419 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 11, "y": 24 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -114.031219, 36.994875 ], [ -112.412109, 37.010229 ] ], [ [ -114.031219, 36.994875 ], [ -114.027100, 36.527295 ] ], [ [ -116.597900, 36.527295 ], [ -118.212891, 37.716418 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -116.597900, 36.527295 ], [ -118.212891, 37.716418 ] ], [ [ -114.031219, 36.994875 ], [ -114.027100, 36.527295 ] ], [ [ -114.031219, 36.994875 ], [ -112.412109, 37.010229 ] ] ] } }
] }
] }
,
@ -240,13 +240,13 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 12, "y": 24 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -109.046173, 37.000359 ], [ -110.496368, 37.008036 ], [ -112.417603, 37.010229 ], [ -112.587891, 37.009133 ] ], [ [ -109.046173, 37.000359 ], [ -106.787109, 36.999262 ] ], [ [ -109.046173, 37.000359 ], [ -109.046173, 36.527295 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -109.046173, 37.000359 ], [ -110.496368, 37.008036 ], [ -112.417603, 37.010229 ], [ -112.587891, 37.009133 ] ], [ [ -109.046173, 37.000359 ], [ -109.046173, 36.527295 ] ], [ [ -109.046173, 37.000359 ], [ -106.787109, 36.999262 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 12, "y": 23 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -111.085510, 44.506300 ], [ -111.067657, 44.542526 ], [ -111.071777, 45.050240 ], [ -109.102478, 45.057031 ], [ -107.547913, 45.046359 ], [ -106.787109, 45.049270 ] ], [ [ -111.085510, 44.506300 ], [ -111.049805, 44.488668 ], [ -111.051178, 42.002366 ], [ -112.587891, 41.998284 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -111.051178, 42.002366 ], [ -112.587891, 41.998284 ] ], [ [ -111.085510, 44.506300 ], [ -111.049805, 44.488668 ], [ -111.051178, 42.002366 ] ], [ [ -111.085510, 44.506300 ], [ -111.067657, 44.542526 ], [ -111.071777, 45.050240 ], [ -109.102478, 45.057031 ], [ -107.547913, 45.046359 ], [ -106.787109, 45.049270 ] ] ] } }
] }
] }
,
@ -264,25 +264,25 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 13, "y": 25 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -103.002319, 36.499701 ], [ -103.003693, 36.668419 ] ], [ [ -103.002319, 36.499701 ], [ -101.162109, 36.499701 ] ], [ [ -103.002319, 36.499701 ], [ -103.002319, 31.999924 ], [ -106.630554, 31.999924 ], [ -106.619568, 31.914868 ], [ -106.594849, 31.877558 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -103.002319, 36.499701 ], [ -103.003693, 36.668419 ] ], [ [ -103.002319, 36.499701 ], [ -103.002319, 31.999924 ], [ -106.630554, 31.999924 ], [ -106.619568, 31.914868 ], [ -106.594849, 31.877558 ] ], [ [ -103.002319, 36.499701 ], [ -101.162109, 36.499701 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 13, "y": 24 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -102.050629, 40.001320 ], [ -101.162109, 40.001320 ] ], [ [ -103.003693, 36.995972 ], [ -106.962891, 37.000359 ] ], [ [ -103.003693, 36.995972 ], [ -103.002319, 36.527295 ] ], [ [ -103.003693, 36.995972 ], [ -102.042389, 36.992682 ] ], [ [ -104.046021, 41.046217 ], [ -104.046021, 41.004775 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -104.046021, 41.046217 ], [ -104.046021, 41.004775 ] ], [ [ -103.003693, 36.995972 ], [ -106.962891, 37.000359 ] ], [ [ -103.003693, 36.995972 ], [ -103.002319, 36.527295 ] ], [ [ -103.003693, 36.995972 ], [ -102.042389, 36.992682 ] ], [ [ -102.050629, 40.001320 ], [ -101.162109, 40.001320 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 13, "y": 23 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -104.078979, 45.041508 ], [ -105.746155, 45.051210 ], [ -106.962891, 45.048300 ] ], [ [ -104.078979, 45.041508 ], [ -104.052887, 43.000630 ], [ -101.162109, 43.000630 ] ], [ [ -104.052887, 43.000630 ], [ -104.046021, 41.004775 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -104.078979, 45.041508 ], [ -105.746155, 45.051210 ], [ -106.962891, 45.048300 ] ], [ [ -104.078979, 45.041508 ], [ -104.052887, 43.000630 ], [ -104.046021, 41.004775 ] ], [ [ -104.052887, 43.000630 ], [ -101.162109, 43.000630 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 13, "y": 22 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -104.026794, 45.956878 ], [ -104.077606, 47.171978 ], [ -104.094086, 48.980217 ] ], [ [ -104.026794, 45.956878 ], [ -101.162109, 45.964515 ] ], [ [ -104.078979, 45.041508 ], [ -105.746155, 45.051210 ], [ -106.962891, 45.048300 ] ], [ [ -104.078979, 45.041508 ], [ -104.078979, 45.026950 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -104.078979, 45.041508 ], [ -105.746155, 45.051210 ], [ -106.962891, 45.048300 ] ], [ [ -104.026794, 45.956878 ], [ -104.077606, 47.171978 ], [ -104.094086, 48.980217 ] ], [ [ -104.078979, 45.041508 ], [ -104.078979, 45.026950 ] ], [ [ -104.026794, 45.956878 ], [ -101.162109, 45.964515 ] ] ] } }
] }
] }
,
@ -300,13 +300,13 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 14, "y": 24 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -95.796661, 40.584757 ], [ -95.777435, 40.502314 ], [ -95.608521, 40.343404 ], [ -95.537109, 40.285811 ] ], [ [ -95.537109, 40.002372 ], [ -101.337891, 40.001320 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -95.537109, 40.002372 ], [ -101.337891, 40.001320 ] ], [ [ -95.796661, 40.584757 ], [ -95.777435, 40.502314 ], [ -95.608521, 40.343404 ], [ -95.537109, 40.285811 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 14, "y": 23 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -96.453094, 43.502745 ], [ -95.537109, 43.500752 ] ], [ [ -96.453094, 43.502745 ], [ -96.586304, 43.501749 ], [ -96.587677, 43.258206 ], [ -96.459961, 43.125043 ], [ -96.484680, 43.016697 ], [ -96.535492, 42.855833 ], [ -96.616516, 42.692530 ], [ -96.454468, 42.581400 ], [ -96.455841, 42.489315 ], [ -96.623383, 42.503490 ], [ -96.709900, 42.551057 ], [ -96.755219, 42.634969 ], [ -97.028503, 42.717759 ], [ -97.288055, 42.846772 ], [ -97.645111, 42.836703 ], [ -97.882690, 42.840731 ], [ -97.969208, 42.794393 ], [ -98.337250, 42.873951 ], [ -98.595428, 43.000630 ], [ -101.337891, 43.000630 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -96.455841, 42.489315 ], [ -96.623383, 42.503490 ], [ -96.709900, 42.551057 ], [ -96.755219, 42.634969 ], [ -97.028503, 42.717759 ], [ -97.288055, 42.846772 ], [ -97.645111, 42.836703 ], [ -97.882690, 42.840731 ], [ -97.969208, 42.794393 ], [ -98.337250, 42.873951 ], [ -98.595428, 43.000630 ], [ -101.337891, 43.000630 ] ], [ [ -96.453094, 43.502745 ], [ -96.586304, 43.501749 ], [ -96.587677, 43.258206 ], [ -96.459961, 43.125043 ], [ -96.484680, 43.016697 ], [ -96.535492, 42.855833 ], [ -96.616516, 42.692530 ], [ -96.454468, 42.581400 ], [ -96.455841, 42.489315 ] ], [ [ -96.453094, 43.502745 ], [ -95.537109, 43.500752 ] ] ] } }
] }
] }
,
@ -324,19 +324,19 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 15, "y": 25 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -94.629364, 36.541640 ], [ -93.412628, 36.527295 ], [ -92.308502, 36.523984 ], [ -91.252441, 36.523984 ], [ -90.112610, 36.462159 ], [ -90.030212, 36.338359 ], [ -90.254059, 36.123455 ], [ -90.315857, 36.023557 ], [ -89.912109, 36.023557 ] ], [ [ -94.629364, 36.541640 ], [ -94.430237, 35.484156 ], [ -94.452209, 34.511083 ], [ -94.481049, 33.636346 ], [ -94.910889, 33.832779 ], [ -95.191040, 33.938803 ], [ -95.419006, 33.870416 ], [ -95.712891, 33.879537 ] ], [ [ -94.060822, 33.013270 ], [ -93.999023, 31.942840 ], [ -93.904266, 31.877558 ] ], [ [ -90.249939, 35.021000 ], [ -89.912109, 35.022124 ] ], [ [ -90.249939, 35.021000 ], [ -90.269165, 34.942237 ], [ -90.447693, 34.867905 ], [ -90.450439, 34.722426 ], [ -90.585022, 34.454483 ], [ -90.700378, 34.397845 ], [ -90.877533, 34.261757 ], [ -90.983276, 34.056073 ], [ -91.201630, 33.707205 ], [ -91.223602, 33.470399 ], [ -91.108246, 33.207669 ], [ -91.156311, 33.010967 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -94.481049, 33.636346 ], [ -94.910889, 33.832779 ], [ -95.191040, 33.938803 ], [ -95.419006, 33.870416 ], [ -95.712891, 33.879537 ] ], [ [ -94.629364, 36.541640 ], [ -94.430237, 35.484156 ], [ -94.452209, 34.511083 ], [ -94.481049, 33.636346 ] ], [ [ -94.629364, 36.541640 ], [ -93.412628, 36.527295 ], [ -92.308502, 36.523984 ], [ -91.252441, 36.523984 ], [ -90.112610, 36.462159 ], [ -90.030212, 36.338359 ], [ -90.254059, 36.123455 ], [ -90.315857, 36.023557 ], [ -89.912109, 36.023557 ] ], [ [ -90.249939, 35.021000 ], [ -90.269165, 34.942237 ], [ -90.447693, 34.867905 ], [ -90.450439, 34.722426 ], [ -90.585022, 34.454483 ], [ -90.700378, 34.397845 ], [ -90.877533, 34.261757 ], [ -90.983276, 34.056073 ], [ -91.201630, 33.707205 ], [ -91.223602, 33.470399 ], [ -91.108246, 33.207669 ], [ -91.156311, 33.010967 ] ], [ [ -94.060822, 33.013270 ], [ -93.999023, 31.942840 ], [ -93.904266, 31.877558 ] ], [ [ -90.249939, 35.021000 ], [ -89.912109, 35.022124 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 15, "y": 24 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -95.324249, 40.002372 ], [ -95.712891, 40.002372 ] ], [ [ -95.324249, 40.002372 ], [ -95.453339, 40.215587 ], [ -95.608521, 40.343404 ], [ -95.712891, 40.441721 ] ], [ [ -95.324249, 40.002372 ], [ -95.086670, 39.868642 ], [ -94.956207, 39.870750 ], [ -94.927368, 39.725145 ], [ -95.067444, 39.540058 ], [ -94.991913, 39.444678 ], [ -94.868317, 39.235444 ], [ -94.606018, 39.140712 ], [ -94.623871, 37.000359 ] ], [ [ -91.430969, 40.369566 ], [ -91.410370, 40.551374 ], [ -91.154938, 40.700422 ], [ -91.087646, 40.852254 ], [ -90.957184, 41.025499 ], [ -90.964050, 41.046217 ] ], [ [ -91.430969, 40.369566 ], [ -91.518860, 40.120090 ], [ -91.428223, 39.821194 ], [ -91.263428, 39.615210 ], [ -91.072540, 39.445738 ], [ -90.841827, 39.310925 ], [ -90.749817, 39.266284 ], [ -90.666046, 39.075710 ], [ -90.650940, 38.908133 ], [ -90.535583, 38.866444 ], [ -90.347443, 38.930571 ], [ -90.156555, 38.770146 ], [ -90.212860, 38.585747 ], [ -90.306244, 38.439607 ], [ -90.370789, 38.264063 ], [ -90.229340, 38.114030 ], [ -90.030212, 37.972350 ], [ -89.917603, 37.969102 ], [ -89.912109, 37.964771 ] ], [ [ -94.629364, 36.541640 ], [ -93.460693, 36.527295 ] ], [ [ -94.629364, 36.541640 ], [ -94.626617, 36.527295 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -91.430969, 40.369566 ], [ -91.410370, 40.551374 ], [ -91.154938, 40.700422 ], [ -91.087646, 40.852254 ], [ -90.957184, 41.025499 ], [ -90.964050, 41.046217 ] ], [ [ -95.324249, 40.002372 ], [ -95.712891, 40.002372 ] ], [ [ -95.324249, 40.002372 ], [ -95.453339, 40.215587 ], [ -95.608521, 40.343404 ], [ -95.712891, 40.441721 ] ], [ [ -95.324249, 40.002372 ], [ -95.086670, 39.868642 ], [ -94.956207, 39.870750 ], [ -94.927368, 39.725145 ], [ -95.067444, 39.540058 ], [ -94.991913, 39.444678 ], [ -94.868317, 39.235444 ], [ -94.606018, 39.140712 ], [ -94.623871, 37.000359 ] ], [ [ -91.430969, 40.369566 ], [ -91.518860, 40.120090 ], [ -91.428223, 39.821194 ], [ -91.263428, 39.615210 ], [ -91.072540, 39.445738 ], [ -90.841827, 39.310925 ], [ -90.749817, 39.266284 ], [ -90.666046, 39.075710 ], [ -90.650940, 38.908133 ], [ -90.535583, 38.866444 ], [ -90.347443, 38.930571 ], [ -90.156555, 38.770146 ], [ -90.212860, 38.585747 ], [ -90.306244, 38.439607 ], [ -90.370789, 38.264063 ], [ -90.229340, 38.114030 ], [ -90.030212, 37.972350 ], [ -89.917603, 37.969102 ], [ -89.912109, 37.964771 ] ], [ [ -94.629364, 36.541640 ], [ -94.626617, 36.527295 ] ], [ [ -94.629364, 36.541640 ], [ -93.460693, 36.527295 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 15, "y": 23 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -91.229095, 43.501749 ], [ -92.540588, 43.520672 ], [ -94.001770, 43.513701 ], [ -95.359955, 43.500752 ], [ -95.712891, 43.501749 ] ], [ [ -91.229095, 43.501749 ], [ -91.255188, 43.614205 ], [ -91.257935, 43.855326 ], [ -91.290894, 43.937462 ], [ -91.628723, 44.085612 ], [ -91.880035, 44.257987 ], [ -91.950073, 44.365097 ], [ -92.062683, 44.432799 ], [ -92.386780, 44.575796 ], [ -92.506256, 44.584599 ], [ -92.797394, 44.776961 ], [ -92.767181, 44.996854 ], [ -92.767181, 45.151053 ] ], [ [ -90.641327, 42.505515 ], [ -89.912109, 42.505515 ] ], [ [ -90.641327, 42.505515 ], [ -90.583649, 42.429539 ], [ -90.465546, 42.378836 ], [ -90.417480, 42.271212 ], [ -90.260925, 42.190882 ], [ -90.157928, 42.104336 ], [ -90.210114, 41.835805 ], [ -90.395508, 41.609282 ], [ -90.462799, 41.537366 ], [ -90.690765, 41.479776 ], [ -91.034088, 41.430372 ], [ -91.124725, 41.258194 ], [ -90.999756, 41.180721 ], [ -90.957184, 41.025499 ], [ -91.042328, 40.913513 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -91.229095, 43.501749 ], [ -91.255188, 43.614205 ], [ -91.257935, 43.855326 ], [ -91.290894, 43.937462 ], [ -91.628723, 44.085612 ], [ -91.880035, 44.257987 ], [ -91.950073, 44.365097 ], [ -92.062683, 44.432799 ], [ -92.386780, 44.575796 ], [ -92.506256, 44.584599 ], [ -92.797394, 44.776961 ], [ -92.767181, 44.996854 ], [ -92.767181, 45.151053 ] ], [ [ -91.229095, 43.501749 ], [ -92.540588, 43.520672 ], [ -94.001770, 43.513701 ], [ -95.359955, 43.500752 ], [ -95.712891, 43.501749 ] ], [ [ -90.641327, 42.505515 ], [ -90.583649, 42.429539 ], [ -90.465546, 42.378836 ], [ -90.417480, 42.271212 ], [ -90.260925, 42.190882 ], [ -90.157928, 42.104336 ], [ -90.210114, 41.835805 ], [ -90.395508, 41.609282 ], [ -90.462799, 41.537366 ], [ -90.690765, 41.479776 ], [ -91.034088, 41.430372 ], [ -91.124725, 41.258194 ], [ -90.999756, 41.180721 ], [ -90.957184, 41.025499 ], [ -91.042328, 40.913513 ] ], [ [ -90.641327, 42.505515 ], [ -89.912109, 42.505515 ] ] ] } }
] }
] }
,
@ -348,25 +348,25 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 16, "y": 26 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -87.530823, 30.274486 ], [ -87.458038, 30.411966 ], [ -87.405853, 30.609550 ], [ -87.633820, 30.851542 ], [ -87.617340, 30.928145 ], [ -87.046051, 30.985851 ], [ -85.005341, 30.991737 ], [ -85.054779, 31.109389 ], [ -85.117950, 31.236289 ], [ -85.090485, 31.400535 ], [ -85.065765, 31.577365 ], [ -85.120697, 31.765537 ], [ -85.075378, 32.026706 ] ], [ [ -85.005341, 30.991737 ], [ -84.854279, 30.721768 ], [ -84.287109, 30.696973 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -85.005341, 30.991737 ], [ -85.054779, 31.109389 ], [ -85.117950, 31.236289 ], [ -85.090485, 31.400535 ], [ -85.065765, 31.577365 ], [ -85.120697, 31.765537 ], [ -85.075378, 32.026706 ] ], [ [ -87.530823, 30.274486 ], [ -87.458038, 30.411966 ], [ -87.405853, 30.609550 ], [ -87.633820, 30.851542 ], [ -87.617340, 30.928145 ], [ -87.046051, 30.985851 ], [ -85.005341, 30.991737 ], [ -84.854279, 30.721768 ], [ -84.287109, 30.696973 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 16, "y": 25 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -89.498749, 36.506325 ], [ -88.070526, 36.497493 ], [ -88.073273, 36.655200 ], [ -87.875519, 36.657403 ], [ -87.842560, 36.611118 ], [ -87.217712, 36.639774 ], [ -86.678009, 36.634264 ], [ -86.092987, 36.626550 ], [ -85.520325, 36.597889 ], [ -85.231934, 36.610016 ], [ -84.350281, 36.568115 ], [ -84.287109, 36.571424 ] ], [ [ -89.498749, 36.506325 ], [ -89.524841, 36.410231 ], [ -89.585266, 36.267529 ], [ -89.663544, 36.023557 ] ], [ [ -88.168030, 35.000754 ], [ -89.265289, 35.022124 ], [ -90.087891, 35.022124 ] ], [ [ -85.626068, 34.986128 ], [ -85.366516, 33.744897 ], [ -85.130310, 32.751478 ], [ -84.987488, 32.439090 ], [ -84.899597, 32.259265 ], [ -85.064392, 32.083738 ], [ -85.101471, 31.877558 ] ], [ [ -84.287109, 35.202989 ], [ -84.299469, 35.199623 ], [ -84.321442, 34.987253 ] ], [ [ -90.087891, 36.425703 ], [ -90.030212, 36.338359 ], [ -90.087891, 36.283028 ] ], [ [ -90.087891, 36.023557 ], [ -89.663544, 36.023557 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -90.087891, 36.425703 ], [ -90.030212, 36.338359 ], [ -90.087891, 36.283028 ] ], [ [ -90.087891, 36.023557 ], [ -89.663544, 36.023557 ] ], [ [ -89.498749, 36.506325 ], [ -89.524841, 36.410231 ], [ -89.585266, 36.267529 ], [ -89.663544, 36.023557 ] ], [ [ -88.168030, 35.000754 ], [ -89.265289, 35.022124 ], [ -90.087891, 35.022124 ] ], [ [ -89.498749, 36.506325 ], [ -88.070526, 36.497493 ], [ -88.073273, 36.655200 ], [ -87.875519, 36.657403 ], [ -87.842560, 36.611118 ], [ -87.217712, 36.639774 ], [ -86.678009, 36.634264 ], [ -86.092987, 36.626550 ], [ -85.520325, 36.597889 ], [ -85.231934, 36.610016 ], [ -84.350281, 36.568115 ], [ -84.287109, 36.571424 ] ], [ [ -85.626068, 34.986128 ], [ -85.366516, 33.744897 ], [ -85.130310, 32.751478 ], [ -84.987488, 32.439090 ], [ -84.899597, 32.259265 ], [ -85.064392, 32.083738 ], [ -85.101471, 31.877558 ] ], [ [ -84.287109, 35.202989 ], [ -84.299469, 35.199623 ], [ -84.321442, 34.987253 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 16, "y": 24 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -89.103241, 36.953184 ], [ -89.280396, 37.107765 ], [ -89.388885, 37.081476 ], [ -89.516602, 37.327581 ], [ -89.479523, 37.478128 ], [ -89.555054, 37.719677 ], [ -89.655304, 37.749001 ], [ -89.917603, 37.969102 ], [ -90.030212, 37.972350 ], [ -90.087891, 38.014558 ] ], [ [ -89.103241, 36.953184 ], [ -89.141693, 37.104479 ], [ -89.074402, 37.200800 ], [ -88.807983, 37.147182 ], [ -88.567657, 37.054081 ], [ -88.435822, 37.137330 ], [ -88.474274, 37.355968 ], [ -88.247681, 37.438884 ], [ -88.071899, 37.511905 ], [ -88.158417, 37.606616 ], [ -88.044434, 37.745743 ], [ -88.051300, 37.820633 ], [ -88.019714, 38.022131 ], [ -87.879639, 38.291014 ], [ -87.672272, 38.509490 ], [ -87.599487, 38.674789 ], [ -87.515717, 38.735875 ], [ -87.507477, 38.869652 ], [ -87.561035, 39.040520 ], [ -87.642059, 39.114079 ], [ -87.529449, 39.392693 ], [ -87.528076, 41.046217 ] ], [ [ -88.051300, 37.820633 ], [ -87.922211, 37.794593 ], [ -87.912598, 37.905199 ], [ -87.654419, 37.827141 ], [ -87.440186, 37.936616 ], [ -87.132568, 37.783740 ], [ -87.057037, 37.881357 ], [ -86.826324, 37.976680 ], [ -86.610718, 37.859676 ], [ -86.500854, 37.970185 ], [ -86.326447, 38.170194 ], [ -86.263275, 38.047010 ], [ -86.060028, 37.961523 ], [ -85.840302, 38.259750 ], [ -85.698853, 38.291014 ], [ -85.567017, 38.462192 ], [ -85.426941, 38.535276 ], [ -85.404968, 38.727305 ], [ -85.168762, 38.691941 ], [ -85.012207, 38.779781 ], [ -84.843292, 38.781922 ], [ -84.800720, 38.855751 ], [ -84.881744, 39.059716 ], [ -84.824066, 39.106620 ], [ -84.482117, 39.084238 ], [ -84.304962, 38.987168 ], [ -84.287109, 38.972222 ] ], [ [ -88.070526, 36.527295 ], [ -88.073273, 36.655200 ], [ -87.875519, 36.657403 ], [ -87.842560, 36.611118 ], [ -87.217712, 36.639774 ], [ -86.678009, 36.634264 ], [ -86.092987, 36.626550 ], [ -85.520325, 36.597889 ], [ -85.231934, 36.610016 ], [ -84.350281, 36.568115 ], [ -84.287109, 36.571424 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -89.103241, 36.953184 ], [ -89.280396, 37.107765 ], [ -89.388885, 37.081476 ], [ -89.516602, 37.327581 ], [ -89.479523, 37.478128 ], [ -89.555054, 37.719677 ], [ -89.655304, 37.749001 ], [ -89.917603, 37.969102 ], [ -90.030212, 37.972350 ], [ -90.087891, 38.014558 ] ], [ [ -88.051300, 37.820633 ], [ -88.019714, 38.022131 ], [ -87.879639, 38.291014 ], [ -87.672272, 38.509490 ], [ -87.599487, 38.674789 ], [ -87.515717, 38.735875 ], [ -87.507477, 38.869652 ], [ -87.561035, 39.040520 ], [ -87.642059, 39.114079 ], [ -87.529449, 39.392693 ], [ -87.528076, 41.046217 ] ], [ [ -89.103241, 36.953184 ], [ -89.141693, 37.104479 ], [ -89.074402, 37.200800 ], [ -88.807983, 37.147182 ], [ -88.567657, 37.054081 ], [ -88.435822, 37.137330 ], [ -88.474274, 37.355968 ], [ -88.247681, 37.438884 ], [ -88.071899, 37.511905 ], [ -88.158417, 37.606616 ], [ -88.044434, 37.745743 ], [ -88.051300, 37.820633 ], [ -87.922211, 37.794593 ], [ -87.912598, 37.905199 ], [ -87.654419, 37.827141 ], [ -87.440186, 37.936616 ], [ -87.132568, 37.783740 ], [ -87.057037, 37.881357 ], [ -86.826324, 37.976680 ], [ -86.610718, 37.859676 ], [ -86.500854, 37.970185 ], [ -86.326447, 38.170194 ], [ -86.263275, 38.047010 ], [ -86.060028, 37.961523 ], [ -85.840302, 38.259750 ], [ -85.698853, 38.291014 ], [ -85.567017, 38.462192 ], [ -85.426941, 38.535276 ], [ -85.404968, 38.727305 ], [ -85.168762, 38.691941 ], [ -85.012207, 38.779781 ], [ -84.843292, 38.781922 ], [ -84.800720, 38.855751 ], [ -84.881744, 39.059716 ], [ -84.824066, 39.106620 ] ], [ [ -88.070526, 36.527295 ], [ -88.073273, 36.655200 ], [ -87.875519, 36.657403 ], [ -87.842560, 36.611118 ], [ -87.217712, 36.639774 ], [ -86.678009, 36.634264 ], [ -86.092987, 36.626550 ], [ -85.520325, 36.597889 ], [ -85.231934, 36.610016 ], [ -84.350281, 36.568115 ], [ -84.287109, 36.571424 ] ], [ [ -84.824066, 39.106620 ], [ -84.482117, 39.084238 ], [ -84.304962, 38.987168 ], [ -84.287109, 38.972222 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 16, "y": 23 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -87.806854, 42.494378 ], [ -88.577271, 42.503490 ], [ -90.087891, 42.505515 ] ], [ [ -87.522583, 41.708804 ], [ -87.526703, 41.708804 ], [ -87.528076, 40.913513 ] ], [ [ -84.807587, 41.678041 ], [ -84.287109, 41.685220 ] ], [ [ -87.662659, 45.151053 ], [ -87.614594, 45.109393 ], [ -87.613220, 45.111331 ], [ -87.598114, 45.106485 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -87.662659, 45.151053 ], [ -87.614594, 45.109393 ], [ -87.613220, 45.111331 ], [ -87.598114, 45.106485 ] ], [ [ -87.806854, 42.494378 ], [ -88.577271, 42.503490 ], [ -90.087891, 42.505515 ] ], [ [ -84.807587, 41.678041 ], [ -84.287109, 41.685220 ] ], [ [ -87.522583, 41.708804 ], [ -87.526703, 41.708804 ], [ -87.528076, 40.913513 ] ] ] } }
] }
] }
,
@ -384,13 +384,13 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 17, "y": 25 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -84.321442, 34.987253 ], [ -84.299469, 35.199623 ], [ -84.087982, 35.262441 ], [ -84.017944, 35.370015 ], [ -83.876495, 35.490866 ], [ -83.674622, 35.517697 ], [ -83.438416, 35.563512 ], [ -83.210449, 35.649485 ], [ -83.111572, 35.737595 ], [ -82.920685, 35.817813 ], [ -82.926178, 35.890163 ], [ -82.674866, 36.025779 ], [ -82.593842, 35.937988 ], [ -82.224426, 36.126783 ], [ -82.052765, 36.106815 ], [ -81.897583, 36.274172 ], [ -81.694336, 36.317338 ], [ -81.705322, 36.461054 ], [ -81.680603, 36.585760 ] ], [ [ -83.077240, 34.979377 ], [ -82.437286, 35.180543 ], [ -81.514435, 35.172686 ], [ -81.046143, 35.126648 ], [ -81.039276, 35.037868 ], [ -80.937653, 35.104181 ], [ -80.781097, 34.934356 ], [ -80.783844, 34.818313 ], [ -79.672852, 34.808166 ], [ -78.662109, 33.954752 ] ], [ [ -81.680603, 36.585760 ], [ -82.187347, 36.567012 ], [ -83.674622, 36.600094 ], [ -84.350281, 36.568115 ], [ -84.462891, 36.573630 ] ], [ [ -83.674622, 36.600094 ], [ -83.384857, 36.657403 ], [ -83.346405, 36.668419 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -83.674622, 36.600094 ], [ -84.350281, 36.568115 ], [ -84.462891, 36.573630 ] ], [ [ -83.674622, 36.600094 ], [ -83.384857, 36.657403 ], [ -83.346405, 36.668419 ] ], [ [ -84.321442, 34.987253 ], [ -84.299469, 35.199623 ], [ -84.087982, 35.262441 ], [ -84.017944, 35.370015 ], [ -83.876495, 35.490866 ], [ -83.674622, 35.517697 ], [ -83.438416, 35.563512 ], [ -83.210449, 35.649485 ], [ -83.111572, 35.737595 ], [ -82.920685, 35.817813 ], [ -82.926178, 35.890163 ], [ -82.674866, 36.025779 ], [ -82.593842, 35.937988 ], [ -82.224426, 36.126783 ], [ -82.052765, 36.106815 ], [ -81.897583, 36.274172 ], [ -81.694336, 36.317338 ], [ -81.705322, 36.461054 ], [ -81.680603, 36.585760 ], [ -82.187347, 36.567012 ], [ -83.674622, 36.600094 ] ], [ [ -83.077240, 34.979377 ], [ -82.437286, 35.180543 ], [ -81.514435, 35.172686 ], [ -81.046143, 35.126648 ], [ -81.039276, 35.037868 ], [ -80.937653, 35.104181 ], [ -80.781097, 34.934356 ], [ -80.783844, 34.818313 ], [ -79.672852, 34.808166 ], [ -78.662109, 33.954752 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 17, "y": 24 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -83.674622, 36.600094 ], [ -84.350281, 36.568115 ], [ -84.462891, 36.573630 ] ], [ [ -83.674622, 36.600094 ], [ -82.187347, 36.567012 ], [ -81.680603, 36.585760 ] ], [ [ -83.674622, 36.600094 ], [ -83.384857, 36.657403 ], [ -83.178864, 36.719072 ], [ -83.089600, 36.815881 ], [ -82.816315, 36.935623 ], [ -82.709198, 37.040928 ], [ -82.685852, 37.122001 ], [ -82.372742, 37.239075 ], [ -81.973114, 37.536955 ] ], [ [ -82.589722, 38.415938 ], [ -82.776489, 38.511639 ], [ -82.856140, 38.652271 ], [ -83.045654, 38.635109 ], [ -83.259888, 38.580379 ], [ -83.435669, 38.637255 ], [ -83.673248, 38.609359 ], [ -83.827057, 38.690869 ], [ -84.039917, 38.761580 ], [ -84.304962, 38.987168 ], [ -84.462891, 39.073578 ] ], [ [ -80.520172, 40.642094 ], [ -80.520172, 39.720920 ], [ -79.477844, 39.720920 ], [ -79.486084, 39.214167 ], [ -79.333649, 39.303487 ], [ -79.161987, 39.419221 ], [ -78.964233, 39.458463 ], [ -78.829651, 39.563353 ], [ -78.662109, 39.541117 ] ], [ [ -81.680603, 36.585760 ], [ -81.692963, 36.527295 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -83.674622, 36.600094 ], [ -84.350281, 36.568115 ], [ -84.462891, 36.573630 ] ], [ [ -82.589722, 38.415938 ], [ -82.776489, 38.511639 ], [ -82.856140, 38.652271 ], [ -83.045654, 38.635109 ], [ -83.259888, 38.580379 ], [ -83.435669, 38.637255 ], [ -83.673248, 38.609359 ], [ -83.827057, 38.690869 ], [ -84.039917, 38.761580 ], [ -84.304962, 38.987168 ], [ -84.462891, 39.073578 ] ], [ [ -83.674622, 36.600094 ], [ -83.384857, 36.657403 ], [ -83.178864, 36.719072 ], [ -83.089600, 36.815881 ], [ -82.816315, 36.935623 ], [ -82.709198, 37.040928 ], [ -82.685852, 37.122001 ], [ -82.372742, 37.239075 ], [ -81.973114, 37.536955 ] ], [ [ -80.520172, 40.642094 ], [ -80.520172, 39.720920 ], [ -79.477844, 39.720920 ] ], [ [ -81.680603, 36.585760 ], [ -81.692963, 36.527295 ] ], [ [ -83.674622, 36.600094 ], [ -82.187347, 36.567012 ], [ -81.680603, 36.585760 ] ], [ [ -79.477844, 39.720920 ], [ -79.486084, 39.214167 ], [ -79.333649, 39.303487 ], [ -79.161987, 39.419221 ], [ -78.964233, 39.458463 ], [ -78.829651, 39.563353 ], [ -78.662109, 39.541117 ] ] ] } }
] }
] }
,
@ -408,19 +408,19 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 18, "y": 24 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -77.724152, 39.322612 ], [ -77.802429, 39.449980 ], [ -77.924652, 39.592990 ], [ -78.233643, 39.672313 ], [ -78.425903, 39.597223 ], [ -78.534393, 39.523111 ], [ -78.829651, 39.563353 ], [ -78.837891, 39.557001 ] ], [ [ -77.724152, 39.322612 ], [ -77.577209, 39.288608 ], [ -77.444000, 39.214167 ], [ -77.518158, 39.106620 ], [ -77.306671, 39.045853 ], [ -77.119904, 38.934844 ], [ -77.038879, 38.982898 ], [ -76.912537, 38.879274 ], [ -77.041626, 38.790486 ] ], [ [ -75.787811, 39.724089 ], [ -75.715027, 38.450362 ], [ -75.048981, 38.449287 ] ], [ [ -75.787811, 39.724089 ], [ -75.710907, 39.803261 ], [ -75.621643, 39.847558 ], [ -75.406036, 39.795876 ] ], [ [ -73.675690, 41.046217 ], [ -73.657837, 40.985082 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -73.675690, 41.046217 ], [ -73.657837, 40.985082 ] ], [ [ -77.724152, 39.322612 ], [ -77.802429, 39.449980 ], [ -77.924652, 39.592990 ], [ -78.233643, 39.672313 ], [ -78.425903, 39.597223 ], [ -78.534393, 39.523111 ], [ -78.829651, 39.563353 ], [ -78.837891, 39.557001 ] ], [ [ -77.724152, 39.322612 ], [ -77.577209, 39.288608 ], [ -77.444000, 39.214167 ], [ -77.518158, 39.106620 ], [ -77.306671, 39.045853 ], [ -77.119904, 38.934844 ], [ -77.038879, 38.982898 ], [ -76.912537, 38.879274 ], [ -77.041626, 38.790486 ] ], [ [ -75.787811, 39.724089 ], [ -75.710907, 39.803261 ], [ -75.621643, 39.847558 ], [ -75.406036, 39.795876 ] ], [ [ -75.787811, 39.724089 ], [ -75.715027, 38.450362 ], [ -75.048981, 38.449287 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 18, "y": 23 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -74.679565, 41.356196 ], [ -74.841614, 41.427283 ], [ -75.011902, 41.496235 ], [ -75.076447, 41.642131 ], [ -75.048981, 41.751849 ], [ -75.168457, 41.841943 ], [ -75.386810, 41.999305 ], [ -76.744995, 42.001346 ], [ -78.837891, 42.000325 ] ], [ [ -73.282928, 42.743987 ], [ -73.037109, 42.739952 ] ], [ [ -73.282928, 42.743987 ], [ -73.498535, 42.055411 ], [ -73.554840, 41.290190 ], [ -73.475189, 41.205523 ], [ -73.693542, 41.108330 ], [ -73.657837, 40.985082 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -74.679565, 41.356196 ], [ -74.841614, 41.427283 ], [ -75.011902, 41.496235 ], [ -75.076447, 41.642131 ], [ -75.048981, 41.751849 ], [ -75.168457, 41.841943 ], [ -75.386810, 41.999305 ], [ -76.744995, 42.001346 ], [ -78.837891, 42.000325 ] ], [ [ -73.282928, 42.743987 ], [ -73.498535, 42.055411 ], [ -73.554840, 41.290190 ], [ -73.475189, 41.205523 ], [ -73.693542, 41.108330 ], [ -73.657837, 40.985082 ] ], [ [ -73.282928, 42.743987 ], [ -73.037109, 42.739952 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 6, "x": 19, "y": 23 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -71.505890, 45.008506 ], [ -71.621246, 44.736003 ], [ -71.547089, 44.592423 ], [ -71.585541, 44.468091 ], [ -71.810760, 44.352332 ], [ -72.004395, 44.304196 ], [ -72.037354, 44.206819 ], [ -72.059326, 44.046142 ], [ -72.178802, 43.808765 ], [ -72.261200, 43.721490 ], [ -72.371063, 43.522663 ], [ -72.404022, 43.286203 ], [ -72.435608, 43.223191 ], [ -72.458954, 42.961448 ], [ -72.538605, 42.831667 ], [ -72.457581, 42.727848 ], [ -73.212891, 42.742978 ] ], [ [ -71.801147, 42.013591 ], [ -71.379547, 42.024814 ], [ -71.305389, 41.763117 ], [ -71.148834, 41.648288 ], [ -71.121368, 41.495207 ] ], [ [ -71.801147, 42.013591 ], [ -71.794281, 41.467428 ], [ -71.854706, 41.320107 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -71.505890, 45.008506 ], [ -71.621246, 44.736003 ], [ -71.547089, 44.592423 ], [ -71.585541, 44.468091 ], [ -71.810760, 44.352332 ], [ -72.004395, 44.304196 ], [ -72.037354, 44.206819 ], [ -72.059326, 44.046142 ], [ -72.178802, 43.808765 ], [ -72.261200, 43.721490 ], [ -72.371063, 43.522663 ], [ -72.404022, 43.286203 ], [ -72.435608, 43.223191 ], [ -72.458954, 42.961448 ], [ -72.538605, 42.831667 ], [ -72.457581, 42.727848 ], [ -73.212891, 42.742978 ] ], [ [ -71.801147, 42.013591 ], [ -71.794281, 41.467428 ], [ -71.854706, 41.320107 ] ], [ [ -71.801147, 42.013591 ], [ -71.379547, 42.024814 ], [ -71.305389, 41.763117 ], [ -71.148834, 41.648288 ], [ -71.121368, 41.495207 ] ] ] } }
] }
] }
,
@ -528,7 +528,7 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 23, "y": 49 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -114.030533, 36.994327 ], [ -114.032593, 38.856820 ] ], [ [ -114.030533, 36.994327 ], [ -112.456055, 37.009681 ] ], [ [ -114.030533, 36.994327 ], [ -114.027786, 36.562600 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -114.030533, 36.994327 ], [ -114.032593, 38.856820 ] ], [ [ -114.030533, 36.994327 ], [ -114.027786, 36.562600 ] ], [ [ -114.030533, 36.994327 ], [ -112.456055, 37.009681 ] ] ] } }
] }
] }
,
@ -582,7 +582,7 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 24, "y": 46 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -111.085510, 44.506300 ], [ -111.194687, 44.561610 ], [ -111.292191, 44.701850 ], [ -111.400681, 44.729174 ], [ -111.542816, 44.530780 ], [ -111.772156, 44.498464 ], [ -112.336578, 44.561120 ], [ -112.362671, 44.462701 ], [ -112.543945, 44.483280 ] ], [ [ -111.085510, 44.506300 ], [ -111.067657, 44.542037 ], [ -111.071777, 45.049755 ], [ -109.643555, 45.055091 ] ], [ [ -111.085510, 44.506300 ], [ -111.049805, 44.488178 ], [ -111.050491, 43.036776 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -111.085510, 44.506300 ], [ -111.194687, 44.561610 ], [ -111.292191, 44.701850 ], [ -111.400681, 44.729174 ], [ -111.542816, 44.530780 ], [ -111.772156, 44.498464 ], [ -112.336578, 44.561120 ], [ -112.362671, 44.462701 ], [ -112.543945, 44.483280 ] ], [ [ -111.085510, 44.506300 ], [ -111.049805, 44.488178 ], [ -111.050491, 43.036776 ] ], [ [ -111.085510, 44.506300 ], [ -111.067657, 44.542037 ], [ -111.071777, 45.049755 ], [ -109.643555, 45.055091 ] ] ] } }
] }
] }
,
@ -606,13 +606,13 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 25, "y": 49 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -109.045486, 37.000359 ], [ -109.731445, 37.004198 ] ], [ [ -109.045486, 37.000359 ], [ -109.049606, 38.856820 ] ], [ [ -109.045486, 37.000359 ], [ -106.831055, 36.999811 ] ], [ [ -109.045486, 37.000359 ], [ -109.045486, 36.562600 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -109.045486, 37.000359 ], [ -109.731445, 37.004198 ] ], [ [ -109.045486, 37.000359 ], [ -109.049606, 38.856820 ] ], [ [ -109.045486, 37.000359 ], [ -109.045486, 36.562600 ] ], [ [ -109.045486, 37.000359 ], [ -106.831055, 36.999811 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 25, "y": 48 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -109.049606, 38.788345 ], [ -109.053726, 41.002184 ], [ -109.731445, 41.010993 ] ], [ [ -109.053726, 41.002184 ], [ -106.831055, 41.003221 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -109.053726, 41.002184 ], [ -109.731445, 41.010993 ] ], [ [ -109.053726, 41.002184 ], [ -106.831055, 41.003221 ] ], [ [ -109.049606, 38.788345 ], [ -109.053726, 41.002184 ] ] ] } }
] }
] }
,
@ -648,13 +648,13 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 26, "y": 48 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -104.046021, 41.013066 ], [ -104.045334, 41.004257 ], [ -106.918945, 41.003739 ] ], [ [ -104.045334, 41.004257 ], [ -104.018555, 41.004257 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -104.045334, 41.004257 ], [ -106.918945, 41.003739 ] ], [ [ -104.046021, 41.013066 ], [ -104.045334, 41.004257 ], [ -104.018555, 41.004257 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 26, "y": 47 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -104.052887, 43.000630 ], [ -104.054260, 43.100983 ] ], [ [ -104.052887, 43.000630 ], [ -104.045334, 41.004257 ] ], [ [ -104.052887, 43.000630 ], [ -104.018555, 43.000630 ] ], [ [ -104.045334, 41.004257 ], [ -106.918945, 41.003739 ] ], [ [ -104.045334, 41.004257 ], [ -104.018555, 41.004257 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -104.052887, 43.000630 ], [ -104.054260, 43.100983 ] ], [ [ -104.045334, 41.004257 ], [ -106.918945, 41.003739 ] ], [ [ -104.052887, 43.000630 ], [ -104.045334, 41.004257 ] ], [ [ -104.052887, 43.000630 ], [ -104.018555, 43.000630 ] ], [ [ -104.045334, 41.004257 ], [ -104.018555, 41.004257 ] ] ] } }
] }
] }
,
@ -666,7 +666,7 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 26, "y": 45 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -104.077606, 45.058001 ], [ -104.026794, 45.956878 ], [ -104.073486, 47.070122 ] ], [ [ -104.026794, 45.956878 ], [ -104.018555, 45.957356 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -104.026794, 45.956878 ], [ -104.073486, 47.070122 ] ], [ [ -104.077606, 45.058001 ], [ -104.026794, 45.956878 ], [ -104.018555, 45.957356 ] ] ] } }
] }
] }
,
@ -690,31 +690,31 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 27, "y": 50 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -103.001633, 36.499701 ], [ -103.003006, 36.633162 ] ], [ [ -103.001633, 36.499701 ], [ -101.206055, 36.499701 ] ], [ [ -103.001633, 36.499701 ], [ -103.001633, 34.270836 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -103.001633, 36.499701 ], [ -103.003006, 36.633162 ] ], [ [ -103.001633, 36.499701 ], [ -103.001633, 34.270836 ] ], [ [ -103.001633, 36.499701 ], [ -101.206055, 36.499701 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 27, "y": 49 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -103.003693, 36.995424 ], [ -104.106445, 36.996520 ] ], [ [ -103.003693, 36.995424 ], [ -103.003006, 36.562600 ] ], [ [ -103.003693, 36.995424 ], [ -102.041702, 36.992133 ], [ -102.040329, 38.460041 ], [ -102.043076, 38.856820 ] ], [ [ -102.041702, 36.992133 ], [ -101.206055, 36.993230 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -103.003693, 36.995424 ], [ -104.106445, 36.996520 ] ], [ [ -103.003693, 36.995424 ], [ -103.003006, 36.562600 ] ], [ [ -102.041702, 36.992133 ], [ -102.040329, 38.460041 ], [ -102.043076, 38.856820 ] ], [ [ -103.003693, 36.995424 ], [ -102.041702, 36.992133 ], [ -101.206055, 36.993230 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 27, "y": 48 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -102.050629, 40.001320 ], [ -102.048569, 41.004257 ], [ -104.045334, 41.004257 ] ], [ [ -102.050629, 40.001320 ], [ -101.206055, 40.001320 ] ], [ [ -102.050629, 40.001320 ], [ -102.043076, 38.788345 ] ], [ [ -104.046021, 41.013066 ], [ -104.045334, 41.004257 ], [ -104.106445, 41.004257 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -104.045334, 41.004257 ], [ -104.106445, 41.004257 ] ], [ [ -104.046021, 41.013066 ], [ -104.045334, 41.004257 ] ], [ [ -102.050629, 40.001320 ], [ -102.048569, 41.004257 ], [ -104.045334, 41.004257 ] ], [ [ -102.050629, 40.001320 ], [ -102.043076, 38.788345 ] ], [ [ -102.050629, 40.001320 ], [ -101.206055, 40.001320 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 27, "y": 47 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -104.052887, 43.000630 ], [ -104.054260, 43.100983 ] ], [ [ -104.052887, 43.000630 ], [ -101.206055, 43.000630 ] ], [ [ -104.052887, 43.000630 ], [ -104.045334, 41.004257 ], [ -104.106445, 41.004257 ] ], [ [ -104.045334, 41.004257 ], [ -102.048569, 41.004257 ], [ -102.049942, 40.946714 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -104.052887, 43.000630 ], [ -104.054260, 43.100983 ] ], [ [ -104.045334, 41.004257 ], [ -104.106445, 41.004257 ] ], [ [ -104.052887, 43.000630 ], [ -104.045334, 41.004257 ] ], [ [ -104.052887, 43.000630 ], [ -101.206055, 43.000630 ] ], [ [ -104.045334, 41.004257 ], [ -102.048569, 41.004257 ], [ -102.049942, 40.946714 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 27, "y": 46 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -104.053574, 43.036776 ], [ -104.078293, 45.041023 ] ], [ [ -104.106445, 45.041508 ], [ -104.078293, 45.041023 ], [ -104.074860, 45.120053 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -104.106445, 45.041508 ], [ -104.078293, 45.041023 ], [ -104.074860, 45.120053 ] ], [ [ -104.053574, 43.036776 ], [ -104.078293, 45.041023 ] ] ] } }
] }
] }
,
@ -786,7 +786,7 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 29, "y": 48 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -95.796661, 40.584235 ], [ -95.862579, 40.764941 ], [ -95.834427, 40.944120 ], [ -95.844040, 41.013066 ] ], [ [ -95.796661, 40.584235 ], [ -95.776749, 40.501792 ], [ -95.608521, 40.343404 ], [ -95.581055, 40.321420 ] ], [ [ -95.796661, 40.584235 ], [ -95.581055, 40.584235 ] ], [ [ -95.581055, 40.001846 ], [ -98.481445, 40.001846 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -95.796661, 40.584235 ], [ -95.862579, 40.764941 ], [ -95.834427, 40.944120 ], [ -95.844040, 41.013066 ] ], [ [ -95.581055, 40.001846 ], [ -98.481445, 40.001846 ] ], [ [ -95.796661, 40.584235 ], [ -95.776749, 40.501792 ], [ -95.608521, 40.343404 ], [ -95.581055, 40.321420 ] ], [ [ -95.796661, 40.584235 ], [ -95.581055, 40.584235 ] ] ] } }
] }
] }
,
@ -798,7 +798,7 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 29, "y": 46 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -96.453094, 43.502247 ], [ -96.440048, 44.436231 ], [ -96.527252, 45.120053 ] ], [ [ -96.453094, 43.502247 ], [ -95.581055, 43.501251 ] ], [ [ -96.453094, 43.502247 ], [ -96.586304, 43.501251 ], [ -96.587677, 43.257706 ], [ -96.459961, 43.124542 ], [ -96.479874, 43.036776 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -96.453094, 43.502247 ], [ -96.440048, 44.436231 ], [ -96.527252, 45.120053 ] ], [ [ -96.453094, 43.502247 ], [ -96.586304, 43.501251 ], [ -96.587677, 43.257706 ], [ -96.459961, 43.124542 ], [ -96.479874, 43.036776 ] ], [ [ -96.453094, 43.502247 ], [ -95.581055, 43.501251 ] ] ] } }
] }
] }
,
@ -834,7 +834,7 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 30, "y": 50 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -94.628677, 36.541088 ], [ -94.627304, 36.633162 ] ], [ [ -94.628677, 36.541088 ], [ -93.412628, 36.526743 ], [ -92.768555, 36.525639 ] ], [ [ -94.628677, 36.541088 ], [ -94.430237, 35.483597 ], [ -94.451523, 34.511083 ], [ -94.459763, 34.270836 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -94.628677, 36.541088 ], [ -94.627304, 36.633162 ] ], [ [ -94.628677, 36.541088 ], [ -94.430237, 35.483597 ], [ -94.451523, 34.511083 ], [ -94.459763, 34.270836 ] ], [ [ -94.628677, 36.541088 ], [ -93.412628, 36.526743 ], [ -92.768555, 36.525639 ] ] ] } }
] }
] }
,
@ -846,7 +846,7 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 30, "y": 48 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -95.323563, 40.001846 ], [ -95.668945, 40.001846 ] ], [ [ -95.323563, 40.001846 ], [ -95.452652, 40.215587 ], [ -95.608521, 40.343404 ], [ -95.668945, 40.400425 ] ], [ [ -95.323563, 40.001846 ], [ -95.085983, 39.868115 ], [ -94.955521, 39.870223 ], [ -94.926682, 39.725145 ], [ -95.067444, 39.540058 ], [ -94.991226, 39.444678 ], [ -94.868317, 39.234912 ], [ -94.605331, 39.140180 ], [ -94.608765, 38.788345 ] ], [ [ -92.768555, 40.594664 ], [ -92.852325, 40.592578 ], [ -94.002457, 40.585278 ], [ -94.898529, 40.583714 ], [ -95.668945, 40.584235 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -95.323563, 40.001846 ], [ -95.668945, 40.001846 ] ], [ [ -95.323563, 40.001846 ], [ -95.452652, 40.215587 ], [ -95.608521, 40.343404 ], [ -95.668945, 40.400425 ] ], [ [ -92.768555, 40.594664 ], [ -92.852325, 40.592578 ], [ -94.002457, 40.585278 ], [ -94.898529, 40.583714 ], [ -95.668945, 40.584235 ] ], [ [ -95.323563, 40.001846 ], [ -95.085983, 39.868115 ], [ -94.955521, 39.870223 ], [ -94.926682, 39.725145 ], [ -95.067444, 39.540058 ], [ -94.991226, 39.444678 ], [ -94.868317, 39.234912 ], [ -94.605331, 39.140180 ], [ -94.608765, 38.788345 ] ] ] } }
] }
] }
,
@ -876,7 +876,7 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 31, "y": 50 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -90.249252, 35.021000 ], [ -89.956055, 35.021562 ] ], [ [ -90.249252, 35.021000 ], [ -90.135269, 35.114292 ], [ -90.147629, 35.405282 ], [ -89.989014, 35.536696 ], [ -89.956055, 35.678494 ] ], [ [ -90.249252, 35.021000 ], [ -90.268478, 34.941674 ], [ -90.447006, 34.867342 ], [ -90.450439, 34.721862 ], [ -90.584335, 34.454483 ], [ -90.699692, 34.397845 ], [ -90.865173, 34.270836 ] ], [ [ -89.956055, 36.023557 ], [ -90.315857, 36.023557 ], [ -90.254059, 36.122901 ], [ -90.029526, 36.338359 ], [ -90.112610, 36.462159 ], [ -91.251755, 36.523432 ], [ -92.307816, 36.523984 ], [ -92.856445, 36.525639 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -89.956055, 36.023557 ], [ -90.315857, 36.023557 ], [ -90.254059, 36.122901 ], [ -90.029526, 36.338359 ], [ -90.112610, 36.462159 ], [ -91.251755, 36.523432 ], [ -92.307816, 36.523984 ], [ -92.856445, 36.525639 ] ], [ [ -90.249252, 35.021000 ], [ -90.268478, 34.941674 ], [ -90.447006, 34.867342 ], [ -90.450439, 34.721862 ], [ -90.584335, 34.454483 ], [ -90.699692, 34.397845 ], [ -90.865173, 34.270836 ] ], [ [ -90.249252, 35.021000 ], [ -90.135269, 35.114292 ], [ -90.147629, 35.405282 ], [ -89.989014, 35.536696 ], [ -89.956055, 35.678494 ] ], [ [ -90.249252, 35.021000 ], [ -89.956055, 35.021562 ] ] ] } }
] }
] }
,
@ -888,25 +888,25 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 31, "y": 48 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -91.430969, 40.369043 ], [ -91.567612, 40.452695 ], [ -91.758499, 40.614474 ], [ -92.856445, 40.592578 ] ], [ [ -91.430969, 40.369043 ], [ -91.410370, 40.551374 ], [ -91.154251, 40.699902 ], [ -91.087646, 40.851735 ], [ -90.966797, 41.013066 ] ], [ [ -91.430969, 40.369043 ], [ -91.518173, 40.120090 ], [ -91.428223, 39.821194 ], [ -91.262741, 39.615210 ], [ -91.071854, 39.445208 ], [ -90.841827, 39.310925 ], [ -90.749817, 39.265753 ], [ -90.666046, 39.075177 ], [ -90.650253, 38.907599 ], [ -90.535583, 38.865909 ], [ -90.346756, 38.930571 ], [ -90.179214, 38.788345 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -91.430969, 40.369043 ], [ -91.410370, 40.551374 ], [ -91.154251, 40.699902 ], [ -91.087646, 40.851735 ], [ -90.966797, 41.013066 ] ], [ [ -91.430969, 40.369043 ], [ -91.567612, 40.452695 ], [ -91.758499, 40.614474 ], [ -92.856445, 40.592578 ] ], [ [ -91.430969, 40.369043 ], [ -91.518173, 40.120090 ], [ -91.428223, 39.821194 ], [ -91.262741, 39.615210 ], [ -91.071854, 39.445208 ], [ -90.841827, 39.310925 ], [ -90.749817, 39.265753 ], [ -90.666046, 39.075177 ], [ -90.650253, 38.907599 ], [ -90.535583, 38.865909 ], [ -90.346756, 38.930571 ], [ -90.179214, 38.788345 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 31, "y": 47 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -90.641327, 42.505515 ], [ -90.738831, 42.658707 ], [ -91.064987, 42.754575 ], [ -91.129532, 42.913189 ], [ -91.170044, 43.002639 ], [ -91.172104, 43.100983 ] ], [ [ -90.641327, 42.505515 ], [ -89.956055, 42.505515 ] ], [ [ -90.641327, 42.505515 ], [ -90.582962, 42.429539 ], [ -90.464859, 42.378836 ], [ -90.417480, 42.270704 ], [ -90.260239, 42.190373 ], [ -90.157242, 42.103827 ], [ -90.210114, 41.835293 ], [ -90.395508, 41.608768 ], [ -90.462112, 41.536852 ], [ -90.690765, 41.479261 ], [ -91.034088, 41.429857 ], [ -91.124039, 41.257678 ], [ -90.999069, 41.180204 ], [ -90.957184, 41.024981 ], [ -91.016922, 40.946714 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -90.641327, 42.505515 ], [ -90.738831, 42.658707 ], [ -91.064987, 42.754575 ], [ -91.129532, 42.913189 ], [ -91.170044, 43.002639 ], [ -91.172104, 43.100983 ] ], [ [ -90.641327, 42.505515 ], [ -90.582962, 42.429539 ], [ -90.464859, 42.378836 ], [ -90.417480, 42.270704 ], [ -90.260239, 42.190373 ], [ -90.157242, 42.103827 ], [ -90.210114, 41.835293 ], [ -90.395508, 41.608768 ], [ -90.462112, 41.536852 ], [ -90.690765, 41.479261 ], [ -91.034088, 41.429857 ], [ -91.124039, 41.257678 ], [ -90.999069, 41.180204 ], [ -90.957184, 41.024981 ], [ -91.016922, 40.946714 ] ], [ [ -90.641327, 42.505515 ], [ -89.956055, 42.505515 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 31, "y": 46 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -91.228409, 43.501251 ], [ -92.540588, 43.520174 ], [ -92.856445, 43.519178 ] ], [ [ -91.228409, 43.501251 ], [ -91.255188, 43.614205 ], [ -91.257935, 43.854831 ], [ -91.290207, 43.937462 ], [ -91.628036, 44.085612 ], [ -91.880035, 44.257495 ], [ -91.950073, 44.365097 ], [ -92.062683, 44.432799 ], [ -92.386093, 44.575307 ], [ -92.505569, 44.584110 ], [ -92.796707, 44.776474 ], [ -92.766495, 44.996368 ], [ -92.766495, 45.120053 ] ], [ [ -91.228409, 43.501251 ], [ -91.213989, 43.446937 ], [ -91.084213, 43.288202 ], [ -91.173477, 43.212683 ], [ -91.170731, 43.036776 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -91.228409, 43.501251 ], [ -91.255188, 43.614205 ], [ -91.257935, 43.854831 ], [ -91.290207, 43.937462 ], [ -91.628036, 44.085612 ], [ -91.880035, 44.257495 ], [ -91.950073, 44.365097 ], [ -92.062683, 44.432799 ], [ -92.386093, 44.575307 ], [ -92.505569, 44.584110 ], [ -92.796707, 44.776474 ], [ -92.766495, 44.996368 ], [ -92.766495, 45.120053 ] ], [ [ -91.228409, 43.501251 ], [ -92.540588, 43.520174 ], [ -92.856445, 43.519178 ] ], [ [ -91.228409, 43.501251 ], [ -91.213989, 43.446937 ], [ -91.084213, 43.288202 ], [ -91.173477, 43.212683 ], [ -91.170731, 43.036776 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 31, "y": 45 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -90.396881, 46.576327 ], [ -90.335083, 46.597090 ], [ -90.334396, 46.593788 ], [ -90.177155, 46.561221 ], [ -90.096817, 46.381044 ], [ -89.956055, 46.353089 ] ], [ [ -92.766495, 45.058001 ], [ -92.765808, 45.267155 ], [ -92.689590, 45.518857 ], [ -92.856445, 45.667325 ] ], [ [ -92.856445, 45.763212 ], [ -92.757568, 45.890008 ], [ -92.296829, 46.096567 ], [ -92.265244, 46.095615 ], [ -92.275543, 46.656506 ], [ -92.012558, 46.712090 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -92.766495, 45.058001 ], [ -92.765808, 45.267155 ], [ -92.689590, 45.518857 ], [ -92.856445, 45.667325 ] ], [ [ -92.856445, 45.763212 ], [ -92.757568, 45.890008 ], [ -92.296829, 46.096567 ], [ -92.265244, 46.095615 ], [ -92.275543, 46.656506 ], [ -92.012558, 46.712090 ] ], [ [ -90.396881, 46.576327 ], [ -90.335083, 46.597090 ], [ -90.334396, 46.593788 ], [ -90.177155, 46.561221 ], [ -90.096817, 46.381044 ], [ -89.956055, 46.353089 ] ] ] } }
] }
] }
,
@ -924,13 +924,13 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 32, "y": 50 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -89.498749, 36.506325 ], [ -89.274216, 36.611670 ], [ -89.233704, 36.633162 ] ], [ [ -89.498749, 36.506325 ], [ -89.524841, 36.409679 ], [ -89.585266, 36.267529 ], [ -89.663544, 36.023557 ], [ -89.673843, 35.940212 ], [ -89.775467, 35.799437 ], [ -89.950562, 35.701917 ], [ -89.989014, 35.536696 ], [ -90.043945, 35.491425 ] ], [ [ -88.167343, 35.000191 ], [ -89.264603, 35.021562 ], [ -90.043945, 35.021562 ] ], [ [ -88.167343, 35.000191 ], [ -87.143555, 35.000191 ] ], [ [ -88.167343, 35.000191 ], [ -88.095932, 34.806474 ], [ -88.170090, 34.270836 ] ], [ [ -87.352295, 36.633162 ], [ -87.842560, 36.611118 ], [ -87.858353, 36.633162 ] ], [ [ -88.073273, 36.633162 ], [ -88.069839, 36.497493 ], [ -89.498749, 36.506325 ] ], [ [ -90.043945, 36.360481 ], [ -90.029526, 36.338359 ], [ -90.043945, 36.325084 ] ], [ [ -90.043945, 36.023557 ], [ -89.663544, 36.023557 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -90.043945, 36.360481 ], [ -90.029526, 36.338359 ], [ -90.043945, 36.325084 ] ], [ [ -90.043945, 36.023557 ], [ -89.663544, 36.023557 ] ], [ [ -89.498749, 36.506325 ], [ -89.274216, 36.611670 ], [ -89.233704, 36.633162 ] ], [ [ -89.498749, 36.506325 ], [ -89.524841, 36.409679 ], [ -89.585266, 36.267529 ], [ -89.663544, 36.023557 ], [ -89.673843, 35.940212 ], [ -89.775467, 35.799437 ], [ -89.950562, 35.701917 ], [ -89.989014, 35.536696 ], [ -90.043945, 35.491425 ] ], [ [ -88.167343, 35.000191 ], [ -89.264603, 35.021562 ], [ -90.043945, 35.021562 ] ], [ [ -88.167343, 35.000191 ], [ -88.095932, 34.806474 ], [ -88.170090, 34.270836 ] ], [ [ -87.352295, 36.633162 ], [ -87.842560, 36.611118 ], [ -87.858353, 36.633162 ] ], [ [ -88.073273, 36.633162 ], [ -88.069839, 36.497493 ], [ -89.498749, 36.506325 ] ], [ [ -88.167343, 35.000191 ], [ -87.143555, 35.000191 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 32, "y": 49 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -89.103241, 36.952635 ], [ -89.280396, 37.107765 ], [ -89.388885, 37.081476 ], [ -89.516602, 37.327035 ], [ -89.479523, 37.477583 ], [ -89.554367, 37.719133 ], [ -89.655304, 37.749001 ], [ -89.916916, 37.968561 ], [ -90.030212, 37.972350 ], [ -90.043945, 37.982634 ] ], [ [ -89.103241, 36.952635 ], [ -89.134827, 36.852153 ], [ -89.115601, 36.694851 ], [ -89.274216, 36.611670 ], [ -89.379272, 36.562600 ] ], [ [ -89.103241, 36.952635 ], [ -89.141693, 37.103932 ], [ -89.074402, 37.200800 ], [ -88.807983, 37.146635 ], [ -88.566971, 37.054081 ], [ -88.435822, 37.136782 ], [ -88.474274, 37.355422 ], [ -88.247681, 37.438884 ], [ -88.071899, 37.511905 ], [ -88.157730, 37.606072 ], [ -88.044434, 37.745200 ], [ -88.051300, 37.820090 ], [ -88.019028, 38.022131 ], [ -87.878952, 38.291014 ], [ -87.671585, 38.508953 ], [ -87.598801, 38.674253 ], [ -87.515717, 38.735339 ], [ -87.508850, 38.856820 ] ], [ [ -88.051300, 37.820090 ], [ -87.921524, 37.794050 ], [ -87.911911, 37.904658 ], [ -87.653732, 37.826599 ], [ -87.439499, 37.936075 ], [ -87.143555, 37.789709 ] ], [ [ -88.071899, 36.562600 ], [ -88.073273, 36.654649 ], [ -87.874832, 36.656852 ], [ -87.842560, 36.611118 ], [ -87.217026, 36.639223 ], [ -87.143555, 36.638672 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -89.103241, 36.952635 ], [ -89.280396, 37.107765 ], [ -89.388885, 37.081476 ], [ -89.516602, 37.327035 ], [ -89.479523, 37.477583 ], [ -89.554367, 37.719133 ], [ -89.655304, 37.749001 ], [ -89.916916, 37.968561 ], [ -90.030212, 37.972350 ], [ -90.043945, 37.982634 ] ], [ [ -88.051300, 37.820090 ], [ -88.019028, 38.022131 ], [ -87.878952, 38.291014 ], [ -87.671585, 38.508953 ], [ -87.598801, 38.674253 ], [ -87.515717, 38.735339 ], [ -87.508850, 38.856820 ] ], [ [ -89.103241, 36.952635 ], [ -89.134827, 36.852153 ], [ -89.115601, 36.694851 ], [ -89.274216, 36.611670 ], [ -89.379272, 36.562600 ] ], [ [ -89.103241, 36.952635 ], [ -89.141693, 37.103932 ], [ -89.074402, 37.200800 ], [ -88.807983, 37.146635 ], [ -88.566971, 37.054081 ], [ -88.435822, 37.136782 ], [ -88.474274, 37.355422 ], [ -88.247681, 37.438884 ], [ -88.071899, 37.511905 ], [ -88.157730, 37.606072 ], [ -88.044434, 37.745200 ], [ -88.051300, 37.820090 ], [ -87.921524, 37.794050 ], [ -87.911911, 37.904658 ], [ -87.653732, 37.826599 ], [ -87.439499, 37.936075 ], [ -87.143555, 37.789709 ] ], [ [ -88.071899, 36.562600 ], [ -88.073273, 36.654649 ], [ -87.874832, 36.656852 ], [ -87.842560, 36.611118 ], [ -87.217026, 36.639223 ], [ -87.143555, 36.638672 ] ] ] } }
] }
] }
,
@ -960,7 +960,7 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 33, "y": 52 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -85.005341, 30.991148 ], [ -87.046051, 30.985262 ], [ -87.231445, 30.967012 ] ], [ [ -85.005341, 30.991148 ], [ -85.054779, 31.108801 ], [ -85.117950, 31.236289 ], [ -85.090485, 31.400535 ], [ -85.065765, 31.577365 ], [ -85.120010, 31.765537 ], [ -85.081558, 31.989442 ] ], [ [ -85.005341, 30.991148 ], [ -84.853592, 30.721768 ], [ -84.331055, 30.698745 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -85.005341, 30.991148 ], [ -85.054779, 31.108801 ], [ -85.117950, 31.236289 ], [ -85.090485, 31.400535 ], [ -85.065765, 31.577365 ], [ -85.120010, 31.765537 ], [ -85.081558, 31.989442 ] ], [ [ -85.005341, 30.991148 ], [ -87.046051, 30.985262 ], [ -87.231445, 30.967012 ] ], [ [ -85.005341, 30.991148 ], [ -84.853592, 30.721768 ], [ -84.331055, 30.698745 ] ] ] } }
] }
] }
,
@ -972,19 +972,19 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 33, "y": 50 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -85.626068, 34.986128 ], [ -86.910095, 34.999629 ], [ -87.231445, 35.000191 ] ], [ [ -85.626068, 34.986128 ], [ -84.854965, 34.977127 ], [ -84.331055, 34.987253 ] ], [ [ -85.626068, 34.986128 ], [ -85.475693, 34.270836 ] ], [ [ -84.331055, 36.568666 ], [ -84.350281, 36.567564 ], [ -85.231247, 36.610016 ], [ -85.519638, 36.597889 ], [ -86.092987, 36.625999 ], [ -86.600418, 36.633162 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -84.331055, 36.568666 ], [ -84.350281, 36.567564 ], [ -85.231247, 36.610016 ], [ -85.519638, 36.597889 ], [ -86.092987, 36.625999 ], [ -86.600418, 36.633162 ] ], [ [ -85.626068, 34.986128 ], [ -86.910095, 34.999629 ], [ -87.231445, 35.000191 ] ], [ [ -85.626068, 34.986128 ], [ -84.854965, 34.977127 ], [ -84.331055, 34.987253 ] ], [ [ -85.626068, 34.986128 ], [ -85.475693, 34.270836 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 33, "y": 49 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -84.331055, 36.568666 ], [ -84.350281, 36.567564 ], [ -85.231247, 36.610016 ], [ -85.519638, 36.597889 ], [ -86.092987, 36.625999 ], [ -86.678009, 36.634264 ], [ -87.217026, 36.639223 ], [ -87.231445, 36.638672 ] ], [ [ -84.800720, 38.856820 ], [ -84.800034, 38.855216 ], [ -84.843292, 38.781387 ], [ -85.012207, 38.779781 ], [ -85.168076, 38.691405 ], [ -85.404282, 38.727305 ], [ -85.426254, 38.535276 ], [ -85.567017, 38.462192 ], [ -85.698853, 38.290476 ], [ -85.840302, 38.259211 ], [ -86.060028, 37.960982 ], [ -86.262589, 38.047010 ], [ -86.325760, 38.169654 ], [ -86.500168, 37.970185 ], [ -86.610718, 37.859134 ], [ -86.825638, 37.976680 ], [ -87.056351, 37.881357 ], [ -87.131882, 37.783740 ], [ -87.231445, 37.833107 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -84.800720, 38.856820 ], [ -84.800034, 38.855216 ], [ -84.843292, 38.781387 ], [ -85.012207, 38.779781 ], [ -85.168076, 38.691405 ], [ -85.404282, 38.727305 ], [ -85.426254, 38.535276 ], [ -85.567017, 38.462192 ], [ -85.698853, 38.290476 ], [ -85.840302, 38.259211 ], [ -86.060028, 37.960982 ], [ -86.262589, 38.047010 ], [ -86.325760, 38.169654 ], [ -86.500168, 37.970185 ], [ -86.610718, 37.859134 ], [ -86.825638, 37.976680 ], [ -87.056351, 37.881357 ], [ -87.131882, 37.783740 ], [ -87.231445, 37.833107 ] ], [ [ -84.331055, 36.568666 ], [ -84.350281, 36.567564 ], [ -85.231247, 36.610016 ], [ -85.519638, 36.597889 ], [ -86.092987, 36.625999 ], [ -86.678009, 36.634264 ], [ -87.217026, 36.639223 ], [ -87.231445, 36.638672 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 33, "y": 48 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -84.824066, 39.106620 ], [ -84.810333, 40.773262 ], [ -84.810333, 41.013066 ] ], [ [ -84.824066, 39.106620 ], [ -84.481430, 39.083705 ], [ -84.331055, 39.001577 ] ], [ [ -84.824066, 39.106620 ], [ -84.881744, 39.059716 ], [ -84.800034, 38.855216 ], [ -84.839859, 38.788345 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -84.824066, 39.106620 ], [ -84.810333, 40.773262 ], [ -84.810333, 41.013066 ] ], [ [ -84.824066, 39.106620 ], [ -84.881744, 39.059716 ], [ -84.800034, 38.855216 ], [ -84.839859, 38.788345 ] ], [ [ -84.824066, 39.106620 ], [ -84.481430, 39.083705 ], [ -84.331055, 39.001577 ] ] ] } }
] }
] }
,
@ -1008,13 +1008,13 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 34, "y": 50 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -84.321442, 34.987253 ], [ -84.418945, 34.986128 ] ], [ [ -84.321442, 34.987253 ], [ -84.298782, 35.199062 ], [ -84.087296, 35.261880 ], [ -84.017944, 35.369455 ], [ -83.876495, 35.490306 ], [ -83.673935, 35.517138 ], [ -83.438416, 35.562953 ], [ -83.209763, 35.649485 ], [ -83.110886, 35.737595 ], [ -82.920685, 35.817256 ], [ -82.926178, 35.890163 ], [ -82.674866, 36.025223 ], [ -82.593842, 35.937432 ], [ -82.224426, 36.126229 ], [ -82.052078, 36.106260 ], [ -81.897583, 36.274172 ], [ -81.694336, 36.317338 ], [ -81.705322, 36.460502 ], [ -81.679916, 36.585760 ] ], [ [ -84.321442, 34.987253 ], [ -83.076553, 34.979377 ], [ -82.976990, 35.009190 ], [ -82.437286, 35.180543 ], [ -81.518555, 35.172686 ] ], [ [ -83.076553, 34.979377 ], [ -83.186417, 34.896069 ], [ -83.346405, 34.706622 ], [ -83.076553, 34.540500 ], [ -82.902832, 34.479958 ], [ -82.779922, 34.270836 ] ], [ [ -81.679916, 36.585760 ], [ -82.186661, 36.566461 ], [ -83.673935, 36.600094 ] ], [ [ -81.679916, 36.585760 ], [ -81.518555, 36.581901 ] ], [ [ -83.673935, 36.600094 ], [ -84.350281, 36.567564 ], [ -84.418945, 36.571424 ] ], [ [ -83.673935, 36.600094 ], [ -83.505707, 36.633162 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -83.673935, 36.600094 ], [ -84.350281, 36.567564 ], [ -84.418945, 36.571424 ] ], [ [ -84.321442, 34.987253 ], [ -84.418945, 34.986128 ] ], [ [ -83.673935, 36.600094 ], [ -83.505707, 36.633162 ] ], [ [ -84.321442, 34.987253 ], [ -84.298782, 35.199062 ], [ -84.087296, 35.261880 ], [ -84.017944, 35.369455 ], [ -83.876495, 35.490306 ], [ -83.673935, 35.517138 ], [ -83.438416, 35.562953 ], [ -83.209763, 35.649485 ], [ -83.110886, 35.737595 ], [ -82.920685, 35.817256 ], [ -82.926178, 35.890163 ], [ -82.674866, 36.025223 ], [ -82.593842, 35.937432 ], [ -82.224426, 36.126229 ], [ -82.052078, 36.106260 ], [ -81.897583, 36.274172 ], [ -81.694336, 36.317338 ], [ -81.705322, 36.460502 ], [ -81.679916, 36.585760 ] ], [ [ -84.321442, 34.987253 ], [ -83.076553, 34.979377 ] ], [ [ -81.679916, 36.585760 ], [ -82.186661, 36.566461 ], [ -83.673935, 36.600094 ] ], [ [ -83.076553, 34.979377 ], [ -83.186417, 34.896069 ], [ -83.346405, 34.706622 ], [ -83.076553, 34.540500 ], [ -82.902832, 34.479958 ], [ -82.779922, 34.270836 ] ], [ [ -83.076553, 34.979377 ], [ -82.976990, 35.009190 ], [ -82.437286, 35.180543 ], [ -81.518555, 35.172686 ] ], [ [ -81.679916, 36.585760 ], [ -81.518555, 36.581901 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 34, "y": 49 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -83.673935, 36.600094 ], [ -84.350281, 36.567564 ], [ -84.418945, 36.571424 ] ], [ [ -83.673935, 36.600094 ], [ -82.186661, 36.566461 ], [ -81.679916, 36.585760 ] ], [ [ -83.673935, 36.600094 ], [ -83.384857, 36.656852 ], [ -83.178864, 36.718522 ], [ -83.089600, 36.815881 ], [ -82.815628, 36.935074 ], [ -82.709198, 37.040380 ], [ -82.685165, 37.121454 ], [ -82.372742, 37.238529 ], [ -81.973114, 37.536410 ] ], [ [ -82.589035, 38.415938 ], [ -82.341156, 38.441220 ], [ -82.210693, 38.579842 ], [ -82.194901, 38.801725 ], [ -82.159195, 38.856820 ] ], [ [ -82.589035, 38.415938 ], [ -82.775803, 38.511639 ], [ -82.855453, 38.651735 ], [ -83.044968, 38.634573 ], [ -83.259201, 38.579842 ], [ -83.434982, 38.637255 ], [ -83.673248, 38.609359 ], [ -83.827057, 38.690333 ], [ -84.039230, 38.761044 ], [ -84.151840, 38.856820 ] ], [ [ -82.589035, 38.415938 ], [ -82.570496, 38.320650 ], [ -82.580795, 38.113490 ], [ -82.462006, 37.957192 ], [ -82.413940, 37.805444 ], [ -82.267685, 37.675669 ], [ -82.167435, 37.554921 ], [ -81.973114, 37.536410 ], [ -81.928482, 37.366337 ], [ -81.815872, 37.275692 ], [ -81.664124, 37.195331 ], [ -81.518555, 37.251101 ] ], [ [ -81.679916, 36.585760 ], [ -81.518555, 36.581901 ] ], [ [ -81.679916, 36.585760 ], [ -81.685410, 36.562600 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -83.673935, 36.600094 ], [ -84.350281, 36.567564 ], [ -84.418945, 36.571424 ] ], [ [ -82.589035, 38.415938 ], [ -82.775803, 38.511639 ], [ -82.855453, 38.651735 ], [ -83.044968, 38.634573 ], [ -83.259201, 38.579842 ], [ -83.434982, 38.637255 ], [ -83.673248, 38.609359 ], [ -83.827057, 38.690333 ], [ -84.039230, 38.761044 ], [ -84.151840, 38.856820 ] ], [ [ -82.589035, 38.415938 ], [ -82.570496, 38.320650 ], [ -82.580795, 38.113490 ], [ -82.462006, 37.957192 ], [ -82.413940, 37.805444 ], [ -82.267685, 37.675669 ], [ -82.167435, 37.554921 ], [ -81.973114, 37.536410 ] ], [ [ -83.673935, 36.600094 ], [ -83.384857, 36.656852 ], [ -83.178864, 36.718522 ], [ -83.089600, 36.815881 ], [ -82.815628, 36.935074 ], [ -82.709198, 37.040380 ], [ -82.685165, 37.121454 ], [ -82.372742, 37.238529 ], [ -81.973114, 37.536410 ] ], [ [ -82.589035, 38.415938 ], [ -82.341156, 38.441220 ], [ -82.210693, 38.579842 ], [ -82.194901, 38.801725 ], [ -82.159195, 38.856820 ] ], [ [ -81.973114, 37.536410 ], [ -81.928482, 37.366337 ], [ -81.815872, 37.275692 ], [ -81.664124, 37.195331 ], [ -81.518555, 37.251101 ] ], [ [ -81.679916, 36.585760 ], [ -81.685410, 36.562600 ] ], [ [ -83.673935, 36.600094 ], [ -82.186661, 36.566461 ], [ -81.679916, 36.585760 ], [ -81.518555, 36.581901 ] ] ] } }
] }
] }
,
@ -1050,13 +1050,13 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 35, "y": 49 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -80.783157, 36.562600 ], [ -81.606445, 36.584106 ] ], [ [ -78.805618, 38.856820 ], [ -78.892822, 38.780317 ], [ -78.965607, 38.822056 ], [ -79.175034, 38.555683 ], [ -79.223099, 38.464880 ], [ -79.366608, 38.426160 ], [ -79.515610, 38.497668 ], [ -79.648132, 38.575011 ], [ -79.744263, 38.357273 ], [ -79.915237, 38.179910 ], [ -79.964676, 38.031867 ], [ -80.157623, 37.901407 ], [ -80.293579, 37.728366 ], [ -80.277100, 37.610968 ], [ -80.298386, 37.519529 ], [ -80.457001, 37.442155 ], [ -80.596390, 37.456328 ], [ -80.720673, 37.383253 ], [ -80.833282, 37.418709 ], [ -80.855255, 37.329219 ], [ -81.228104, 37.245635 ], [ -81.348267, 37.316114 ], [ -81.606445, 37.217753 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -78.805618, 38.856820 ], [ -78.892822, 38.780317 ], [ -78.965607, 38.822056 ], [ -79.175034, 38.555683 ], [ -79.223099, 38.464880 ], [ -79.366608, 38.426160 ], [ -79.515610, 38.497668 ], [ -79.648132, 38.575011 ], [ -79.744263, 38.357273 ], [ -79.915237, 38.179910 ], [ -79.964676, 38.031867 ], [ -80.157623, 37.901407 ], [ -80.293579, 37.728366 ], [ -80.277100, 37.610968 ], [ -80.298386, 37.519529 ], [ -80.457001, 37.442155 ], [ -80.596390, 37.456328 ], [ -80.720673, 37.383253 ], [ -80.833282, 37.418709 ], [ -80.855255, 37.329219 ], [ -81.228104, 37.245635 ], [ -81.348267, 37.316114 ], [ -81.606445, 37.217753 ] ], [ [ -80.783157, 36.562600 ], [ -81.606445, 36.584106 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 35, "y": 48 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -80.519485, 40.641573 ], [ -80.658188, 40.591014 ], [ -80.615616, 40.464189 ], [ -80.662308, 40.233936 ], [ -80.765305, 39.973437 ], [ -80.862122, 39.757880 ], [ -80.879288, 39.654341 ], [ -81.151199, 39.426647 ], [ -81.266556, 39.377834 ], [ -81.401138, 39.349697 ], [ -81.522675, 39.371995 ], [ -81.606445, 39.307206 ] ], [ [ -80.519485, 40.641573 ], [ -80.519485, 41.013066 ] ], [ [ -80.519485, 40.641573 ], [ -80.519485, 39.720920 ], [ -79.477844, 39.720920 ], [ -79.486084, 39.213635 ], [ -79.332962, 39.302956 ], [ -79.161301, 39.418690 ], [ -78.963547, 39.457933 ], [ -78.829651, 39.562824 ], [ -78.706055, 39.546941 ] ], [ [ -79.477844, 39.720920 ], [ -78.706055, 39.720920 ] ], [ [ -78.706055, 38.935912 ], [ -78.745193, 38.909202 ], [ -78.883896, 38.788345 ] ], [ [ -78.907242, 38.788345 ], [ -78.965607, 38.822056 ], [ -78.992386, 38.788345 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -80.519485, 40.641573 ], [ -80.519485, 41.013066 ] ], [ [ -80.519485, 40.641573 ], [ -80.658188, 40.591014 ], [ -80.615616, 40.464189 ], [ -80.662308, 40.233936 ], [ -80.765305, 39.973437 ], [ -80.862122, 39.757880 ], [ -80.879288, 39.654341 ], [ -81.151199, 39.426647 ], [ -81.266556, 39.377834 ], [ -81.401138, 39.349697 ], [ -81.522675, 39.371995 ], [ -81.606445, 39.307206 ] ], [ [ -80.519485, 40.641573 ], [ -80.519485, 39.720920 ], [ -79.477844, 39.720920 ] ], [ [ -78.706055, 38.935912 ], [ -78.745193, 38.909202 ], [ -78.883896, 38.788345 ] ], [ [ -78.907242, 38.788345 ], [ -78.965607, 38.822056 ], [ -78.992386, 38.788345 ] ], [ [ -79.477844, 39.720920 ], [ -79.486084, 39.213635 ], [ -79.332962, 39.302956 ], [ -79.161301, 39.418690 ], [ -78.963547, 39.457933 ], [ -78.829651, 39.562824 ], [ -78.706055, 39.546941 ] ], [ [ -79.477844, 39.720920 ], [ -78.706055, 39.720920 ] ] ] } }
] }
] }
,
@ -1080,13 +1080,13 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 36, "y": 49 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -77.041626, 38.789951 ], [ -76.944122, 38.856820 ] ], [ [ -77.041626, 38.789951 ], [ -77.036819, 38.848799 ], [ -77.045059, 38.856820 ] ], [ [ -77.041626, 38.789951 ], [ -77.059479, 38.709089 ], [ -77.229767, 38.614724 ], [ -77.343750, 38.391724 ], [ -77.211227, 38.337348 ], [ -77.048492, 38.380960 ], [ -76.990128, 38.239798 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -77.041626, 38.789951 ], [ -77.036819, 38.848799 ], [ -77.045059, 38.856820 ] ], [ [ -77.041626, 38.789951 ], [ -76.944122, 38.856820 ] ], [ [ -77.041626, 38.789951 ], [ -77.059479, 38.709089 ], [ -77.229767, 38.614724 ], [ -77.343750, 38.391724 ], [ -77.211227, 38.337348 ], [ -77.048492, 38.380960 ], [ -76.990128, 38.239798 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 36, "y": 48 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -77.723465, 39.322612 ], [ -77.835388, 39.134854 ], [ -78.346252, 39.405958 ], [ -78.424530, 39.139647 ], [ -78.549500, 39.039986 ], [ -78.745193, 38.909202 ], [ -78.793945, 38.866979 ] ], [ [ -77.723465, 39.322612 ], [ -77.801743, 39.449980 ], [ -77.923965, 39.592990 ], [ -78.232956, 39.672313 ], [ -78.425217, 39.596694 ], [ -78.534393, 39.522581 ], [ -78.793945, 39.558059 ] ], [ [ -77.723465, 39.322612 ], [ -77.576523, 39.288608 ], [ -77.444000, 39.213635 ], [ -77.517471, 39.106087 ], [ -77.305984, 39.045853 ], [ -77.119904, 38.934310 ], [ -77.036819, 38.848799 ], [ -77.041626, 38.789951 ] ], [ [ -77.119904, 38.934310 ], [ -77.038879, 38.982364 ], [ -76.911850, 38.878740 ], [ -77.041626, 38.789951 ], [ -77.042313, 38.788345 ] ], [ [ -75.893555, 39.723560 ], [ -76.668777, 39.720920 ], [ -77.523651, 39.725673 ], [ -78.550186, 39.719863 ], [ -78.793945, 39.720392 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -77.723465, 39.322612 ], [ -77.835388, 39.134854 ], [ -78.346252, 39.405958 ], [ -78.424530, 39.139647 ], [ -78.549500, 39.039986 ], [ -78.745193, 38.909202 ], [ -78.793945, 38.866979 ] ], [ [ -77.723465, 39.322612 ], [ -77.801743, 39.449980 ], [ -77.923965, 39.592990 ], [ -78.232956, 39.672313 ], [ -78.425217, 39.596694 ], [ -78.534393, 39.522581 ], [ -78.793945, 39.558059 ] ], [ [ -75.893555, 39.723560 ], [ -76.668777, 39.720920 ], [ -77.523651, 39.725673 ], [ -78.550186, 39.719863 ], [ -78.793945, 39.720392 ] ], [ [ -77.723465, 39.322612 ], [ -77.576523, 39.288608 ], [ -77.444000, 39.213635 ], [ -77.517471, 39.106087 ], [ -77.305984, 39.045853 ], [ -77.119904, 38.934310 ], [ -77.036819, 38.848799 ], [ -77.041626, 38.789951 ] ], [ [ -77.119904, 38.934310 ], [ -77.038879, 38.982364 ], [ -76.911850, 38.878740 ], [ -77.041626, 38.789951 ], [ -77.042313, 38.788345 ] ] ] } }
] }
] }
,
@ -1104,19 +1104,19 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 37, "y": 49 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -75.688248, 37.932284 ], [ -75.609970, 38.000491 ], [ -75.377884, 38.015640 ] ], [ [ -75.048981, 38.449287 ], [ -75.715027, 38.449825 ], [ -75.738373, 38.856820 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -75.048981, 38.449287 ], [ -75.715027, 38.449825 ], [ -75.738373, 38.856820 ] ], [ [ -75.688248, 37.932284 ], [ -75.609970, 38.000491 ], [ -75.377884, 38.015640 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 37, "y": 48 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -75.787811, 39.723560 ], [ -75.981445, 39.723032 ] ], [ [ -75.787811, 39.723560 ], [ -75.734253, 38.788345 ] ], [ [ -75.787811, 39.723560 ], [ -75.710907, 39.802734 ], [ -75.621643, 39.847558 ], [ -75.406036, 39.795876 ], [ -75.201416, 39.887085 ], [ -75.129318, 39.949753 ], [ -74.892426, 40.082274 ], [ -74.763336, 40.190939 ], [ -75.078506, 40.449560 ], [ -75.095673, 40.555548 ], [ -75.204163, 40.586842 ], [ -75.199356, 40.747777 ], [ -75.082626, 40.869911 ], [ -75.136185, 41.000112 ], [ -75.113525, 41.013066 ] ], [ [ -75.406036, 39.795876 ], [ -75.554352, 39.691337 ], [ -75.528259, 39.498742 ] ], [ [ -73.913269, 40.960197 ], [ -74.016266, 41.013066 ] ], [ [ -73.665390, 41.013066 ], [ -73.657150, 40.985082 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -73.913269, 40.960197 ], [ -74.016266, 41.013066 ] ], [ [ -73.665390, 41.013066 ], [ -73.657150, 40.985082 ] ], [ [ -75.787811, 39.723560 ], [ -75.981445, 39.723032 ] ], [ [ -75.406036, 39.795876 ], [ -75.201416, 39.887085 ], [ -75.129318, 39.949753 ], [ -74.892426, 40.082274 ], [ -74.763336, 40.190939 ], [ -75.078506, 40.449560 ], [ -75.095673, 40.555548 ], [ -75.204163, 40.586842 ], [ -75.199356, 40.747777 ], [ -75.082626, 40.869911 ], [ -75.136185, 41.000112 ], [ -75.113525, 41.013066 ] ], [ [ -75.787811, 39.723560 ], [ -75.710907, 39.802734 ], [ -75.621643, 39.847558 ], [ -75.406036, 39.795876 ], [ -75.554352, 39.691337 ], [ -75.528259, 39.498742 ] ], [ [ -75.787811, 39.723560 ], [ -75.734253, 38.788345 ] ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 37, "y": 47 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -74.679565, 41.355680 ], [ -74.840927, 41.426768 ], [ -75.011215, 41.495721 ], [ -75.075760, 41.641618 ], [ -75.048981, 41.751336 ], [ -75.168457, 41.841943 ], [ -75.386124, 41.999305 ], [ -75.981445, 42.000325 ] ], [ [ -74.679565, 41.355680 ], [ -73.913269, 40.960197 ] ], [ [ -74.679565, 41.355680 ], [ -74.801788, 41.311855 ], [ -74.976196, 41.088150 ], [ -75.136185, 41.000112 ], [ -75.114899, 40.946714 ] ], [ [ -73.282242, 42.743987 ], [ -73.264389, 43.100983 ] ], [ [ -73.282242, 42.743987 ], [ -73.081055, 42.740457 ] ], [ [ -73.282242, 42.743987 ], [ -73.498535, 42.054901 ], [ -73.081055, 42.045213 ] ], [ [ -73.498535, 42.054901 ], [ -73.554153, 41.290190 ], [ -73.475189, 41.205006 ], [ -73.692856, 41.107813 ], [ -73.657150, 40.985082 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -74.679565, 41.355680 ], [ -74.840927, 41.426768 ], [ -75.011215, 41.495721 ], [ -75.075760, 41.641618 ], [ -75.048981, 41.751336 ], [ -75.168457, 41.841943 ], [ -75.386124, 41.999305 ], [ -75.981445, 42.000325 ] ], [ [ -73.282242, 42.743987 ], [ -73.264389, 43.100983 ] ], [ [ -73.282242, 42.743987 ], [ -73.498535, 42.054901 ] ], [ [ -74.679565, 41.355680 ], [ -73.913269, 40.960197 ] ], [ [ -73.498535, 42.054901 ], [ -73.554153, 41.290190 ], [ -73.475189, 41.205006 ], [ -73.692856, 41.107813 ], [ -73.657150, 40.985082 ] ], [ [ -73.282242, 42.743987 ], [ -73.081055, 42.740457 ] ], [ [ -73.498535, 42.054901 ], [ -73.081055, 42.045213 ] ], [ [ -74.679565, 41.355680 ], [ -74.801788, 41.311855 ], [ -74.976196, 41.088150 ], [ -75.136185, 41.000112 ], [ -75.114899, 40.946714 ] ] ] } }
] }
] }
,
@ -1128,7 +1128,7 @@
,
{ "type": "FeatureCollection", "properties": { "zoom": 7, "x": 38, "y": 47 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "countries", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -72.457581, 42.727344 ], [ -73.168945, 42.742474 ] ], [ [ -72.457581, 42.727344 ], [ -72.537918, 42.831164 ], [ -72.458954, 42.960945 ], [ -72.446594, 43.100983 ] ], [ [ -72.457581, 42.727344 ], [ -71.249084, 42.718264 ], [ -71.146088, 42.816559 ], [ -70.933914, 42.884518 ], [ -70.815125, 42.865396 ] ], [ [ -71.801147, 42.013591 ], [ -73.168945, 42.047253 ] ], [ [ -71.801147, 42.013591 ], [ -71.379547, 42.024814 ], [ -71.305389, 41.762605 ], [ -71.148148, 41.647775 ], [ -71.120682, 41.494692 ] ], [ [ -71.801147, 42.013591 ], [ -71.793594, 41.466914 ], [ -71.854019, 41.320107 ] ], [ [ -70.815125, 42.865396 ], [ -70.646210, 43.090454 ] ], [ [ -70.758133, 43.100983 ], [ -70.751266, 43.080424 ], [ -70.646210, 43.090454 ] ] ] } }
{ "type": "Feature", "properties": { "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ -72.457581, 42.727344 ], [ -72.537918, 42.831164 ], [ -72.458954, 42.960945 ], [ -72.446594, 43.100983 ] ], [ [ -70.758133, 43.100983 ], [ -70.751266, 43.080424 ], [ -70.646210, 43.090454 ] ], [ [ -72.457581, 42.727344 ], [ -73.168945, 42.742474 ] ], [ [ -71.801147, 42.013591 ], [ -73.168945, 42.047253 ] ], [ [ -71.801147, 42.013591 ], [ -71.793594, 41.466914 ], [ -71.854019, 41.320107 ] ], [ [ -72.457581, 42.727344 ], [ -71.249084, 42.718264 ], [ -71.146088, 42.816559 ], [ -70.933914, 42.884518 ], [ -70.815125, 42.865396 ], [ -70.646210, 43.090454 ] ], [ [ -71.801147, 42.013591 ], [ -71.379547, 42.024814 ], [ -71.305389, 41.762605 ], [ -71.148148, 41.647775 ], [ -71.120682, 41.494692 ] ] ] } }
] }
] }
,

View File

@ -1,6 +1,6 @@
{ "type": "FeatureCollection", "properties": {
"bounds": "-124.213807,29.689480,-70.645734,49.005639",
"center": "-95.625000,44.951199,5",
"center": "-84.375000,36.466030,5",
"description": "tests/ne_110m_admin_1_states_provinces_lines/out/-z5_-M500_--drop-smallest-as-needed.json.check.mbtiles",
"format": "pbf",
"json": "{\"vector_layers\": [ { \"id\": \"in\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 5, \"fields\": {\"adm0_a3\": \"String\", \"adm0_name\": \"String\", \"featurecla\": \"String\", \"mapcolor13\": \"Number\", \"mapcolor9\": \"Number\", \"scalerank\": \"Number\"} } ],\"tilestats\": {\"layerCount\": 1,\"layers\": [{\"layer\": \"in\",\"count\": 110,\"geometry\": \"LineString\",\"attributeCount\": 6,\"attributes\": [{\"attribute\": \"adm0_a3\",\"count\": 1,\"type\": \"string\",\"values\": [\"USA\"]},{\"attribute\": \"adm0_name\",\"count\": 1,\"type\": \"string\",\"values\": [\"United States of America\"]},{\"attribute\": \"featurecla\",\"count\": 1,\"type\": \"string\",\"values\": [\"Admin-1 boundary\"]},{\"attribute\": \"mapcolor13\",\"count\": 1,\"type\": \"number\",\"values\": [1],\"min\": 1,\"max\": 1},{\"attribute\": \"mapcolor9\",\"count\": 1,\"type\": \"number\",\"values\": [1],\"min\": 1,\"max\": 1},{\"attribute\": \"scalerank\",\"count\": 1,\"type\": \"number\",\"values\": [2],\"min\": 2,\"max\": 2}]}]}}",
@ -24,8 +24,6 @@
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -96.503906, 42.553080 ], [ -97.294922, 42.875964 ], [ -97.998047, 42.811522 ], [ -98.613281, 43.004647 ], [ -104.062500, 43.004647 ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -91.230469, 43.516689 ], [ -91.318359, 43.961191 ], [ -92.812500, 44.777936 ], [ -92.724609, 45.521744 ], [ -92.900391, 45.706179 ], [ -92.812500, 45.890008 ], [ -92.285156, 46.134170 ], [ -92.285156, 46.679594 ], [ -92.021484, 46.739861 ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -120.058594, 42.032974 ], [ -120.058594, 39.027719 ], [ -114.697266, 35.101934 ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -114.082031, 37.020098 ], [ -114.082031, 42.032974 ] ] } }
@ -42,8 +40,6 @@
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -94.482422, 33.651208 ], [ -95.273438, 33.943360 ], [ -96.328125, 33.797409 ], [ -96.855469, 33.797409 ], [ -97.031250, 33.943360 ], [ -97.119141, 33.797409 ], [ -97.734375, 34.016242 ], [ -97.998047, 33.943360 ], [ -98.173828, 34.161818 ], [ -99.228516, 34.307144 ], [ -99.404297, 34.452218 ], [ -99.667969, 34.379713 ], [ -100.019531, 34.597042 ], [ -100.019531, 36.527295 ], [ -103.007812, 36.527295 ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -74.707031, 41.376809 ], [ -75.058594, 41.508577 ], [ -75.058594, 41.771312 ], [ -75.410156, 42.032974 ], [ -79.804688, 42.032974 ], [ -79.804688, 42.293564 ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -83.759766, 36.668419 ], [ -88.154297, 36.668419 ], [ -88.154297, 36.527295 ], [ -89.560547, 36.527295 ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -77.783203, 39.368279 ], [ -77.871094, 39.164141 ], [ -78.398438, 39.436193 ], [ -78.486328, 39.164141 ], [ -79.013672, 38.822591 ], [ -79.277344, 38.479395 ], [ -79.453125, 38.479395 ], [ -79.716797, 38.616870 ], [ -80.332031, 37.788081 ], [ -80.332031, 37.579413 ], [ -80.507812, 37.509726 ], [ -81.738281, 37.230328 ], [ -82.001953, 37.370157 ], [ -82.001953, 37.579413 ] ] } }
@ -132,12 +128,6 @@
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -94.482422, 33.642063 ], [ -94.910889, 33.833920 ], [ -95.196533, 33.943360 ], [ -95.427246, 33.870416 ], [ -95.987549, 33.879537 ], [ -96.152344, 33.806538 ], [ -96.317139, 33.760882 ], [ -96.470947, 33.806538 ], [ -96.800537, 33.751748 ], [ -96.954346, 33.925130 ], [ -97.108154, 33.779147 ], [ -97.382812, 33.843045 ], [ -97.657471, 33.998027 ], [ -97.965088, 33.897777 ], [ -98.096924, 34.134542 ], [ -98.558350, 34.116352 ], [ -99.195557, 34.243595 ], [ -99.338379, 34.443159 ], [ -99.602051, 34.379713 ], [ -100.008545, 34.569906 ], [ -100.008545, 36.500805 ], [ -103.007812, 36.500805 ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -91.439209, 40.371659 ], [ -91.527100, 40.120090 ], [ -91.428223, 39.825413 ], [ -91.263428, 39.622615 ], [ -91.076660, 39.453161 ], [ -90.758057, 39.266284 ], [ -90.670166, 39.078908 ], [ -90.659180, 38.908133 ], [ -90.538330, 38.873929 ], [ -90.351562, 38.933776 ], [ -90.164795, 38.771216 ], [ -90.219727, 38.591114 ], [ -90.307617, 38.444985 ], [ -90.373535, 38.264063 ], [ -90.230713, 38.117272 ], [ -90.032959, 37.978845 ], [ -90.000000, 37.978845 ], [ -89.923096, 37.970185 ], [ -89.659424, 37.753344 ], [ -89.560547, 37.727280 ], [ -89.483643, 37.483577 ], [ -89.516602, 37.335224 ], [ -89.395752, 37.081476 ], [ -89.285889, 37.107765 ], [ -89.121094, 36.976227 ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -94.636230, 36.544949 ], [ -93.416748, 36.527295 ], [ -91.252441, 36.527295 ], [ -90.120850, 36.465472 ], [ -90.032959, 36.341678 ], [ -90.263672, 36.129002 ], [ -90.318604, 36.031332 ], [ -90.000000, 36.031332 ], [ -89.670410, 36.031332 ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -91.164551, 33.017876 ], [ -91.087646, 32.953368 ], [ -91.186523, 32.814978 ], [ -91.032715, 32.611616 ], [ -91.076660, 32.481963 ], [ -90.944824, 32.314991 ], [ -91.087646, 32.212801 ], [ -91.131592, 32.017392 ], [ -91.329346, 31.868228 ], [ -91.505127, 31.409912 ], [ -91.625977, 31.297328 ], [ -91.593018, 31.052934 ], [ -90.703125, 31.024694 ], [ -90.000000, 31.024694 ], [ -89.769287, 31.015279 ], [ -89.791260, 30.855079 ], [ -89.857178, 30.685164 ], [ -89.791260, 30.562261 ], [ -89.659424, 30.448674 ], [ -89.615479, 30.183122 ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -89.121094, 36.509636 ], [ -89.505615, 36.509636 ] ] } }
] }
] }
@ -161,40 +151,22 @@
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -120.003662, 42.000325 ], [ -120.003662, 40.979898 ], [ -120.003662, 40.313043 ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -114.038086, 40.313043 ], [ -114.038086, 40.979898 ], [ -114.038086, 42.000325 ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -91.439209, 40.371659 ], [ -91.461182, 40.313043 ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 3, "x": 2, "y": 3 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -90.878906, 39.334297 ], [ -90.758057, 39.266284 ], [ -90.670166, 39.078908 ], [ -90.659180, 38.908133 ], [ -90.538330, 38.873929 ], [ -90.351562, 38.933776 ], [ -90.164795, 38.771216 ], [ -90.219727, 38.591114 ], [ -90.307617, 38.444985 ], [ -90.373535, 38.264063 ], [ -90.230713, 38.117272 ], [ -90.032959, 37.978845 ], [ -90.000000, 37.978845 ], [ -89.923096, 37.970185 ], [ -89.659424, 37.753344 ], [ -89.560547, 37.727280 ], [ -89.483643, 37.483577 ], [ -89.516602, 37.335224 ], [ -89.395752, 37.081476 ], [ -89.285889, 37.107765 ], [ -89.110107, 36.958671 ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -90.878906, 36.509636 ], [ -90.120850, 36.465472 ], [ -90.032959, 36.341678 ], [ -90.263672, 36.129002 ], [ -90.318604, 36.031332 ], [ -90.000000, 36.031332 ], [ -89.670410, 36.031332 ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -90.878906, 31.024694 ], [ -90.000000, 31.024694 ], [ -89.769287, 31.015279 ], [ -89.791260, 30.855079 ], [ -89.857178, 30.685164 ], [ -89.791260, 30.562261 ], [ -89.659424, 30.448674 ], [ -89.615479, 30.183122 ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -74.685059, 41.360319 ], [ -75.014648, 41.500350 ], [ -75.080566, 41.640078 ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -87.528076, 41.640078 ], [ -87.528076, 40.979898 ], [ -87.539062, 39.393755 ], [ -87.648926, 39.121537 ], [ -87.561035, 39.044786 ], [ -87.517090, 38.873929 ], [ -87.517090, 38.736946 ], [ -87.604980, 38.676933 ], [ -87.681885, 38.513788 ], [ -87.879639, 38.298559 ], [ -88.022461, 38.022131 ], [ -88.055420, 37.822802 ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -88.176270, 35.003003 ], [ -88.099365, 34.813803 ], [ -88.275146, 33.513919 ], [ -88.450928, 31.914868 ], [ -88.417969, 30.391830 ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -83.682861, 36.606709 ], [ -84.353027, 36.571424 ], [ -85.231934, 36.615528 ], [ -85.528564, 36.597889 ], [ -86.099854, 36.633162 ], [ -86.682129, 36.641978 ], [ -87.220459, 36.641978 ], [ -87.846680, 36.615528 ], [ -87.879639, 36.659606 ], [ -88.077393, 36.659606 ], [ -88.077393, 36.500805 ], [ -89.505615, 36.509636 ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -77.728271, 39.325799 ], [ -77.838135, 39.138582 ], [ -78.354492, 39.410733 ], [ -78.431396, 39.147103 ], [ -78.552246, 39.044786 ], [ -78.750000, 38.916682 ], [ -78.892822, 38.788345 ], [ -78.969727, 38.822591 ], [ -79.178467, 38.556757 ], [ -79.233398, 38.470794 ], [ -79.376221, 38.427774 ], [ -79.650879, 38.582526 ], [ -79.749756, 38.358888 ], [ -79.925537, 38.186387 ], [ -79.969482, 38.039439 ], [ -80.167236, 37.909534 ], [ -80.299072, 37.735969 ], [ -80.277100, 37.614231 ], [ -80.299072, 37.527154 ], [ -80.463867, 37.448697 ], [ -80.606689, 37.457418 ], [ -80.727539, 37.387617 ], [ -80.837402, 37.422526 ], [ -80.859375, 37.335224 ], [ -81.232910, 37.247821 ], [ -81.353760, 37.317752 ], [ -81.672363, 37.195331 ], [ -81.826172, 37.282795 ], [ -81.936035, 37.370157 ], [ -81.979980, 37.544577 ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -83.078613, 34.985003 ], [ -82.441406, 35.182788 ], [ -81.518555, 35.173808 ], [ -81.046143, 35.128894 ], [ -81.046143, 35.038992 ], [ -80.947266, 35.110922 ], [ -80.782471, 34.939985 ], [ -80.793457, 34.822823 ], [ -79.672852, 34.813803 ], [ -78.563232, 33.870416 ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -81.683350, 36.589068 ], [ -80.002441, 36.544949 ], [ -75.871582, 36.553775 ] ] } }
] }
] }
,
{ "type": "FeatureCollection", "properties": { "zoom": 3, "x": 2, "y": 2 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -74.685059, 41.360319 ], [ -75.014648, 41.500350 ], [ -75.080566, 41.648288 ], [ -75.058594, 41.754922 ], [ -75.388184, 42.000325 ], [ -79.760742, 42.000325 ], [ -79.760742, 42.244785 ] ] } }
,
{ "type": "Feature", "properties": { "scalerank": 2, "featurecla": "Admin-1 boundary", "adm0_a3": "USA", "adm0_name": "United States of America", "mapcolor9": 1, "mapcolor13": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ -87.528076, 41.713930 ], [ -87.528076, 40.979898 ], [ -87.539062, 40.313043 ] ] } }
] }
] }
,

View File

@ -0,0 +1,13 @@
{ "type": "FeatureCollection", "properties": {
"bounds": "-180.000000,0.800000,180.000000,1.000000",
"center": "-179.989014,1.000000,14",
"description": "tests/onefeature/-zg_--drop-densest-as-needed.json.check.mbtiles",
"format": "pbf",
"json": "{\"vector_layers\": [ { \"id\": \"in\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 14, \"fields\": {} } ],\"tilestats\": {\"layerCount\": 1,\"layers\": [{\"layer\": \"in\",\"count\": 1,\"geometry\": \"LineString\",\"attributeCount\": 0,\"attributes\": []}]}}",
"maxzoom": "14",
"minzoom": "0",
"name": "tests/onefeature/-zg_--drop-densest-as-needed.json.check.mbtiles",
"type": "overlay",
"version": "2"
}, "features": [
] }

1
tests/onefeature/in.json Normal file
View File

@ -0,0 +1 @@
{"":"","":[{"":"","":{"":[]},"":{"":""}},{"":"","type":"LineString","coordinates":[[1000,0.8],[900,1]]}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -8,5 +8,5 @@
"bounds": "-122.682427,45.512331,-122.654961,45.569975",
"type": "overlay",
"format": "pbf",
"json": "{\"vector_layers\": [ { \"id\": \"hackspotsgeojson\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 14, \"fields\": {\"Address\": \"String\", \"Name\": \"String\", \"Notes\": \"String\"} } ],\"tilestats\": {\"layerCount\": 1,\"layers\": [{\"layer\": \"hackspotsgeojson\",\"count\": 4,\"geometry\": \"Point\",\"attributeCount\": 3,\"attributes\": [{\"attribute\": \"Address\",\"count\": 4,\"type\": \"string\",\"values\": [\"1507 N Rosa Parks Way Portland, OR 97217\",\"201 SE 12th Ave, Portland, OR 97214\",\"4637 N Albina Ave Portland, OR 97217\",\"915 SE Hawthorne Blvd. Portland, OR 97214\"]},{\"attribute\": \"Name\",\"count\": 4,\"type\": \"string\",\"values\": [\"Albina Press\",\"Arbor Lodge\",\"Lucky Labrador Brew Pub\",\"Three Friends Coffeehouse\"]},{\"attribute\": \"Notes\",\"count\": 3,\"type\": \"string\",\"values\": [\"\",\"Dog friendly\",\"usually busy, outlets on side wall only\"]}]}]}}"
"json": "{\"vector_layers\": [ { \"id\": \"hackspots\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 14, \"fields\": {\"Address\": \"String\", \"Name\": \"String\", \"Notes\": \"String\"} } ],\"tilestats\": {\"layerCount\": 1,\"layers\": [{\"layer\": \"hackspots\",\"count\": 4,\"geometry\": \"Point\",\"attributeCount\": 3,\"attributes\": [{\"attribute\": \"Address\",\"count\": 4,\"type\": \"string\",\"values\": [\"1507 N Rosa Parks Way Portland, OR 97217\",\"201 SE 12th Ave, Portland, OR 97214\",\"4637 N Albina Ave Portland, OR 97217\",\"915 SE Hawthorne Blvd. Portland, OR 97214\"]},{\"attribute\": \"Name\",\"count\": 4,\"type\": \"string\",\"values\": [\"Albina Press\",\"Arbor Lodge\",\"Lucky Labrador Brew Pub\",\"Three Friends Coffeehouse\"]},{\"attribute\": \"Notes\",\"count\": 3,\"type\": \"string\",\"values\": [\"\",\"Dog friendly\",\"usually busy, outlets on side wall only\"]}]}]}}"
}

View File

@ -326,12 +326,12 @@ struct reader {
long long x = 0;
long long sorty = 0;
long long y = 0;
int pbf_count = 0;
int z_flag = 0;
std::string data = "";
std::vector<std::string> pbf_path{};
std::vector<std::string> large_zoom{};
std::vector<zxy> dirtiles;
std::string dirbase;
sqlite3 *db = NULL;
sqlite3_stmt *stmt = NULL;
@ -367,165 +367,29 @@ struct reader {
}
};
std::vector<std::string> split_slash(std::string pbf_path) {
std::vector<std::string> path_parts;
std::string path(pbf_path);
std::istringstream iss(path);
std::string token;
while (std::getline(iss, token, '/')) {
path_parts.push_back(token);
}
return path_parts;
}
int filter(const struct dirent *dir) {
if (strcmp(dir->d_name, ".") == 0 || strcmp(dir->d_name, "..") == 0 || strcmp(dir->d_name, ".DS_Store") == 0 || strcmp(dir->d_name, "metadata.json") == 0) {
return 0;
} else {
return 1;
}
}
// Recursively walk through a specified directory and its subdirectories,
// using alphasort function and integer variable zoom_range to handle input in numerical order.
// Store the path of all pbf files in a pbf_path vector member of reader struct,
// with the help of a large_zoom vector and two integer members pbf_count and z_flag
// to ensure the tiles order in pbf_path to be the same as in mbtiles.
struct reader *read_dir(struct reader *readers, const char *name, int level, int zoom_range) {
struct dirent **namelist;
struct stat buf;
std::string path;
int i = 0;
int n = scandir(name, &namelist, filter, alphasort);
std::vector<std::string> path_parts1, path_parts2;
readers->pbf_count = 0;
if (n > 0) {
while (i < n) {
path = std::string(name) + "/" + std::string(namelist[i]->d_name);
if (stat(path.c_str(), &buf) == 0 && S_ISDIR(buf.st_mode)) {
if (level == 0) {
if (std::stoi(namelist[i]->d_name) <= 9) {
zoom_range = 0;
} else {
zoom_range = 1;
}
if (readers->pbf_count > 0) {
if (readers->z_flag == 0) {
std::sort(readers->pbf_path.end() - (readers->pbf_count + 1), readers->pbf_path.end(), std::greater<std::string>());
} else {
std::sort(readers->large_zoom.end() - (readers->pbf_count + 1), readers->large_zoom.end(), std::greater<std::string>());
}
readers->pbf_count = 0;
}
}
if (level == 1 && readers->pbf_count > 0) {
if (zoom_range == 0) {
std::sort(readers->pbf_path.end() - (readers->pbf_count + 1), readers->pbf_path.end(), std::greater<std::string>());
} else {
std::sort(readers->large_zoom.end() - (readers->pbf_count + 1), readers->large_zoom.end(), std::greater<std::string>());
}
readers->pbf_count = 0;
}
read_dir(readers, path.c_str(), level + 1, zoom_range);
} else {
if (level == 0) {
fprintf(stderr, "ERROR: Directory structure in '%s' should be zoom/x/y\n", name);
exit(EXIT_FAILURE);
}
if (level == 1) {
fprintf(stderr, "ERROR: Directory structure in '%s' should be zoom/x/y\n", split_slash(name)[0].c_str());
exit(EXIT_FAILURE);
}
if (zoom_range == 0) {
readers->pbf_path.push_back(path);
if (readers->pbf_path.size() > 1) {
path_parts1 = split_slash(readers->pbf_path[readers->pbf_path.size() - 1]);
path_parts2 = split_slash(readers->pbf_path[readers->pbf_path.size() - 2]);
int p1 = path_parts1.size();
int p2 = path_parts2.size();
if (std::stoll(path_parts1[p1 - 3]) == std::stoll(path_parts2[p2 - 3]) && std::stoll(path_parts1[p1 - 2]) == std::stoll(path_parts2[p2 - 2])) {
readers->z_flag = 0;
readers->pbf_count++;
}
path_parts1.clear();
path_parts2.clear();
}
} else {
readers->large_zoom.push_back(path);
if (readers->large_zoom.size() > 1) {
path_parts1 = split_slash(readers->large_zoom[readers->large_zoom.size() - 1]);
path_parts2 = split_slash(readers->large_zoom[readers->large_zoom.size() - 2]);
int p1 = path_parts1.size();
int p2 = path_parts2.size();
if (std::stoll(path_parts1[p1 - 3]) == std::stoll(path_parts2[p2 - 3]) && std::stoll(path_parts1[p1 - 2]) == std::stoll(path_parts2[p2 - 2])) {
readers->z_flag = 1;
readers->pbf_count++;
}
path_parts1.clear();
path_parts2.clear();
}
}
}
free(namelist[i]);
i++;
}
if (level == 0) {
if (readers->pbf_count > 0) {
std::sort(readers->pbf_path.end() - (readers->pbf_count + 1), readers->pbf_path.end(), std::greater<std::string>());
}
readers->pbf_path.insert(std::end(readers->pbf_path), std::begin(readers->large_zoom), std::end(readers->large_zoom));
}
free(namelist);
} else if (n == 0) {
fprintf(stderr, "ERROR: Empty directory '%s'\n", name);
exit(EXIT_FAILURE);
} else {
perror("scandir");
}
return readers;
}
struct reader *begin_reading(char *fname) {
DIR *dir;
struct reader *r = new reader;
if ((dir = opendir(fname)) != NULL) {
r = read_dir(r, fname, 0, 0);
std::vector<std::string> path_parts;
path_parts = split_slash(r->pbf_path[0]);
int p = path_parts.size();
struct stat st;
if (stat(fname, &st) == 0 && (st.st_mode & S_IFDIR) != 0) {
r->db = NULL;
r->stmt = NULL;
r->next = NULL;
r->pbf_count = 0;
r->zoom = std::stoll(path_parts[p - 3]);
r->x = std::stoll(path_parts[p - 2]);
r->y = std::stoll(path_parts[p - 1].substr(0, path_parts[p - 1].find_last_of(".")));
r->sorty = (1LL << r->zoom) - 1 - r->y;
r->data = dir_read_tile(r->pbf_path[0]);
path_parts.clear();
closedir(dir);
r->dirtiles = enumerate_dirtiles(fname);
r->dirbase = fname;
if (r->dirtiles.size() == 0) {
r->zoom = 32;
} else {
r->zoom = r->dirtiles[0].z;
r->x = r->dirtiles[0].x;
r->y = r->dirtiles[0].y;
r->sorty = (1LL << r->zoom) - 1 - r->y;
r->data = dir_read_tile(r->dirbase, r->dirtiles[0]);
r->dirtiles.erase(r->dirtiles.begin());
}
} else {
sqlite3 *db;
@ -564,40 +428,6 @@ struct reader *begin_reading(char *fname) {
return r;
}
struct zxy {
long long z;
long long x;
long long y;
zxy(long long _z, long long _x, long long _y)
: z(_z),
x(_x),
y(_y) {
}
bool operator<(zxy const &other) const {
if (z < other.z) {
return true;
}
if (z > other.z) {
return false;
}
if (x < other.x) {
return true;
}
if (x > other.x) {
return false;
}
if (y < other.y) {
return true;
}
return false;
}
};
struct arg {
std::map<zxy, std::vector<std::string>> inputs{};
std::map<zxy, std::string> outputs{};
@ -775,20 +605,16 @@ void decode(struct reader *readers, std::map<std::string, layermap_entry> &layer
r->zoom = 32;
}
} else {
r->pbf_count++;
if (r->pbf_count != static_cast<int>(r->pbf_path.size())) {
std::vector<std::string> path_parts;
path_parts = split_slash(r->pbf_path[r->pbf_count]);
int p = path_parts.size();
r->zoom = std::stoll(path_parts[p - 3]);
r->x = std::stoll(path_parts[p - 2]);
r->y = std::stoll(path_parts[p - 1].substr(0, path_parts[p - 1].find_last_of(".")));
r->sorty = (1LL << r->zoom) - 1 - r->y;
r->data = dir_read_tile(r->pbf_path[r->pbf_count]);
path_parts.clear();
} else {
if (r->dirtiles.size() == 0) {
r->zoom = 32;
} else {
r->zoom = r->dirtiles[0].z;
r->x = r->dirtiles[0].x;
r->y = r->dirtiles[0].y;
r->sorty = (1LL << r->zoom) - 1 - r->y;
r->data = dir_read_tile(r->dirbase, r->dirtiles[0]);
r->dirtiles.erase(r->dirtiles.begin());
}
}
@ -816,157 +642,86 @@ void decode(struct reader *readers, std::map<std::string, layermap_entry> &layer
for (struct reader *r = readers; r != NULL; r = next) {
next = r->next;
if (r->db != NULL) {
sqlite3_finalize(r->stmt);
if (sqlite3_prepare_v2(r->db, "SELECT value from metadata where name = 'minzoom'", -1, &r->stmt, NULL) == SQLITE_OK) {
if (sqlite3_step(r->stmt) == SQLITE_ROW) {
int minz = max(sqlite3_column_int(r->stmt, 0), minzoom);
st->minzoom = min(st->minzoom, minz);
}
sqlite3_finalize(r->stmt);
}
if (sqlite3_prepare_v2(r->db, "SELECT value from metadata where name = 'maxzoom'", -1, &r->stmt, NULL) == SQLITE_OK) {
if (sqlite3_step(r->stmt) == SQLITE_ROW) {
int maxz = min(sqlite3_column_int(r->stmt, 0), maxzoom);
st->maxzoom = max(st->maxzoom, maxz);
}
sqlite3_finalize(r->stmt);
}
if (sqlite3_prepare_v2(r->db, "SELECT value from metadata where name = 'center'", -1, &r->stmt, NULL) == SQLITE_OK) {
if (sqlite3_step(r->stmt) == SQLITE_ROW) {
const unsigned char *s = sqlite3_column_text(r->stmt, 0);
if (s != NULL) {
sscanf((char *) s, "%lf,%lf", &st->midlon, &st->midlat);
}
}
sqlite3_finalize(r->stmt);
}
if (sqlite3_prepare_v2(r->db, "SELECT value from metadata where name = 'attribution'", -1, &r->stmt, NULL) == SQLITE_OK) {
if (sqlite3_step(r->stmt) == SQLITE_ROW) {
const unsigned char *s = sqlite3_column_text(r->stmt, 0);
if (s != NULL) {
attribution = std::string((char *) s);
}
}
sqlite3_finalize(r->stmt);
}
if (sqlite3_prepare_v2(r->db, "SELECT value from metadata where name = 'description'", -1, &r->stmt, NULL) == SQLITE_OK) {
if (sqlite3_step(r->stmt) == SQLITE_ROW) {
const unsigned char *s = sqlite3_column_text(r->stmt, 0);
if (s != NULL) {
description = std::string((char *) s);
}
}
sqlite3_finalize(r->stmt);
}
if (sqlite3_prepare_v2(r->db, "SELECT value from metadata where name = 'name'", -1, &r->stmt, NULL) == SQLITE_OK) {
if (sqlite3_step(r->stmt) == SQLITE_ROW) {
const unsigned char *s = sqlite3_column_text(r->stmt, 0);
if (s != NULL) {
if (name.size() == 0) {
name = std::string((char *) s);
} else {
name += " + " + std::string((char *) s);
}
}
}
sqlite3_finalize(r->stmt);
}
if (sqlite3_prepare_v2(r->db, "SELECT value from metadata where name = 'bounds'", -1, &r->stmt, NULL) == SQLITE_OK) {
if (sqlite3_step(r->stmt) == SQLITE_ROW) {
const unsigned char *s = sqlite3_column_text(r->stmt, 0);
if (s != NULL) {
if (sscanf((char *) s, "%lf,%lf,%lf,%lf", &minlon, &minlat, &maxlon, &maxlat) == 4) {
st->minlon = min(minlon, st->minlon);
st->maxlon = max(maxlon, st->maxlon);
st->minlat = min(minlat, st->minlat);
st->maxlat = max(maxlat, st->maxlat);
}
}
}
sqlite3_finalize(r->stmt);
}
if (sqlite3_close(r->db) != SQLITE_OK) {
fprintf(stderr, "Could not close database: %s\n", sqlite3_errmsg(r->db));
exit(EXIT_FAILURE);
}
sqlite3 *db = r->db;
if (db == NULL) {
db = dirmeta2tmp(r->dirbase.c_str());
} else {
std::vector<std::string> path_parts;
path_parts = split_slash(r->pbf_path[0]);
std::string metadata_path = path_parts[0];
sqlite3_finalize(r->stmt);
}
for (int i = 1; i < static_cast<int>(path_parts.size()) - 3; i++) {
metadata_path = metadata_path + "/" + path_parts[i];
if (sqlite3_prepare_v2(db, "SELECT value from metadata where name = 'minzoom'", -1, &r->stmt, NULL) == SQLITE_OK) {
if (sqlite3_step(r->stmt) == SQLITE_ROW) {
int minz = max(sqlite3_column_int(r->stmt, 0), minzoom);
st->minzoom = min(st->minzoom, minz);
}
metadata_path += "/metadata.json";
path_parts.clear();
FILE *f = fopen(metadata_path.c_str(), "r");
if (f == NULL) {
perror(metadata_path.c_str());
exit(EXIT_FAILURE);
sqlite3_finalize(r->stmt);
}
if (sqlite3_prepare_v2(db, "SELECT value from metadata where name = 'maxzoom'", -1, &r->stmt, NULL) == SQLITE_OK) {
if (sqlite3_step(r->stmt) == SQLITE_ROW) {
int maxz = min(sqlite3_column_int(r->stmt, 0), maxzoom);
st->maxzoom = max(st->maxzoom, maxz);
}
json_pull *jp = json_begin_file(f);
json_object *j, *k;
while ((j = json_read(jp)) != NULL) {
if (j->type == JSON_HASH) {
if ((k = json_hash_get(j, "minzoom")) != NULL) {
const std::string minzoom_tmp = k->string;
int minz = max(std::stoi(minzoom_tmp), minzoom);
st->minzoom = min(st->minzoom, minz);
}
if ((k = json_hash_get(j, "maxzoom")) != NULL) {
const std::string maxzoom_tmp = k->string;
int maxz = min(std::stoi(maxzoom_tmp), maxzoom);
st->maxzoom = max(st->maxzoom, maxz);
}
if ((k = json_hash_get(j, "center")) != NULL) {
const std::string center = k->string;
const unsigned char *s = (const unsigned char *) center.c_str();
sscanf((char *) s, "%lf,%lf", &st->midlon, &st->midlat);
}
if ((k = json_hash_get(j, "attribution")) != NULL) {
attribution = k->string;
}
if ((k = json_hash_get(j, "description")) != NULL) {
description = k->string;
}
if ((k = json_hash_get(j, "name")) != NULL) {
const std::string name_tmp = k->string;
if (name.size() == 0) {
name = name_tmp;
} else {
name += " + " + name_tmp;
}
}
if ((k = json_hash_get(j, "bounds")) != NULL) {
const std::string bounds = k->string;
const unsigned char *s = (const unsigned char *) bounds.c_str();
if (sscanf((char *) s, "%lf,%lf,%lf,%lf", &minlon, &minlat, &maxlon, &maxlat) == 4) {
st->minlon = min(minlon, st->minlon);
st->maxlon = max(maxlon, st->maxlon);
st->minlat = min(minlat, st->minlat);
st->maxlat = max(maxlat, st->maxlat);
}
sqlite3_finalize(r->stmt);
}
if (sqlite3_prepare_v2(db, "SELECT value from metadata where name = 'center'", -1, &r->stmt, NULL) == SQLITE_OK) {
if (sqlite3_step(r->stmt) == SQLITE_ROW) {
const unsigned char *s = sqlite3_column_text(r->stmt, 0);
if (s != NULL) {
sscanf((char *) s, "%lf,%lf", &st->midlon, &st->midlat);
}
}
sqlite3_finalize(r->stmt);
}
if (sqlite3_prepare_v2(db, "SELECT value from metadata where name = 'attribution'", -1, &r->stmt, NULL) == SQLITE_OK) {
if (sqlite3_step(r->stmt) == SQLITE_ROW) {
const unsigned char *s = sqlite3_column_text(r->stmt, 0);
if (s != NULL) {
attribution = std::string((char *) s);
}
}
sqlite3_finalize(r->stmt);
}
if (sqlite3_prepare_v2(db, "SELECT value from metadata where name = 'description'", -1, &r->stmt, NULL) == SQLITE_OK) {
if (sqlite3_step(r->stmt) == SQLITE_ROW) {
const unsigned char *s = sqlite3_column_text(r->stmt, 0);
if (s != NULL) {
description = std::string((char *) s);
}
}
sqlite3_finalize(r->stmt);
}
if (sqlite3_prepare_v2(db, "SELECT value from metadata where name = 'name'", -1, &r->stmt, NULL) == SQLITE_OK) {
if (sqlite3_step(r->stmt) == SQLITE_ROW) {
const unsigned char *s = sqlite3_column_text(r->stmt, 0);
if (s != NULL) {
if (name.size() == 0) {
name = std::string((char *) s);
} else {
name += " + " + std::string((char *) s);
}
}
}
json_free(j);
json_end(jp);
fclose(f);
sqlite3_finalize(r->stmt);
}
if (sqlite3_prepare_v2(db, "SELECT value from metadata where name = 'bounds'", -1, &r->stmt, NULL) == SQLITE_OK) {
if (sqlite3_step(r->stmt) == SQLITE_ROW) {
const unsigned char *s = sqlite3_column_text(r->stmt, 0);
if (s != NULL) {
if (sscanf((char *) s, "%lf,%lf,%lf,%lf", &minlon, &minlat, &maxlon, &maxlat) == 4) {
st->minlon = min(minlon, st->minlon);
st->maxlon = max(maxlon, st->maxlon);
st->minlat = min(minlat, st->minlat);
st->maxlat = max(maxlat, st->maxlat);
}
}
}
sqlite3_finalize(r->stmt);
}
// Closes either real db or temp mirror of metadata.json
if (sqlite3_close(db) != SQLITE_OK) {
fprintf(stderr, "Could not close database: %s\n", sqlite3_errmsg(db));
exit(EXIT_FAILURE);
}
delete r;
@ -1173,10 +928,7 @@ int main(int argc, char **argv) {
outdb = mbtiles_open(out_mbtiles, argv, 0);
}
if (out_dir != NULL) {
if (force) {
check_dir(out_dir, true);
}
check_dir(out_dir, false);
check_dir(out_dir, force, false);
}
struct stats st;

165
tile.cpp
View File

@ -83,7 +83,6 @@ struct coalesce {
std::vector<serial_val> full_values = std::vector<serial_val>();
drawvec geom = drawvec();
unsigned long long index = 0;
unsigned long long index2 = 0;
long long original_seq = 0;
int type = 0;
int m = 0;
@ -117,6 +116,19 @@ int coalcmp(const void *v1, const void *v2) {
return cmp;
}
if (c1->has_id != c2->has_id) {
return (int) c1->has_id - (int) c2->has_id;
}
if (c1->has_id && c2->has_id) {
if (c1->id < c2->id) {
return -1;
}
if (c1->id > c2->id) {
return 1;
}
}
return metacmp(c1->m, c1->keys, c1->values, c1->stringpool, c2->m, c2->keys, c2->values, c2->stringpool);
}
@ -130,9 +142,9 @@ int coalindexcmp(const struct coalesce *c1, const struct coalesce *c2) {
return 1;
}
if (c1->index2 > c2->index2) {
if (c1->geom < c2->geom) {
return -1;
} else if (c1->index2 < c2->index2) {
} else if (c1->geom > c2->geom) {
return 1;
}
}
@ -186,7 +198,7 @@ int metacmp(int m1, const std::vector<long long> &keys1, const std::vector<long
return type1 - type2;
}
int cmp = strcmp(s1, s2);
if (s1 != s2) {
if (cmp != 0) {
return cmp;
}
}
@ -318,7 +330,6 @@ struct partial {
long long layer = 0;
long long original_seq = 0;
unsigned long long index = 0;
unsigned long long index2 = 0;
int m = 0;
int segment = 0;
bool reduced = 0;
@ -457,22 +468,7 @@ void *partial_feature_worker(void *v) {
}
}
// Worth skipping this if not coalescing anyway?
if (geoms.size() > 0 && geoms[0].size() > 0) {
(*partials)[i].index = encode(geoms[0][0].x, geoms[0][0].y);
(*partials)[i].index2 = encode(geoms[0][geoms[0].size() - 1].x, geoms[0][geoms[0].size() - 1].y);
// Anything numbered below the start of the line
// can't possibly be the next feature.
// We want lowest-but-not-under.
if ((*partials)[i].index2 < (*partials)[i].index) {
(*partials)[i].index2 = ~0LL;
}
} else {
(*partials)[i].index = 0;
(*partials)[i].index2 = 0;
}
(*partials)[i].index = i;
(*partials)[i].geoms = geoms;
}
@ -1389,6 +1385,34 @@ void *run_prefilter(void *v) {
return NULL;
}
void add_tilestats(std::string const &layername, int z, std::vector<std::map<std::string, layermap_entry>> *layermaps, size_t tiling_seg, std::vector<std::vector<std::string>> *layer_unmaps, std::string const &key, serial_val const &val) {
std::map<std::string, layermap_entry> &layermap = (*layermaps)[tiling_seg];
if (layermap.count(layername) == 0) {
layermap_entry lme = layermap_entry(layermap.size());
lme.minzoom = z;
lme.maxzoom = z;
lme.retain = 1;
layermap.insert(std::pair<std::string, layermap_entry>(layername, lme));
if (lme.id >= (*layer_unmaps)[tiling_seg].size()) {
(*layer_unmaps)[tiling_seg].resize(lme.id + 1);
(*layer_unmaps)[tiling_seg][lme.id] = layername;
}
}
auto fk = layermap.find(layername);
if (fk == layermap.end()) {
fprintf(stderr, "Internal error: layer %s not found\n", layername.c_str());
exit(EXIT_FAILURE);
}
type_and_string attrib;
attrib.type = val.type;
attrib.string = val.s;
add_to_file_keys(fk->second.file_keys, key, attrib);
}
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, sqlite3 *outdb, const char *outdir, 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, size_t tiling_seg, size_t pass, size_t passes, unsigned long long mingap, long long minextent, double fraction, const char *prefilter, const char *postfilter, write_tile_args *arg) {
int line_detail;
double merge_fraction = 1;
@ -1433,6 +1457,7 @@ long long write_tile(FILE *geoms, long long *geompos_in, char *metabase, char *s
double scale = (double) (1LL << (64 - 2 * (z + 8)));
double gap = 0, density_gap = 0;
double spacing = 0;
size_t clustered = 0;
long long original_features = 0;
long long unclipped_features = 0;
@ -1544,7 +1569,34 @@ long long write_tile(FILE *geoms, long long *geompos_in, char *metabase, char *s
}
}
if (additional[A_DROP_DENSEST_AS_NEEDED]) {
if (additional[A_CLUSTER_DENSEST_AS_NEEDED] || cluster_distance != 0) {
indices.push_back(sf.index);
if (sf.index - merge_previndex < mingap) {
clustered++;
continue;
} else {
if (clustered > 0) {
std::string layername = (*layer_unmaps)[sf.segment][sf.layer];
serial_val sv, sv2;
sf.full_keys.push_back("clustered");
sv.type = mvt_bool;
sv.s = "true";
sf.full_values.push_back(sv);
add_tilestats(layername, z, layermaps, tiling_seg, layer_unmaps, "clustered", sv);
sf.full_keys.push_back("point_count");
sv2.type = mvt_double;
sv2.s = std::to_string(clustered + 1);
sf.full_values.push_back(sv2);
add_tilestats(layername, z, layermaps, tiling_seg, layer_unmaps, "point_count", sv2);
}
clustered = 0;
}
} else if (additional[A_DROP_DENSEST_AS_NEEDED]) {
indices.push_back(sf.index);
if (sf.index - merge_previndex < mingap) {
continue;
@ -1621,7 +1673,6 @@ long long write_tile(FILE *geoms, long long *geompos_in, char *metabase, char *s
p.simplification = simplification;
p.id = sf.id;
p.has_id = sf.has_id;
p.index2 = merge_previndex;
p.index = sf.index;
p.renamed = -1;
partials.push_back(p);
@ -1644,6 +1695,44 @@ long long write_tile(FILE *geoms, long long *geompos_in, char *metabase, char *s
}
}
// Attach the leftover cluster count to the last feature that did make it
if (clustered > 0) {
if (partials.size() > 0) {
size_t n = partials.size() - 1;
size_t i;
for (i = 0; i < partials[n].full_keys.size(); i++) {
if (partials[n].full_keys[i] == std::string("point_count")) {
break;
}
}
std::string layername = (*layer_unmaps)[partials[n].segment][partials[n].layer];
if (i < partials[n].full_keys.size()) {
size_t sum = strtoul(partials[n].full_values[i].s.c_str(), NULL, 10) + clustered;
partials[n].full_values[i].s = std::to_string(sum);
add_tilestats(layername, z, layermaps, tiling_seg, layer_unmaps, "point_count", partials[n].full_values[i]);
} else {
serial_val sv, sv2;
partials[n].full_keys.push_back("clustered");
sv.type = mvt_bool;
sv.s = "true";
partials[n].full_values.push_back(sv);
add_tilestats(layername, z, layermaps, tiling_seg, layer_unmaps, "clustered", sv);
partials[n].full_keys.push_back("point_count");
sv2.type = mvt_double;
sv2.s = std::to_string(clustered + 1);
partials[n].full_values.push_back(sv2);
add_tilestats(layername, z, layermaps, tiling_seg, layer_unmaps, "point_count", sv2);
}
}
}
if (prefilter != NULL) {
json_end(prefilter_jp);
if (fclose(prefilter_read_fp) != 0) {
@ -1720,7 +1809,6 @@ long long write_tile(FILE *geoms, long long *geompos_in, char *metabase, char *s
c.type = t;
c.index = partials[i].index;
c.index2 = partials[i].index2;
c.geom = pgeoms[j];
pgeoms[j].clear();
c.coalesced = false;
@ -1784,7 +1872,7 @@ long long write_tile(FILE *geoms, long long *geompos_in, char *metabase, char *s
}
#endif
if (additional[A_COALESCE] && out.size() > 0 && out[y].geom.size() + layer_features[x].geom.size() < 700 && coalcmp(&layer_features[x], &out[y]) == 0 && layer_features[x].type != VT_POINT) {
if (additional[A_COALESCE] && out.size() > 0 && coalcmp(&layer_features[x], &out[y]) == 0 && layer_features[x].type != VT_POINT) {
for (size_t g = 0; g < layer_features[x].geom.size(); g++) {
out[y].geom.push_back(layer_features[x].geom[g]);
}
@ -1890,7 +1978,7 @@ long long write_tile(FILE *geoms, long long *geompos_in, char *metabase, char *s
fprintf(stderr, "Is your data in the wrong projection? It should be in WGS84/EPSG:4326.\n");
}
long long totalsize = 0;
size_t totalsize = 0;
for (auto layer_iterator = layers.begin(); layer_iterator != layers.end(); ++layer_iterator) {
std::vector<coalesce> &layer_features = layer_iterator->second;
totalsize += layer_features.size();
@ -1905,11 +1993,11 @@ long long write_tile(FILE *geoms, long long *geompos_in, char *metabase, char *s
}
if (totalsize > 0 && tile.layers.size() > 0) {
if (totalsize > 200000 && !prevent[P_FEATURE_LIMIT]) {
fprintf(stderr, "tile %d/%u/%u has %lld features, >200000 \n", z, tx, ty, totalsize);
if (totalsize > max_tile_features && !prevent[P_FEATURE_LIMIT]) {
fprintf(stderr, "tile %d/%u/%u has %zu features, >%zu \n", z, tx, ty, totalsize, max_tile_features);
if (has_polygons && additional[A_MERGE_POLYGONS_AS_NEEDED] && merge_fraction > .05 && merge_successful) {
merge_fraction = merge_fraction * 200000 / tile.layers.size() * 0.95;
merge_fraction = merge_fraction * max_tile_features / tile.layers.size() * 0.95;
if (!quiet) {
fprintf(stderr, "Going to try merging %0.2f%% of the polygons to make it fit\n", 100 - merge_fraction * 100);
}
@ -1932,11 +2020,11 @@ long long write_tile(FILE *geoms, long long *geompos_in, char *metabase, char *s
}
line_detail++; // to keep it the same when the loop decrements it
continue;
} else if (additional[A_DROP_DENSEST_AS_NEEDED]) {
mingap_fraction = mingap_fraction * 200000.0 / totalsize * 0.90;
} else if (additional[A_DROP_DENSEST_AS_NEEDED] || additional[A_CLUSTER_DENSEST_AS_NEEDED]) {
mingap_fraction = mingap_fraction * max_tile_features / totalsize * 0.90;
unsigned long long mg = choose_mingap(indices, mingap_fraction);
if (mg <= mingap) {
mg = mingap * 1.5;
mg = (mingap + 1) * 1.5;
}
mingap = mg;
if (mingap > arg->mingap_out) {
@ -1949,7 +2037,7 @@ long long write_tile(FILE *geoms, long long *geompos_in, char *metabase, char *s
line_detail++;
continue;
} else if (additional[A_DROP_SMALLEST_AS_NEEDED] || additional[A_COALESCE_SMALLEST_AS_NEEDED]) {
minextent_fraction = minextent_fraction * 200000.0 / totalsize * 0.90;
minextent_fraction = minextent_fraction * max_tile_features / totalsize * 0.90;
long long m = choose_minextent(extents, minextent_fraction);
if (m != minextent) {
minextent = m;
@ -1964,7 +2052,7 @@ long long write_tile(FILE *geoms, long long *geompos_in, char *metabase, char *s
continue;
}
} else if (prevent[P_DYNAMIC_DROP] || additional[A_DROP_FRACTION_AS_NEEDED]) {
fraction = fraction * 200000 / totalsize * 0.95;
fraction = fraction * max_tile_features / totalsize * 0.95;
if (!quiet) {
fprintf(stderr, "Going to try keeping %0.2f%% of the features to make it fit\n", fraction * 100);
}
@ -2016,7 +2104,7 @@ long long write_tile(FILE *geoms, long long *geompos_in, char *metabase, char *s
fprintf(stderr, "Going to try gamma of %0.3f to make it fit\n", gamma);
}
line_detail++; // to keep it the same when the loop decrements it
} else if (additional[A_DROP_DENSEST_AS_NEEDED]) {
} else if (additional[A_DROP_DENSEST_AS_NEEDED] || additional[A_CLUSTER_DENSEST_AS_NEEDED]) {
mingap_fraction = mingap_fraction * max_tile_size / compressed.size() * 0.90;
unsigned long long mg = choose_mingap(indices, mingap_fraction);
if (mg <= mingap) {
@ -2275,6 +2363,9 @@ int traverse_zooms(int *geomfd, off_t *geom_size, char *metabase, char *stringpo
if (threads >= (1U << 30)) {
threads = 1U << 30;
}
if (threads < 1) {
threads = 1;
}
// Assign temporary files to threads
@ -2327,12 +2418,12 @@ int traverse_zooms(int *geomfd, off_t *geom_size, char *metabase, char *stringpo
int err = INT_MAX;
size_t start = 1;
if (additional[A_INCREASE_GAMMA_AS_NEEDED] || additional[A_DROP_DENSEST_AS_NEEDED] || additional[A_DROP_FRACTION_AS_NEEDED] || additional[A_DROP_SMALLEST_AS_NEEDED] || additional[A_COALESCE_SMALLEST_AS_NEEDED]) {
if (additional[A_INCREASE_GAMMA_AS_NEEDED] || additional[A_DROP_DENSEST_AS_NEEDED] || additional[A_CLUSTER_DENSEST_AS_NEEDED] || additional[A_DROP_FRACTION_AS_NEEDED] || additional[A_DROP_SMALLEST_AS_NEEDED] || additional[A_COALESCE_SMALLEST_AS_NEEDED]) {
start = 0;
}
double zoom_gamma = gamma;
unsigned long long zoom_mingap = 0;
unsigned long long zoom_mingap = ((1LL << (32 - i)) / 256 * cluster_distance) * ((1LL << (32 - i)) / 256 * cluster_distance);
long long zoom_minextent = 0;
double zoom_fraction = 1;

View File

@ -1,6 +1,6 @@
#ifndef VERSION_HPP
#define VERSION_HPP
#define VERSION "tippecanoe v1.27.0\n"
#define VERSION "tippecanoe v1.27.6\n"
#endif

View File

@ -118,19 +118,11 @@ void layer_to_geojson(FILE *fp, mvt_layer const &layer, unsigned z, unsigned x,
} else if (val.type == mvt_double) {
fprintq(fp, key);
double v = val.numeric_value.double_value;
if (v == (long long) v) {
fprintf(fp, ": %lld", (long long) v);
} else {
fprintf(fp, ": %s", milo::dtoa_milo(v).c_str());
}
fprintf(fp, ": %s", milo::dtoa_milo(v).c_str());
} else if (val.type == mvt_float) {
fprintq(fp, key);
double v = val.numeric_value.float_value;
if (v == (long long) v) {
fprintf(fp, ": %lld", (long long) v);
} else {
fprintf(fp, ": %s", milo::dtoa_milo(v).c_str());
}
fprintf(fp, ": %s", milo::dtoa_milo(v).c_str());
} else if (val.type == mvt_sint) {
fprintq(fp, key);
fprintf(fp, ": %lld", val.numeric_value.sint_value);