mirror of
https://github.com/mapbox/tippecanoe.git
synced 2025-06-24 17:55:11 +00:00
Compare commits
40 Commits
Author | SHA1 | Date | |
---|---|---|---|
6ad1497853 | |||
5d4e39d8b1 | |||
5d458a2a91 | |||
91063d5af5 | |||
ba102b0ea4 | |||
a3e78a7846 | |||
b81b42879e | |||
9ac97fd0a2 | |||
1ba03b7f47 | |||
560a64c071 | |||
21b9b1993f | |||
d49606babf | |||
e07a4dd51b | |||
eb966ae398 | |||
aaf08a6c55 | |||
fc32a0e897 | |||
01884a3bf6 | |||
6524b6510e | |||
b03dabe098 | |||
5687ee041f | |||
be79d13cbc | |||
2e32004589 | |||
82a2b5dfdc | |||
ed0b69a3c8 | |||
ec475b3beb | |||
afb5cece96 | |||
f3e6afa4e9 | |||
f2f76082df | |||
e4743d9527 | |||
d7f44ab082 | |||
1acd771743 | |||
ad86d06cce | |||
1b1be9f872 | |||
ba1c343204 | |||
ca028dd1cc | |||
8ac7c46788 | |||
2234e37883 | |||
8230987405 | |||
9964784e77 | |||
ac67013930 |
@ -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' ]
|
||||
|
32
CHANGELOG.md
32
CHANGELOG.md
@ -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
|
||||
|
53
Makefile
53
Makefile
@ -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
|
||||
|
||||
|
14
README.md
14
README.md
@ -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).
|
||||
|
||||
[](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
20
csv.cpp
@ -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;
|
||||
|
125
decode.cpp
125
decode.cpp
@ -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) {
|
||||
|
113
dirtiles.cpp
113
dirtiles.cpp
@ -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;
|
||||
}
|
||||
|
41
dirtiles.hpp
41
dirtiles.hpp
@ -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
120
geocsv.cpp
Normal 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
13
geocsv.hpp
Normal 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
|
@ -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) {
|
||||
|
15
jsontool.cpp
15
jsontool.cpp
@ -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) {
|
||||
|
99
main.cpp
99
main.cpp
@ -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;
|
||||
|
2
main.hpp
2
main.hpp
@ -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);
|
||||
|
@ -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
|
||||
|
73
mbtiles.cpp
73
mbtiles.cpp
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
378
mvt.cpp
@ -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;
|
||||
}
|
||||
|
@ -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
236
protozero/data_view.hpp
Normal 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
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -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>();
|
||||
}
|
||||
|
||||
|
@ -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)) {
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
3632
tests/allow-existing/both.mbtiles.json
Normal file
3632
tests/allow-existing/both.mbtiles.json
Normal file
File diff suppressed because one or more lines are too long
177
tests/coalesce-id/in.json
Normal file
177
tests/coalesce-id/in.json
Normal file
File diff suppressed because one or more lines are too long
348
tests/coalesce-id/out/-z1_--coalesce_--reorder.json
Normal file
348
tests/coalesce-id/out/-z1_--coalesce_--reorder.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
367
tests/coalesce-tract/tl_2010_06001_tract10.json
Normal file
367
tests/coalesce-tract/tl_2010_06001_tract10.json
Normal file
File diff suppressed because one or more lines are too long
203
tests/coalesce-tract/tl_2010_06075_tract10.json
Normal file
203
tests/coalesce-tract/tl_2010_06075_tract10.json
Normal file
File diff suppressed because one or more lines are too long
244
tests/csv/ne_110m_populated_places_simple.csv
Normal file
244
tests/csv/ne_110m_populated_places_simple.csv
Normal 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
|
|
502
tests/csv/out.mbtiles.json
Normal file
502
tests/csv/out.mbtiles.json
Normal file
File diff suppressed because one or more lines are too long
@ -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 ] ] } ]
|
||||
|
@ -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
1000
tests/loop/in.json
Normal file
File diff suppressed because it is too large
Load Diff
18
tests/loop/out/-z0_-O200_--cluster-densest-as-needed.json
Normal file
18
tests/loop/out/-z0_-O200_--cluster-densest-as-needed.json
Normal 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 ] } }
|
||||
] }
|
||||
] }
|
||||
] }
|
18
tests/loop/out/-z0_-O200_--drop-densest-as-needed.json
Normal file
18
tests/loop/out/-z0_-O200_--drop-densest-as-needed.json
Normal 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 ] } }
|
||||
] }
|
||||
] }
|
||||
] }
|
394
tests/loop/out/-z0_-O200_--drop-fraction-as-needed.json
Normal file
394
tests/loop/out/-z0_-O200_--drop-fraction-as-needed.json
Normal 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 ] } }
|
||||
] }
|
||||
] }
|
||||
] }
|
@ -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
@ -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 ] } }
|
||||
|
2230
tests/muni/out/-Z11_-z13_-O100_--cluster-densest-as-needed.json
Normal file
2230
tests/muni/out/-Z11_-z13_-O100_--cluster-densest-as-needed.json
Normal file
File diff suppressed because it is too large
Load Diff
7688
tests/muni/out/-r1_-K20.json
Normal file
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
@ -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 ] ] ] } }
|
||||
|
@ -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 ] ] ] } }
|
||||
] }
|
||||
] }
|
||||
,
|
||||
|
@ -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 ] ] } }
|
||||
] }
|
||||
] }
|
||||
,
|
||||
|
13
tests/onefeature/-zg_--drop-densest-as-needed.json
Normal file
13
tests/onefeature/-zg_--drop-densest-as-needed.json
Normal 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
1
tests/onefeature/in.json
Normal 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.
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.
@ -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\"]}]}]}}"
|
||||
}
|
||||
|
454
tile-join.cpp
454
tile-join.cpp
@ -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
165
tile.cpp
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
Reference in New Issue
Block a user