mirror of
https://github.com/felt/tippecanoe.git
synced 2026-10-03 00:45:41 +02:00
Merge remote-tracking branch 'origin/main' into clean-polygons
This commit is contained in:
@@ -1,3 +1,49 @@
|
||||
# 2.45.0
|
||||
|
||||
* Adjust tile size limit with --retain-points-multiplier dynamically within each tile, to allow multiplier features at high zooms if other features are being dropped as-needed
|
||||
|
||||
# 2.44.0
|
||||
|
||||
* Add --unidecode-data option to allow case-insensitive filter comparisons of transliterated strings
|
||||
|
||||
# 2.43.0
|
||||
|
||||
* Change -fraction-as-needed feature dropping to be consistent across tiles and zoom levels, and to follow the same pattern as point dropping by zoom level
|
||||
* With -as-needed feature dropping, drop or retain entire multiplier clusters instead of individual features
|
||||
* Sort the features within each multiplier cluster by its retention priority, for more consistency between zoom levels in filtered feature choice
|
||||
|
||||
# 2.42.0
|
||||
|
||||
* Improve tiling speed
|
||||
* Generate tilestats for the --retain-points-multiplier attributes
|
||||
|
||||
# 2.41.3
|
||||
|
||||
* Performance optimizations to tile reading, writing, and overzooming
|
||||
* Automatically vary the tile size limit by zoom level to match the intended retain-points-multiplier multiplication
|
||||
* Fix decompression error when bailing out because a tile can't be made small enough
|
||||
* Search harder for a feature size threshold to make the tile small enough before giving up
|
||||
|
||||
# 2.41.2
|
||||
|
||||
* Add --accumulate-attribute to tippecanoe-overzoom
|
||||
* Go back to ordering features within each multiplier cluster spatially, not in the order specified for tile feature order
|
||||
|
||||
# 2.41.1
|
||||
|
||||
* Make --preserve-input-order, --order-by, --order-descending-by, --order-smallest-first, and --order-largest-first cooperate with --retain-points-multiplier. The clusters will be ordered by their lead feature in the specified sequence. The other features in each cluster will continue to be physically near the lead feature, but ordered as specified within the cluster.
|
||||
|
||||
# 2.41.0
|
||||
|
||||
* Add Felt-style expression support for -j feature filters
|
||||
* Add --retain-points-multiplier option
|
||||
* Add tippecanoe_decisions metadata field to record basezoom, drop rate, and multiplier
|
||||
* Add multiplier thinning (-m) and feature filters (-j) to tippecanoe-overzoom
|
||||
|
||||
# 2.40.0
|
||||
|
||||
* Slightly reduce compression aggressiveness to improve as-needed dropping speed
|
||||
|
||||
# 2.39.0
|
||||
|
||||
* Reduce memory usage during tiling
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
FROM centos:7
|
||||
FROM centos:centos8
|
||||
|
||||
RUN yum install -y make sqlite-devel zlib-devel bash git gcc-c++
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@ C = $(wildcard *.c) $(wildcard *.cpp)
|
||||
INCLUDES = -I/usr/local/include -I.
|
||||
LIBS = -L/usr/local/lib
|
||||
|
||||
tippecanoe: geojson.o jsonpull/jsonpull.o tile.o pool.o mbtiles.o geometry.o projection.o memfile.o mvt.o serial.o main.o text.o dirtiles.o pmtiles_file.o plugin.o read_json.o write_json.o geobuf.o flatgeobuf.o evaluator.o geocsv.o csv.o geojson-loop.o json_logger.o visvalingam.o compression.o clip.o sort.o polygon.o
|
||||
tippecanoe: geojson.o jsonpull/jsonpull.o tile.o pool.o mbtiles.o geometry.o projection.o memfile.o mvt.o serial.o main.o text.o dirtiles.o pmtiles_file.o plugin.o read_json.o write_json.o geobuf.o flatgeobuf.o evaluator.o geocsv.o csv.o geojson-loop.o json_logger.o visvalingam.o compression.o clip.o sort.o attribute.o thread.o shared_borders.o polygon.o
|
||||
$(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3 -lpthread
|
||||
|
||||
tippecanoe-enumerate: enumerate.o
|
||||
@@ -67,7 +67,7 @@ tippecanoe-enumerate: enumerate.o
|
||||
tippecanoe-decode: decode.o projection.o mvt.o write_json.o text.o jsonpull/jsonpull.o dirtiles.o pmtiles_file.o
|
||||
$(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3
|
||||
|
||||
tile-join: tile-join.o projection.o mbtiles.o mvt.o memfile.o dirtiles.o jsonpull/jsonpull.o text.o evaluator.o csv.o write_json.o pmtiles_file.o clip.o polygon.o
|
||||
tile-join: tile-join.o projection.o mbtiles.o mvt.o memfile.o dirtiles.o jsonpull/jsonpull.o text.o evaluator.o csv.o write_json.o pmtiles_file.o clip.o attribute.o thread.o polygon.o
|
||||
$(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3 -lpthread
|
||||
|
||||
tippecanoe-json-tool: jsontool.o jsonpull/jsonpull.o csv.o text.o geojson-loop.o
|
||||
@@ -76,7 +76,7 @@ tippecanoe-json-tool: jsontool.o jsonpull/jsonpull.o csv.o text.o geojson-loop.o
|
||||
unit: unit.o text.o sort.o mvt.o
|
||||
$(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3 -lpthread
|
||||
|
||||
tippecanoe-overzoom: overzoom.o mvt.o clip.o polygon.o
|
||||
tippecanoe-overzoom: overzoom.o mvt.o clip.o evaluator.o jsonpull/jsonpull.o text.o attribute.o polygon.o
|
||||
$(CXX) $(PG) $(LIBS) $(FINAL_FLAGS) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) -lm -lz -lsqlite3 -lpthread
|
||||
|
||||
-include $(wildcard *.d)
|
||||
@@ -91,7 +91,7 @@ clean:
|
||||
rm -f ./tippecanoe ./tippecanoe-* ./tile-join ./unit *.o *.d */*.o */*.d tests/**/*.mbtiles tests/**/*.check
|
||||
|
||||
indent:
|
||||
clang-format -i -style="{BasedOnStyle: Google, IndentWidth: 8, UseTab: Always, AllowShortIfStatementsOnASingleLine: false, ColumnLimit: 0, ContinuationIndentWidth: 8, SpaceAfterCStyleCast: true, IndentCaseLabels: false, AllowShortBlocksOnASingleLine: false, AllowShortFunctionsOnASingleLine: false, SortIncludes: false}" $(filter-out flatgeobuf.cpp,$(C)) $(H)
|
||||
clang-format -i -style="{BasedOnStyle: Google, IndentWidth: 8, UseTab: Always, AllowShortIfStatementsOnASingleLine: false, ColumnLimit: 0, ContinuationIndentWidth: 8, SpaceAfterCStyleCast: true, IndentCaseLabels: false, AllowShortBlocksOnASingleLine: false, AllowShortFunctionsOnASingleLine: false, SortIncludes: false}" $(filter-out flatgeobuf.cpp,$(C)) $(H) jsonpull/*.[ch]
|
||||
|
||||
TESTS = $(wildcard tests/*/out/*.json)
|
||||
SPACE = $(NULL) $(NULL)
|
||||
@@ -287,6 +287,48 @@ overzoom-test: tippecanoe-overzoom
|
||||
./tippecanoe-overzoom -o tests/pbf/14-2616-6331.pbf tests/pbf/11-327-791.pbf 11/327/791 14/2616/6331
|
||||
cmp tests/pbf/14-2616-6331.pbf /dev/null
|
||||
rm tests/pbf/14-2616-6331.pbf
|
||||
# Thinning
|
||||
# 243 features in the source tile tests/pbf/0-0-0-pop.pbf
|
||||
# 9 of them survive as the best of each cluster of 30
|
||||
# ./tippecanoe -z1 -r30 --retain-points-multiplier 30 -f -e out.dir tests/ne_110m_populated_places/in.json
|
||||
# cp out.dir/0/0/0.pbf tests/pbf/0-0-0-pop.pbf
|
||||
./tippecanoe-overzoom -y NAME -m -o tests/pbf/0-0-0-pop-filtered.pbf tests/pbf/0-0-0-pop.pbf 0/0/0 0/0/0
|
||||
./tippecanoe-decode tests/pbf/0-0-0-pop-filtered.pbf 0 0 0 > tests/pbf/0-0-0-pop-filtered.pbf.json.check
|
||||
cmp tests/pbf/0-0-0-pop-filtered.pbf.json.check tests/pbf/0-0-0-pop-filtered.pbf.json
|
||||
rm tests/pbf/0-0-0-pop-filtered.pbf tests/pbf/0-0-0-pop-filtered.pbf.json.check
|
||||
# Thinning with accumulation
|
||||
./tippecanoe-overzoom -y NAME -m --accumulate-attribute NAME:comma -o tests/pbf/0-0-0-pop-accum.pbf tests/pbf/0-0-0-pop.pbf 0/0/0 0/0/0
|
||||
./tippecanoe-decode tests/pbf/0-0-0-pop-accum.pbf 0 0 0 > tests/pbf/0-0-0-pop-accum.pbf.json.check
|
||||
cmp tests/pbf/0-0-0-pop-accum.pbf.json.check tests/pbf/0-0-0-pop-accum.pbf.json
|
||||
rm tests/pbf/0-0-0-pop-accum.pbf tests/pbf/0-0-0-pop-accum.pbf.json.check
|
||||
# Filtering
|
||||
# 243 features in the source tile tests/pbf/0-0-0-pop.pbf
|
||||
# 27 of them match the filter and are retained
|
||||
./tippecanoe-overzoom -y NAME -j'{"*":["SCALERANK","eq",0]}' -o tests/pbf/0-0-0-pop-expr.pbf tests/pbf/0-0-0-pop.pbf 0/0/0 0/0/0
|
||||
./tippecanoe-decode tests/pbf/0-0-0-pop-expr.pbf 0 0 0 > tests/pbf/0-0-0-pop-expr.pbf.json.check
|
||||
cmp tests/pbf/0-0-0-pop-expr.pbf.json.check tests/pbf/0-0-0-pop-expr.pbf.json
|
||||
rm tests/pbf/0-0-0-pop-expr.pbf tests/pbf/0-0-0-pop-expr.pbf.json.check
|
||||
# Filtering with multiplier
|
||||
# 243 features in the source tile tests/pbf/0-0-0-pop.pbf
|
||||
# 8 features survive into the output, from 9 clusters of 30
|
||||
./tippecanoe-overzoom -y NAME -y SCALERANK -j'{"*":["SCALERANK","eq",0]}' -m -o tests/pbf/0-0-0-filter-mult.pbf tests/pbf/0-0-0-pop.pbf 0/0/0 0/0/0
|
||||
./tippecanoe-decode tests/pbf/0-0-0-filter-mult.pbf 0 0 0 > tests/pbf/0-0-0-filter-mult.pbf.json.check
|
||||
cmp tests/pbf/0-0-0-filter-mult.pbf.json.check tests/pbf/0-0-0-filter-mult.pbf.json
|
||||
rm tests/pbf/0-0-0-filter-mult.pbf tests/pbf/0-0-0-filter-mult.pbf.json.check
|
||||
# Filtering with multiplier and preserve-input-order
|
||||
# 243 features in the source tile tests/pbf/0-0-0-pop.pbf
|
||||
./tippecanoe-overzoom -y NAME -y SCALERANK -j'{"*":["NAME","cn","e"]}' -m --preserve-input-order -o tests/pbf/0-0-0-filter-mult-order.pbf tests/pbf/0-0-0-pop.pbf 0/0/0 0/0/0
|
||||
./tippecanoe-decode tests/pbf/0-0-0-filter-mult-order.pbf 0 0 0 > tests/pbf/0-0-0-filter-mult-order.pbf.json.check
|
||||
cmp tests/pbf/0-0-0-filter-mult-order.pbf.json.check tests/pbf/0-0-0-filter-mult-order.pbf.json
|
||||
rm tests/pbf/0-0-0-filter-mult-order.pbf tests/pbf/0-0-0-filter-mult-order.pbf.json.check
|
||||
# Test that overzooming with a multiplier exactly reverses the effect of tiling with a multiplier
|
||||
./tippecanoe -q -z5 --preserve-point-density-threshold 8 --retain-points-multiplier 3 -f -e tests/muni/out/out.dir tests/muni/muni.json
|
||||
./tippecanoe -q -z5 --preserve-point-density-threshold 8 -f -o tests/muni/out/out.mbtiles tests/muni/muni.json
|
||||
./tippecanoe-overzoom -m -o tests/muni/out/out.dir/000.pbf tests/muni/out/out.dir/0/0/0.pbf 0/0/0 0/0/0
|
||||
./tippecanoe-decode tests/muni/out/out.mbtiles 0 0 0 > tests/muni/out/out.dir/direct.json
|
||||
./tippecanoe-decode tests/muni/out/out.dir/000.pbf 0 0 0 > tests/muni/out/out.dir/overzoomed.json
|
||||
cmp tests/muni/out/out.dir/overzoomed.json tests/muni/out/out.dir/direct.json
|
||||
rm -rf tests/muni/out/out.dir tests/muni/out/out.mbtiles tests/muni/out/out.dir/overzoomed.json tests/muni/out/out.dir/direct.json
|
||||
|
||||
join-test: tippecanoe tippecanoe-decode tile-join
|
||||
./tippecanoe -q -f -z12 -o tests/join-population/tabblock_06001420.mbtiles -YALAND10:'Land area' -L'{"file": "tests/join-population/tabblock_06001420.json", "description": "population"}'
|
||||
|
||||
@@ -34,7 +34,9 @@ Installation
|
||||
|
||||
The easiest way to install tippecanoe on OSX is with [Homebrew](http://brew.sh/):
|
||||
|
||||
```sh
|
||||
$ brew install tippecanoe
|
||||
```
|
||||
|
||||
On Ubuntu it will usually be easiest to build from the source repository:
|
||||
|
||||
@@ -421,7 +423,7 @@ be reduced to the maximum that can be used with the specified _maxzoom_.
|
||||
|
||||
### Filtering features by attributes
|
||||
|
||||
* `-j` *filter* or `--feature-filter`=*filter*: Check features against a per-layer filter (as defined in the [Mapbox GL Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/#other-filter)) and only include those that match. Any features in layers that have no filter specified will be passed through. Filters for the layer `"*"` apply to all layers. The special variable `$zoom` refers to the current zoom level.
|
||||
* `-j` *filter* or `--feature-filter`=*filter*: Check features against a per-layer filter (as defined in the [Mapbox GL Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/#other-filter) or in a Felt filter specification still to be finalized) and only include those that match. Any features in layers that have no filter specified will be passed through. Filters for the layer `"*"` apply to all layers. The special variable `$zoom` refers to the current zoom level.
|
||||
* `-J` *filter-file* or `--feature-filter-file`=*filter-file*: Like `-j`, but read the filter from a file.
|
||||
|
||||
Example: to find the Natural Earth countries with low `scalerank` but high `LABELRANK`:
|
||||
@@ -459,6 +461,7 @@ the same layer, enclose them in an `all` expression so they will all be evaluate
|
||||
If you use `-Bg`, it will guess a zoom level that will keep at most 50,000 features in the densest tile.
|
||||
You can also specify a marker-width with `-Bg`*width* to allow fewer features in the densest tile to
|
||||
compensate for the larger marker, or `-Bf`*number* to allow at most *number* features in the densest tile.
|
||||
* `--retain-points-multiplier=`_multiple_: Retain the specified multiple of points instead of just the number of points that would ordinarily be retained by the drop rate. These can be thinned out later with the `-m` option to `tippecanoe-overzoom`. The start of each cluster is marked in the feature sequence by the `tippecanoe:retain_points_multiplier_first` attribute. The `--tile-size-limit` will also be extended at low zoom levels to allow for the multiplied features.
|
||||
* `--drop-denser=`_percentage_: When dropping dots at zoom levels below the base zoom, give the specified _percentage_
|
||||
preference to retaining points in sparse areas and dropping points in dense areas.
|
||||
* `--limit-base-zoom-to-maximum-zoom` or `-Pb`: Limit the guessed base zoom not to exceed the maxzoom, even if this would put more than the requested number of features in a base zoom tile.
|
||||
@@ -993,4 +996,7 @@ reads tile `inz/inx/iny` of `in.mvt.gz` and produces tile `outz/outx/outy` of `o
|
||||
* `-b` *buffer*: Set the tile buffer in the output tile (default 5)
|
||||
* `-d` *detail*: Set the detail of the output tile (default 12)
|
||||
* `-y` *attribute*: Retain the specified *attribute* in the output features. All attributes that are not named in a `-y` option will be removed.
|
||||
|
||||
* `-j` *filter*: Filter features using the same expression syntax as in tippecanoe.
|
||||
* `-m`: If a tile was created with the `--retain-points-multiplier` option, thin the tile back down to its normal feature count during overzooming. The first feature from each cluster will be retained, unless `-j` is used to specify a filter, in which case the first matching filter from each cluster will be retained instead.
|
||||
* `--preserve-input-order`: Restore a set of filtered features to its original input order
|
||||
* `--accumulate-attribute`: Behaves as in `tippecanoe` to sum attributes from the features of a multiplier cluster that are not included in the final output. The attributes from features that are filtered away with `-j` are *not* accumulated onto the output feature.
|
||||
|
||||
+146
@@ -0,0 +1,146 @@
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include "attribute.hpp"
|
||||
#include "errors.hpp"
|
||||
#include "serial.hpp"
|
||||
#include "jsonpull/jsonpull.h"
|
||||
#include "milo/dtoa_milo.h"
|
||||
|
||||
void set_attribute_accum(std::unordered_map<std::string, attribute_op> &attribute_accum, std::string name, std::string type) {
|
||||
attribute_op t;
|
||||
|
||||
if (type == "sum") {
|
||||
t = op_sum;
|
||||
} else if (type == "product") {
|
||||
t = op_product;
|
||||
} else if (type == "mean") {
|
||||
t = op_mean;
|
||||
} else if (type == "max") {
|
||||
t = op_max;
|
||||
} else if (type == "min") {
|
||||
t = op_min;
|
||||
} else if (type == "concat") {
|
||||
t = op_concat;
|
||||
} else if (type == "comma") {
|
||||
t = op_comma;
|
||||
} else {
|
||||
fprintf(stderr, "Attribute method (%s) must be sum, product, mean, max, min, concat, or comma\n", type.c_str());
|
||||
exit(EXIT_ARGS);
|
||||
}
|
||||
|
||||
attribute_accum.insert(std::pair<std::string, attribute_op>(name, t));
|
||||
}
|
||||
|
||||
void set_attribute_accum(std::unordered_map<std::string, attribute_op> &attribute_accum, const char *arg, char **argv) {
|
||||
if (*arg == '{') {
|
||||
json_pull *jp = json_begin_string(arg);
|
||||
json_object *o = json_read_tree(jp);
|
||||
|
||||
if (o == NULL) {
|
||||
fprintf(stderr, "%s: -E%s: %s\n", *argv, arg, jp->error);
|
||||
exit(EXIT_JSON);
|
||||
}
|
||||
|
||||
if (o->type != JSON_HASH) {
|
||||
fprintf(stderr, "%s: -E%s: not a JSON object\n", *argv, arg);
|
||||
exit(EXIT_JSON);
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < o->value.object.length; i++) {
|
||||
json_object *k = o->value.object.keys[i];
|
||||
json_object *v = o->value.object.values[i];
|
||||
|
||||
if (k->type != JSON_STRING) {
|
||||
fprintf(stderr, "%s: -E%s: key %zu not a string\n", *argv, arg, i);
|
||||
exit(EXIT_JSON);
|
||||
}
|
||||
if (v->type != JSON_STRING) {
|
||||
fprintf(stderr, "%s: -E%s: value %zu not a string\n", *argv, arg, i);
|
||||
exit(EXIT_JSON);
|
||||
}
|
||||
|
||||
set_attribute_accum(attribute_accum, k->value.string.string, v->value.string.string);
|
||||
}
|
||||
|
||||
json_free(o);
|
||||
json_end(jp);
|
||||
return;
|
||||
}
|
||||
|
||||
const char *s = strchr(arg, ':');
|
||||
if (s == NULL) {
|
||||
fprintf(stderr, "-E%s option must be in the form -Ename:method\n", arg);
|
||||
exit(EXIT_ARGS);
|
||||
}
|
||||
|
||||
std::string name = std::string(arg, s - arg);
|
||||
std::string type = std::string(s + 1);
|
||||
|
||||
set_attribute_accum(attribute_accum, name, type);
|
||||
}
|
||||
|
||||
void preserve_attribute(attribute_op const &op, std::string const &key, serial_val const &val, std::vector<std::string> &full_keys, std::vector<serial_val> &full_values, std::unordered_map<std::string, accum_state> &attribute_accum_state) {
|
||||
for (size_t i = 0; i < full_keys.size(); i++) {
|
||||
if (key == full_keys[i]) {
|
||||
switch (op) {
|
||||
case op_sum:
|
||||
full_values[i].s = milo::dtoa_milo(atof(full_values[i].s.c_str()) + atof(val.s.c_str()));
|
||||
full_values[i].type = mvt_double;
|
||||
break;
|
||||
|
||||
case op_product:
|
||||
full_values[i].s = milo::dtoa_milo(atof(full_values[i].s.c_str()) * atof(val.s.c_str()));
|
||||
full_values[i].type = mvt_double;
|
||||
break;
|
||||
|
||||
case op_max: {
|
||||
double existing = atof(full_values[i].s.c_str());
|
||||
double maybe = atof(val.s.c_str());
|
||||
if (maybe > existing) {
|
||||
full_values[i].s = val.s.c_str();
|
||||
full_values[i].type = mvt_double;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case op_min: {
|
||||
double existing = atof(full_values[i].s.c_str());
|
||||
double maybe = atof(val.s.c_str());
|
||||
if (maybe < existing) {
|
||||
full_values[i].s = val.s.c_str();
|
||||
full_values[i].type = mvt_double;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case op_mean: {
|
||||
auto state = attribute_accum_state.find(key);
|
||||
if (state == attribute_accum_state.end()) {
|
||||
accum_state s;
|
||||
s.sum = atof(full_values[i].s.c_str()) + atof(val.s.c_str());
|
||||
s.count = 2;
|
||||
attribute_accum_state.insert(std::pair<std::string, accum_state>(key, s));
|
||||
|
||||
full_values[i].s = milo::dtoa_milo(s.sum / s.count);
|
||||
} else {
|
||||
state->second.sum += atof(val.s.c_str());
|
||||
state->second.count += 1;
|
||||
|
||||
full_values[i].s = milo::dtoa_milo(state->second.sum / state->second.count);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case op_concat:
|
||||
full_values[i].s += val.s;
|
||||
full_values[i].type = mvt_string;
|
||||
break;
|
||||
|
||||
case op_comma:
|
||||
full_values[i].s += std::string(",") + val.s;
|
||||
full_values[i].type = mvt_string;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
#ifndef ATTRIBUTE_HPP
|
||||
#define ATTRIBUTE_HPP
|
||||
|
||||
#include <vector>
|
||||
#include <unordered_map>
|
||||
|
||||
enum attribute_op {
|
||||
op_sum,
|
||||
op_product,
|
||||
op_mean,
|
||||
op_concat,
|
||||
op_comma,
|
||||
op_max,
|
||||
op_min,
|
||||
};
|
||||
|
||||
struct accum_state {
|
||||
double sum = 0;
|
||||
double count = 0;
|
||||
};
|
||||
|
||||
struct serial_val;
|
||||
|
||||
void set_attribute_accum(std::unordered_map<std::string, attribute_op> &attribute_accum, std::string name, std::string type);
|
||||
void set_attribute_accum(std::unordered_map<std::string, attribute_op> &attribute_accum, const char *arg, char **argv);
|
||||
void preserve_attribute(attribute_op const &op, const std::string &key, serial_val const &val, std::vector<std::string> &full_keys, std::vector<serial_val> &full_values, std::unordered_map<std::string, accum_state> &attribute_accum_state);
|
||||
|
||||
#endif
|
||||
@@ -8,6 +8,9 @@
|
||||
#include "compression.hpp"
|
||||
#include "mvt.hpp"
|
||||
#include "polygon.hpp"
|
||||
#include "evaluator.hpp"
|
||||
#include "serial.hpp"
|
||||
#include "attribute.hpp"
|
||||
|
||||
static std::vector<std::pair<double, double>> clip_poly1(std::vector<std::pair<double, double>> &geom,
|
||||
long long minx, long long miny, long long maxx, long long maxy,
|
||||
@@ -753,9 +756,10 @@ static std::vector<std::pair<double, double>> clip_poly1(std::vector<std::pair<d
|
||||
return out;
|
||||
}
|
||||
|
||||
std::string overzoom(std::string s, int oz, int ox, int oy, int nz, int nx, int ny,
|
||||
std::string overzoom(const std::string &s, int oz, int ox, int oy, int nz, int nx, int ny,
|
||||
int detail, int buffer, std::set<std::string> const &keep, bool do_compress,
|
||||
std::vector<std::pair<unsigned, unsigned>> *next_overzoomed_tiles) {
|
||||
std::vector<std::pair<unsigned, unsigned>> *next_overzoomed_tiles,
|
||||
bool demultiply, json_object *filter, bool preserve_input_order, std::unordered_map<std::string, attribute_op> const &attribute_accum, std::vector<std::string> const &unidecode_data) {
|
||||
mvt_tile tile;
|
||||
|
||||
try {
|
||||
@@ -769,13 +773,110 @@ std::string overzoom(std::string s, int oz, int ox, int oy, int nz, int nx, int
|
||||
exit(EXIT_PROTOBUF);
|
||||
}
|
||||
|
||||
return overzoom(tile, oz, ox, oy, nz, nx, ny, detail, buffer, keep, do_compress, next_overzoomed_tiles);
|
||||
return overzoom(tile, oz, ox, oy, nz, nx, ny, detail, buffer, keep, do_compress, next_overzoomed_tiles, demultiply, filter, preserve_input_order, attribute_accum, unidecode_data);
|
||||
}
|
||||
|
||||
std::string overzoom(mvt_tile tile, int oz, int ox, int oy, int nz, int nx, int ny,
|
||||
struct tile_feature {
|
||||
drawvec geom;
|
||||
int t;
|
||||
bool has_id;
|
||||
unsigned long long id;
|
||||
std::vector<unsigned> tags;
|
||||
mvt_layer const *layer;
|
||||
size_t seq = 0;
|
||||
};
|
||||
|
||||
static void feature_out(std::vector<tile_feature> const &features, mvt_layer &outlayer, std::set<std::string> const &keep, std::unordered_map<std::string, attribute_op> const &attribute_accum, std::shared_ptr<std::string> const &tile_stringpool) {
|
||||
// Add geometry to output feature
|
||||
|
||||
mvt_feature outfeature;
|
||||
outfeature.type = features[0].t;
|
||||
for (auto const &g : features[0].geom) {
|
||||
outfeature.geometry.emplace_back(g.op, g.x, g.y);
|
||||
}
|
||||
|
||||
// ID and attributes, if it didn't get clipped away
|
||||
|
||||
if (outfeature.geometry.size() > 0) {
|
||||
if (features[0].has_id) {
|
||||
outfeature.has_id = true;
|
||||
outfeature.id = features[0].id;
|
||||
}
|
||||
|
||||
outfeature.seq = features[0].seq;
|
||||
|
||||
if (attribute_accum.size() > 0) {
|
||||
// convert the attributes of the output feature
|
||||
// from mvt_value to serial_val so they can have
|
||||
// attributes from the other features of the
|
||||
// multiplier cluster accumulated onto them
|
||||
|
||||
std::unordered_map<std::string, accum_state> attribute_accum_state;
|
||||
std::vector<std::string> full_keys;
|
||||
std::vector<serial_val> full_values;
|
||||
|
||||
for (size_t i = 0; i + 1 < features[0].tags.size(); i += 2) {
|
||||
auto f = attribute_accum.find(features[0].layer->keys[features[0].tags[i]]);
|
||||
if (f != attribute_accum.end()) {
|
||||
// this attribute has an accumulator, so convert it
|
||||
full_keys.push_back(features[0].layer->keys[features[0].tags[i]]);
|
||||
full_values.push_back(mvt_value_to_serial_val(features[0].layer->values[features[0].tags[i + 1]]));
|
||||
} else {
|
||||
// otherwise just tag it directly onto the output feature
|
||||
if (keep.size() == 0 || keep.find(features[0].layer->keys[features[0].tags[i]]) != keep.end()) {
|
||||
outlayer.tag(outfeature, features[0].layer->keys[features[0].tags[i]], features[0].layer->values[features[0].tags[i + 1]]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// accumulate whatever attributes are specified to be accumulated
|
||||
// onto the feature that will survive into the output, from the
|
||||
// features that will not
|
||||
|
||||
for (size_t i = 1; i < features.size(); i++) {
|
||||
for (size_t j = 0; j + 1 < features[i].tags.size(); j += 2) {
|
||||
std::string key = features[i].layer->keys[features[i].tags[j]];
|
||||
|
||||
auto f = attribute_accum.find(key);
|
||||
if (f != attribute_accum.end()) {
|
||||
serial_val val = mvt_value_to_serial_val(features[i].layer->values[features[i].tags[j + 1]]);
|
||||
preserve_attribute(f->second, key, val, full_keys, full_values, attribute_accum_state);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// convert the final attributes back to mvt_value
|
||||
// and tag them onto the output feature
|
||||
|
||||
for (size_t i = 0; i < full_keys.size(); i++) {
|
||||
if (keep.size() == 0 || keep.find(full_keys[i]) != keep.end()) {
|
||||
outlayer.tag(outfeature, full_keys[i], stringified_to_mvt_value(full_values[i].type, full_values[i].s.c_str(), tile_stringpool));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (size_t i = 0; i + 1 < features[0].tags.size(); i += 2) {
|
||||
if (keep.size() == 0 || keep.find(features[0].layer->keys[features[0].tags[i]]) != keep.end()) {
|
||||
outlayer.tag(outfeature, features[0].layer->keys[features[0].tags[i]], features[0].layer->values[features[0].tags[i + 1]]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
outlayer.features.push_back(std::move(outfeature));
|
||||
}
|
||||
}
|
||||
|
||||
static struct preservecmp {
|
||||
bool operator()(const mvt_feature &a, const mvt_feature &b) {
|
||||
return a.seq < b.seq;
|
||||
}
|
||||
} preservecmp;
|
||||
|
||||
std::string overzoom(const mvt_tile &tile, int oz, int ox, int oy, int nz, int nx, int ny,
|
||||
int detail, int buffer, std::set<std::string> const &keep, bool do_compress,
|
||||
std::vector<std::pair<unsigned, unsigned>> *next_overzoomed_tiles) {
|
||||
std::vector<std::pair<unsigned, unsigned>> *next_overzoomed_tiles,
|
||||
bool demultiply, json_object *filter, bool preserve_input_order, std::unordered_map<std::string, attribute_op> const &attribute_accum, std::vector<std::string> const &unidecode_data) {
|
||||
mvt_tile outtile;
|
||||
std::shared_ptr<std::string> tile_stringpool = std::make_shared<std::string>();
|
||||
|
||||
for (auto const &layer : tile.layers) {
|
||||
mvt_layer outlayer = mvt_layer();
|
||||
@@ -789,8 +890,45 @@ std::string overzoom(mvt_tile tile, int oz, int ox, int oy, int nz, int nx, int
|
||||
outlayer.version = layer.version;
|
||||
outlayer.extent = 1LL << det;
|
||||
|
||||
for (auto const &feature : layer.features) {
|
||||
mvt_feature outfeature;
|
||||
std::vector<tile_feature> pending_tile_features;
|
||||
|
||||
static const std::string retain_points_multiplier_first = "tippecanoe:retain_points_multiplier_first";
|
||||
static const std::string retain_points_multiplier_sequence = "tippecanoe:retain_points_multiplier_sequence";
|
||||
|
||||
for (auto feature : layer.features) {
|
||||
bool flush_multiplier_cluster = false;
|
||||
if (demultiply) {
|
||||
for (ssize_t i = feature.tags.size() - 2; i >= 0; i -= 2) {
|
||||
if (layer.keys[feature.tags[i]] == retain_points_multiplier_first) {
|
||||
mvt_value v = layer.values[feature.tags[i + 1]];
|
||||
if (v.type == mvt_bool && v.numeric_value.bool_value) {
|
||||
flush_multiplier_cluster = true;
|
||||
feature.tags.erase(feature.tags.begin() + i, feature.tags.begin() + i + 2);
|
||||
}
|
||||
}
|
||||
|
||||
if (layer.keys[feature.tags[i]] == retain_points_multiplier_sequence) {
|
||||
mvt_value v = layer.values[feature.tags[i + 1]];
|
||||
feature.seq = mvt_value_to_long_long(v);
|
||||
feature.tags.erase(feature.tags.begin() + i, feature.tags.begin() + i + 2);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
flush_multiplier_cluster = true;
|
||||
}
|
||||
|
||||
if (flush_multiplier_cluster) {
|
||||
if (pending_tile_features.size() > 0) {
|
||||
feature_out(pending_tile_features, outlayer, keep, attribute_accum, tile_stringpool);
|
||||
pending_tile_features.clear();
|
||||
}
|
||||
}
|
||||
|
||||
std::set<std::string> exclude_attributes;
|
||||
if (filter != NULL && !evaluate(feature, layer, filter, exclude_attributes, nz, unidecode_data)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
drawvec geom;
|
||||
int t = feature.type;
|
||||
|
||||
@@ -798,6 +936,7 @@ std::string overzoom(mvt_tile tile, int oz, int ox, int oy, int nz, int nx, int
|
||||
|
||||
long long tilesize = 1LL << (32 - oz); // source tile size in world coordinates
|
||||
draw ring_closure(0, 0, 0);
|
||||
bool sametile = (nz == oz && nx == ox && ny == oy && outlayer.extent >= layer.extent);
|
||||
|
||||
for (auto const &g : feature.geometry) {
|
||||
if (g.op == mvt_closepath) {
|
||||
@@ -823,32 +962,34 @@ std::string overzoom(mvt_tile tile, int oz, int ox, int oy, int nz, int nx, int
|
||||
g.y -= ny * outtilesize;
|
||||
}
|
||||
|
||||
// Clip to output tile
|
||||
if (!sametile) {
|
||||
// Clip to output tile
|
||||
|
||||
long long xmin = LLONG_MAX;
|
||||
long long ymin = LLONG_MAX;
|
||||
long long xmax = LLONG_MIN;
|
||||
long long ymax = LLONG_MIN;
|
||||
long long xmin = LLONG_MAX;
|
||||
long long ymin = LLONG_MAX;
|
||||
long long xmax = LLONG_MIN;
|
||||
long long ymax = LLONG_MIN;
|
||||
|
||||
for (auto const &g : geom) {
|
||||
xmin = std::min(xmin, g.x);
|
||||
ymin = std::min(ymin, g.y);
|
||||
xmax = std::max(xmax, g.x);
|
||||
ymax = std::max(ymax, g.y);
|
||||
}
|
||||
for (auto const &g : geom) {
|
||||
xmin = std::min(xmin, g.x);
|
||||
ymin = std::min(ymin, g.y);
|
||||
xmax = std::max(xmax, g.x);
|
||||
ymax = std::max(ymax, g.y);
|
||||
}
|
||||
|
||||
long long b = outtilesize * buffer / 256;
|
||||
if (xmax < -b || ymax < -b || xmin > outtilesize + b || ymin > outtilesize + b) {
|
||||
continue;
|
||||
}
|
||||
long long b = outtilesize * buffer / 256;
|
||||
if (xmax < -b || ymax < -b || xmin > outtilesize + b || ymin > outtilesize + b) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (t == VT_LINE) {
|
||||
geom = clip_lines(geom, nz, buffer);
|
||||
} else if (t == VT_POLYGON) {
|
||||
drawvec dv;
|
||||
geom = simple_clip_poly(geom, nz, buffer, dv, false);
|
||||
} else if (t == VT_POINT) {
|
||||
geom = clip_point(geom, nz, buffer);
|
||||
if (t == VT_LINE) {
|
||||
geom = clip_lines(geom, nz, buffer);
|
||||
} else if (t == VT_POLYGON) {
|
||||
drawvec dv;
|
||||
geom = simple_clip_poly(geom, nz, buffer, dv, false);
|
||||
} else if (t == VT_POINT) {
|
||||
geom = clip_point(geom, nz, buffer);
|
||||
}
|
||||
}
|
||||
|
||||
// Scale to output tile extent
|
||||
@@ -859,41 +1000,43 @@ std::string overzoom(mvt_tile tile, int oz, int ox, int oy, int nz, int nx, int
|
||||
to_tile_scale(geom, nz, det);
|
||||
}
|
||||
|
||||
// Clean geometries
|
||||
if (!sametile) {
|
||||
// Clean geometries
|
||||
|
||||
geom = remove_noop(geom, t, 0);
|
||||
if (t == VT_POLYGON) {
|
||||
geom = clean_or_clip_poly(geom, 0, 0, false, false);
|
||||
}
|
||||
}
|
||||
|
||||
geom = remove_noop(geom, t, 0);
|
||||
if (t == VT_POLYGON) {
|
||||
geom = clean_polygon(geom, 1LL << det);
|
||||
geom = close_poly(geom);
|
||||
}
|
||||
|
||||
// Add geometry to output feature
|
||||
tile_feature tf;
|
||||
tf.geom = std::move(geom);
|
||||
tf.t = t;
|
||||
tf.has_id = feature.has_id;
|
||||
tf.id = feature.id;
|
||||
tf.tags = std::move(feature.tags);
|
||||
tf.layer = &layer;
|
||||
tf.seq = feature.seq;
|
||||
|
||||
outfeature.type = t;
|
||||
for (auto const &g : geom) {
|
||||
outfeature.geometry.emplace_back(g.op, g.x, g.y);
|
||||
}
|
||||
pending_tile_features.push_back(tf);
|
||||
}
|
||||
|
||||
// ID and attributes, if it didn't get clipped away
|
||||
if (pending_tile_features.size() > 0) {
|
||||
feature_out(pending_tile_features, outlayer, keep, attribute_accum, tile_stringpool);
|
||||
pending_tile_features.clear();
|
||||
}
|
||||
|
||||
if (outfeature.geometry.size() > 0) {
|
||||
if (feature.has_id) {
|
||||
outfeature.has_id = true;
|
||||
outfeature.id = feature.id;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i + 1 < feature.tags.size(); i += 2) {
|
||||
if (keep.size() == 0 || keep.find(layer.keys[feature.tags[i]]) != keep.end()) {
|
||||
outlayer.tag(outfeature, layer.keys[feature.tags[i]], layer.values[feature.tags[i + 1]]);
|
||||
}
|
||||
}
|
||||
|
||||
outlayer.features.push_back(outfeature);
|
||||
}
|
||||
if (preserve_input_order) {
|
||||
std::sort(outlayer.features.begin(), outlayer.features.end(), preservecmp);
|
||||
}
|
||||
|
||||
if (outlayer.features.size() > 0) {
|
||||
outtile.layers.push_back(outlayer);
|
||||
outtile.layers.push_back(std::move(outlayer));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -910,7 +1053,8 @@ std::string overzoom(mvt_tile tile, int oz, int ox, int oy, int nz, int nx, int
|
||||
for (size_t y = 0; y < 2; y++) {
|
||||
std::string child = overzoom(outtile, nz, nx, ny,
|
||||
nz + 1, nx * 2 + x, ny * 2 + y,
|
||||
detail, buffer, keep, false, NULL);
|
||||
detail, buffer, keep, false, NULL,
|
||||
demultiply, filter, preserve_input_order, attribute_accum, unidecode_data);
|
||||
if (child.size() > 0) {
|
||||
next_overzoomed_tiles->emplace_back(nx * 2 + x, ny * 2 + y);
|
||||
}
|
||||
|
||||
+1
-1
@@ -277,7 +277,7 @@ void decode(char *fname, int z, unsigned x, unsigned y, std::set<std::string> co
|
||||
struct stat st;
|
||||
std::vector<zxy> tiles;
|
||||
|
||||
char *pmtiles_map;
|
||||
char *pmtiles_map = NULL;
|
||||
std::vector<pmtiles::entry_zxy> entries;
|
||||
bool is_pmtiles = false;
|
||||
|
||||
|
||||
@@ -318,6 +318,9 @@ void dir_write_metadata(const char *outdir, const metadata &m) {
|
||||
if (m.strategies_json.size() > 0) {
|
||||
out(state, "strategies", m.strategies_json);
|
||||
}
|
||||
if (m.decisions_json.size() > 0) {
|
||||
out(state, "tippecanoe_decisions", m.decisions_json);
|
||||
}
|
||||
out(state, "format", m.format);
|
||||
out(state, "generator", m.generator);
|
||||
out(state, "generator_options", m.generator_options);
|
||||
|
||||
+472
-41
@@ -1,39 +1,217 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <map>
|
||||
#include <unordered_map>
|
||||
#include <functional>
|
||||
#include "mvt.hpp"
|
||||
#include "evaluator.hpp"
|
||||
#include "errors.hpp"
|
||||
#include "milo/dtoa_milo.h"
|
||||
#include "text.hpp"
|
||||
|
||||
int compare(mvt_value one, json_object *two, bool &fail) {
|
||||
if (one.type == mvt_string) {
|
||||
static std::string mvt_value_to_string(mvt_value const &one, bool &fail, std::vector<std::string> const &unidecode_data) {
|
||||
switch (one.type) {
|
||||
case mvt_string:
|
||||
if (unidecode_data.size() > 0) {
|
||||
return unidecode_smash(unidecode_data, one.c_str());
|
||||
} else {
|
||||
return one.get_string_value();
|
||||
}
|
||||
case mvt_float:
|
||||
return milo::dtoa_milo(one.numeric_value.float_value);
|
||||
case mvt_double:
|
||||
return milo::dtoa_milo(one.numeric_value.double_value);
|
||||
case mvt_int:
|
||||
return std::to_string(one.numeric_value.int_value);
|
||||
case mvt_uint:
|
||||
return std::to_string(one.numeric_value.uint_value);
|
||||
case mvt_sint:
|
||||
return std::to_string(one.numeric_value.sint_value);
|
||||
case mvt_bool:
|
||||
return one.numeric_value.bool_value ? "true" : "false";
|
||||
case mvt_null:
|
||||
fail = true; // null op string => null
|
||||
return "";
|
||||
case mvt_no_such_key:
|
||||
default:
|
||||
fprintf(stderr, "unhandled mvt_type %d\n", one.type);
|
||||
exit(EXIT_IMPOSSIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
// Alter the JSON parse tree in place to replace the original match string
|
||||
// with its unidecode-smashed version.
|
||||
//
|
||||
// To avoid repeated re-smashings of the same JSON object, objects that have
|
||||
// already been smashed are marked by setting their refcon to the unidecode data.
|
||||
static void smash(std::vector<std::string> const &unidecode_data, json_object *j) {
|
||||
if (j->value.string.refcon == (void *) &unidecode_data) {
|
||||
return;
|
||||
}
|
||||
|
||||
std::string s = unidecode_smash(unidecode_data, j->value.string.string);
|
||||
j->value.string.string = (char *) realloc(j->value.string.string, s.size() + 1);
|
||||
if (j->value.string.string == NULL) {
|
||||
perror("realloc for unidecode_smash");
|
||||
exit(EXIT_MEMORY);
|
||||
}
|
||||
strcpy(j->value.string.string, s.c_str());
|
||||
j->value.string.refcon = (void *) &unidecode_data;
|
||||
}
|
||||
|
||||
int compare_fsl(mvt_value const &one, json_object *two, bool &fail, std::vector<std::string> const &unidecode_data) {
|
||||
// In FSL expressions, the attribute value is coerced to the type
|
||||
// of the JSON literal value it is being compared to.
|
||||
//
|
||||
// If it cannot be converted, the comparison returns null
|
||||
// (which is distinct from true and false but is falsy if
|
||||
// it is the final output value).
|
||||
|
||||
if (two->type == JSON_NULL) {
|
||||
fail = true; // anything op null => null
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (two->type == JSON_NUMBER) {
|
||||
double lhs;
|
||||
|
||||
switch (one.type) {
|
||||
case mvt_string: {
|
||||
char *endptr = NULL;
|
||||
const char *s = one.c_str();
|
||||
lhs = strtod(s, &endptr);
|
||||
if (endptr == s) {
|
||||
fail = true; // non-numeric-string op number => null
|
||||
return 0;
|
||||
}
|
||||
} break;
|
||||
case mvt_float:
|
||||
lhs = one.numeric_value.float_value;
|
||||
break;
|
||||
case mvt_double:
|
||||
lhs = one.numeric_value.double_value;
|
||||
break;
|
||||
case mvt_int:
|
||||
lhs = one.numeric_value.int_value;
|
||||
break;
|
||||
case mvt_uint:
|
||||
lhs = one.numeric_value.uint_value;
|
||||
break;
|
||||
case mvt_sint:
|
||||
lhs = one.numeric_value.sint_value;
|
||||
break;
|
||||
case mvt_bool:
|
||||
lhs = one.numeric_value.bool_value;
|
||||
break;
|
||||
case mvt_null:
|
||||
fail = true; // null op number => null
|
||||
return 0;
|
||||
default:
|
||||
fprintf(stderr, "unhandled mvt_type %d\n", one.type);
|
||||
exit(EXIT_IMPOSSIBLE);
|
||||
}
|
||||
|
||||
if (lhs < two->value.number.number) {
|
||||
return -1;
|
||||
} else if (lhs > two->value.number.number) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (two->type == JSON_STRING) {
|
||||
std::string lhs = mvt_value_to_string(one, fail, unidecode_data);
|
||||
|
||||
if (unidecode_data.size() > 0) {
|
||||
smash(unidecode_data, two);
|
||||
}
|
||||
|
||||
return strcmp(lhs.c_str(), two->value.string.string);
|
||||
}
|
||||
|
||||
if (two->type == JSON_TRUE || two->type == JSON_FALSE) {
|
||||
bool lhs;
|
||||
|
||||
switch (one.type) {
|
||||
case mvt_string:
|
||||
lhs = one.get_string_view().size() > 0;
|
||||
break;
|
||||
case mvt_float:
|
||||
lhs = one.numeric_value.float_value != 0;
|
||||
break;
|
||||
case mvt_double:
|
||||
lhs = one.numeric_value.double_value != 0;
|
||||
break;
|
||||
case mvt_int:
|
||||
lhs = one.numeric_value.int_value != 0;
|
||||
break;
|
||||
case mvt_uint:
|
||||
lhs = one.numeric_value.uint_value != 0;
|
||||
break;
|
||||
case mvt_sint:
|
||||
lhs = one.numeric_value.sint_value != 0;
|
||||
break;
|
||||
case mvt_bool:
|
||||
lhs = one.numeric_value.bool_value;
|
||||
break;
|
||||
case mvt_null:
|
||||
fail = true; // null op bool => null
|
||||
return 0;
|
||||
|
||||
case mvt_no_such_key:
|
||||
default:
|
||||
fprintf(stderr, "unhandled mvt_type %d\n", one.type);
|
||||
exit(EXIT_IMPOSSIBLE);
|
||||
}
|
||||
|
||||
bool rhs = two->type == JSON_TRUE;
|
||||
return lhs - rhs;
|
||||
}
|
||||
|
||||
fprintf(stderr, "unhandled JSON type %d\n", two->type);
|
||||
exit(EXIT_IMPOSSIBLE);
|
||||
}
|
||||
|
||||
int compare(mvt_value const &one, json_object *two, bool &fail) {
|
||||
switch (one.type) {
|
||||
case mvt_string:
|
||||
if (two->type != JSON_STRING) {
|
||||
fail = true;
|
||||
return false; // string vs non-string
|
||||
}
|
||||
|
||||
return strcmp(one.string_value.c_str(), two->value.string.string);
|
||||
}
|
||||
return strcmp(one.c_str(), two->value.string.string);
|
||||
|
||||
if (one.type == mvt_double || one.type == mvt_float || one.type == mvt_int || one.type == mvt_uint || one.type == mvt_sint) {
|
||||
case mvt_double:
|
||||
case mvt_float:
|
||||
case mvt_int:
|
||||
case mvt_uint:
|
||||
case mvt_sint:
|
||||
if (two->type != JSON_NUMBER) {
|
||||
fail = true;
|
||||
return false; // number vs non-number
|
||||
}
|
||||
|
||||
double v;
|
||||
if (one.type == mvt_double) {
|
||||
switch (one.type) {
|
||||
case mvt_double:
|
||||
v = one.numeric_value.double_value;
|
||||
} else if (one.type == mvt_float) {
|
||||
break;
|
||||
case mvt_float:
|
||||
v = one.numeric_value.float_value;
|
||||
} else if (one.type == mvt_int) {
|
||||
break;
|
||||
case mvt_int:
|
||||
v = one.numeric_value.int_value;
|
||||
} else if (one.type == mvt_uint) {
|
||||
break;
|
||||
case mvt_uint:
|
||||
v = one.numeric_value.uint_value;
|
||||
} else if (one.type == mvt_sint) {
|
||||
break;
|
||||
case mvt_sint:
|
||||
v = one.numeric_value.sint_value;
|
||||
} else {
|
||||
break;
|
||||
case mvt_no_such_key:
|
||||
default:
|
||||
fprintf(stderr, "Internal error: bad mvt type %d\n", one.type);
|
||||
exit(EXIT_IMPOSSIBLE);
|
||||
}
|
||||
@@ -45,32 +223,65 @@ int compare(mvt_value one, json_object *two, bool &fail) {
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (one.type == mvt_bool) {
|
||||
case mvt_bool:
|
||||
if (two->type != JSON_TRUE && two->type != JSON_FALSE) {
|
||||
fail = true;
|
||||
return false; // bool vs non-bool
|
||||
}
|
||||
|
||||
bool b = two->type != JSON_FALSE;
|
||||
return one.numeric_value.bool_value > b;
|
||||
}
|
||||
{
|
||||
bool b = two->type != JSON_FALSE;
|
||||
return one.numeric_value.bool_value > b;
|
||||
}
|
||||
|
||||
if (one.type == mvt_null) {
|
||||
case mvt_null:
|
||||
if (two->type != JSON_NULL) {
|
||||
fail = true;
|
||||
return false; // null vs non-null
|
||||
}
|
||||
|
||||
return 0; // null equals null
|
||||
|
||||
case mvt_no_such_key:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
fprintf(stderr, "Internal error: bad mvt type %d\n", one.type);
|
||||
exit(EXIT_IMPOSSIBLE);
|
||||
}
|
||||
|
||||
bool eval(std::map<std::string, mvt_value> const &feature, json_object *f, std::set<std::string> &exclude_attributes) {
|
||||
// 0: false
|
||||
// 1: true
|
||||
// -1: incomparable (sql null), treated as false in final output
|
||||
static int eval(std::function<mvt_value(std::string const &)> feature, json_object *f, std::set<std::string> &exclude_attributes, std::vector<std::string> const &unidecode_data) {
|
||||
if (f != NULL) {
|
||||
if (f->type == JSON_TRUE) {
|
||||
return 1;
|
||||
} else if (f->type == JSON_FALSE) {
|
||||
return 0;
|
||||
} else if (f->type == JSON_NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (f->type == JSON_NUMBER) {
|
||||
if (f->value.number.number == 0) {
|
||||
return 0;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (f->type == JSON_STRING) {
|
||||
if (f->value.string.string[0] == '\0') {
|
||||
return 0;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (f == NULL || f->type != JSON_ARRAY) {
|
||||
fprintf(stderr, "Filter is not an array: %s\n", json_stringify(f));
|
||||
exit(EXIT_FILTER);
|
||||
@@ -81,6 +292,157 @@ bool eval(std::map<std::string, mvt_value> const &feature, json_object *f, std::
|
||||
exit(EXIT_FILTER);
|
||||
}
|
||||
|
||||
// FSL conjunctions
|
||||
if (f->value.array.length == 3 &&
|
||||
f->value.array.array[1]->type == JSON_STRING &&
|
||||
(strcmp(f->value.array.array[1]->value.string.string, "or") == 0 ||
|
||||
strcmp(f->value.array.array[1]->value.string.string, "and") == 0)) {
|
||||
int lhs;
|
||||
|
||||
if (f->value.array.array[0]->type == JSON_STRING) {
|
||||
// if LHS of a boolean conjunction is a string, it is an attribute reference
|
||||
mvt_value ff = feature(std::string(f->value.array.array[0]->value.string.string));
|
||||
if (ff.type != mvt_no_such_key) {
|
||||
if (ff.type == mvt_bool) {
|
||||
lhs = ff.numeric_value.bool_value;
|
||||
} else {
|
||||
lhs = -1; // not boolean: null
|
||||
}
|
||||
} else {
|
||||
lhs = -1; // not found: null
|
||||
}
|
||||
} else {
|
||||
lhs = eval(feature, f->value.array.array[0], exclude_attributes, unidecode_data);
|
||||
}
|
||||
|
||||
int rhs = eval(feature, f->value.array.array[2], exclude_attributes, unidecode_data);
|
||||
if (lhs < 0 && rhs < 0) {
|
||||
return -1; // null op null => null
|
||||
}
|
||||
if (strcmp(f->value.array.array[1]->value.string.string, "or") == 0) {
|
||||
return (lhs > 0) || (rhs > 0);
|
||||
} else {
|
||||
return (lhs > 0) && (rhs > 0);
|
||||
}
|
||||
}
|
||||
|
||||
// FSL comparators
|
||||
if (f->value.array.length == 3 &&
|
||||
f->value.array.array[0]->type == JSON_STRING &&
|
||||
f->value.array.array[1]->type == JSON_STRING &&
|
||||
(strcmp(f->value.array.array[1]->value.string.string, "lt") == 0 ||
|
||||
strcmp(f->value.array.array[1]->value.string.string, "gt") == 0 ||
|
||||
strcmp(f->value.array.array[1]->value.string.string, "le") == 0 ||
|
||||
strcmp(f->value.array.array[1]->value.string.string, "ge") == 0 ||
|
||||
strcmp(f->value.array.array[1]->value.string.string, "eq") == 0 ||
|
||||
strcmp(f->value.array.array[1]->value.string.string, "ne") == 0 ||
|
||||
strcmp(f->value.array.array[1]->value.string.string, "cn") == 0 ||
|
||||
strcmp(f->value.array.array[1]->value.string.string, "nc") == 0 ||
|
||||
strcmp(f->value.array.array[1]->value.string.string, "in") == 0 ||
|
||||
strcmp(f->value.array.array[1]->value.string.string, "ni") == 0 ||
|
||||
strcmp(f->value.array.array[1]->value.string.string, "is") == 0 ||
|
||||
strcmp(f->value.array.array[1]->value.string.string, "isnt") == 0 ||
|
||||
false)) {
|
||||
mvt_value lhs;
|
||||
lhs.type = mvt_null; // attributes that aren't found are nulls
|
||||
mvt_value ff = feature(std::string(f->value.array.array[0]->value.string.string));
|
||||
if (ff.type != mvt_no_such_key) {
|
||||
lhs = ff;
|
||||
}
|
||||
|
||||
if (f->value.array.array[2]->type == JSON_NULL && strcmp(f->value.array.array[1]->value.string.string, "is") == 0) {
|
||||
return lhs.type == mvt_null; // null is null => true, anything is null => false
|
||||
}
|
||||
if (f->value.array.array[2]->type == JSON_NULL && strcmp(f->value.array.array[1]->value.string.string, "isnt") == 0) {
|
||||
return lhs.type != mvt_null; // null isnt null => false, anything isnt null => true
|
||||
}
|
||||
|
||||
if (lhs.type == mvt_null) {
|
||||
return -1; // null op anything => null
|
||||
}
|
||||
|
||||
bool fail = false;
|
||||
|
||||
if (f->value.array.array[2]->type == JSON_STRING &&
|
||||
(strcmp(f->value.array.array[1]->value.string.string, "cn") == 0 ||
|
||||
strcmp(f->value.array.array[1]->value.string.string, "nc") == 0)) {
|
||||
std::string s = mvt_value_to_string(lhs, fail, unidecode_data);
|
||||
if (fail) {
|
||||
return -1; // null cn anything => false
|
||||
}
|
||||
|
||||
bool contains;
|
||||
if (unidecode_data.size() > 0) {
|
||||
smash(unidecode_data, f->value.array.array[2]);
|
||||
}
|
||||
contains = strstr(s.c_str(), f->value.array.array[2]->value.string.string);
|
||||
|
||||
if (strcmp(f->value.array.array[1]->value.string.string, "cn") == 0) {
|
||||
return contains;
|
||||
} else {
|
||||
return !contains;
|
||||
}
|
||||
}
|
||||
|
||||
if (f->value.array.array[2]->type == JSON_ARRAY &&
|
||||
(strcmp(f->value.array.array[1]->value.string.string, "in") == 0 ||
|
||||
strcmp(f->value.array.array[1]->value.string.string, "ni") == 0)) {
|
||||
std::string s = mvt_value_to_string(lhs, fail, unidecode_data);
|
||||
if (fail) {
|
||||
return -1; // null in anything => false
|
||||
}
|
||||
|
||||
bool contains = false;
|
||||
for (size_t i = 0; i < f->value.array.array[2]->value.array.length; i++) {
|
||||
if (f->value.array.array[2]->value.array.array[i]->type != JSON_STRING) {
|
||||
return -1; // anything in [not-a-string] => null
|
||||
}
|
||||
|
||||
if (unidecode_data.size() > 0) {
|
||||
smash(unidecode_data, f->value.array.array[2]->value.array.array[i]);
|
||||
}
|
||||
|
||||
if (strcmp(s.c_str(), f->value.array.array[2]->value.array.array[i]->value.string.string) == 0) {
|
||||
contains = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (strcmp(f->value.array.array[1]->value.string.string, "in") == 0) {
|
||||
return contains;
|
||||
} else {
|
||||
return !contains;
|
||||
}
|
||||
}
|
||||
|
||||
int cmp = compare_fsl(ff, f->value.array.array[2], fail, unidecode_data);
|
||||
if (fail) {
|
||||
return -1; // null
|
||||
}
|
||||
|
||||
if (strcmp(f->value.array.array[1]->value.string.string, "eq") == 0) {
|
||||
return cmp == 0;
|
||||
}
|
||||
if (strcmp(f->value.array.array[1]->value.string.string, "ne") == 0) {
|
||||
return cmp != 0;
|
||||
}
|
||||
if (strcmp(f->value.array.array[1]->value.string.string, "gt") == 0) {
|
||||
return cmp > 0;
|
||||
}
|
||||
if (strcmp(f->value.array.array[1]->value.string.string, "ge") == 0) {
|
||||
return cmp >= 0;
|
||||
}
|
||||
if (strcmp(f->value.array.array[1]->value.string.string, "lt") == 0) {
|
||||
return cmp < 0;
|
||||
}
|
||||
if (strcmp(f->value.array.array[1]->value.string.string, "le") == 0) {
|
||||
return cmp <= 0;
|
||||
}
|
||||
|
||||
fprintf(stderr, "expression fsl comparison: can't happen %s\n", f->value.array.array[1]->value.string.string);
|
||||
exit(EXIT_IMPOSSIBLE);
|
||||
}
|
||||
|
||||
if (f->value.array.array[0]->type != JSON_STRING) {
|
||||
fprintf(stderr, "Filter operation is not a string: %s\n", json_stringify(f));
|
||||
exit(EXIT_FILTER);
|
||||
@@ -98,7 +460,7 @@ bool eval(std::map<std::string, mvt_value> const &feature, json_object *f, std::
|
||||
fprintf(stderr, "\"has\" key is not a string: %s\n", json_stringify(f));
|
||||
exit(EXIT_FILTER);
|
||||
}
|
||||
return feature.count(std::string(f->value.array.array[1]->value.string.string)) != 0;
|
||||
return feature(std::string(f->value.array.array[1]->value.string.string)).type != mvt_no_such_key;
|
||||
}
|
||||
|
||||
if (strcmp(f->value.array.array[0]->value.string.string, "!has") == 0) {
|
||||
@@ -106,7 +468,7 @@ bool eval(std::map<std::string, mvt_value> const &feature, json_object *f, std::
|
||||
fprintf(stderr, "\"!has\" key is not a string: %s\n", json_stringify(f));
|
||||
exit(EXIT_FILTER);
|
||||
}
|
||||
return feature.count(std::string(f->value.array.array[1]->value.string.string)) == 0;
|
||||
return feature(std::string(f->value.array.array[1]->value.string.string)).type == mvt_no_such_key;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -125,8 +487,8 @@ bool eval(std::map<std::string, mvt_value> const &feature, json_object *f, std::
|
||||
exit(EXIT_FILTER);
|
||||
}
|
||||
|
||||
auto ff = feature.find(std::string(f->value.array.array[1]->value.string.string));
|
||||
if (ff == feature.end()) {
|
||||
mvt_value ff = feature(std::string(f->value.array.array[1]->value.string.string));
|
||||
if (ff.type == mvt_no_such_key) {
|
||||
static bool warned = false;
|
||||
if (!warned) {
|
||||
const char *s = json_stringify(f);
|
||||
@@ -141,7 +503,7 @@ bool eval(std::map<std::string, mvt_value> const &feature, json_object *f, std::
|
||||
}
|
||||
|
||||
bool fail = false;
|
||||
int cmp = compare(ff->second, f->value.array.array[2], fail);
|
||||
int cmp = compare(ff, f->value.array.array[2], fail);
|
||||
|
||||
if (fail) {
|
||||
static bool warned = false;
|
||||
@@ -192,17 +554,19 @@ bool eval(std::map<std::string, mvt_value> const &feature, json_object *f, std::
|
||||
}
|
||||
|
||||
for (size_t i = 1; i < f->value.array.length; i++) {
|
||||
bool out = eval(feature, f->value.array.array[i], exclude_attributes);
|
||||
int out = eval(feature, f->value.array.array[i], exclude_attributes, unidecode_data);
|
||||
|
||||
if (strcmp(f->value.array.array[0]->value.string.string, "all") == 0) {
|
||||
v = v && out;
|
||||
if (!v) {
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
v = v || out;
|
||||
if (v) {
|
||||
break;
|
||||
if (out >= 0) { // nulls are ignored in boolean and/or expressions
|
||||
if (strcmp(f->value.array.array[0]->value.string.string, "all") == 0) {
|
||||
v = v && out;
|
||||
if (!v) {
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
v = v || out;
|
||||
if (v) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -226,8 +590,8 @@ bool eval(std::map<std::string, mvt_value> const &feature, json_object *f, std::
|
||||
exit(EXIT_FILTER);
|
||||
}
|
||||
|
||||
auto ff = feature.find(std::string(f->value.array.array[1]->value.string.string));
|
||||
if (ff == feature.end()) {
|
||||
mvt_value ff = feature(std::string(f->value.array.array[1]->value.string.string));
|
||||
if (ff.type == mvt_no_such_key) {
|
||||
static bool warned = false;
|
||||
if (!warned) {
|
||||
const char *s = json_stringify(f);
|
||||
@@ -244,7 +608,7 @@ bool eval(std::map<std::string, mvt_value> const &feature, json_object *f, std::
|
||||
bool found = false;
|
||||
for (size_t i = 2; i < f->value.array.length; i++) {
|
||||
bool fail = false;
|
||||
int cmp = compare(ff->second, f->value.array.array[i], fail);
|
||||
int cmp = compare(ff, f->value.array.array[i], fail);
|
||||
|
||||
if (fail) {
|
||||
static bool warned = false;
|
||||
@@ -281,7 +645,7 @@ bool eval(std::map<std::string, mvt_value> const &feature, json_object *f, std::
|
||||
exit(EXIT_FILTER);
|
||||
}
|
||||
|
||||
bool ok = eval(feature, f->value.array.array[2], exclude_attributes);
|
||||
bool ok = eval(feature, f->value.array.array[2], exclude_attributes, unidecode_data) > 0;
|
||||
if (!ok) {
|
||||
exclude_attributes.insert(f->value.array.array[1]->value.string.string);
|
||||
}
|
||||
@@ -293,7 +657,7 @@ bool eval(std::map<std::string, mvt_value> const &feature, json_object *f, std::
|
||||
exit(EXIT_FILTER);
|
||||
}
|
||||
|
||||
bool evaluate(std::map<std::string, mvt_value> const &feature, std::string const &layer, json_object *filter, std::set<std::string> &exclude_attributes) {
|
||||
bool evaluate(std::function<mvt_value(std::string const &)> feature, std::string const &layer, json_object *filter, std::set<std::string> &exclude_attributes, std::vector<std::string> const &unidecode_data) {
|
||||
if (filter == NULL || filter->type != JSON_HASH) {
|
||||
fprintf(stderr, "Error: filter is not a hash: %s\n", json_stringify(filter));
|
||||
exit(EXIT_JSON);
|
||||
@@ -304,12 +668,12 @@ bool evaluate(std::map<std::string, mvt_value> const &feature, std::string const
|
||||
|
||||
f = json_hash_get(filter, layer.c_str());
|
||||
if (ok && f != NULL) {
|
||||
ok = eval(feature, f, exclude_attributes);
|
||||
ok = eval(feature, f, exclude_attributes, unidecode_data) > 0;
|
||||
}
|
||||
|
||||
f = json_hash_get(filter, "*");
|
||||
if (ok && f != NULL) {
|
||||
ok = eval(feature, f, exclude_attributes);
|
||||
ok = eval(feature, f, exclude_attributes, unidecode_data) > 0;
|
||||
}
|
||||
|
||||
return ok;
|
||||
@@ -346,3 +710,70 @@ json_object *parse_filter(const char *s) {
|
||||
json_end(jp);
|
||||
return filter;
|
||||
}
|
||||
|
||||
bool evaluate(std::unordered_map<std::string, mvt_value> const &feature, std::string const &layer, json_object *filter, std::set<std::string> &exclude_attributes, std::vector<std::string> const &unidecode_data) {
|
||||
std::function<mvt_value(std::string const &)> getter = [&](std::string const &key) {
|
||||
auto f = feature.find(key);
|
||||
if (f != feature.end()) {
|
||||
return f->second;
|
||||
} else {
|
||||
mvt_value v;
|
||||
v.type = mvt_no_such_key;
|
||||
v.numeric_value.null_value = 0;
|
||||
return v;
|
||||
}
|
||||
};
|
||||
|
||||
return evaluate(getter, layer, filter, exclude_attributes, unidecode_data);
|
||||
}
|
||||
|
||||
bool evaluate(mvt_feature const &feat, mvt_layer const &layer, json_object *filter, std::set<std::string> &exclude_attributes, int z, std::vector<std::string> const &unidecode_data) {
|
||||
std::function<mvt_value(std::string const &)> getter = [&](std::string const &key) {
|
||||
const static std::string dollar_id = "$id";
|
||||
if (key == dollar_id && feat.has_id) {
|
||||
mvt_value v;
|
||||
v.type = mvt_uint;
|
||||
v.numeric_value.uint_value = feat.id;
|
||||
return v;
|
||||
}
|
||||
|
||||
const static std::string dollar_type = "$type";
|
||||
if (key == dollar_type) {
|
||||
mvt_value v;
|
||||
v.type = mvt_string;
|
||||
|
||||
if (feat.type == mvt_point) {
|
||||
const static std::string point = "Point";
|
||||
v.set_string_value(point);
|
||||
} else if (feat.type == mvt_linestring) {
|
||||
const static std::string linestring = "LineString";
|
||||
v.set_string_value(linestring);
|
||||
} else if (feat.type == mvt_polygon) {
|
||||
const static std::string polygon = "Polygon";
|
||||
v.set_string_value(polygon);
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
const static std::string dollar_zoom = "$zoom";
|
||||
if (key == dollar_zoom) {
|
||||
mvt_value v2;
|
||||
v2.type = mvt_uint;
|
||||
v2.numeric_value.uint_value = z;
|
||||
return v2;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i + 1 < feat.tags.size(); i += 2) {
|
||||
if (layer.keys[feat.tags[i]] == key) {
|
||||
return layer.values[feat.tags[i + 1]];
|
||||
}
|
||||
}
|
||||
|
||||
mvt_value v;
|
||||
v.type = mvt_no_such_key;
|
||||
v.numeric_value.null_value = 0;
|
||||
return v;
|
||||
};
|
||||
|
||||
return evaluate(getter, layer.name, filter, exclude_attributes, unidecode_data);
|
||||
}
|
||||
|
||||
+4
-2
@@ -1,14 +1,16 @@
|
||||
#ifndef EVALUATOR_HPP
|
||||
#define EVALUATOR HPP
|
||||
|
||||
#include <map>
|
||||
#include <unordered_map>
|
||||
#include <string>
|
||||
#include <set>
|
||||
#include "jsonpull/jsonpull.h"
|
||||
#include "mvt.hpp"
|
||||
|
||||
bool evaluate(std::map<std::string, mvt_value> const &feature, std::string const &layer, json_object *filter, std::set<std::string> &exclude_attributes);
|
||||
bool evaluate(std::unordered_map<std::string, mvt_value> const &feature, std::string const &layer, json_object *filter, std::set<std::string> &exclude_attributes, std::vector<std::string> const &unidecode_data);
|
||||
json_object *parse_filter(const char *s);
|
||||
json_object *read_filter(const char *fname);
|
||||
|
||||
bool evaluate(mvt_feature const &feat, mvt_layer const &layer, json_object *filter, std::set<std::string> &exclude_attributes, int z, std::vector<std::string> const &unidecode_data);
|
||||
|
||||
#endif
|
||||
|
||||
+5
-5
@@ -7,6 +7,7 @@
|
||||
#include "milo/dtoa_milo.h"
|
||||
#include "main.hpp"
|
||||
#include "errors.hpp"
|
||||
#include "thread.hpp"
|
||||
|
||||
static constexpr uint8_t magicbytes[8] = { 0x66, 0x67, 0x62, 0x03, 0x66, 0x67, 0x62, 0x01 };
|
||||
|
||||
@@ -131,7 +132,6 @@ void readFeature(const FlatGeobuf::Feature *feature, long long feature_sequence_
|
||||
serial_feature sf;
|
||||
|
||||
sf.layer = layer;
|
||||
sf.layername = layername;
|
||||
sf.segment = sst->segment;
|
||||
if (feature_sequence_id >= 0) {
|
||||
sf.has_id = true;
|
||||
@@ -139,8 +139,8 @@ void readFeature(const FlatGeobuf::Feature *feature, long long feature_sequence_
|
||||
sf.has_id = false;
|
||||
}
|
||||
sf.id = feature_sequence_id;
|
||||
sf.has_tippecanoe_minzoom = false;
|
||||
sf.has_tippecanoe_maxzoom = false;
|
||||
sf.tippecanoe_minzoom = -1;
|
||||
sf.tippecanoe_maxzoom = -1;
|
||||
sf.feature_minzoom = false;
|
||||
sf.seq = (*sst->layer_seq);
|
||||
sf.geometry = dv;
|
||||
@@ -246,7 +246,7 @@ void readFeature(const FlatGeobuf::Feature *feature, long long feature_sequence_
|
||||
sf.full_keys = full_keys;
|
||||
sf.full_values = full_values;
|
||||
|
||||
serialize_feature(sst, sf);
|
||||
serialize_feature(sst, sf, layername);
|
||||
}
|
||||
|
||||
struct fgb_queued_feature {
|
||||
@@ -303,7 +303,7 @@ void fgbRunQueue() {
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < CPUS; i++) {
|
||||
if (pthread_create(&pthreads[i], NULL, fgb_run_parse_feature, &qra[i]) != 0) {
|
||||
if (thread_create(&pthreads[i], NULL, fgb_run_parse_feature, &qra[i]) != 0) {
|
||||
perror("pthread_create");
|
||||
exit(EXIT_PTHREAD);
|
||||
}
|
||||
|
||||
+9
-12
@@ -15,6 +15,7 @@
|
||||
#include "jsonpull/jsonpull.h"
|
||||
#include "text.hpp"
|
||||
#include "errors.hpp"
|
||||
#include "thread.hpp"
|
||||
|
||||
#define POINT 0
|
||||
#define MULTIPOINT 1
|
||||
@@ -379,12 +380,11 @@ void readFeature(protozero::pbf_reader &pbf, size_t dim, double e, std::vector<s
|
||||
serial_feature sf;
|
||||
|
||||
sf.layer = layer;
|
||||
sf.layername = layername;
|
||||
sf.segment = sst->segment;
|
||||
sf.has_id = has_id;
|
||||
sf.id = id;
|
||||
sf.has_tippecanoe_minzoom = false;
|
||||
sf.has_tippecanoe_maxzoom = false;
|
||||
sf.tippecanoe_minzoom = -1;
|
||||
sf.tippecanoe_maxzoom = -1;
|
||||
sf.feature_minzoom = false;
|
||||
sf.seq = *(sst->layer_seq);
|
||||
sf.geometry = dv[i].dv;
|
||||
@@ -400,19 +400,17 @@ void readFeature(protozero::pbf_reader &pbf, size_t dim, double e, std::vector<s
|
||||
if (o != NULL) {
|
||||
json_object *min = json_hash_get(o, "minzoom");
|
||||
if (min != NULL && (min->type == JSON_NUMBER)) {
|
||||
sf.has_tippecanoe_minzoom = true;
|
||||
sf.tippecanoe_minzoom = integer_zoom(sst->fname, milo::dtoa_milo(min->value.number.number));
|
||||
}
|
||||
|
||||
json_object *max = json_hash_get(o, "maxzoom");
|
||||
if (max != NULL && (max->type == JSON_NUMBER)) {
|
||||
sf.has_tippecanoe_maxzoom = true;
|
||||
sf.tippecanoe_maxzoom = integer_zoom(sst->fname, milo::dtoa_milo(max->value.number.number));
|
||||
}
|
||||
|
||||
json_object *tlayer = json_hash_get(o, "layer");
|
||||
if (tlayer != NULL && (tlayer->type == JSON_STRING)) {
|
||||
sf.layername = tlayer->value.string.string;
|
||||
layername = tlayer->value.string.string;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -420,7 +418,7 @@ void readFeature(protozero::pbf_reader &pbf, size_t dim, double e, std::vector<s
|
||||
json_end(jp);
|
||||
}
|
||||
|
||||
serialize_feature(sst, sf);
|
||||
serialize_feature(sst, sf, layername);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -465,7 +463,7 @@ void runQueue() {
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < CPUS; i++) {
|
||||
if (pthread_create(&pthreads[i], NULL, run_parse_feature, &qra[i]) != 0) {
|
||||
if (thread_create(&pthreads[i], NULL, run_parse_feature, &qra[i]) != 0) {
|
||||
perror("pthread_create");
|
||||
exit(EXIT_PTHREAD);
|
||||
}
|
||||
@@ -506,17 +504,16 @@ void outBareGeometry(drawvec const &dv, int type, struct serialization_state *ss
|
||||
serial_feature sf;
|
||||
|
||||
sf.layer = layer;
|
||||
sf.layername = layername;
|
||||
sf.segment = sst->segment;
|
||||
sf.has_id = false;
|
||||
sf.has_tippecanoe_minzoom = false;
|
||||
sf.has_tippecanoe_maxzoom = false;
|
||||
sf.tippecanoe_minzoom = -1;
|
||||
sf.tippecanoe_maxzoom = -1;
|
||||
sf.feature_minzoom = false;
|
||||
sf.seq = (*sst->layer_seq);
|
||||
sf.geometry = dv;
|
||||
sf.t = type;
|
||||
|
||||
serialize_feature(sst, sf);
|
||||
serialize_feature(sst, sf, layername);
|
||||
}
|
||||
|
||||
void readFeatureCollection(protozero::pbf_reader &pbf, size_t dim, double e, std::vector<std::string> &keys, std::vector<struct serialization_state> *sst, int layer, std::string layername) {
|
||||
|
||||
+3
-4
@@ -115,12 +115,11 @@ void parse_geocsv(std::vector<struct serialization_state> &sst, std::string fnam
|
||||
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.tippecanoe_minzoom = -1;
|
||||
sf.tippecanoe_maxzoom = -1;
|
||||
sf.feature_minzoom = false;
|
||||
sf.seq = *(sst[0].layer_seq);
|
||||
sf.geometry = dv;
|
||||
@@ -128,7 +127,7 @@ void parse_geocsv(std::vector<struct serialization_state> &sst, std::string fnam
|
||||
sf.full_keys = full_keys;
|
||||
sf.full_values = full_values;
|
||||
|
||||
serialize_feature(&sst[0], sf);
|
||||
serialize_feature(&sst[0], sf, layername);
|
||||
}
|
||||
|
||||
if (fname.size() != 0) {
|
||||
|
||||
+12
-47
@@ -10,7 +10,6 @@
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/mman.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
@@ -41,7 +40,7 @@
|
||||
#include "milo/dtoa_milo.h"
|
||||
#include "errors.hpp"
|
||||
|
||||
int serialize_geojson_feature(struct serialization_state *sst, json_object *geometry, json_object *properties, json_object *id, int layer, json_object *tippecanoe, json_object *feature, std::string layername) {
|
||||
int serialize_geojson_feature(struct serialization_state *sst, json_object *geometry, json_object *properties, json_object *id, int layer, json_object *tippecanoe, json_object *feature, std::string const &layername) {
|
||||
json_object *geometry_type = json_hash_get(geometry, "type");
|
||||
if (geometry_type == NULL) {
|
||||
static int warned = 0;
|
||||
@@ -81,7 +80,7 @@ int serialize_geojson_feature(struct serialization_state *sst, json_object *geom
|
||||
|
||||
int tippecanoe_minzoom = -1;
|
||||
int tippecanoe_maxzoom = -1;
|
||||
std::string tippecanoe_layername;
|
||||
std::string tippecanoe_layername = layername;
|
||||
|
||||
if (tippecanoe != NULL) {
|
||||
json_object *min = json_hash_get(tippecanoe, "minzoom");
|
||||
@@ -182,36 +181,18 @@ int serialize_geojson_feature(struct serialization_state *sst, json_object *geom
|
||||
nprop = properties->value.object.length;
|
||||
}
|
||||
|
||||
std::vector<char *> metakey;
|
||||
metakey.resize(nprop);
|
||||
std::vector<std::string> keys;
|
||||
std::vector<serial_val> values;
|
||||
|
||||
std::vector<std::string> metaval;
|
||||
metaval.resize(nprop);
|
||||
|
||||
std::vector<int> metatype;
|
||||
metatype.resize(nprop);
|
||||
|
||||
size_t m = 0;
|
||||
keys.reserve(nprop);
|
||||
values.reserve(nprop);
|
||||
|
||||
for (size_t i = 0; i < nprop; i++) {
|
||||
if (properties->value.object.keys[i]->type == JSON_STRING) {
|
||||
std::string s(properties->value.object.keys[i]->value.string.string);
|
||||
serial_val sv = stringify_value(properties->value.object.values[i], sst->fname, sst->line, feature);
|
||||
|
||||
int type = -1;
|
||||
std::string val;
|
||||
stringify_value(properties->value.object.values[i], type, val, sst->fname, sst->line, feature);
|
||||
|
||||
if (type >= 0) {
|
||||
metakey[m] = properties->value.object.keys[i]->value.string.string;
|
||||
metatype[m] = type;
|
||||
metaval[m] = val;
|
||||
m++;
|
||||
} else {
|
||||
metakey[m] = properties->value.object.keys[i]->value.string.string;
|
||||
metatype[m] = mvt_null;
|
||||
metaval[m] = "null";
|
||||
m++;
|
||||
}
|
||||
keys.emplace_back(properties->value.object.keys[i]->value.string.string);
|
||||
values.push_back(std::move(sv));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -224,31 +205,15 @@ int serialize_geojson_feature(struct serialization_state *sst, json_object *geom
|
||||
sf.t = mb_geometry[t];
|
||||
sf.has_id = has_id;
|
||||
sf.id = id_value;
|
||||
sf.has_tippecanoe_minzoom = (tippecanoe_minzoom != -1);
|
||||
sf.tippecanoe_minzoom = tippecanoe_minzoom;
|
||||
sf.has_tippecanoe_maxzoom = (tippecanoe_maxzoom != -1);
|
||||
sf.tippecanoe_maxzoom = tippecanoe_maxzoom;
|
||||
sf.geometry = dv;
|
||||
sf.feature_minzoom = 0; // Will be filled in during index merging
|
||||
sf.seq = *(sst->layer_seq);
|
||||
sf.full_keys = std::move(keys);
|
||||
sf.full_values = std::move(values);
|
||||
|
||||
if (tippecanoe_layername.size() != 0) {
|
||||
sf.layername = tippecanoe_layername;
|
||||
} else {
|
||||
sf.layername = layername;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < m; i++) {
|
||||
sf.full_keys.push_back(metakey[i]);
|
||||
|
||||
serial_val sv;
|
||||
sv.type = metatype[i];
|
||||
sv.s = metaval[i];
|
||||
|
||||
sf.full_values.push_back(sv);
|
||||
}
|
||||
|
||||
return serialize_feature(sst, sf);
|
||||
return serialize_feature(sst, sf, tippecanoe_layername);
|
||||
}
|
||||
|
||||
void check_crs(json_object *j, const char *reading) {
|
||||
|
||||
+24
-32
@@ -21,7 +21,7 @@
|
||||
#include "errors.hpp"
|
||||
#include "projection.hpp"
|
||||
|
||||
drawvec decode_geometry(char **meta, int z, unsigned tx, unsigned ty, long long *bbox, unsigned initial_x, unsigned initial_y) {
|
||||
drawvec decode_geometry(const char **meta, int z, unsigned tx, unsigned ty, long long *bbox, unsigned initial_x, unsigned initial_y) {
|
||||
drawvec out;
|
||||
|
||||
bbox[0] = LLONG_MAX;
|
||||
@@ -56,18 +56,10 @@ drawvec decode_geometry(char **meta, int z, unsigned tx, unsigned ty, long long
|
||||
wwy -= ty << (32 - z);
|
||||
}
|
||||
|
||||
if (wwx < bbox[0]) {
|
||||
bbox[0] = wwx;
|
||||
}
|
||||
if (wwy < bbox[1]) {
|
||||
bbox[1] = wwy;
|
||||
}
|
||||
if (wwx > bbox[2]) {
|
||||
bbox[2] = wwx;
|
||||
}
|
||||
if (wwy > bbox[3]) {
|
||||
bbox[3] = wwy;
|
||||
}
|
||||
bbox[0] = std::min(wwx, bbox[0]);
|
||||
bbox[1] = std::min(wwy, bbox[1]);
|
||||
bbox[2] = std::max(wwx, bbox[2]);
|
||||
bbox[3] = std::max(wwy, bbox[3]);
|
||||
|
||||
d.x = wwx;
|
||||
d.y = wwy;
|
||||
@@ -96,13 +88,13 @@ void check_polygon(drawvec &geom) {
|
||||
mapbox::geometry::linear_ring<long long> lr;
|
||||
|
||||
for (size_t k = i; k < j; k++) {
|
||||
lr.push_back(mapbox::geometry::point<long long>(geom[k].x, geom[k].y));
|
||||
lr.push_back({geom[k].x, geom[k].y});
|
||||
}
|
||||
|
||||
if (lr.size() >= 3) {
|
||||
mapbox::geometry::polygon<long long> p;
|
||||
p.push_back(lr);
|
||||
mp.push_back(p);
|
||||
p.push_back(std::move(lr));
|
||||
mp.push_back(std::move(p));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -166,7 +158,7 @@ double get_perimeter(const drawvec &geom, size_t i, size_t j) {
|
||||
return perimeter;
|
||||
}
|
||||
|
||||
drawvec reduce_tiny_poly(drawvec &geom, int z, int detail, bool *still_needs_simplification, bool *reduced_away, double *accum_area, serial_feature *this_feature, serial_feature *tiny_feature) {
|
||||
drawvec reduce_tiny_poly(drawvec const &geom, int z, int detail, bool *still_needs_simplification, bool *reduced_away, double *accum_area, serial_feature *this_feature, serial_feature *tiny_feature) {
|
||||
drawvec out;
|
||||
const double pixel = (1LL << (32 - detail - z)) * (double) tiny_polygon_size;
|
||||
bool includes_real = false;
|
||||
@@ -222,11 +214,11 @@ drawvec reduce_tiny_poly(drawvec &geom, int z, int detail, bool *still_needs_sim
|
||||
if (area > 0 && *accum_area > pixel * pixel) {
|
||||
// XXX use centroid;
|
||||
|
||||
out.push_back(draw(VT_MOVETO, geom[i].x - pixel / 2, geom[i].y - pixel / 2));
|
||||
out.push_back(draw(VT_LINETO, geom[i].x - pixel / 2 + pixel, geom[i].y - pixel / 2));
|
||||
out.push_back(draw(VT_LINETO, geom[i].x - pixel / 2 + pixel, geom[i].y - pixel / 2 + pixel));
|
||||
out.push_back(draw(VT_LINETO, geom[i].x - pixel / 2, geom[i].y - pixel / 2 + pixel));
|
||||
out.push_back(draw(VT_LINETO, geom[i].x - pixel / 2, geom[i].y - pixel / 2));
|
||||
out.emplace_back(VT_MOVETO, geom[i].x - pixel / 2, geom[i].y - pixel / 2);
|
||||
out.emplace_back(VT_LINETO, geom[i].x - pixel / 2 + pixel, geom[i].y - pixel / 2);
|
||||
out.emplace_back(VT_LINETO, geom[i].x - pixel / 2 + pixel, geom[i].y - pixel / 2 + pixel);
|
||||
out.emplace_back(VT_LINETO, geom[i].x - pixel / 2, geom[i].y - pixel / 2 + pixel);
|
||||
out.emplace_back(VT_LINETO, geom[i].x - pixel / 2, geom[i].y - pixel / 2);
|
||||
includes_dust = true;
|
||||
|
||||
*accum_area -= pixel * pixel;
|
||||
@@ -298,7 +290,7 @@ drawvec reduce_tiny_poly(drawvec &geom, int z, int detail, bool *still_needs_sim
|
||||
return out;
|
||||
}
|
||||
|
||||
int quick_check(long long *bbox, int z, long long buffer) {
|
||||
int quick_check(const long long *bbox, int z, long long buffer) {
|
||||
long long min = 0;
|
||||
long long area = 1LL << (32 - z);
|
||||
|
||||
@@ -456,7 +448,7 @@ static void douglas_peucker(drawvec &geom, int start, int n, double e, size_t ke
|
||||
// If any line segment crosses a tile boundary, add a node there
|
||||
// that cannot be simplified away, to prevent the edge of any
|
||||
// feature from jumping abruptly at the tile boundary.
|
||||
drawvec impose_tile_boundaries(drawvec &geom, long long extent) {
|
||||
drawvec impose_tile_boundaries(const drawvec &geom, long long extent) {
|
||||
drawvec out;
|
||||
|
||||
for (size_t i = 0; i < geom.size(); i++) {
|
||||
@@ -471,11 +463,11 @@ drawvec impose_tile_boundaries(drawvec &geom, long long extent) {
|
||||
|
||||
if (c > 1) { // clipped
|
||||
if (x1 != geom[i - 1].x || y1 != geom[i - 1].y) {
|
||||
out.push_back(draw(VT_LINETO, x1, y1));
|
||||
out.emplace_back(VT_LINETO, x1, y1);
|
||||
out[out.size() - 1].necessary = 1;
|
||||
}
|
||||
if (x2 != geom[i - 0].x || y2 != geom[i - 0].y) {
|
||||
out.push_back(draw(VT_LINETO, x2, y2));
|
||||
out.emplace_back(VT_LINETO, x2, y2);
|
||||
out[out.size() - 1].necessary = 1;
|
||||
}
|
||||
}
|
||||
@@ -569,17 +561,17 @@ drawvec simplify_lines(drawvec &geom, int z, int tx, int ty, int detail, bool ma
|
||||
}
|
||||
}
|
||||
|
||||
drawvec out;
|
||||
size_t out = 0;
|
||||
for (size_t i = 0; i < geom.size(); i++) {
|
||||
if (geom[i].necessary) {
|
||||
out.push_back(geom[i]);
|
||||
geom[out++] = geom[i];
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
geom.resize(out);
|
||||
return geom;
|
||||
}
|
||||
|
||||
drawvec reorder_lines(drawvec &geom) {
|
||||
drawvec reorder_lines(const drawvec &geom) {
|
||||
// Only reorder simple linestrings with a single moveto
|
||||
|
||||
if (geom.size() == 0) {
|
||||
@@ -625,7 +617,7 @@ drawvec reorder_lines(drawvec &geom) {
|
||||
return geom;
|
||||
}
|
||||
|
||||
drawvec fix_polygon(drawvec &geom) {
|
||||
drawvec fix_polygon(const drawvec &geom) {
|
||||
int outer = 1;
|
||||
drawvec out;
|
||||
|
||||
|
||||
+17
-9
@@ -8,6 +8,8 @@
|
||||
#include <sqlite3.h>
|
||||
#include <stdio.h>
|
||||
#include <mvt.hpp>
|
||||
#include "jsonpull/jsonpull.h"
|
||||
#include "attribute.hpp"
|
||||
|
||||
#define VT_POINT 1
|
||||
#define VT_LINE 2
|
||||
@@ -65,22 +67,22 @@ struct draw {
|
||||
typedef std::vector<draw> drawvec;
|
||||
struct serial_feature;
|
||||
|
||||
drawvec decode_geometry(char **meta, int z, unsigned tx, unsigned ty, long long *bbox, unsigned initial_x, unsigned initial_y);
|
||||
drawvec decode_geometry(const char **meta, int z, unsigned tx, unsigned ty, long long *bbox, unsigned initial_x, unsigned initial_y);
|
||||
void to_tile_scale(drawvec &geom, int z, int detail);
|
||||
drawvec from_tile_scale(drawvec const &geom, int z, int detail);
|
||||
drawvec remove_noop(drawvec geom, int type, int shift);
|
||||
drawvec clip_point(drawvec &geom, int z, long long buffer);
|
||||
drawvec clean_or_clip_poly(drawvec &geom, int z, int buffer, bool clip, bool try_scaling);
|
||||
drawvec close_poly(drawvec &geom);
|
||||
drawvec reduce_tiny_poly(drawvec &geom, int z, int detail, bool *still_needs_simplification, bool *reduced_away, double *accum_area, serial_feature *this_feature, serial_feature *tiny_feature);
|
||||
drawvec reduce_tiny_poly(const drawvec &geom, int z, int detail, bool *still_needs_simplification, bool *reduced_away, double *accum_area, serial_feature *this_feature, serial_feature *tiny_feature);
|
||||
int clip(long long *x0, long long *y0, long long *x1, long long *y1, long long xmin, long long ymin, long long xmax, long long ymax);
|
||||
drawvec clip_lines(drawvec &geom, int z, long long buffer);
|
||||
drawvec stairstep(drawvec &geom, int z, int detail);
|
||||
bool point_within_tile(long long x, long long y, int z);
|
||||
int quick_check(long long *bbox, int z, long long buffer);
|
||||
int quick_check(const long long *bbox, int z, long long buffer);
|
||||
drawvec simplify_lines(drawvec &geom, int z, int tx, int ty, int detail, bool mark_tile_bounds, double simplification, size_t retain, drawvec const &shared_nodes, struct node *shared_nodes_map, size_t nodepos);
|
||||
drawvec reorder_lines(drawvec &geom);
|
||||
drawvec fix_polygon(drawvec &geom);
|
||||
drawvec reorder_lines(const drawvec &geom);
|
||||
drawvec fix_polygon(const drawvec &geom);
|
||||
std::vector<drawvec> chop_polygon(std::vector<drawvec> &geoms);
|
||||
void check_polygon(drawvec &geom);
|
||||
double get_area(const drawvec &geom, size_t i, size_t j);
|
||||
@@ -98,12 +100,18 @@ void visvalingam(drawvec &ls, size_t start, size_t end, double threshold, size_t
|
||||
int pnpoly(const drawvec &vert, size_t start, size_t nvert, long long testx, long long testy);
|
||||
double distance_from_line(long long point_x, long long point_y, long long segA_x, long long segA_y, long long segB_x, long long segB_y);
|
||||
|
||||
std::string overzoom(mvt_tile tile, int oz, int ox, int oy, int nz, int nx, int ny,
|
||||
std::string overzoom(const mvt_tile &tile, int oz, int ox, int oy, int nz, int nx, int ny,
|
||||
int detail, int buffer, std::set<std::string> const &keep, bool do_compress,
|
||||
std::vector<std::pair<unsigned, unsigned>> *next_overzoomed_tiles);
|
||||
std::vector<std::pair<unsigned, unsigned>> *next_overzoomed_tiles,
|
||||
bool demultiply, json_object *filter, bool preserve_input_order,
|
||||
std::unordered_map<std::string, attribute_op> const &attribute_accum,
|
||||
std::vector<std::string> const &unidecode_data);
|
||||
|
||||
std::string overzoom(std::string s, int oz, int ox, int oy, int nz, int nx, int ny,
|
||||
std::string overzoom(const std::string &s, int oz, int ox, int oy, int nz, int nx, int ny,
|
||||
int detail, int buffer, std::set<std::string> const &keep, bool do_compress,
|
||||
std::vector<std::pair<unsigned, unsigned>> *next_overzoomed_tiles);
|
||||
std::vector<std::pair<unsigned, unsigned>> *next_overzoomed_tiles,
|
||||
bool demultiply, json_object *filter, bool preserve_input_order,
|
||||
std::unordered_map<std::string, attribute_op> const &attribute_accum,
|
||||
std::vector<std::string> const &unidecode_data);
|
||||
|
||||
#endif
|
||||
|
||||
+105
-74
@@ -10,6 +10,15 @@
|
||||
|
||||
#define BUFFER 10000
|
||||
|
||||
struct string {
|
||||
char *buf;
|
||||
size_t n;
|
||||
size_t nalloc;
|
||||
};
|
||||
|
||||
static void string_init(struct string *s);
|
||||
static void string_free(struct string *s);
|
||||
|
||||
json_pull *json_begin(ssize_t (*read)(struct json_pull *, char *buffer, size_t n), void *source) {
|
||||
json_pull *j = malloc(sizeof(json_pull));
|
||||
if (j == NULL) {
|
||||
@@ -33,6 +42,13 @@ json_pull *json_begin(ssize_t (*read)(struct json_pull *, char *buffer, size_t n
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
j->number_buffer = malloc(sizeof(struct string));
|
||||
if (j->number_buffer == NULL) {
|
||||
perror("Out of memory");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
string_init(j->number_buffer);
|
||||
|
||||
return j;
|
||||
}
|
||||
|
||||
@@ -88,6 +104,9 @@ json_pull *json_begin_string(const char *s) {
|
||||
}
|
||||
|
||||
void json_end(json_pull *p) {
|
||||
string_free(p->number_buffer);
|
||||
free(p->number_buffer);
|
||||
|
||||
json_free(p->root);
|
||||
free(p->buffer);
|
||||
free(p);
|
||||
@@ -103,7 +122,7 @@ static inline int read_wrap(json_pull *j) {
|
||||
return c;
|
||||
}
|
||||
|
||||
#define SIZE_FOR(i, size) ((size_t)((((i) + 7) & ~7) * size))
|
||||
#define SIZE_FOR(i, size) ((size_t) ((((i) + 7) & ~7) * size))
|
||||
|
||||
static json_object *fabricate_object(json_pull *jp, json_object *parent, json_type type) {
|
||||
json_object *o = malloc(sizeof(struct json_object));
|
||||
@@ -215,12 +234,6 @@ json_object *json_hash_get(json_object *o, const char *s) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct string {
|
||||
char *buf;
|
||||
size_t n;
|
||||
size_t nalloc;
|
||||
};
|
||||
|
||||
static void string_init(struct string *s) {
|
||||
s->nalloc = 500;
|
||||
s->buf = malloc(s->nalloc);
|
||||
@@ -292,38 +305,45 @@ json_object *json_read_separators(json_pull *j, json_separator_callback cb, void
|
||||
}
|
||||
|
||||
again:
|
||||
/////////////////////////// Whitespace
|
||||
|
||||
do {
|
||||
c = read_wrap(j);
|
||||
if (c == EOF) {
|
||||
if (j->container != NULL) {
|
||||
j->error = "Reached EOF without all containers being closed";
|
||||
}
|
||||
|
||||
return NULL;
|
||||
c = read_wrap(j);
|
||||
if (c == EOF) {
|
||||
if (j->container != NULL) {
|
||||
j->error = "Reached EOF without all containers being closed";
|
||||
}
|
||||
|
||||
// Byte-order mark
|
||||
if (c == 0xEF) {
|
||||
int c2 = peek(j);
|
||||
if (c2 == 0xBB) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
switch (c) {
|
||||
/////////////////////////// Byte order mark
|
||||
|
||||
case 0xEF: {
|
||||
int c2 = peek(j);
|
||||
if (c2 == 0xBB) {
|
||||
c2 = read_wrap(j);
|
||||
c2 = peek(j);
|
||||
if (c2 == 0xBF) {
|
||||
c2 = read_wrap(j);
|
||||
c2 = peek(j);
|
||||
if (c2 == 0xBF) {
|
||||
c2 = read_wrap(j);
|
||||
c = ' ';
|
||||
continue;
|
||||
}
|
||||
c = ' ';
|
||||
goto again;
|
||||
}
|
||||
j->error = "Corrupt byte-order mark found";
|
||||
return NULL;
|
||||
}
|
||||
} while (c == ' ' || c == '\t' || c == '\r' || c == '\n' || c == 0x1E);
|
||||
j->error = "Corrupt byte-order mark found";
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/////////////////////////// Arrays
|
||||
/////////////////////////// Whitespace
|
||||
|
||||
if (c == '[') {
|
||||
case ' ':
|
||||
case '\t':
|
||||
case '\r':
|
||||
case '\n':
|
||||
case 0x1E:
|
||||
goto again;
|
||||
|
||||
/////////////////////////// Arrays
|
||||
|
||||
case '[': {
|
||||
json_object *o = add_object(j, JSON_ARRAY);
|
||||
if (o == NULL) {
|
||||
return NULL;
|
||||
@@ -336,7 +356,9 @@ again:
|
||||
}
|
||||
|
||||
goto again;
|
||||
} else if (c == ']') {
|
||||
}
|
||||
|
||||
case ']': {
|
||||
if (j->container == NULL) {
|
||||
j->error = "Found ] at top level";
|
||||
return NULL;
|
||||
@@ -359,9 +381,9 @@ again:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/////////////////////////// Hashes
|
||||
/////////////////////////// Hashes
|
||||
|
||||
if (c == '{') {
|
||||
case '{': {
|
||||
json_object *o = add_object(j, JSON_HASH);
|
||||
if (o == NULL) {
|
||||
return NULL;
|
||||
@@ -374,7 +396,9 @@ again:
|
||||
}
|
||||
|
||||
goto again;
|
||||
} else if (c == '}') {
|
||||
}
|
||||
|
||||
case '}': {
|
||||
if (j->container == NULL) {
|
||||
j->error = "Found } at top level";
|
||||
return NULL;
|
||||
@@ -397,9 +421,9 @@ again:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/////////////////////////// Null
|
||||
/////////////////////////// Null
|
||||
|
||||
if (c == 'n') {
|
||||
case 'n': {
|
||||
if (read_wrap(j) != 'u' || read_wrap(j) != 'l' || read_wrap(j) != 'l') {
|
||||
j->error = "Found misspelling of null";
|
||||
return NULL;
|
||||
@@ -408,9 +432,9 @@ again:
|
||||
return add_object(j, JSON_NULL);
|
||||
}
|
||||
|
||||
/////////////////////////// NaN
|
||||
/////////////////////////// NaN
|
||||
|
||||
if (c == 'N') {
|
||||
case 'N': {
|
||||
if (read_wrap(j) != 'a' || read_wrap(j) != 'N') {
|
||||
j->error = "Found misspelling of NaN";
|
||||
return NULL;
|
||||
@@ -420,9 +444,9 @@ again:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/////////////////////////// Infinity
|
||||
/////////////////////////// Infinity
|
||||
|
||||
if (c == 'I') {
|
||||
case 'I': {
|
||||
if (read_wrap(j) != 'n' || read_wrap(j) != 'f' || read_wrap(j) != 'i' ||
|
||||
read_wrap(j) != 'n' || read_wrap(j) != 'i' || read_wrap(j) != 't' ||
|
||||
read_wrap(j) != 'y') {
|
||||
@@ -434,9 +458,9 @@ again:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/////////////////////////// True
|
||||
/////////////////////////// True
|
||||
|
||||
if (c == 't') {
|
||||
case 't': {
|
||||
if (read_wrap(j) != 'r' || read_wrap(j) != 'u' || read_wrap(j) != 'e') {
|
||||
j->error = "Found misspelling of true";
|
||||
return NULL;
|
||||
@@ -445,9 +469,9 @@ again:
|
||||
return add_object(j, JSON_TRUE);
|
||||
}
|
||||
|
||||
/////////////////////////// False
|
||||
/////////////////////////// False
|
||||
|
||||
if (c == 'f') {
|
||||
case 'f': {
|
||||
if (read_wrap(j) != 'a' || read_wrap(j) != 'l' || read_wrap(j) != 's' || read_wrap(j) != 'e') {
|
||||
j->error = "Found misspelling of false";
|
||||
return NULL;
|
||||
@@ -456,9 +480,9 @@ again:
|
||||
return add_object(j, JSON_FALSE);
|
||||
}
|
||||
|
||||
/////////////////////////// Comma
|
||||
/////////////////////////// Comma
|
||||
|
||||
if (c == ',') {
|
||||
case ',': {
|
||||
if (j->container != NULL) {
|
||||
if (j->container->expect != JSON_COMMA) {
|
||||
j->error = "Found unexpected comma";
|
||||
@@ -479,9 +503,9 @@ again:
|
||||
goto again;
|
||||
}
|
||||
|
||||
/////////////////////////// Colon
|
||||
/////////////////////////// Colon
|
||||
|
||||
if (c == ':') {
|
||||
case ':': {
|
||||
if (j->container == NULL) {
|
||||
j->error = "Found colon at top level";
|
||||
return NULL;
|
||||
@@ -501,71 +525,80 @@ again:
|
||||
goto again;
|
||||
}
|
||||
|
||||
/////////////////////////// Numbers
|
||||
/////////////////////////// Numbers
|
||||
|
||||
if (c == '-' || (c >= '0' && c <= '9')) {
|
||||
struct string val;
|
||||
string_init(&val);
|
||||
case '-':
|
||||
case '0':
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
case '8':
|
||||
case '9': {
|
||||
j->number_buffer->n = 0;
|
||||
int decimal = 0;
|
||||
|
||||
if (c == '-') {
|
||||
string_append(&val, c);
|
||||
string_append(j->number_buffer, c);
|
||||
c = read_wrap(j);
|
||||
}
|
||||
|
||||
if (c == '0') {
|
||||
string_append(&val, c);
|
||||
string_append(j->number_buffer, c);
|
||||
} else if (c >= '1' && c <= '9') {
|
||||
string_append(&val, c);
|
||||
string_append(j->number_buffer, c);
|
||||
c = peek(j);
|
||||
|
||||
while (c >= '0' && c <= '9') {
|
||||
string_append(&val, read_wrap(j));
|
||||
string_append(j->number_buffer, read_wrap(j));
|
||||
c = peek(j);
|
||||
}
|
||||
}
|
||||
|
||||
if (peek(j) == '.') {
|
||||
string_append(&val, read_wrap(j));
|
||||
string_append(j->number_buffer, read_wrap(j));
|
||||
decimal = 1;
|
||||
|
||||
c = peek(j);
|
||||
if (c < '0' || c > '9') {
|
||||
j->error = "Decimal point without digits";
|
||||
string_free(&val);
|
||||
string_free(j->number_buffer);
|
||||
return NULL;
|
||||
}
|
||||
while (c >= '0' && c <= '9') {
|
||||
string_append(&val, read_wrap(j));
|
||||
string_append(j->number_buffer, read_wrap(j));
|
||||
c = peek(j);
|
||||
}
|
||||
}
|
||||
|
||||
c = peek(j);
|
||||
if (c == 'e' || c == 'E') {
|
||||
string_append(&val, read_wrap(j));
|
||||
string_append(j->number_buffer, read_wrap(j));
|
||||
decimal = 1;
|
||||
|
||||
c = peek(j);
|
||||
if (c == '+' || c == '-') {
|
||||
string_append(&val, read_wrap(j));
|
||||
string_append(j->number_buffer, read_wrap(j));
|
||||
}
|
||||
|
||||
c = peek(j);
|
||||
if (c < '0' || c > '9') {
|
||||
j->error = "Exponent without digits";
|
||||
string_free(&val);
|
||||
string_free(j->number_buffer);
|
||||
return NULL;
|
||||
}
|
||||
while (c >= '0' && c <= '9') {
|
||||
string_append(&val, read_wrap(j));
|
||||
string_append(j->number_buffer, read_wrap(j));
|
||||
c = peek(j);
|
||||
}
|
||||
}
|
||||
|
||||
json_object *n = add_object(j, JSON_NUMBER);
|
||||
if (n != NULL) {
|
||||
n->value.number.number = atof(val.buf);
|
||||
n->value.number.number = atof(j->number_buffer->buf);
|
||||
n->value.number.large_signed = 0;
|
||||
n->value.number.large_unsigned = 0;
|
||||
|
||||
@@ -575,7 +608,7 @@ again:
|
||||
if (!decimal && n->value.number.number > MAX_SAFE_INTEGER) {
|
||||
errno = 0;
|
||||
char *err = NULL;
|
||||
unsigned long long ull = strtoull(val.buf, &err, 10);
|
||||
unsigned long long ull = strtoull(j->number_buffer->buf, &err, 10);
|
||||
if (errno == 0 && (err == NULL || *err == '\0')) {
|
||||
n->value.number.large_unsigned = ull;
|
||||
}
|
||||
@@ -583,22 +616,18 @@ again:
|
||||
if (!decimal && n->value.number.number < MIN_SAFE_INTEGER) {
|
||||
errno = 0;
|
||||
char *err = NULL;
|
||||
long long ll = strtoll(val.buf, &err, 10);
|
||||
long long ll = strtoll(j->number_buffer->buf, &err, 10);
|
||||
if (errno == 0 && (err == NULL || *err == '\0')) {
|
||||
n->value.number.large_signed = ll;
|
||||
}
|
||||
}
|
||||
|
||||
string_free(&val);
|
||||
} else {
|
||||
string_free(&val);
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
/////////////////////////// Strings
|
||||
/////////////////////////// Strings
|
||||
|
||||
if (c == '"') {
|
||||
case '"': {
|
||||
struct string val;
|
||||
string_init(&val);
|
||||
|
||||
@@ -726,11 +755,13 @@ again:
|
||||
json_object *s = add_object(j, JSON_STRING);
|
||||
if (s != NULL) {
|
||||
s->value.string.string = val.buf;
|
||||
s->value.string.refcon = NULL;
|
||||
} else {
|
||||
string_free(&val);
|
||||
}
|
||||
return s;
|
||||
}
|
||||
}
|
||||
|
||||
j->error = "Found unexpected character";
|
||||
return NULL;
|
||||
|
||||
@@ -38,6 +38,7 @@ typedef struct json_object {
|
||||
|
||||
struct {
|
||||
char *string;
|
||||
void *refcon; // reference constant for caller's use
|
||||
} string;
|
||||
|
||||
struct {
|
||||
@@ -68,6 +69,8 @@ typedef struct json_pull {
|
||||
|
||||
json_object *container;
|
||||
json_object *root;
|
||||
|
||||
struct string *number_buffer;
|
||||
} json_pull;
|
||||
|
||||
json_pull *json_begin_file(FILE *f);
|
||||
|
||||
@@ -66,6 +66,8 @@
|
||||
#include "errors.hpp"
|
||||
#include "read_json.hpp"
|
||||
#include "sort.hpp"
|
||||
#include "attribute.hpp"
|
||||
#include "thread.hpp"
|
||||
|
||||
static int low_detail = 12;
|
||||
static int full_detail = -1;
|
||||
@@ -93,6 +95,8 @@ unsigned int drop_denser = 0;
|
||||
std::map<std::string, serial_val> set_attributes;
|
||||
unsigned long long preserve_point_density_threshold = 0;
|
||||
long long extend_zooms_max = 0;
|
||||
int retain_points_multiplier = 1;
|
||||
std::vector<std::string> unidecode_data;
|
||||
|
||||
std::vector<order_field> order_by;
|
||||
bool order_reverse;
|
||||
@@ -303,7 +307,6 @@ int calc_feature_minzoom(struct index *ix, struct drop_state *ds, int maxzoom, d
|
||||
for (ssize_t i = maxzoom; i >= 0; i--) {
|
||||
ds[i].seq++;
|
||||
}
|
||||
ssize_t chosen = maxzoom + 1;
|
||||
for (ssize_t i = maxzoom; i >= 0; i--) {
|
||||
if (ds[i].seq < 0) {
|
||||
feature_minzoom = i + 1;
|
||||
@@ -317,7 +320,6 @@ int calc_feature_minzoom(struct index *ix, struct drop_state *ds, int maxzoom, d
|
||||
ds[j].previndex = ix->ix;
|
||||
}
|
||||
|
||||
chosen = i + 1;
|
||||
break;
|
||||
} else {
|
||||
ds[i].seq -= ds[i].interval;
|
||||
@@ -330,7 +332,7 @@ int calc_feature_minzoom(struct index *ix, struct drop_state *ds, int maxzoom, d
|
||||
// we will go ahead and push it out.
|
||||
|
||||
if (preserve_point_density_threshold > 0) {
|
||||
for (ssize_t i = 0; i < chosen && i < maxzoom; i++) {
|
||||
for (ssize_t i = 0; i < feature_minzoom && i < maxzoom; i++) {
|
||||
if (ix->ix - ds[i].previndex > ((1LL << (32 - i)) / preserve_point_density_threshold) * ((1LL << (32 - i)) / preserve_point_density_threshold)) {
|
||||
feature_minzoom = i;
|
||||
|
||||
@@ -448,7 +450,7 @@ void *run_sort(void *v) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void do_read_parallel(char *map, long long len, long long initial_offset, const char *reading, std::vector<struct reader> *readers, std::atomic<long long> *progress_seq, std::set<std::string> *exclude, std::set<std::string> *include, int exclude_all, int basezoom, int source, std::vector<std::map<std::string, layermap_entry> > *layermaps, int *initialized, unsigned *initial_x, unsigned *initial_y, int maxzoom, std::string layername, bool uses_gamma, std::map<std::string, int> const *attribute_types, int separator, double *dist_sum, size_t *dist_count, double *area_sum, bool want_dist, bool filters) {
|
||||
void do_read_parallel(char *map, long long len, long long initial_offset, const char *reading, std::vector<struct reader> *readers, std::atomic<long long> *progress_seq, std::set<std::string> *exclude, std::set<std::string> *include, int exclude_all, int basezoom, int source, std::vector<std::map<std::string, layermap_entry> > *layermaps, int *initialized, unsigned *initial_x, unsigned *initial_y, int maxzoom, std::string layername, bool uses_gamma, std::unordered_map<std::string, int> const *attribute_types, int separator, double *dist_sum, size_t *dist_count, double *area_sum, bool want_dist, bool filters) {
|
||||
long long segs[CPUS + 1];
|
||||
segs[0] = 0;
|
||||
segs[CPUS] = len;
|
||||
@@ -480,10 +482,10 @@ void do_read_parallel(char *map, long long len, long long initial_offset, const
|
||||
sst.resize(CPUS);
|
||||
|
||||
pthread_t pthreads[CPUS];
|
||||
std::vector<std::set<type_and_string> > file_subkeys;
|
||||
std::vector<std::set<serial_val> > file_subkeys;
|
||||
|
||||
for (size_t i = 0; i < CPUS; i++) {
|
||||
file_subkeys.push_back(std::set<type_and_string>());
|
||||
file_subkeys.push_back(std::set<serial_val>());
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < CPUS; i++) {
|
||||
@@ -518,7 +520,7 @@ void do_read_parallel(char *map, long long len, long long initial_offset, const
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < CPUS; i++) {
|
||||
if (pthread_create(&pthreads[i], NULL, run_parse_json, &pja[i]) != 0) {
|
||||
if (thread_create(&pthreads[i], NULL, run_parse_json, &pja[i]) != 0) {
|
||||
perror("pthread_create");
|
||||
exit(EXIT_PTHREAD);
|
||||
}
|
||||
@@ -649,7 +651,7 @@ struct read_parallel_arg {
|
||||
unsigned *initial_y = NULL;
|
||||
std::string layername = "";
|
||||
bool uses_gamma = false;
|
||||
std::map<std::string, int> const *attribute_types = NULL;
|
||||
std::unordered_map<std::string, int> const *attribute_types = NULL;
|
||||
double *dist_sum = NULL;
|
||||
size_t *dist_count = NULL;
|
||||
double *area_sum = NULL;
|
||||
@@ -693,7 +695,7 @@ void *run_read_parallel(void *v) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void start_parsing(int fd, STREAM *fp, long long offset, long long len, std::atomic<int> *is_parsing, pthread_t *parallel_parser, bool &parser_created, const char *reading, std::vector<struct reader> *readers, std::atomic<long long> *progress_seq, std::set<std::string> *exclude, std::set<std::string> *include, int exclude_all, int basezoom, int source, std::vector<std::map<std::string, layermap_entry> > &layermaps, int *initialized, unsigned *initial_x, unsigned *initial_y, int maxzoom, std::string layername, bool uses_gamma, std::map<std::string, int> const *attribute_types, int separator, double *dist_sum, size_t *dist_count, double *area_sum, bool want_dist, bool filters) {
|
||||
void start_parsing(int fd, STREAM *fp, long long offset, long long len, std::atomic<int> *is_parsing, pthread_t *parallel_parser, bool &parser_created, const char *reading, std::vector<struct reader> *readers, std::atomic<long long> *progress_seq, std::set<std::string> *exclude, std::set<std::string> *include, int exclude_all, int basezoom, int source, std::vector<std::map<std::string, layermap_entry> > &layermaps, int *initialized, unsigned *initial_x, unsigned *initial_y, int maxzoom, std::string layername, bool uses_gamma, std::unordered_map<std::string, int> const *attribute_types, int separator, double *dist_sum, size_t *dist_count, double *area_sum, bool want_dist, bool filters) {
|
||||
// This has to kick off an intermediate thread to start the parser threads,
|
||||
// so the main thread can get back to reading the next input stage while
|
||||
// the intermediate thread waits for the completion of the parser threads.
|
||||
@@ -735,7 +737,7 @@ void start_parsing(int fd, STREAM *fp, long long offset, long long len, std::ato
|
||||
rpa->want_dist = want_dist;
|
||||
rpa->filters = filters;
|
||||
|
||||
if (pthread_create(parallel_parser, NULL, run_read_parallel, rpa) != 0) {
|
||||
if (thread_create(parallel_parser, NULL, run_read_parallel, rpa) != 0) {
|
||||
perror("pthread_create");
|
||||
exit(EXIT_PTHREAD);
|
||||
}
|
||||
@@ -931,7 +933,7 @@ void radix1(int *geomfds_in, int *indexfds_in, int inputs, int prefix, int split
|
||||
}
|
||||
|
||||
for (size_t a = 0; a < CPUS; a++) {
|
||||
if (pthread_create(&pthreads[a], NULL, run_sort, &args[a]) != 0) {
|
||||
if (thread_create(&pthreads[a], NULL, run_sort, &args[a]) != 0) {
|
||||
perror("pthread_create");
|
||||
exit(EXIT_PTHREAD);
|
||||
}
|
||||
@@ -1237,7 +1239,7 @@ int vertexcmp(const void *void1, const void *void2) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::pair<int, metadata> read_input(std::vector<source> &sources, char *fname, int maxzoom, int minzoom, int basezoom, double basezoom_marker_width, sqlite3 *outdb, const char *outdir, std::set<std::string> *exclude, std::set<std::string> *include, int exclude_all, json_object *filter, double droprate, int buffer, const char *tmpdir, double gamma, int read_parallel, int forcetable, const char *attribution, bool uses_gamma, long long *file_bbox, long long *file_bbox1, long long *file_bbox2, const char *prefilter, const char *postfilter, const char *description, bool guess_maxzoom, bool guess_cluster_maxzoom, std::map<std::string, int> const *attribute_types, const char *pgm, std::map<std::string, attribute_op> const *attribute_accum, std::map<std::string, std::string> const &attribute_descriptions, std::string const &commandline, int minimum_maxzoom) {
|
||||
std::pair<int, metadata> read_input(std::vector<source> &sources, char *fname, int maxzoom, int minzoom, int basezoom, double basezoom_marker_width, sqlite3 *outdb, const char *outdir, std::set<std::string> *exclude, std::set<std::string> *include, int exclude_all, json_object *filter, double droprate, int buffer, const char *tmpdir, double gamma, int read_parallel, int forcetable, const char *attribution, bool uses_gamma, long long *file_bbox, long long *file_bbox1, long long *file_bbox2, const char *prefilter, const char *postfilter, const char *description, bool guess_maxzoom, bool guess_cluster_maxzoom, std::unordered_map<std::string, int> const *attribute_types, const char *pgm, std::unordered_map<std::string, attribute_op> const *attribute_accum, std::map<std::string, std::string> const &attribute_descriptions, std::string const &commandline, int minimum_maxzoom) {
|
||||
int ret = EXIT_SUCCESS;
|
||||
|
||||
std::vector<struct reader> readers;
|
||||
@@ -1335,7 +1337,8 @@ std::pair<int, metadata> read_input(std::vector<source> &sources, char *fname, i
|
||||
// To distinguish a null value
|
||||
{
|
||||
struct stringpool p;
|
||||
memfile_write(r->treefile, &p, sizeof(struct stringpool));
|
||||
bool in_memory;
|
||||
memfile_write(r->treefile, &p, sizeof(struct stringpool), in_memory);
|
||||
}
|
||||
|
||||
r->file_bbox[0] = r->file_bbox[1] = UINT_MAX;
|
||||
@@ -2757,7 +2760,7 @@ std::pair<int, metadata> read_input(std::vector<source> &sources, char *fname, i
|
||||
std::atomic<unsigned> midx(0);
|
||||
std::atomic<unsigned> midy(0);
|
||||
std::vector<strategy> strategies;
|
||||
int written = traverse_zooms(fd, size, stringpool, &midx, &midy, maxzoom, minzoom, outdb, outdir, buffer, fname, tmpdir, gamma, full_detail, low_detail, min_detail, pool_off, initial_x, initial_y, simplification, maxzoom_simplification, layermaps, prefilter, postfilter, attribute_accum, filter, strategies, iz, shared_nodes_map, nodepos);
|
||||
int written = traverse_zooms(fd, size, stringpool, &midx, &midy, maxzoom, minzoom, outdb, outdir, buffer, fname, tmpdir, gamma, full_detail, low_detail, min_detail, pool_off, initial_x, initial_y, simplification, maxzoom_simplification, layermaps, prefilter, postfilter, attribute_accum, filter, strategies, iz, shared_nodes_map, nodepos, basezoom, droprate, unidecode_data);
|
||||
|
||||
if (maxzoom != written) {
|
||||
if (written > minzoom) {
|
||||
@@ -2825,7 +2828,7 @@ std::pair<int, metadata> read_input(std::vector<source> &sources, char *fname, i
|
||||
ai->second.maxzoom = maxzoom;
|
||||
}
|
||||
|
||||
metadata m = make_metadata(fname, minzoom, maxzoom, minlat, minlon, maxlat, maxlon, minlat2, minlon2, maxlat2, maxlon2, midlat, midlon, attribution, merged_lm, true, description, !prevent[P_TILE_STATS], attribute_descriptions, "tippecanoe", commandline, strategies);
|
||||
metadata m = make_metadata(fname, minzoom, maxzoom, minlat, minlon, maxlat, maxlon, minlat2, minlon2, maxlat2, maxlon2, midlat, midlon, attribution, merged_lm, true, description, !prevent[P_TILE_STATS], attribute_descriptions, "tippecanoe", commandline, strategies, basezoom, droprate, retain_points_multiplier);
|
||||
if (outdb != NULL) {
|
||||
mbtiles_write_metadata(outdb, m, forcetable);
|
||||
} else {
|
||||
@@ -2845,7 +2848,7 @@ static bool has_name(struct option *long_options, int *pl) {
|
||||
return false;
|
||||
}
|
||||
|
||||
void set_attribute_type(std::map<std::string, int> &attribute_types, const char *arg) {
|
||||
void set_attribute_type(std::unordered_map<std::string, int> &attribute_types, const char *arg) {
|
||||
const char *s = strchr(arg, ':');
|
||||
if (s == NULL) {
|
||||
fprintf(stderr, "-T%s option must be in the form -Tname:type\n", arg);
|
||||
@@ -2872,79 +2875,6 @@ void set_attribute_type(std::map<std::string, int> &attribute_types, const char
|
||||
attribute_types.insert(std::pair<std::string, int>(name, t));
|
||||
}
|
||||
|
||||
void set_attribute_accum(std::map<std::string, attribute_op> &attribute_accum, std::string name, std::string type) {
|
||||
attribute_op t;
|
||||
|
||||
if (type == "sum") {
|
||||
t = op_sum;
|
||||
} else if (type == "product") {
|
||||
t = op_product;
|
||||
} else if (type == "mean") {
|
||||
t = op_mean;
|
||||
} else if (type == "max") {
|
||||
t = op_max;
|
||||
} else if (type == "min") {
|
||||
t = op_min;
|
||||
} else if (type == "concat") {
|
||||
t = op_concat;
|
||||
} else if (type == "comma") {
|
||||
t = op_comma;
|
||||
} else {
|
||||
fprintf(stderr, "Attribute method (%s) must be sum, product, mean, max, min, concat, or comma\n", type.c_str());
|
||||
exit(EXIT_ARGS);
|
||||
}
|
||||
|
||||
attribute_accum.insert(std::pair<std::string, attribute_op>(name, t));
|
||||
}
|
||||
|
||||
void set_attribute_accum(std::map<std::string, attribute_op> &attribute_accum, const char *arg) {
|
||||
if (*arg == '{') {
|
||||
json_pull *jp = json_begin_string(arg);
|
||||
json_object *o = json_read_tree(jp);
|
||||
|
||||
if (o == NULL) {
|
||||
fprintf(stderr, "%s: -E%s: %s\n", *av, arg, jp->error);
|
||||
exit(EXIT_JSON);
|
||||
}
|
||||
|
||||
if (o->type != JSON_HASH) {
|
||||
fprintf(stderr, "%s: -E%s: not a JSON object\n", *av, arg);
|
||||
exit(EXIT_JSON);
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < o->value.object.length; i++) {
|
||||
json_object *k = o->value.object.keys[i];
|
||||
json_object *v = o->value.object.values[i];
|
||||
|
||||
if (k->type != JSON_STRING) {
|
||||
fprintf(stderr, "%s: -E%s: key %zu not a string\n", *av, arg, i);
|
||||
exit(EXIT_JSON);
|
||||
}
|
||||
if (v->type != JSON_STRING) {
|
||||
fprintf(stderr, "%s: -E%s: value %zu not a string\n", *av, arg, i);
|
||||
exit(EXIT_JSON);
|
||||
}
|
||||
|
||||
set_attribute_accum(attribute_accum, k->value.string.string, v->value.string.string);
|
||||
}
|
||||
|
||||
json_free(o);
|
||||
json_end(jp);
|
||||
return;
|
||||
}
|
||||
|
||||
const char *s = strchr(arg, ':');
|
||||
if (s == NULL) {
|
||||
fprintf(stderr, "-E%s option must be in the form -Ename:method\n", arg);
|
||||
exit(EXIT_ARGS);
|
||||
}
|
||||
|
||||
std::string name = std::string(arg, s - arg);
|
||||
std::string type = std::string(s + 1);
|
||||
|
||||
set_attribute_accum(attribute_accum, name, type);
|
||||
}
|
||||
|
||||
void set_attribute_value(const char *arg) {
|
||||
if (*arg == '{') {
|
||||
json_pull *jp = json_begin_string(arg);
|
||||
@@ -2969,10 +2899,8 @@ void set_attribute_value(const char *arg) {
|
||||
exit(EXIT_JSON);
|
||||
}
|
||||
|
||||
serial_val val;
|
||||
stringify_value(v, val.type, val.s, "json", 1, o);
|
||||
|
||||
set_attributes.insert(std::pair<std::string, serial_val>(k->value.string.string, val));
|
||||
serial_val val = stringify_value(v, "json", 1, o);
|
||||
set_attributes.emplace(k->value.string.string, val);
|
||||
}
|
||||
|
||||
json_free(o);
|
||||
@@ -3078,8 +3006,8 @@ int main(int argc, char **argv) {
|
||||
bool guess_cluster_maxzoom = false;
|
||||
|
||||
std::set<std::string> exclude, include;
|
||||
std::map<std::string, int> attribute_types;
|
||||
std::map<std::string, attribute_op> attribute_accum;
|
||||
std::unordered_map<std::string, int> attribute_types;
|
||||
std::unordered_map<std::string, attribute_op> attribute_accum;
|
||||
std::map<std::string, std::string> attribute_descriptions;
|
||||
int exclude_all = 0;
|
||||
int read_parallel = 0;
|
||||
@@ -3147,9 +3075,11 @@ int main(int argc, char **argv) {
|
||||
{"Filtering features by attributes", 0, 0, 0},
|
||||
{"feature-filter-file", required_argument, 0, 'J'},
|
||||
{"feature-filter", required_argument, 0, 'j'},
|
||||
{"unidecode-data", required_argument, 0, '~'},
|
||||
|
||||
{"Dropping a fixed fraction of features by zoom level", 0, 0, 0},
|
||||
{"drop-rate", required_argument, 0, 'r'},
|
||||
{"retain-points-multiplier", required_argument, 0, '~'},
|
||||
{"base-zoom", required_argument, 0, 'B'},
|
||||
{"drop-denser", required_argument, 0, '~'},
|
||||
{"limit-base-zoom-to-maximum-zoom", no_argument, &prevent[P_BASEZOOM_ABOVE_MAXZOOM], 1},
|
||||
@@ -3370,6 +3300,10 @@ int main(int argc, char **argv) {
|
||||
preserve_point_density_threshold = atoll_require(optarg, "Preserve point density threshold");
|
||||
} else if (strcmp(opt, "extend-zooms-if-still-dropping-maximum") == 0) {
|
||||
extend_zooms_max = atoll_require(optarg, "Maximum number by which to extend zooms");
|
||||
} else if (strcmp(opt, "retain-points-multiplier") == 0) {
|
||||
retain_points_multiplier = atoll_require(optarg, "Multiply the fraction of points retained by zoom level");
|
||||
} else if (strcmp(opt, "unidecode-data") == 0) {
|
||||
unidecode_data = read_unidecode(optarg);
|
||||
} else {
|
||||
fprintf(stderr, "%s: Unrecognized option --%s\n", argv[0], opt);
|
||||
exit(EXIT_ARGS);
|
||||
@@ -3692,7 +3626,7 @@ int main(int argc, char **argv) {
|
||||
break;
|
||||
|
||||
case 'E':
|
||||
set_attribute_accum(attribute_accum, optarg);
|
||||
set_attribute_accum(attribute_accum, optarg, argv);
|
||||
break;
|
||||
|
||||
default: {
|
||||
|
||||
@@ -62,6 +62,7 @@ extern size_t limit_tile_feature_count;
|
||||
extern size_t limit_tile_feature_count_at_maxzoom;
|
||||
extern std::map<std::string, serial_val> set_attributes;
|
||||
extern long long extend_zooms_max;
|
||||
extern int retain_points_multiplier;
|
||||
|
||||
struct order_field {
|
||||
std::string name;
|
||||
|
||||
+15
-1
@@ -29,7 +29,11 @@ significant travel corridor.
|
||||
.PP
|
||||
The easiest way to install tippecanoe on OSX is with Homebrew \[la]http://brew.sh/\[ra]:
|
||||
.PP
|
||||
.RS
|
||||
.nf
|
||||
$ brew install tippecanoe
|
||||
.fi
|
||||
.RE
|
||||
.PP
|
||||
On Ubuntu it will usually be easiest to build from the source repository:
|
||||
.PP
|
||||
@@ -526,7 +530,7 @@ The attributes and values may also be specified as JSON keys and values: \fB\fC\
|
||||
.SS Filtering features by attributes
|
||||
.RS
|
||||
.IP \(bu 2
|
||||
\fB\fC\-j\fR \fIfilter\fP or \fB\fC\-\-feature\-filter\fR=\fIfilter\fP: Check features against a per\-layer filter (as defined in the Mapbox GL Style Specification \[la]https://docs.mapbox.com/mapbox-gl-js/style-spec/#other-filter\[ra]) and only include those that match. Any features in layers that have no filter specified will be passed through. Filters for the layer \fB\fC"*"\fR apply to all layers. The special variable \fB\fC$zoom\fR refers to the current zoom level.
|
||||
\fB\fC\-j\fR \fIfilter\fP or \fB\fC\-\-feature\-filter\fR=\fIfilter\fP: Check features against a per\-layer filter (as defined in the Mapbox GL Style Specification \[la]https://docs.mapbox.com/mapbox-gl-js/style-spec/#other-filter\[ra] or in a Felt filter specification still to be finalized) and only include those that match. Any features in layers that have no filter specified will be passed through. Filters for the layer \fB\fC"*"\fR apply to all layers. The special variable \fB\fC$zoom\fR refers to the current zoom level.
|
||||
.IP \(bu 2
|
||||
\fB\fC\-J\fR \fIfilter\-file\fP or \fB\fC\-\-feature\-filter\-file\fR=\fIfilter\-file\fP: Like \fB\fC\-j\fR, but read the filter from a file.
|
||||
.RE
|
||||
@@ -574,6 +578,8 @@ If you use \fB\fC\-Bg\fR, it will guess a zoom level that will keep at most 50,0
|
||||
You can also specify a marker\-width with \fB\fC\-Bg\fR\fIwidth\fP to allow fewer features in the densest tile to
|
||||
compensate for the larger marker, or \fB\fC\-Bf\fR\fInumber\fP to allow at most \fInumber\fP features in the densest tile.
|
||||
.IP \(bu 2
|
||||
\fB\fC\-\-retain\-points\-multiplier=\fR\fImultiple\fP: Retain the specified multiple of points instead of just the number of points that would ordinarily be retained by the drop rate. These can be thinned out later with the \fB\fC\-m\fR option to \fB\fCtippecanoe\-overzoom\fR\&. The start of each cluster is marked in the feature sequence by the \fB\fCtippecanoe:retain_points_multiplier_first\fR attribute. The \fB\fC\-\-tile\-size\-limit\fR will also be extended at low zoom levels to allow for the multiplied features.
|
||||
.IP \(bu 2
|
||||
\fB\fC\-\-drop\-denser=\fR\fIpercentage\fP: When dropping dots at zoom levels below the base zoom, give the specified \fIpercentage\fP
|
||||
preference to retaining points in sparse areas and dropping points in dense areas.
|
||||
.IP \(bu 2
|
||||
@@ -1260,4 +1266,12 @@ reads tile \fB\fCinz/inx/iny\fR of \fB\fCin.mvt.gz\fR and produces tile \fB\fCou
|
||||
\fB\fC\-d\fR \fIdetail\fP: Set the detail of the output tile (default 12)
|
||||
.IP \(bu 2
|
||||
\fB\fC\-y\fR \fIattribute\fP: Retain the specified \fIattribute\fP in the output features. All attributes that are not named in a \fB\fC\-y\fR option will be removed.
|
||||
.IP \(bu 2
|
||||
\fB\fC\-j\fR \fIfilter\fP: Filter features using the same expression syntax as in tippecanoe.
|
||||
.IP \(bu 2
|
||||
\fB\fC\-m\fR: If a tile was created with the \fB\fC\-\-retain\-points\-multiplier\fR option, thin the tile back down to its normal feature count during overzooming. The first feature from each cluster will be retained, unless \fB\fC\-j\fR is used to specify a filter, in which case the first matching filter from each cluster will be retained instead.
|
||||
.IP \(bu 2
|
||||
\fB\fC\-\-preserve\-input\-order\fR: Restore a set of filtered features to its original input order
|
||||
.IP \(bu 2
|
||||
\fB\fC\-\-accumulate\-attribute\fR: Behaves as in \fB\fCtippecanoe\fR to sum attributes from the features of a multiplier cluster that are not included in the final output. The attributes from features that are filtered away with \fB\fC\-j\fR are \fInot\fP accumulated onto the output feature.
|
||||
.RE
|
||||
|
||||
+82
-64
@@ -7,6 +7,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sqlite3.h>
|
||||
#include <cmath>
|
||||
#include <climits>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <set>
|
||||
@@ -99,19 +101,6 @@ sqlite3 *mbtiles_open(char *dbname, char **argv, int forcetable) {
|
||||
return outdb;
|
||||
}
|
||||
|
||||
unsigned long long fnv1a(std::string const &s) {
|
||||
// Store tiles by a hash of their contents (fnv1a 64-bit)
|
||||
// http://www.isthe.com/chongo/tech/comp/fnv/
|
||||
const unsigned long long fnv_offset_basis = 14695981039346656037u;
|
||||
const unsigned long long fnv_prime = 1099511628211u;
|
||||
unsigned long long h = fnv_offset_basis;
|
||||
for (size_t i = 0; i < s.size(); i++) {
|
||||
h ^= (unsigned char) s[i];
|
||||
h *= fnv_prime;
|
||||
}
|
||||
return h;
|
||||
}
|
||||
|
||||
void mbtiles_write_tile(sqlite3 *outdb, int z, int tx, int ty, const char *data, int size) {
|
||||
std::string hash = std::to_string(fnv1a(std::string(data, size)));
|
||||
|
||||
@@ -194,21 +183,21 @@ void mbtiles_erase_zoom(sqlite3 *outdb, int z) {
|
||||
}
|
||||
}
|
||||
|
||||
bool type_and_string::operator<(const type_and_string &o) const {
|
||||
if (string < o.string) {
|
||||
bool serial_val::operator<(const serial_val &o) const {
|
||||
if (s < o.s) {
|
||||
return true;
|
||||
}
|
||||
if (string == o.string && type < o.type) {
|
||||
if (s == o.s && type < o.type) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool type_and_string::operator!=(const type_and_string &o) const {
|
||||
bool serial_val::operator!=(const serial_val &o) const {
|
||||
if (type != o.type) {
|
||||
return true;
|
||||
}
|
||||
if (string != o.string) {
|
||||
if (s != o.s) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -259,7 +248,7 @@ void tilestats(std::map<std::string, layermap_entry> const &layermap1, size_t el
|
||||
state.nospace = true;
|
||||
state.json_write_string(geomtype);
|
||||
|
||||
size_t attrib_count = layer.second.file_keys.size();
|
||||
size_t attrib_count = layer.second.tilestats.size();
|
||||
if (attrib_count > max_tilestats_attributes) {
|
||||
attrib_count = max_tilestats_attributes;
|
||||
}
|
||||
@@ -275,7 +264,7 @@ void tilestats(std::map<std::string, layermap_entry> const &layermap1, size_t el
|
||||
state.json_write_array();
|
||||
|
||||
size_t attrs = 0;
|
||||
for (auto attribute : layer.second.file_keys) {
|
||||
for (auto attribute : layer.second.tilestats) {
|
||||
if (attrs == elements) {
|
||||
break;
|
||||
}
|
||||
@@ -336,15 +325,15 @@ void tilestats(std::map<std::string, layermap_entry> const &layermap1, size_t el
|
||||
vals++;
|
||||
|
||||
state.nospace = true;
|
||||
state.json_write_stringified(value.string);
|
||||
state.json_write_stringified(value.s);
|
||||
} else {
|
||||
std::string trunc = truncate16(value.string, 256);
|
||||
std::string trunc = truncate16(value.s, 256);
|
||||
|
||||
if (trunc.size() == value.string.size()) {
|
||||
if (trunc.size() == value.s.size()) {
|
||||
vals++;
|
||||
|
||||
state.nospace = true;
|
||||
state.json_write_string(value.string);
|
||||
state.json_write_string(value.s);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -601,6 +590,17 @@ void mbtiles_write_metadata(sqlite3 *db, const metadata &m, bool forcetable) {
|
||||
sqlite3_free(sql);
|
||||
}
|
||||
|
||||
if (m.decisions_json.size() > 0) {
|
||||
sql = sqlite3_mprintf("INSERT INTO metadata (name, value) VALUES ('tippecanoe_decisions', %Q);", m.decisions_json.c_str());
|
||||
if (sqlite3_exec(db, sql, NULL, NULL, &err) != SQLITE_OK) {
|
||||
fprintf(stderr, "set decisions: %s\n", err);
|
||||
if (!forcetable) {
|
||||
exit(EXIT_SQLITE);
|
||||
}
|
||||
}
|
||||
sqlite3_free(sql);
|
||||
}
|
||||
|
||||
if (m.vector_layers_json.size() > 0 || m.tilestats_json.size() > 0) {
|
||||
std::string json;
|
||||
json_writer state(&json);
|
||||
@@ -642,7 +642,7 @@ void mbtiles_write_metadata(sqlite3 *db, const metadata &m, bool forcetable) {
|
||||
}
|
||||
}
|
||||
|
||||
metadata make_metadata(const char *fname, int minzoom, int maxzoom, double minlat, double minlon, double maxlat, double maxlon, double minlat2, double minlon2, double maxlat2, double maxlon2, double midlat, double midlon, const char *attribution, std::map<std::string, layermap_entry> const &layermap, bool vector, const char *description, bool do_tilestats, std::map<std::string, std::string> const &attribute_descriptions, std::string const &program, std::string const &commandline, std::vector<strategy> const &strategies) {
|
||||
metadata make_metadata(const char *fname, int minzoom, int maxzoom, double minlat, double minlon, double maxlat, double maxlon, double minlat2, double minlon2, double maxlat2, double maxlon2, double midlat, double midlon, const char *attribution, std::map<std::string, layermap_entry> const &layermap, bool vector, const char *description, bool do_tilestats, std::map<std::string, std::string> const &attribute_descriptions, std::string const &program, std::string const &commandline, std::vector<strategy> const &strategies, int basezoom, double droprate, int retain_points_multiplier) {
|
||||
metadata m;
|
||||
|
||||
m.name = fname;
|
||||
@@ -677,6 +677,17 @@ metadata make_metadata(const char *fname, int minzoom, int maxzoom, double minla
|
||||
|
||||
m.strategies_json = stringify_strategies(strategies);
|
||||
|
||||
if (isinf(droprate)) {
|
||||
droprate = LLONG_MAX;
|
||||
}
|
||||
if (basezoom != maxzoom || droprate != 2.5 || retain_points_multiplier != 1) {
|
||||
m.decisions_json = std::string("{") +
|
||||
"\"basezoom\":" + milo::dtoa_milo(basezoom) + "," +
|
||||
"\"droprate\":" + milo::dtoa_milo(droprate) + "," +
|
||||
"\"retain_points_multiplier\":" + std::to_string(retain_points_multiplier) +
|
||||
std::string("}");
|
||||
}
|
||||
|
||||
if (vector) {
|
||||
{
|
||||
json_writer state(&m.vector_layers_json);
|
||||
@@ -690,7 +701,7 @@ metadata make_metadata(const char *fname, int minzoom, int maxzoom, double minla
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < lnames.size(); i++) {
|
||||
auto fk = layermap.find(lnames[i]);
|
||||
auto ts = layermap.find(lnames[i]);
|
||||
state.nospace = true;
|
||||
state.json_write_hash();
|
||||
|
||||
@@ -702,17 +713,17 @@ metadata make_metadata(const char *fname, int minzoom, int maxzoom, double minla
|
||||
state.nospace = true;
|
||||
state.json_write_string("description");
|
||||
state.nospace = true;
|
||||
state.json_write_string(fk->second.description);
|
||||
state.json_write_string(ts->second.description);
|
||||
|
||||
state.nospace = true;
|
||||
state.json_write_string("minzoom");
|
||||
state.nospace = true;
|
||||
state.json_write_signed(fk->second.minzoom);
|
||||
state.json_write_signed(ts->second.minzoom);
|
||||
|
||||
state.nospace = true;
|
||||
state.json_write_string("maxzoom");
|
||||
state.nospace = true;
|
||||
state.json_write_signed(fk->second.maxzoom);
|
||||
state.json_write_signed(ts->second.maxzoom);
|
||||
|
||||
state.nospace = true;
|
||||
state.json_write_string("fields");
|
||||
@@ -721,7 +732,7 @@ metadata make_metadata(const char *fname, int minzoom, int maxzoom, double minla
|
||||
|
||||
bool first = true;
|
||||
size_t attribute_count = 0;
|
||||
for (auto j = fk->second.file_keys.begin(); j != fk->second.file_keys.end(); ++j) {
|
||||
for (auto j = ts->second.tilestats.begin(); j != ts->second.tilestats.end(); ++j) {
|
||||
if (first) {
|
||||
first = false;
|
||||
}
|
||||
@@ -828,35 +839,35 @@ std::map<std::string, layermap_entry> merge_layermaps(std::vector<std::map<std::
|
||||
exit(EXIT_IMPOSSIBLE);
|
||||
}
|
||||
|
||||
for (auto fk = map->second.file_keys.begin(); fk != map->second.file_keys.end(); ++fk) {
|
||||
std::string attribname = fk->first;
|
||||
for (auto ts = map->second.tilestats.begin(); ts != map->second.tilestats.end(); ++ts) {
|
||||
std::string attribname = ts->first;
|
||||
if (trunc) {
|
||||
attribname = truncate16(attribname, 256);
|
||||
}
|
||||
|
||||
auto fk2 = out_entry->second.file_keys.find(attribname);
|
||||
auto ts2 = out_entry->second.tilestats.find(attribname);
|
||||
|
||||
if (fk2 == out_entry->second.file_keys.end()) {
|
||||
out_entry->second.file_keys.insert(std::pair<std::string, type_and_string_stats>(attribname, fk->second));
|
||||
if (ts2 == out_entry->second.tilestats.end()) {
|
||||
out_entry->second.tilestats.insert(std::pair<std::string, tilestat>(attribname, ts->second));
|
||||
} else {
|
||||
for (auto val : fk->second.sample_values) {
|
||||
auto pt = std::lower_bound(fk2->second.sample_values.begin(), fk2->second.sample_values.end(), val);
|
||||
if (pt == fk2->second.sample_values.end() || *pt != val) { // not found
|
||||
fk2->second.sample_values.insert(pt, val);
|
||||
for (auto val : ts->second.sample_values) {
|
||||
auto pt = std::lower_bound(ts2->second.sample_values.begin(), ts2->second.sample_values.end(), val);
|
||||
if (pt == ts2->second.sample_values.end() || *pt != val) { // not found
|
||||
ts2->second.sample_values.insert(pt, val);
|
||||
|
||||
if (fk2->second.sample_values.size() > max_tilestats_sample_values) {
|
||||
fk2->second.sample_values.pop_back();
|
||||
if (ts2->second.sample_values.size() > max_tilestats_sample_values) {
|
||||
ts2->second.sample_values.pop_back();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fk2->second.type |= fk->second.type;
|
||||
ts2->second.type |= ts->second.type;
|
||||
|
||||
if (fk->second.min < fk2->second.min) {
|
||||
fk2->second.min = fk->second.min;
|
||||
if (ts->second.min < ts2->second.min) {
|
||||
ts2->second.min = ts->second.min;
|
||||
}
|
||||
if (fk->second.max > fk2->second.max) {
|
||||
fk2->second.max = fk->second.max;
|
||||
if (ts->second.max > ts2->second.max) {
|
||||
ts2->second.max = ts->second.max;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -877,41 +888,48 @@ std::map<std::string, layermap_entry> merge_layermaps(std::vector<std::map<std::
|
||||
return out;
|
||||
}
|
||||
|
||||
void add_to_file_keys(std::map<std::string, type_and_string_stats> &file_keys, std::string const &attrib, type_and_string const &val) {
|
||||
void add_to_tilestats(std::map<std::string, tilestat> &tilestats, std::string const &attrib, serial_val const &val) {
|
||||
if (val.type == mvt_null) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto fka = file_keys.find(attrib);
|
||||
if (fka == file_keys.end()) {
|
||||
file_keys.insert(std::pair<std::string, type_and_string_stats>(attrib, type_and_string_stats()));
|
||||
fka = file_keys.find(attrib);
|
||||
auto tsa = tilestats.find(attrib);
|
||||
if (tsa == tilestats.end()) {
|
||||
tilestats.insert(std::pair<std::string, tilestat>(attrib, tilestat()));
|
||||
tsa = tilestats.find(attrib);
|
||||
}
|
||||
|
||||
if (fka == file_keys.end()) {
|
||||
if (tsa == tilestats.end()) {
|
||||
fprintf(stderr, "Can't happen (tilestats)\n");
|
||||
exit(EXIT_IMPOSSIBLE);
|
||||
}
|
||||
|
||||
if (val.type == mvt_double) {
|
||||
double d = atof(val.string.c_str());
|
||||
double d = atof(val.s.c_str());
|
||||
|
||||
if (d < fka->second.min) {
|
||||
fka->second.min = d;
|
||||
if (d < tsa->second.min) {
|
||||
tsa->second.min = d;
|
||||
}
|
||||
if (d > fka->second.max) {
|
||||
fka->second.max = d;
|
||||
if (d > tsa->second.max) {
|
||||
tsa->second.max = d;
|
||||
}
|
||||
}
|
||||
|
||||
auto pt = std::lower_bound(fka->second.sample_values.begin(), fka->second.sample_values.end(), val);
|
||||
if (pt == fka->second.sample_values.end() || *pt != val) { // not found
|
||||
fka->second.sample_values.insert(pt, val);
|
||||
|
||||
if (fka->second.sample_values.size() > max_tilestats_sample_values) {
|
||||
fka->second.sample_values.pop_back();
|
||||
auto pt = std::lower_bound(tsa->second.sample_values.begin(), tsa->second.sample_values.end(), val);
|
||||
if (pt == tsa->second.sample_values.end() || *pt != val) { // not found
|
||||
if (tsa->second.sample_values.size() >= max_tilestats_sample_values) {
|
||||
if (pt == tsa->second.sample_values.end()) {
|
||||
// insertion point would be at the end,
|
||||
// and the list is already full, so do nothing
|
||||
} else {
|
||||
// bump the former last value, insert this one
|
||||
tsa->second.sample_values.insert(pt, val);
|
||||
tsa->second.sample_values.pop_back();
|
||||
}
|
||||
} else {
|
||||
tsa->second.sample_values.insert(pt, val);
|
||||
}
|
||||
}
|
||||
|
||||
fka->second.type |= (1 << val.type);
|
||||
tsa->second.type |= (1 << val.type);
|
||||
}
|
||||
|
||||
+6
-15
@@ -9,16 +9,8 @@ extern size_t max_tilestats_attributes;
|
||||
extern size_t max_tilestats_sample_values;
|
||||
extern size_t max_tilestats_values;
|
||||
|
||||
struct type_and_string {
|
||||
int type = 0;
|
||||
std::string string = "";
|
||||
|
||||
bool operator<(const type_and_string &o) const;
|
||||
bool operator!=(const type_and_string &o) const;
|
||||
};
|
||||
|
||||
struct type_and_string_stats {
|
||||
std::vector<type_and_string> sample_values = std::vector<type_and_string>(); // sorted
|
||||
struct tilestat {
|
||||
std::vector<serial_val> sample_values = std::vector<serial_val>(); // sorted
|
||||
double min = INFINITY;
|
||||
double max = -INFINITY;
|
||||
int type = 0;
|
||||
@@ -26,7 +18,7 @@ struct type_and_string_stats {
|
||||
|
||||
struct layermap_entry {
|
||||
size_t id = 0;
|
||||
std::map<std::string, type_and_string_stats> file_keys{};
|
||||
std::map<std::string, tilestat> tilestats{};
|
||||
int minzoom = 0;
|
||||
int maxzoom = 0;
|
||||
std::string description = "";
|
||||
@@ -66,6 +58,7 @@ struct metadata {
|
||||
|
||||
std::string vector_layers_json;
|
||||
std::string tilestats_json;
|
||||
std::string decisions_json;
|
||||
};
|
||||
|
||||
#include "tile.hpp"
|
||||
@@ -75,7 +68,7 @@ sqlite3 *mbtiles_open(char *dbname, char **argv, int forcetable);
|
||||
void mbtiles_write_tile(sqlite3 *outdb, int z, int tx, int ty, const char *data, int size);
|
||||
void mbtiles_erase_zoom(sqlite3 *outdb, int z);
|
||||
|
||||
metadata make_metadata(const char *fname, int minzoom, int maxzoom, double minlat, double minlon, double maxlat, double maxlon, double minlat2, double minlon2, double maxlat2, double maxlon2, double midlat, double midlon, const char *attribution, std::map<std::string, layermap_entry> const &layermap, bool vector, const char *description, bool do_tilestats, std::map<std::string, std::string> const &attribute_descriptions, std::string const &program, std::string const &commandline, std::vector<strategy> const &strategies);
|
||||
metadata make_metadata(const char *fname, int minzoom, int maxzoom, double minlat, double minlon, double maxlat, double maxlon, double minlat2, double minlon2, double maxlat2, double maxlon2, double midlat, double midlon, const char *attribution, std::map<std::string, layermap_entry> const &layermap, bool vector, const char *description, bool do_tilestats, std::map<std::string, std::string> const &attribute_descriptions, std::string const &program, std::string const &commandline, std::vector<strategy> const &strategies, int basezoom, double droprate, int retain_points_multiplier);
|
||||
void mbtiles_write_metadata(sqlite3 *db, const metadata &m, bool forcetable);
|
||||
|
||||
void mbtiles_close(sqlite3 *outdb, const char *pgm);
|
||||
@@ -83,8 +76,6 @@ void mbtiles_close(sqlite3 *outdb, const char *pgm);
|
||||
std::map<std::string, layermap_entry> merge_layermaps(std::vector<std::map<std::string, layermap_entry> > const &maps);
|
||||
std::map<std::string, layermap_entry> merge_layermaps(std::vector<std::map<std::string, layermap_entry> > const &maps, bool trunc);
|
||||
|
||||
void add_to_file_keys(std::map<std::string, type_and_string_stats> &file_keys, std::string const &layername, type_and_string const &val);
|
||||
|
||||
unsigned long long fnv1a(std::string const &s);
|
||||
void add_to_tilestats(std::map<std::string, tilestat> &tilestats, std::string const &layername, serial_val const &val);
|
||||
|
||||
#endif
|
||||
|
||||
+3
-1
@@ -49,10 +49,11 @@ int memfile_close(struct memfile *file) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int memfile_write(struct memfile *file, void *s, long long len) {
|
||||
int memfile_write(struct memfile *file, void *s, long long len, bool &in_memory) {
|
||||
// If it is full, append to the file.
|
||||
// If it is not full yet, append to the string in memory.
|
||||
|
||||
in_memory = false;
|
||||
if (file->fp != NULL) {
|
||||
if (fwrite(s, sizeof(char), len, file->fp) != (size_t) len) {
|
||||
return 0;
|
||||
@@ -61,6 +62,7 @@ int memfile_write(struct memfile *file, void *s, long long len) {
|
||||
} else {
|
||||
file->map.append(std::string((char *) s, len));
|
||||
file->off += len;
|
||||
in_memory = true;
|
||||
}
|
||||
|
||||
return len;
|
||||
|
||||
+1
-1
@@ -15,7 +15,7 @@ struct memfile {
|
||||
|
||||
struct memfile *memfile_open(int fd);
|
||||
int memfile_close(struct memfile *file);
|
||||
int memfile_write(struct memfile *file, void *s, long long len);
|
||||
int memfile_write(struct memfile *file, void *s, long long len, bool &in_memory);
|
||||
void memfile_full(struct memfile *file);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
#include "protozero/pbf_writer.hpp"
|
||||
#include "milo/dtoa_milo.h"
|
||||
#include "errors.hpp"
|
||||
#include "serial.hpp"
|
||||
#include "text.hpp"
|
||||
|
||||
mvt_geometry::mvt_geometry(int nop, long long nx, long long ny) {
|
||||
this->op = nop;
|
||||
@@ -89,7 +91,7 @@ int compress(std::string const &input, std::string &output, bool gz) {
|
||||
deflate_s.opaque = Z_NULL;
|
||||
deflate_s.avail_in = 0;
|
||||
deflate_s.next_in = Z_NULL;
|
||||
deflateInit2(&deflate_s, Z_BEST_COMPRESSION, Z_DEFLATED, gz ? 31 : 15, 8, Z_DEFAULT_STRATEGY);
|
||||
deflateInit2(&deflate_s, Z_DEFAULT_COMPRESSION, Z_DEFLATED, gz ? 31 : 15, 8, Z_DEFAULT_STRATEGY);
|
||||
deflate_s.next_in = (Bytef *) input.data();
|
||||
deflate_s.avail_in = input.size();
|
||||
size_t length = 0;
|
||||
@@ -109,7 +111,7 @@ int compress(std::string const &input, std::string &output, bool gz) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool mvt_tile::decode(std::string &message, bool &was_compressed) {
|
||||
bool mvt_tile::decode(const std::string &message, bool &was_compressed) {
|
||||
layers.clear();
|
||||
std::string src;
|
||||
|
||||
@@ -126,6 +128,7 @@ bool mvt_tile::decode(std::string &message, bool &was_compressed) {
|
||||
}
|
||||
|
||||
protozero::pbf_reader reader(src);
|
||||
std::shared_ptr<std::string> string_pool = std::make_shared<std::string>();
|
||||
|
||||
while (reader.next()) {
|
||||
switch (reader.tag()) {
|
||||
@@ -156,7 +159,12 @@ bool mvt_tile::decode(std::string &message, bool &was_compressed) {
|
||||
switch (value_reader.tag()) {
|
||||
case 1: /* string */
|
||||
value.type = mvt_string;
|
||||
value.string_value = value_reader.get_string();
|
||||
value.s = string_pool;
|
||||
{
|
||||
auto v = value_reader.get_view();
|
||||
std::string_view sv(v.data(), v.size());
|
||||
value.set_string_value(sv);
|
||||
}
|
||||
break;
|
||||
|
||||
case 2: /* float */
|
||||
@@ -195,7 +203,7 @@ bool mvt_tile::decode(std::string &message, bool &was_compressed) {
|
||||
}
|
||||
}
|
||||
|
||||
layer.values.push_back(value);
|
||||
layer.values.push_back(std::move(value));
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -223,6 +231,7 @@ bool mvt_tile::decode(std::string &message, bool &was_compressed) {
|
||||
case 2: /* tag */
|
||||
{
|
||||
auto pi = feature_reader.get_packed_uint32();
|
||||
feature.tags.reserve(std::distance(pi.first, pi.second));
|
||||
for (auto it = pi.first; it != pi.second; ++it) {
|
||||
feature.tags.push_back(*it);
|
||||
}
|
||||
@@ -236,6 +245,7 @@ bool mvt_tile::decode(std::string &message, bool &was_compressed) {
|
||||
case 4: /* geometry */
|
||||
{
|
||||
auto pi = feature_reader.get_packed_uint32();
|
||||
geoms.reserve(std::distance(pi.first, pi.second));
|
||||
for (auto it = pi.first; it != pi.second; ++it) {
|
||||
geoms.push_back(*it);
|
||||
}
|
||||
@@ -249,6 +259,7 @@ bool mvt_tile::decode(std::string &message, bool &was_compressed) {
|
||||
}
|
||||
|
||||
long long px = 0, py = 0;
|
||||
feature.geometry.reserve(geoms.size()); // probably not quite right, but still plausible
|
||||
for (size_t g = 0; g < geoms.size(); g++) {
|
||||
uint32_t geom = geoms[g];
|
||||
uint32_t op = geom & 7;
|
||||
@@ -260,14 +271,14 @@ bool mvt_tile::decode(std::string &message, bool &was_compressed) {
|
||||
py += protozero::decode_zigzag32(geoms[g + 2]);
|
||||
g += 2;
|
||||
|
||||
feature.geometry.push_back(mvt_geometry(op, px, py));
|
||||
feature.geometry.emplace_back(op, px, py);
|
||||
}
|
||||
} else {
|
||||
feature.geometry.push_back(mvt_geometry(op, 0, 0));
|
||||
feature.geometry.emplace_back(op, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
layer.features.push_back(feature);
|
||||
layer.features.push_back(std::move(feature));
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -277,14 +288,7 @@ bool mvt_tile::decode(std::string &message, bool &was_compressed) {
|
||||
}
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
layers.push_back(layer);
|
||||
layers.push_back(std::move(layer));
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -304,15 +308,18 @@ struct sorted_value {
|
||||
bool operator<(const sorted_value &sv) const {
|
||||
if (val < sv.val) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
} else if (val == sv.val) {
|
||||
if (orig < sv.orig) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
std::string mvt_tile::encode() {
|
||||
std::string data;
|
||||
|
||||
protozero::pbf_writer writer(data);
|
||||
|
||||
for (size_t i = 0; i < layers.size(); i++) {
|
||||
@@ -334,41 +341,58 @@ std::string mvt_tile::encode() {
|
||||
protozero::pbf_writer value_writer(value_string);
|
||||
mvt_value &pbv = layers[i].values[v];
|
||||
|
||||
if (pbv.type == mvt_string) {
|
||||
value_writer.add_string(1, pbv.string_value);
|
||||
} else if (pbv.type == mvt_float) {
|
||||
switch (pbv.type) {
|
||||
case mvt_string:
|
||||
value_writer.add_string(1, pbv.get_string_value());
|
||||
break;
|
||||
case mvt_float:
|
||||
value_writer.add_float(2, pbv.numeric_value.float_value);
|
||||
} else if (pbv.type == mvt_double) {
|
||||
break;
|
||||
case mvt_double:
|
||||
value_writer.add_double(3, pbv.numeric_value.double_value);
|
||||
} else if (pbv.type == mvt_int) {
|
||||
break;
|
||||
case mvt_int:
|
||||
value_writer.add_int64(4, pbv.numeric_value.int_value);
|
||||
} else if (pbv.type == mvt_uint) {
|
||||
break;
|
||||
case mvt_uint:
|
||||
value_writer.add_uint64(5, pbv.numeric_value.uint_value);
|
||||
} else if (pbv.type == mvt_sint) {
|
||||
break;
|
||||
case mvt_sint:
|
||||
value_writer.add_sint64(6, pbv.numeric_value.sint_value);
|
||||
} else if (pbv.type == mvt_bool) {
|
||||
break;
|
||||
case mvt_bool:
|
||||
value_writer.add_bool(7, pbv.numeric_value.bool_value);
|
||||
} else if (pbv.type == mvt_null) {
|
||||
break;
|
||||
case mvt_null:
|
||||
fprintf(stderr, "Internal error: trying to write null attribute to tile\n");
|
||||
exit(EXIT_IMPOSSIBLE);
|
||||
} else {
|
||||
default:
|
||||
fprintf(stderr, "Internal error: trying to write undefined attribute type to tile\n");
|
||||
exit(EXIT_IMPOSSIBLE);
|
||||
}
|
||||
|
||||
sorted_value sv;
|
||||
sv.val = value_string;
|
||||
sv.val = std::move(value_string);
|
||||
sv.orig = v;
|
||||
sorted_values.push_back(sv);
|
||||
sorted_values.push_back(std::move(sv));
|
||||
}
|
||||
|
||||
std::sort(sorted_values.begin(), sorted_values.end());
|
||||
std::vector<size_t> mapping;
|
||||
mapping.resize(sorted_values.size());
|
||||
|
||||
size_t value_index = 0;
|
||||
for (size_t v = 0; v < sorted_values.size(); v++) {
|
||||
mapping[sorted_values[v].orig] = v;
|
||||
mapping[sorted_values[v].orig] = value_index;
|
||||
layer_writer.add_message(4, sorted_values[v].val);
|
||||
|
||||
// crunch out duplicates that were missed by the hashing
|
||||
while (v + 1 < sorted_values.size() && sorted_values[v].val == sorted_values[v + 1].val) {
|
||||
mapping[sorted_values[v + 1].orig] = value_index;
|
||||
v++;
|
||||
}
|
||||
|
||||
value_index++;
|
||||
}
|
||||
|
||||
for (size_t f = 0; f < layers[i].features.size(); f++) {
|
||||
@@ -455,15 +479,70 @@ bool mvt_value::operator<(const mvt_value &o) const {
|
||||
return true;
|
||||
}
|
||||
if (type == o.type) {
|
||||
if ((type == mvt_string && string_value < o.string_value) ||
|
||||
(type == mvt_float && numeric_value.float_value < o.numeric_value.float_value) ||
|
||||
(type == mvt_double && numeric_value.double_value < o.numeric_value.double_value) ||
|
||||
(type == mvt_int && numeric_value.int_value < o.numeric_value.int_value) ||
|
||||
(type == mvt_uint && numeric_value.uint_value < o.numeric_value.uint_value) ||
|
||||
(type == mvt_sint && numeric_value.sint_value < o.numeric_value.sint_value) ||
|
||||
(type == mvt_bool && numeric_value.bool_value < o.numeric_value.bool_value) ||
|
||||
(type == mvt_null && numeric_value.null_value < o.numeric_value.null_value)) {
|
||||
return true;
|
||||
switch (type) {
|
||||
case mvt_string:
|
||||
return get_string_view() < o.get_string_view();
|
||||
|
||||
case mvt_float:
|
||||
return numeric_value.float_value < o.numeric_value.float_value;
|
||||
|
||||
case mvt_double:
|
||||
return numeric_value.double_value < o.numeric_value.double_value;
|
||||
|
||||
case mvt_int:
|
||||
return numeric_value.int_value < o.numeric_value.int_value;
|
||||
|
||||
case mvt_uint:
|
||||
return numeric_value.uint_value < o.numeric_value.uint_value;
|
||||
|
||||
case mvt_sint:
|
||||
return numeric_value.sint_value < o.numeric_value.sint_value;
|
||||
|
||||
case mvt_bool:
|
||||
return numeric_value.bool_value < o.numeric_value.bool_value;
|
||||
|
||||
case mvt_null:
|
||||
return numeric_value.null_value < o.numeric_value.null_value;
|
||||
|
||||
default:
|
||||
fprintf(stderr, "mvt_value::operator<<: can't happen\n");
|
||||
exit(EXIT_IMPOSSIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool mvt_value::operator==(const mvt_value &o) const {
|
||||
if (type == o.type) {
|
||||
switch (type) {
|
||||
case mvt_string:
|
||||
return get_string_view() == o.get_string_view();
|
||||
|
||||
case mvt_float:
|
||||
return numeric_value.float_value == o.numeric_value.float_value;
|
||||
|
||||
case mvt_double:
|
||||
return numeric_value.double_value == o.numeric_value.double_value;
|
||||
|
||||
case mvt_int:
|
||||
return numeric_value.int_value == o.numeric_value.int_value;
|
||||
|
||||
case mvt_uint:
|
||||
return numeric_value.uint_value == o.numeric_value.uint_value;
|
||||
|
||||
case mvt_sint:
|
||||
return numeric_value.sint_value == o.numeric_value.sint_value;
|
||||
|
||||
case mvt_bool:
|
||||
return numeric_value.bool_value == o.numeric_value.bool_value;
|
||||
|
||||
case mvt_null:
|
||||
return numeric_value.null_value == o.numeric_value.null_value;
|
||||
|
||||
default:
|
||||
fprintf(stderr, "mvt_value::operator==: can't happen\n");
|
||||
exit(EXIT_IMPOSSIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -492,61 +571,58 @@ static std::string quote(std::string const &s) {
|
||||
}
|
||||
|
||||
std::string mvt_value::toString() const {
|
||||
if (type == mvt_string) {
|
||||
return quote(string_value);
|
||||
} else if (type == mvt_int) {
|
||||
switch (type) {
|
||||
case mvt_string:
|
||||
return quote(get_string_value());
|
||||
case mvt_int:
|
||||
return std::to_string(numeric_value.int_value);
|
||||
} else if (type == mvt_double) {
|
||||
case mvt_double: {
|
||||
double v = numeric_value.double_value;
|
||||
if (v == (long long) v) {
|
||||
return std::to_string((long long) v);
|
||||
} else {
|
||||
return milo::dtoa_milo(v);
|
||||
}
|
||||
} else if (type == mvt_float) {
|
||||
}
|
||||
case mvt_float: {
|
||||
double v = numeric_value.float_value;
|
||||
if (v == (long long) v) {
|
||||
return std::to_string((long long) v);
|
||||
} else {
|
||||
return milo::dtoa_milo(v);
|
||||
}
|
||||
} else if (type == mvt_sint) {
|
||||
}
|
||||
case mvt_sint:
|
||||
return std::to_string(numeric_value.sint_value);
|
||||
} else if (type == mvt_uint) {
|
||||
case mvt_uint:
|
||||
return std::to_string(numeric_value.uint_value);
|
||||
} else if (type == mvt_bool) {
|
||||
case mvt_bool:
|
||||
return numeric_value.bool_value ? "true" : "false";
|
||||
} else if (type == mvt_null) {
|
||||
case mvt_null:
|
||||
return "null";
|
||||
} else {
|
||||
default:
|
||||
return "unknown";
|
||||
}
|
||||
}
|
||||
|
||||
void mvt_layer::tag(mvt_feature &feature, std::string key, mvt_value value) {
|
||||
size_t ko, vo;
|
||||
|
||||
std::map<std::string, size_t>::iterator ki = key_map.find(key);
|
||||
std::map<mvt_value, size_t>::iterator vi = value_map.find(value);
|
||||
|
||||
if (ki == key_map.end()) {
|
||||
ko = keys.size();
|
||||
void mvt_layer::tag(mvt_feature &feature, std::string const &key, mvt_value const &value) {
|
||||
size_t key_hash = fnv1a(key) % key_dedup.size();
|
||||
if (key_dedup[key_hash] >= 0 &&
|
||||
keys[key_dedup[key_hash]] == key) {
|
||||
} else {
|
||||
key_dedup[key_hash] = keys.size();
|
||||
keys.push_back(key);
|
||||
key_map.insert(std::pair<std::string, size_t>(key, ko));
|
||||
} else {
|
||||
ko = ki->second;
|
||||
}
|
||||
feature.tags.push_back(key_dedup[key_hash]);
|
||||
|
||||
if (vi == value_map.end()) {
|
||||
vo = values.size();
|
||||
size_t value_hash = std::hash<mvt_value>()(value) % value_dedup.size();
|
||||
if (value_dedup[value_hash] >= 0 &&
|
||||
values[value_dedup[value_hash]] == value) {
|
||||
} else {
|
||||
value_dedup[value_hash] = values.size();
|
||||
values.push_back(value);
|
||||
value_map.insert(std::pair<mvt_value, size_t>(value, vo));
|
||||
} else {
|
||||
vo = vi->second;
|
||||
}
|
||||
|
||||
feature.tags.push_back(ko);
|
||||
feature.tags.push_back(vo);
|
||||
feature.tags.push_back(value_dedup[value_hash]);
|
||||
}
|
||||
|
||||
bool is_integer(const char *s, long long *v) {
|
||||
@@ -620,10 +696,17 @@ bool is_unsigned_integer(const char *s, unsigned long long *v) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
mvt_value stringified_to_mvt_value(int type, const char *s) {
|
||||
// This converts a serial_val-style attribute value to an mvt_value
|
||||
// to store in a tile. If the value is numeric, it tries to choose
|
||||
// the type (int, uint, sint, float, or double) that will give the
|
||||
// smallest representation in the tile without losing precision,
|
||||
// regardless of how the value was represented in the original source.
|
||||
mvt_value stringified_to_mvt_value(int type, const char *s, std::shared_ptr<std::string> const &tile_stringpool) {
|
||||
mvt_value tv;
|
||||
tv.s = tile_stringpool;
|
||||
|
||||
if (type == mvt_double) {
|
||||
switch (type) {
|
||||
case mvt_double: {
|
||||
long long v;
|
||||
unsigned long long uv;
|
||||
if (is_unsigned_integer(s, &uv)) {
|
||||
@@ -662,16 +745,93 @@ mvt_value stringified_to_mvt_value(int type, const char *s) {
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (type == mvt_bool) {
|
||||
} break;
|
||||
case mvt_bool:
|
||||
tv.type = mvt_bool;
|
||||
tv.numeric_value.bool_value = (s[0] == 't');
|
||||
} else if (type == mvt_null) {
|
||||
break;
|
||||
case mvt_null:
|
||||
tv.type = mvt_null;
|
||||
tv.numeric_value.null_value = 0;
|
||||
} else {
|
||||
break;
|
||||
default:
|
||||
tv.type = mvt_string;
|
||||
tv.string_value = s;
|
||||
tv.set_string_value(s);
|
||||
}
|
||||
|
||||
return tv;
|
||||
}
|
||||
|
||||
// This converts a mvt_value attribute value from a tile back into
|
||||
// a serial_val for more convenient parsing and comparison without
|
||||
// having to handle all of the vector tile numeric types separately.
|
||||
// All numeric types are given the type mvt_double in the serial_val
|
||||
// whether the actual value is integer or floating point.
|
||||
serial_val mvt_value_to_serial_val(mvt_value const &v) {
|
||||
serial_val sv;
|
||||
|
||||
switch (v.type) {
|
||||
case mvt_string:
|
||||
sv.type = mvt_string;
|
||||
sv.s = v.get_string_value();
|
||||
break;
|
||||
case mvt_float:
|
||||
sv.type = mvt_double;
|
||||
sv.s = milo::dtoa_milo(v.numeric_value.float_value);
|
||||
break;
|
||||
case mvt_double:
|
||||
sv.type = mvt_double;
|
||||
sv.s = milo::dtoa_milo(v.numeric_value.double_value);
|
||||
break;
|
||||
case mvt_int:
|
||||
sv.type = mvt_double;
|
||||
sv.s = std::to_string(v.numeric_value.int_value);
|
||||
break;
|
||||
case mvt_uint:
|
||||
sv.type = mvt_double;
|
||||
sv.s = std::to_string(v.numeric_value.uint_value);
|
||||
break;
|
||||
case mvt_sint:
|
||||
sv.type = mvt_double;
|
||||
sv.s = std::to_string(v.numeric_value.sint_value);
|
||||
break;
|
||||
case mvt_bool:
|
||||
sv.type = mvt_bool;
|
||||
sv.s = v.numeric_value.bool_value ? "true" : "false";
|
||||
break;
|
||||
case mvt_null:
|
||||
sv.type = mvt_null;
|
||||
sv.s = "null";
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "unhandled mvt_type %d\n", v.type);
|
||||
exit(EXIT_IMPOSSIBLE);
|
||||
}
|
||||
|
||||
return sv;
|
||||
}
|
||||
|
||||
// This extracts an integer value from an mvt_value
|
||||
long long mvt_value_to_long_long(mvt_value const &v) {
|
||||
switch (v.type) {
|
||||
case mvt_string:
|
||||
return atoll(v.c_str());
|
||||
case mvt_float:
|
||||
return v.numeric_value.float_value;
|
||||
case mvt_double:
|
||||
return v.numeric_value.double_value;
|
||||
case mvt_int:
|
||||
return v.numeric_value.int_value;
|
||||
case mvt_uint:
|
||||
return v.numeric_value.uint_value;
|
||||
case mvt_sint:
|
||||
return v.numeric_value.sint_value;
|
||||
case mvt_bool:
|
||||
return v.numeric_value.bool_value;
|
||||
case mvt_null:
|
||||
return 0;
|
||||
default:
|
||||
fprintf(stderr, "unhandled mvt_type %d\n", v.type);
|
||||
exit(EXIT_IMPOSSIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,9 +3,15 @@
|
||||
|
||||
#include <sqlite3.h>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <string_view>
|
||||
#include <unordered_map>
|
||||
#include <set>
|
||||
#include <vector>
|
||||
#include <optional>
|
||||
#include <memory>
|
||||
|
||||
#include "errors.hpp"
|
||||
#include "text.hpp"
|
||||
|
||||
struct mvt_value;
|
||||
struct mvt_layer;
|
||||
@@ -48,7 +54,8 @@ struct mvt_feature {
|
||||
int /* mvt_geometry_type */ type = 0;
|
||||
unsigned long long id = 0;
|
||||
bool has_id = false;
|
||||
bool dropped = false;
|
||||
int dropped = 0;
|
||||
size_t seq = 0; // used for ordering in overzoom
|
||||
|
||||
mvt_feature() {
|
||||
has_id = false;
|
||||
@@ -65,11 +72,14 @@ enum mvt_value_type {
|
||||
mvt_sint,
|
||||
mvt_bool,
|
||||
mvt_null,
|
||||
|
||||
mvt_no_such_key,
|
||||
};
|
||||
|
||||
struct mvt_value {
|
||||
mvt_value_type type;
|
||||
std::string string_value;
|
||||
std::shared_ptr<std::string> s;
|
||||
|
||||
union {
|
||||
float float_value;
|
||||
double double_value;
|
||||
@@ -78,18 +88,81 @@ struct mvt_value {
|
||||
long long sint_value;
|
||||
bool bool_value;
|
||||
int null_value;
|
||||
struct {
|
||||
size_t off;
|
||||
size_t len;
|
||||
} string_value;
|
||||
} numeric_value;
|
||||
|
||||
std::string get_string_value() const {
|
||||
return std::string(*s, numeric_value.string_value.off, numeric_value.string_value.len);
|
||||
}
|
||||
|
||||
std::string_view get_string_view() const {
|
||||
return std::string_view(s->c_str() + numeric_value.string_value.off, numeric_value.string_value.len);
|
||||
}
|
||||
|
||||
const char *c_str() const {
|
||||
return s->c_str() + numeric_value.string_value.off;
|
||||
}
|
||||
|
||||
void set_string_value(const std::string_view &val) {
|
||||
if (s == nullptr) {
|
||||
s = std::make_shared<std::string>();
|
||||
}
|
||||
|
||||
type = mvt_string;
|
||||
numeric_value.string_value.off = s->size();
|
||||
numeric_value.string_value.len = val.size();
|
||||
s->append(val);
|
||||
s->push_back('\0');
|
||||
}
|
||||
|
||||
bool operator<(const mvt_value &o) const;
|
||||
bool operator==(const mvt_value &o) const;
|
||||
std::string toString() const;
|
||||
|
||||
mvt_value() {
|
||||
this->type = mvt_double;
|
||||
this->string_value = "";
|
||||
this->numeric_value.double_value = 0;
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct std::hash<mvt_value> {
|
||||
std::size_t operator()(const mvt_value &k) const {
|
||||
switch (k.type) {
|
||||
case mvt_string:
|
||||
return fnv1a(k.c_str(), 0);
|
||||
|
||||
case mvt_float:
|
||||
return fnv1a(sizeof(float), (void *) &k.numeric_value.float_value);
|
||||
|
||||
case mvt_double:
|
||||
return fnv1a(sizeof(double), (void *) &k.numeric_value.double_value);
|
||||
|
||||
case mvt_int:
|
||||
return fnv1a(sizeof(long long), (void *) &k.numeric_value.int_value);
|
||||
|
||||
case mvt_uint:
|
||||
return fnv1a(sizeof(unsigned long long), (void *) &k.numeric_value.uint_value);
|
||||
|
||||
case mvt_sint:
|
||||
return fnv1a(sizeof(long long), (void *) &k.numeric_value.sint_value);
|
||||
|
||||
case mvt_bool:
|
||||
return fnv1a(sizeof(bool), (void *) &k.numeric_value.bool_value);
|
||||
|
||||
case mvt_null:
|
||||
return fnv1a(sizeof(int), (void *) &k.numeric_value.null_value);
|
||||
|
||||
default:
|
||||
fprintf(stderr, "mvt_value hash can't happen\n");
|
||||
exit(EXIT_IMPOSSIBLE);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
struct mvt_layer {
|
||||
int version = 0;
|
||||
std::string name = "";
|
||||
@@ -99,18 +172,18 @@ struct mvt_layer {
|
||||
long long extent = 0;
|
||||
|
||||
// Add a key-value pair to a feature, using this layer's constant pool
|
||||
void tag(mvt_feature &feature, std::string key, mvt_value value);
|
||||
void tag(mvt_feature &feature, std::string const &key, mvt_value const &value);
|
||||
|
||||
// For tracking the key-value constants already used in this layer
|
||||
std::map<std::string, size_t> key_map{};
|
||||
std::map<mvt_value, size_t> value_map{};
|
||||
std::vector<ssize_t> key_dedup = std::vector<ssize_t>(65536, -1);
|
||||
std::vector<ssize_t> value_dedup = std::vector<ssize_t>(65536, -1);
|
||||
};
|
||||
|
||||
struct mvt_tile {
|
||||
std::vector<mvt_layer> layers{};
|
||||
|
||||
std::string encode();
|
||||
bool decode(std::string &message, bool &was_compressed);
|
||||
bool decode(const std::string &message, bool &was_compressed);
|
||||
};
|
||||
|
||||
bool is_compressed(std::string const &data);
|
||||
@@ -118,8 +191,12 @@ int decompress(std::string const &input, std::string &output);
|
||||
int compress(std::string const &input, std::string &output, bool gz);
|
||||
int dezig(unsigned n);
|
||||
|
||||
mvt_value stringified_to_mvt_value(int type, const char *s);
|
||||
mvt_value stringified_to_mvt_value(int type, const char *s, std::shared_ptr<std::string> const &tile_stringpool);
|
||||
long long mvt_value_to_long_long(mvt_value const &v);
|
||||
|
||||
bool is_integer(const char *s, long long *v);
|
||||
bool is_unsigned_integer(const char *s, unsigned long long *v);
|
||||
|
||||
struct serial_val;
|
||||
serial_val mvt_value_to_serial_val(mvt_value const &v);
|
||||
#endif
|
||||
|
||||
+62
-2
@@ -6,12 +6,20 @@
|
||||
#include "errors.hpp"
|
||||
#include "mvt.hpp"
|
||||
#include "geometry.hpp"
|
||||
#include "evaluator.hpp"
|
||||
#include "attribute.hpp"
|
||||
#include "text.hpp"
|
||||
|
||||
extern char *optarg;
|
||||
extern int optind;
|
||||
|
||||
int detail = 12; // tippecanoe-style: mvt extent == 1 << detail
|
||||
int buffer = 5; // tippecanoe-style: mvt buffer == extent * buffer / 256;
|
||||
bool demultiply = false;
|
||||
std::string filter;
|
||||
bool preserve_input_order = false;
|
||||
std::unordered_map<std::string, attribute_op> attribute_accum;
|
||||
std::vector<std::string> unidecode_data;
|
||||
|
||||
std::set<std::string> keep;
|
||||
|
||||
@@ -25,7 +33,33 @@ int main(int argc, char **argv) {
|
||||
int i;
|
||||
const char *outfile = NULL;
|
||||
|
||||
while ((i = getopt(argc, argv, "y:o:d:b:")) != -1) {
|
||||
struct option long_options[] = {
|
||||
{"include", required_argument, 0, 'y'},
|
||||
{"full-detail", required_argument, 0, 'd'},
|
||||
{"buffer", required_argument, 0, 'b'},
|
||||
{"output", required_argument, 0, 'o'},
|
||||
{"filter-points-multiplier", no_argument, 0, 'm'},
|
||||
{"feature-filter", required_argument, 0, 'j'},
|
||||
{"preserve-input-order", no_argument, 0, 'o' & 0x1F},
|
||||
{"accumulate-attribute", required_argument, 0, 'E'},
|
||||
{"unidecode-data", required_argument, 0, 'u' & 0x1F},
|
||||
|
||||
{0, 0, 0, 0},
|
||||
};
|
||||
|
||||
std::string getopt_str;
|
||||
for (size_t lo = 0; long_options[lo].name != NULL; lo++) {
|
||||
if (long_options[lo].val > ' ') {
|
||||
getopt_str.push_back(long_options[lo].val);
|
||||
|
||||
if (long_options[lo].has_arg == required_argument) {
|
||||
getopt_str.push_back(':');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int option_index = 0;
|
||||
while ((i = getopt_long(argc, argv, getopt_str.c_str(), long_options, &option_index)) != -1) {
|
||||
switch (i) {
|
||||
case 'y':
|
||||
keep.insert(optarg);
|
||||
@@ -43,7 +77,28 @@ int main(int argc, char **argv) {
|
||||
buffer = atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'm':
|
||||
demultiply = true;
|
||||
break;
|
||||
|
||||
case 'j':
|
||||
filter = optarg;
|
||||
break;
|
||||
|
||||
case 'o' & 0x1F:
|
||||
preserve_input_order = true;
|
||||
break;
|
||||
|
||||
case 'E':
|
||||
set_attribute_accum(attribute_accum, optarg, argv);
|
||||
break;
|
||||
|
||||
case 'u' & 0x1F:
|
||||
unidecode_data = read_unidecode(optarg);
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf(stderr, "Unrecognized flag -%c\n", i);
|
||||
usage(argv);
|
||||
}
|
||||
}
|
||||
@@ -91,7 +146,12 @@ int main(int argc, char **argv) {
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
std::string out = overzoom(tile, oz, ox, oy, nz, nx, ny, detail, buffer, keep, true, NULL);
|
||||
json_object *json_filter = NULL;
|
||||
if (filter.size() > 0) {
|
||||
json_filter = parse_filter(filter.c_str());
|
||||
}
|
||||
|
||||
std::string out = overzoom(tile, oz, ox, oy, nz, nx, ny, detail, buffer, keep, true, NULL, demultiply, json_filter, preserve_input_order, attribute_accum, unidecode_data);
|
||||
fwrite(out.c_str(), sizeof(char), out.size(), f);
|
||||
fclose(f);
|
||||
|
||||
|
||||
+32
-41
@@ -26,6 +26,7 @@
|
||||
#include "serial.hpp"
|
||||
#include "errors.hpp"
|
||||
#include "polygon.hpp"
|
||||
#include "thread.hpp"
|
||||
|
||||
extern "C" {
|
||||
#include "jsonpull/jsonpull.h"
|
||||
@@ -88,6 +89,7 @@ static std::vector<mvt_geometry> to_feature(drawvec &geom) {
|
||||
// Reads from the postfilter
|
||||
std::vector<mvt_layer> parse_layers(int fd, int z, unsigned x, unsigned y, std::vector<std::map<std::string, layermap_entry>> *layermaps, size_t tiling_seg, std::vector<std::vector<std::string>> *layer_unmaps, int extent) {
|
||||
std::map<std::string, mvt_layer> ret;
|
||||
std::shared_ptr<std::string> tile_stringpool = std::make_shared<std::string>();
|
||||
|
||||
FILE *f = fdopen(fd, "r");
|
||||
if (f == NULL) {
|
||||
@@ -248,44 +250,37 @@ std::vector<mvt_layer> parse_layers(int fd, int z, unsigned x, unsigned y, std::
|
||||
}
|
||||
}
|
||||
|
||||
auto fk = layermap.find(layername);
|
||||
if (fk == layermap.end()) {
|
||||
auto ts = layermap.find(layername);
|
||||
if (ts == layermap.end()) {
|
||||
fprintf(stderr, "Internal error: layer %s not found\n", layername.c_str());
|
||||
exit(EXIT_IMPOSSIBLE);
|
||||
}
|
||||
if (z < fk->second.minzoom) {
|
||||
fk->second.minzoom = z;
|
||||
if (z < ts->second.minzoom) {
|
||||
ts->second.minzoom = z;
|
||||
}
|
||||
if (z > fk->second.maxzoom) {
|
||||
fk->second.maxzoom = z;
|
||||
if (z > ts->second.maxzoom) {
|
||||
ts->second.maxzoom = z;
|
||||
}
|
||||
|
||||
if (feature.type == mvt_point) {
|
||||
fk->second.points++;
|
||||
ts->second.points++;
|
||||
} else if (feature.type == mvt_linestring) {
|
||||
fk->second.lines++;
|
||||
ts->second.lines++;
|
||||
} else if (feature.type == mvt_polygon) {
|
||||
fk->second.polygons++;
|
||||
ts->second.polygons++;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < properties->value.object.length; i++) {
|
||||
int tp = -1;
|
||||
std::string s;
|
||||
|
||||
stringify_value(properties->value.object.values[i], tp, s, "Filter output", jp->line, j);
|
||||
serial_val sv = stringify_value(properties->value.object.values[i], "Filter output", jp->line, j);
|
||||
|
||||
// Nulls can be excluded here because this is the postfilter
|
||||
// and it is nearly time to create the vector representation
|
||||
|
||||
if (tp >= 0 && tp != mvt_null) {
|
||||
mvt_value v = stringified_to_mvt_value(tp, s.c_str());
|
||||
if (sv.type != mvt_null) {
|
||||
mvt_value v = stringified_to_mvt_value(sv.type, sv.s.c_str(), tile_stringpool);
|
||||
l->second.tag(feature, std::string(properties->value.object.keys[i]->value.string.string), v);
|
||||
|
||||
type_and_string attrib;
|
||||
attrib.type = tp;
|
||||
attrib.string = s;
|
||||
|
||||
add_to_file_keys(fk->second.file_keys, std::string(properties->value.object.keys[i]->value.string.string), attrib);
|
||||
add_to_tilestats(ts->second.tilestats, std::string(properties->value.object.keys[i]->value.string.string), sv);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -440,7 +435,9 @@ serial_feature parse_feature(json_pull *jp, int z, unsigned x, unsigned y, std::
|
||||
|
||||
json_object *dropped = json_hash_get(tippecanoe, "dropped");
|
||||
if (dropped != NULL && dropped->type == JSON_TRUE) {
|
||||
sf.dropped = true;
|
||||
sf.dropped = FEATURE_DROPPED; // dropped
|
||||
} else {
|
||||
sf.dropped = FEATURE_KEPT; // kept
|
||||
}
|
||||
}
|
||||
|
||||
@@ -485,49 +482,42 @@ serial_feature parse_feature(json_pull *jp, int z, unsigned x, unsigned y, std::
|
||||
}
|
||||
}
|
||||
|
||||
auto fk = layermap.find(layername);
|
||||
if (fk == layermap.end()) {
|
||||
auto ts = layermap.find(layername);
|
||||
if (ts == layermap.end()) {
|
||||
fprintf(stderr, "Internal error: layer %s not found\n", layername.c_str());
|
||||
exit(EXIT_IMPOSSIBLE);
|
||||
}
|
||||
sf.layer = fk->second.id;
|
||||
sf.layer = ts->second.id;
|
||||
|
||||
if (z < fk->second.minzoom) {
|
||||
fk->second.minzoom = z;
|
||||
if (z < ts->second.minzoom) {
|
||||
ts->second.minzoom = z;
|
||||
}
|
||||
if (z > fk->second.maxzoom) {
|
||||
fk->second.maxzoom = z;
|
||||
if (z > ts->second.maxzoom) {
|
||||
ts->second.maxzoom = z;
|
||||
}
|
||||
|
||||
if (!postfilter) {
|
||||
if (sf.t == mvt_point) {
|
||||
fk->second.points++;
|
||||
ts->second.points++;
|
||||
} else if (sf.t == mvt_linestring) {
|
||||
fk->second.lines++;
|
||||
ts->second.lines++;
|
||||
} else if (sf.t == mvt_polygon) {
|
||||
fk->second.polygons++;
|
||||
ts->second.polygons++;
|
||||
}
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < properties->value.object.length; i++) {
|
||||
serial_val v;
|
||||
v.type = -1;
|
||||
|
||||
stringify_value(properties->value.object.values[i], v.type, v.s, "Filter output", jp->line, j);
|
||||
serial_val v = stringify_value(properties->value.object.values[i], "Filter output", jp->line, j);
|
||||
|
||||
// Nulls can be excluded here because the expression evaluation filter
|
||||
// would have already run before prefiltering
|
||||
|
||||
if (v.type >= 0 && v.type != mvt_null) {
|
||||
if (v.type != mvt_null) {
|
||||
sf.full_keys.push_back(std::string(properties->value.object.keys[i]->value.string.string));
|
||||
sf.full_values.push_back(v);
|
||||
|
||||
type_and_string attrib;
|
||||
attrib.string = v.s;
|
||||
attrib.type = v.type;
|
||||
|
||||
if (!postfilter) {
|
||||
add_to_file_keys(fk->second.file_keys, std::string(properties->value.object.keys[i]->value.string.string), attrib);
|
||||
add_to_tilestats(ts->second.tilestats, std::string(properties->value.object.keys[i]->value.string.string), v);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -650,6 +640,7 @@ std::vector<mvt_layer> filter_layers(const char *filter, std::vector<mvt_layer>
|
||||
wa.extent = extent;
|
||||
|
||||
pthread_t writer;
|
||||
// this does need to be a real thread, so we can pipe both to and from it
|
||||
if (pthread_create(&writer, NULL, run_writer, &wa) != 0) {
|
||||
perror("pthread_create (filter writer)");
|
||||
exit(EXIT_PTHREAD);
|
||||
|
||||
+3
-3
@@ -166,11 +166,11 @@ struct entryv3 {
|
||||
}
|
||||
};
|
||||
|
||||
struct {
|
||||
struct entryv3_cmp {
|
||||
bool operator()(entryv3 a, entryv3 b) const {
|
||||
return a.tile_id < b.tile_id;
|
||||
}
|
||||
} entryv3_cmp;
|
||||
};
|
||||
|
||||
struct entry_zxy {
|
||||
uint8_t z;
|
||||
@@ -388,7 +388,7 @@ inline uint64_t zxy_to_tileid(uint8_t z, uint32_t x, uint32_t y) {
|
||||
if (z > 31) {
|
||||
throw std::overflow_error("tile zoom exceeds 64-bit limit");
|
||||
}
|
||||
if (x > (1 << z) - 1 || y > (1 << z) - 1) {
|
||||
if (x > (1U << z) - 1 || y > (1U << z) - 1) {
|
||||
throw std::overflow_error("tile x/y outside zoom level bounds");
|
||||
}
|
||||
uint64_t acc = 0;
|
||||
|
||||
+14
-1
@@ -103,6 +103,13 @@ std::string metadata_to_pmtiles_json(metadata m) {
|
||||
state.json_write_string("strategies");
|
||||
state.json_write_json(m.strategies_json);
|
||||
}
|
||||
|
||||
if (m.decisions_json.size() > 0) {
|
||||
state.json_comma_newline();
|
||||
state.json_write_string("tippecanoe_decisions");
|
||||
state.json_write_json(m.decisions_json);
|
||||
}
|
||||
|
||||
out(state, "generator", m.generator);
|
||||
out(state, "generator_options", m.generator_options);
|
||||
|
||||
@@ -256,7 +263,7 @@ void mbtiles_map_image_to_pmtiles(char *fname, metadata m, bool tile_compression
|
||||
|
||||
// finalize PMTiles archive.
|
||||
{
|
||||
std::sort(entries.begin(), entries.end(), pmtiles::entryv3_cmp);
|
||||
std::sort(entries.begin(), entries.end(), pmtiles::entryv3_cmp());
|
||||
|
||||
std::string root_bytes;
|
||||
std::string leaves_bytes;
|
||||
@@ -428,6 +435,12 @@ sqlite3 *pmtilesmeta2tmp(const char *fname, const char *pmtiles_map) {
|
||||
fprintf(stderr, "set %s in metadata: %s\n", key, err);
|
||||
}
|
||||
sqlite3_free(sql);
|
||||
} else if (strcmp(key, "tippecanoe_decisions") == 0 && o->value.object.values[i]->type == JSON_HASH) {
|
||||
sql = sqlite3_mprintf("INSERT INTO metadata (name, value) VALUES ('tippecanoe_decisions', %Q);", json_stringify(o->value.object.values[i]));
|
||||
if (sqlite3_exec(db, sql, NULL, NULL, &err) != SQLITE_OK) {
|
||||
fprintf(stderr, "set %s in metadata: %s\n", key, err);
|
||||
}
|
||||
sqlite3_free(sql);
|
||||
} else if (o->value.object.keys[i]->type != JSON_STRING || o->value.object.values[i]->type != JSON_STRING) {
|
||||
fprintf(stderr, "%s\n", key);
|
||||
fprintf(stderr, "%s: non-string in metadata\n", fname);
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <cmath>
|
||||
#include <climits>
|
||||
#include <limits>
|
||||
#include <map>
|
||||
#include "geometry.hpp"
|
||||
#include "errors.hpp"
|
||||
|
||||
|
||||
@@ -7,32 +7,33 @@
|
||||
#include "memfile.hpp"
|
||||
#include "pool.hpp"
|
||||
#include "errors.hpp"
|
||||
#include "text.hpp"
|
||||
|
||||
int swizzlecmp(const char *a, const char *b) {
|
||||
ssize_t alen = strlen(a);
|
||||
ssize_t blen = strlen(b);
|
||||
|
||||
if (strcmp(a, b) == 0) {
|
||||
return 0;
|
||||
inline int swizzlecmp(const char *a, int atype, unsigned long long ahash, const char *b, int btype, unsigned long long bhash) {
|
||||
if (ahash == bhash) {
|
||||
if (atype == btype) {
|
||||
return strcmp(a, b);
|
||||
} else {
|
||||
return atype - btype;
|
||||
}
|
||||
} else {
|
||||
return (int) ahash - (int) bhash;
|
||||
}
|
||||
|
||||
long long hash1 = 0, hash2 = 0;
|
||||
for (ssize_t i = alen - 1; i >= 0; i--) {
|
||||
hash1 = (hash1 * 37 + a[i]) & INT_MAX;
|
||||
}
|
||||
for (ssize_t i = blen - 1; i >= 0; i--) {
|
||||
hash2 = (hash2 * 37 + b[i]) & INT_MAX;
|
||||
}
|
||||
|
||||
int h1 = hash1, h2 = hash2;
|
||||
if (h1 == h2) {
|
||||
return strcmp(a, b);
|
||||
}
|
||||
|
||||
return h1 - h2;
|
||||
}
|
||||
|
||||
long long addpool(struct memfile *poolfile, struct memfile *treefile, const char *s, char type) {
|
||||
long long addpool(struct memfile *poolfile, struct memfile *treefile, const char *s, char type, std::vector<ssize_t> &dedup) {
|
||||
unsigned long long hash = fnv1a(s, type);
|
||||
size_t hash_off = hash % dedup.size();
|
||||
|
||||
if (dedup[hash_off] >= 0 &&
|
||||
poolfile->map[dedup[hash_off]] == type &&
|
||||
strcmp(poolfile->map.c_str() + dedup[hash_off] + 1, s) == 0) {
|
||||
// printf("hit for %s\n", s);
|
||||
return dedup[hash_off];
|
||||
} else {
|
||||
// printf("miss for %s\n", s);
|
||||
}
|
||||
|
||||
unsigned long *sp = &treefile->tree;
|
||||
size_t depth = 0;
|
||||
|
||||
@@ -43,17 +44,17 @@ long long addpool(struct memfile *poolfile, struct memfile *treefile, const char
|
||||
}
|
||||
|
||||
while (*sp != 0) {
|
||||
int cmp = swizzlecmp(s, poolfile->map.c_str() + ((struct stringpool *) (treefile->map.c_str() + *sp))->off + 1);
|
||||
|
||||
if (cmp == 0) {
|
||||
cmp = type - (poolfile->map.c_str() + ((struct stringpool *) (treefile->map.c_str() + *sp))->off)[0];
|
||||
}
|
||||
int cmp = swizzlecmp(s, type, hash,
|
||||
poolfile->map.c_str() + ((struct stringpool *) (treefile->map.c_str() + *sp))->off + 1,
|
||||
(poolfile->map.c_str() + ((struct stringpool *) (treefile->map.c_str() + *sp))->off)[0],
|
||||
((struct stringpool *) (treefile->map.c_str() + *sp))->hash);
|
||||
|
||||
if (cmp < 0) {
|
||||
sp = &(((struct stringpool *) (treefile->map.c_str() + *sp))->left);
|
||||
} else if (cmp > 0) {
|
||||
sp = &(((struct stringpool *) (treefile->map.c_str() + *sp))->right);
|
||||
} else {
|
||||
dedup[hash_off] = ((struct stringpool *) (treefile->map.c_str() + *sp))->off;
|
||||
return ((struct stringpool *) (treefile->map.c_str() + *sp))->off;
|
||||
}
|
||||
|
||||
@@ -65,14 +66,20 @@ long long addpool(struct memfile *poolfile, struct memfile *treefile, const char
|
||||
// the pool is full yet.
|
||||
|
||||
long long off = poolfile->off;
|
||||
if (memfile_write(poolfile, &type, 1) < 0) {
|
||||
bool in_memory = false;
|
||||
|
||||
if (memfile_write(poolfile, &type, 1, in_memory) < 0) {
|
||||
perror("memfile write");
|
||||
exit(EXIT_WRITE);
|
||||
}
|
||||
if (memfile_write(poolfile, (void *) s, strlen(s) + 1) < 0) {
|
||||
if (memfile_write(poolfile, (void *) s, strlen(s) + 1, in_memory) < 0) {
|
||||
perror("memfile write");
|
||||
exit(EXIT_WRITE);
|
||||
}
|
||||
|
||||
if (in_memory) {
|
||||
dedup[hash_off] = off;
|
||||
}
|
||||
return off;
|
||||
}
|
||||
}
|
||||
@@ -95,11 +102,12 @@ long long addpool(struct memfile *poolfile, struct memfile *treefile, const char
|
||||
// to the newly-added strings.
|
||||
|
||||
long long off = poolfile->off;
|
||||
if (memfile_write(poolfile, &type, 1) < 0) {
|
||||
bool in_memory;
|
||||
if (memfile_write(poolfile, &type, 1, in_memory) < 0) {
|
||||
perror("memfile write");
|
||||
exit(EXIT_WRITE);
|
||||
}
|
||||
if (memfile_write(poolfile, (void *) s, strlen(s) + 1) < 0) {
|
||||
if (memfile_write(poolfile, (void *) s, strlen(s) + 1, in_memory) < 0) {
|
||||
perror("memfile write");
|
||||
exit(EXIT_WRITE);
|
||||
}
|
||||
@@ -115,14 +123,18 @@ long long addpool(struct memfile *poolfile, struct memfile *treefile, const char
|
||||
}
|
||||
|
||||
long long off = poolfile->off;
|
||||
if (memfile_write(poolfile, &type, 1) < 0) {
|
||||
bool in_memory = false;
|
||||
if (memfile_write(poolfile, &type, 1, in_memory) < 0) {
|
||||
perror("memfile write");
|
||||
exit(EXIT_WRITE);
|
||||
}
|
||||
if (memfile_write(poolfile, (void *) s, strlen(s) + 1) < 0) {
|
||||
if (memfile_write(poolfile, (void *) s, strlen(s) + 1, in_memory) < 0) {
|
||||
perror("memfile write");
|
||||
exit(EXIT_WRITE);
|
||||
}
|
||||
if (in_memory) {
|
||||
dedup[hash_off] = off;
|
||||
}
|
||||
|
||||
if (off >= LONG_MAX || treefile->off >= LONG_MAX) {
|
||||
// Tree or pool is bigger than 2GB
|
||||
@@ -138,9 +150,10 @@ long long addpool(struct memfile *poolfile, struct memfile *treefile, const char
|
||||
tsp.left = 0;
|
||||
tsp.right = 0;
|
||||
tsp.off = off;
|
||||
tsp.hash = hash;
|
||||
|
||||
long long p = treefile->off;
|
||||
if (memfile_write(treefile, &tsp, sizeof(struct stringpool)) < 0) {
|
||||
if (memfile_write(treefile, &tsp, sizeof(struct stringpool), in_memory) < 0) {
|
||||
perror("memfile write");
|
||||
exit(EXIT_WRITE);
|
||||
}
|
||||
|
||||
@@ -4,9 +4,11 @@
|
||||
struct stringpool {
|
||||
unsigned long left = 0;
|
||||
unsigned long right = 0;
|
||||
|
||||
unsigned long off = 0;
|
||||
size_t hash; // hash of the string at this node
|
||||
};
|
||||
|
||||
long long addpool(struct memfile *poolfile, struct memfile *treefile, const char *s, char type);
|
||||
long long addpool(struct memfile *poolfile, struct memfile *treefile, const char *s, char type, std::vector<ssize_t> &dedup);
|
||||
|
||||
#endif
|
||||
|
||||
+35
-36
@@ -13,6 +13,7 @@
|
||||
#include "mvt.hpp"
|
||||
#include "milo/dtoa_milo.h"
|
||||
#include "errors.hpp"
|
||||
#include "serial.hpp"
|
||||
|
||||
const char *geometry_names[GEOM_TYPES] = {
|
||||
"Point",
|
||||
@@ -116,54 +117,52 @@ void parse_geometry(int t, json_object *j, drawvec &out, int op, const char *fna
|
||||
}
|
||||
}
|
||||
|
||||
void stringify_value(json_object *value, int &type, std::string &stringified, const char *reading, int line, json_object *feature) {
|
||||
// This is used to convert a JSON attribute value into a serial_val-style
|
||||
// type and stringified value. All numeric values, even if they are integers,
|
||||
// even integers that are too large to fit in a double but will still be
|
||||
// stringified with their original precision, are recorded here as mvt_double.
|
||||
serial_val stringify_value(json_object *value, const char *reading, int line, json_object *feature) {
|
||||
serial_val sv;
|
||||
|
||||
if (value != NULL) {
|
||||
int vt = value->type;
|
||||
std::string val;
|
||||
|
||||
if (vt == JSON_STRING) {
|
||||
val = value->value.string.string;
|
||||
} else if (vt == JSON_NUMBER) {
|
||||
if (value->value.number.large_unsigned != 0) {
|
||||
val = std::to_string(value->value.number.large_unsigned);
|
||||
} else if (value->value.number.large_signed != 0) {
|
||||
val = std::to_string(value->value.number.large_signed);
|
||||
} else {
|
||||
val = milo::dtoa_milo(value->value.number.number);
|
||||
}
|
||||
} else if (vt == JSON_TRUE) {
|
||||
val = "true";
|
||||
} else if (vt == JSON_FALSE) {
|
||||
val = "false";
|
||||
} else if (vt == JSON_NULL) {
|
||||
val = "null";
|
||||
} else {
|
||||
const char *v = json_stringify(value);
|
||||
val = std::string(v);
|
||||
free((void *) v); // stringify
|
||||
}
|
||||
sv.type = mvt_string;
|
||||
sv.s = value->value.string.string;
|
||||
|
||||
if (vt == JSON_STRING) {
|
||||
type = mvt_string;
|
||||
stringified = val;
|
||||
std::string err = check_utf8(val);
|
||||
if (err != "") {
|
||||
std::string err = check_utf8(sv.s);
|
||||
if (err.size() > 0) {
|
||||
fprintf(stderr, "%s:%d: %s: ", reading, line, err.c_str());
|
||||
json_context(feature);
|
||||
exit(EXIT_UTF8);
|
||||
}
|
||||
} else if (vt == JSON_NUMBER) {
|
||||
type = mvt_double;
|
||||
stringified = val;
|
||||
} else if (vt == JSON_TRUE || vt == JSON_FALSE) {
|
||||
type = mvt_bool;
|
||||
stringified = val;
|
||||
sv.type = mvt_double;
|
||||
|
||||
if (value->value.number.large_unsigned != 0) {
|
||||
sv.s = std::to_string(value->value.number.large_unsigned);
|
||||
} else if (value->value.number.large_signed != 0) {
|
||||
sv.s = std::to_string(value->value.number.large_signed);
|
||||
} else {
|
||||
sv.s = milo::dtoa_milo(value->value.number.number);
|
||||
}
|
||||
} else if (vt == JSON_TRUE) {
|
||||
sv.type = mvt_bool;
|
||||
sv.s = "true";
|
||||
} else if (vt == JSON_FALSE) {
|
||||
sv.type = mvt_bool;
|
||||
sv.s = "false";
|
||||
} else if (vt == JSON_NULL) {
|
||||
type = mvt_null;
|
||||
stringified = "null";
|
||||
sv.type = mvt_null;
|
||||
sv.s = "null";
|
||||
} else {
|
||||
type = mvt_string;
|
||||
stringified = val;
|
||||
sv.type = mvt_string;
|
||||
const char *v = json_stringify(value);
|
||||
sv.s = std::string(v);
|
||||
free((void *) v); // stringify
|
||||
}
|
||||
}
|
||||
|
||||
return sv;
|
||||
}
|
||||
|
||||
+1
-1
@@ -13,4 +13,4 @@ extern int mb_geometry[GEOM_TYPES];
|
||||
void json_context(json_object *j);
|
||||
void parse_geometry(int t, json_object *j, drawvec &out, int op, const char *fname, int line, json_object *feature);
|
||||
|
||||
void stringify_value(json_object *value, int &type, std::string &stringified, const char *reading, int line, json_object *feature);
|
||||
serial_val stringify_value(json_object *value, const char *reading, int line, json_object *feature);
|
||||
|
||||
+57
-68
@@ -52,25 +52,16 @@ void serialize_long_long(FILE *out, long long n, std::atomic<long long> *fpos, c
|
||||
}
|
||||
|
||||
void serialize_ulong_long(FILE *out, unsigned long long zigzag, std::atomic<long long> *fpos, const char *fname) {
|
||||
while (1) {
|
||||
unsigned char b = zigzag & 0x7F;
|
||||
if ((zigzag >> 7) != 0) {
|
||||
b |= 0x80;
|
||||
if (putc(b, out) == EOF) {
|
||||
fprintf(stderr, "%s: Write to temporary file failed: %s\n", fname, strerror(errno));
|
||||
exit(EXIT_WRITE);
|
||||
}
|
||||
*fpos += 1;
|
||||
zigzag >>= 7;
|
||||
} else {
|
||||
if (putc(b, out) == EOF) {
|
||||
fprintf(stderr, "%s: Write to temporary file failed: %s\n", fname, strerror(errno));
|
||||
exit(EXIT_WRITE);
|
||||
}
|
||||
*fpos += 1;
|
||||
break;
|
||||
}
|
||||
char buf[10]; // ceil(64 / 7)
|
||||
char *s = buf;
|
||||
|
||||
while (zigzag >= 0x80) {
|
||||
*s++ = (zigzag & 0x7F) | 0x80;
|
||||
zigzag >>= 7;
|
||||
}
|
||||
|
||||
*s++ = zigzag;
|
||||
fwrite_check(buf, sizeof(char), s - buf, out, fpos, fname);
|
||||
}
|
||||
|
||||
void serialize_byte(FILE *out, signed char n, std::atomic<long long> *fpos, const char *fname) {
|
||||
@@ -89,17 +80,16 @@ size_t fwrite_check(const void *ptr, size_t size, size_t nitems, std::string &st
|
||||
}
|
||||
|
||||
void serialize_ulong_long(std::string &out, unsigned long long zigzag) {
|
||||
while (1) {
|
||||
unsigned char b = zigzag & 0x7F;
|
||||
if ((zigzag >> 7) != 0) {
|
||||
b |= 0x80;
|
||||
out += b;
|
||||
zigzag >>= 7;
|
||||
} else {
|
||||
out += b;
|
||||
break;
|
||||
}
|
||||
char buf[10]; // ceil(64 / 7)
|
||||
char *s = buf;
|
||||
|
||||
while (zigzag >= 0x80) {
|
||||
*s++ = (zigzag & 0x7F) | 0x80;
|
||||
zigzag >>= 7;
|
||||
}
|
||||
|
||||
*s++ = zigzag;
|
||||
out.append(buf, s - buf);
|
||||
}
|
||||
|
||||
void serialize_long_long(std::string &out, long long n) {
|
||||
@@ -122,43 +112,43 @@ void serialize_uint(std::string &out, unsigned n) {
|
||||
|
||||
// read from memory
|
||||
|
||||
void deserialize_int(char **f, int *n) {
|
||||
void deserialize_int(const char **f, int *n) {
|
||||
long long ll;
|
||||
deserialize_long_long(f, &ll);
|
||||
*n = ll;
|
||||
}
|
||||
|
||||
void deserialize_long_long(char **f, long long *n) {
|
||||
void deserialize_long_long(const char **f, long long *n) {
|
||||
unsigned long long zigzag = 0;
|
||||
deserialize_ulong_long(f, &zigzag);
|
||||
*n = protozero::decode_zigzag64(zigzag);
|
||||
}
|
||||
|
||||
void deserialize_ulong_long(char **f, unsigned long long *zigzag) {
|
||||
void deserialize_ulong_long(const char **f, unsigned long long *zigzag) {
|
||||
*zigzag = 0;
|
||||
int shift = 0;
|
||||
|
||||
while (1) {
|
||||
if ((**f & 0x80) == 0) {
|
||||
*zigzag |= ((unsigned long long) **f) << shift;
|
||||
*zigzag |= ((const unsigned long long) **f) << shift;
|
||||
*f += 1;
|
||||
shift += 7;
|
||||
break;
|
||||
} else {
|
||||
*zigzag |= ((unsigned long long) (**f & 0x7F)) << shift;
|
||||
*zigzag |= ((const unsigned long long) (**f & 0x7F)) << shift;
|
||||
*f += 1;
|
||||
shift += 7;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void deserialize_uint(char **f, unsigned *n) {
|
||||
void deserialize_uint(const char **f, unsigned *n) {
|
||||
unsigned long long v;
|
||||
deserialize_ulong_long(f, &v);
|
||||
*n = v;
|
||||
}
|
||||
|
||||
void deserialize_byte(char **f, signed char *n) {
|
||||
void deserialize_byte(const char **f, signed char *n) {
|
||||
memcpy(n, *f, sizeof(signed char));
|
||||
*f += sizeof(signed char);
|
||||
}
|
||||
@@ -187,7 +177,6 @@ std::string serialize_feature(serial_feature *sf, long long wx, long long wy) {
|
||||
#define FLAG_LAYER 7
|
||||
|
||||
#define FLAG_LABEL_POINT 6
|
||||
#define FLAG_SEQ 5
|
||||
#define FLAG_INDEX 4
|
||||
#define FLAG_EXTENT 3
|
||||
#define FLAG_ID 2
|
||||
@@ -197,21 +186,18 @@ std::string serialize_feature(serial_feature *sf, long long wx, long long wy) {
|
||||
long long layer = 0;
|
||||
layer |= sf->layer << FLAG_LAYER;
|
||||
layer |= (sf->label_point != 0) << FLAG_LABEL_POINT;
|
||||
layer |= (sf->seq != 0) << FLAG_SEQ;
|
||||
layer |= (sf->index != 0) << FLAG_INDEX;
|
||||
layer |= (sf->extent != 0) << FLAG_EXTENT;
|
||||
layer |= sf->has_id << FLAG_ID;
|
||||
layer |= sf->has_tippecanoe_minzoom << FLAG_MINZOOM;
|
||||
layer |= sf->has_tippecanoe_maxzoom << FLAG_MAXZOOM;
|
||||
layer |= (sf->tippecanoe_minzoom != -1) << FLAG_MINZOOM;
|
||||
layer |= (sf->tippecanoe_maxzoom != -1) << FLAG_MAXZOOM;
|
||||
|
||||
serialize_long_long(s, layer);
|
||||
if (sf->seq != 0) {
|
||||
serialize_long_long(s, sf->seq);
|
||||
}
|
||||
if (sf->has_tippecanoe_minzoom) {
|
||||
serialize_long_long(s, sf->seq);
|
||||
if (sf->tippecanoe_minzoom != -1) {
|
||||
serialize_int(s, sf->tippecanoe_minzoom);
|
||||
}
|
||||
if (sf->has_tippecanoe_maxzoom) {
|
||||
if (sf->tippecanoe_maxzoom != -1) {
|
||||
serialize_int(s, sf->tippecanoe_maxzoom);
|
||||
}
|
||||
if (sf->has_id) {
|
||||
@@ -244,17 +230,15 @@ std::string serialize_feature(serial_feature *sf, long long wx, long long wy) {
|
||||
return s;
|
||||
}
|
||||
|
||||
serial_feature deserialize_feature(std::string &geoms, unsigned z, unsigned tx, unsigned ty, unsigned *initial_x, unsigned *initial_y) {
|
||||
serial_feature deserialize_feature(std::string const &geoms, unsigned z, unsigned tx, unsigned ty, unsigned *initial_x, unsigned *initial_y) {
|
||||
serial_feature sf;
|
||||
char *cp = (char *) geoms.c_str();
|
||||
const char *cp = geoms.c_str();
|
||||
|
||||
deserialize_byte(&cp, &sf.t);
|
||||
deserialize_long_long(&cp, &sf.layer);
|
||||
|
||||
sf.seq = 0;
|
||||
if (sf.layer & (1 << FLAG_SEQ)) {
|
||||
deserialize_long_long(&cp, &sf.seq);
|
||||
}
|
||||
deserialize_long_long(&cp, &sf.seq);
|
||||
|
||||
sf.tippecanoe_minzoom = -1;
|
||||
sf.tippecanoe_maxzoom = -1;
|
||||
@@ -425,7 +409,7 @@ static void add_scaled_node(struct reader *r, serialization_state *sst, draw g)
|
||||
}
|
||||
|
||||
// called from frontends
|
||||
int serialize_feature(struct serialization_state *sst, serial_feature &sf) {
|
||||
int serialize_feature(struct serialization_state *sst, serial_feature &sf, std::string const &layername) {
|
||||
struct reader *r = &(*sst->readers)[sst->segment];
|
||||
|
||||
sf.bbox[0] = LLONG_MAX;
|
||||
@@ -683,10 +667,6 @@ int serialize_feature(struct serialization_state *sst, serial_feature &sf) {
|
||||
*(sst->area_sum) += extent;
|
||||
}
|
||||
|
||||
if (!prevent[P_INPUT_ORDER]) {
|
||||
sf.seq = 0;
|
||||
}
|
||||
|
||||
unsigned long long bbox_index;
|
||||
long long midx, midy;
|
||||
|
||||
@@ -729,17 +709,30 @@ int serialize_feature(struct serialization_state *sst, serial_feature &sf) {
|
||||
}
|
||||
}
|
||||
|
||||
if (additional[A_DROP_DENSEST_AS_NEEDED] || additional[A_COALESCE_DENSEST_AS_NEEDED] || additional[A_CLUSTER_DENSEST_AS_NEEDED] || additional[A_CALCULATE_FEATURE_DENSITY] || additional[A_DROP_SMALLEST_AS_NEEDED] || additional[A_COALESCE_SMALLEST_AS_NEEDED] || additional[A_INCREASE_GAMMA_AS_NEEDED] || additional[A_GENERATE_POLYGON_LABEL_POINTS] || sst->uses_gamma || cluster_distance != 0) {
|
||||
if (additional[A_DROP_DENSEST_AS_NEEDED] ||
|
||||
additional[A_COALESCE_DENSEST_AS_NEEDED] ||
|
||||
additional[A_CLUSTER_DENSEST_AS_NEEDED] ||
|
||||
additional[A_CALCULATE_FEATURE_DENSITY] ||
|
||||
additional[A_DROP_SMALLEST_AS_NEEDED] ||
|
||||
additional[A_COALESCE_SMALLEST_AS_NEEDED] ||
|
||||
additional[A_DROP_FRACTION_AS_NEEDED] ||
|
||||
additional[A_COALESCE_FRACTION_AS_NEEDED] ||
|
||||
prevent[P_DYNAMIC_DROP] ||
|
||||
additional[A_INCREASE_GAMMA_AS_NEEDED] ||
|
||||
additional[A_GENERATE_POLYGON_LABEL_POINTS] ||
|
||||
sst->uses_gamma ||
|
||||
retain_points_multiplier > 1 ||
|
||||
cluster_distance != 0) {
|
||||
sf.index = bbox_index;
|
||||
} else {
|
||||
sf.index = 0;
|
||||
}
|
||||
|
||||
if (sst->layermap->count(sf.layername) == 0) {
|
||||
sst->layermap->insert(std::pair<std::string, layermap_entry>(sf.layername, layermap_entry(sst->layermap->size())));
|
||||
if (sst->layermap->count(layername) == 0) {
|
||||
sst->layermap->emplace(layername, layermap_entry(sst->layermap->size()));
|
||||
}
|
||||
|
||||
auto ai = sst->layermap->find(sf.layername);
|
||||
auto ai = sst->layermap->find(layername);
|
||||
if (ai != sst->layermap->end()) {
|
||||
sf.layer = ai->second.id;
|
||||
|
||||
@@ -753,7 +746,7 @@ int serialize_feature(struct serialization_state *sst, serial_feature &sf) {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
fprintf(stderr, "Internal error: can't find layer name %s\n", sf.layername.c_str());
|
||||
fprintf(stderr, "Internal error: can't find layer name %s\n", layername.c_str());
|
||||
exit(EXIT_IMPOSSIBLE);
|
||||
}
|
||||
|
||||
@@ -837,18 +830,14 @@ int serialize_feature(struct serialization_state *sst, serial_feature &sf) {
|
||||
|
||||
if (!sst->filters) {
|
||||
for (size_t i = 0; i < sf.full_keys.size(); i++) {
|
||||
type_and_string attrib;
|
||||
attrib.type = sf.full_values[i].type;
|
||||
attrib.string = sf.full_values[i].s;
|
||||
|
||||
auto fk = sst->layermap->find(sf.layername);
|
||||
add_to_file_keys(fk->second.file_keys, sf.full_keys[i], attrib);
|
||||
auto ts = sst->layermap->find(layername);
|
||||
add_to_tilestats(ts->second.tilestats, sf.full_keys[i], sf.full_values[i]);
|
||||
}
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < sf.full_keys.size(); i++) {
|
||||
sf.keys.push_back(addpool(r->poolfile, r->treefile, sf.full_keys[i].c_str(), mvt_string));
|
||||
sf.values.push_back(addpool(r->poolfile, r->treefile, sf.full_values[i].s.c_str(), sf.full_values[i].type));
|
||||
sf.keys.push_back(addpool(r->poolfile, r->treefile, sf.full_keys[i].c_str(), mvt_string, r->key_dedup));
|
||||
sf.values.push_back(addpool(r->poolfile, r->treefile, sf.full_values[i].s.c_str(), sf.full_values[i].type, r->value_dedup));
|
||||
}
|
||||
|
||||
long long geomstart = r->geompos;
|
||||
@@ -892,7 +881,7 @@ int serialize_feature(struct serialization_state *sst, serial_feature &sf) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
void coerce_value(std::string const &key, int &vt, std::string &val, std::map<std::string, int> const *attribute_types) {
|
||||
void coerce_value(std::string const &key, int &vt, std::string &val, std::unordered_map<std::string, int> const *attribute_types) {
|
||||
auto a = (*attribute_types).find(key);
|
||||
if (a != attribute_types->end()) {
|
||||
if (a->second == mvt_string) {
|
||||
|
||||
+74
-24
@@ -25,15 +25,30 @@ void serialize_ulong_long(std::string &out, unsigned long long n);
|
||||
void serialize_byte(std::string &out, signed char n);
|
||||
void serialize_uint(std::string &out, unsigned n);
|
||||
|
||||
void deserialize_int(char **f, int *n);
|
||||
void deserialize_long_long(char **f, long long *n);
|
||||
void deserialize_ulong_long(char **f, unsigned long long *n);
|
||||
void deserialize_uint(char **f, unsigned *n);
|
||||
void deserialize_byte(char **f, signed char *n);
|
||||
void deserialize_int(const char **f, int *n);
|
||||
void deserialize_long_long(const char **f, long long *n);
|
||||
void deserialize_ulong_long(const char **f, unsigned long long *n);
|
||||
void deserialize_uint(const char **f, unsigned *n);
|
||||
void deserialize_byte(const char **f, signed char *n);
|
||||
|
||||
// This is the main representation of attribute values in memory and
|
||||
// in the string pool. The type is one of the mvt_value type (mvt_string,
|
||||
// mvt_double, mvt_bool, or mvt_null). Note that all numeric values,
|
||||
// whether integer or floating point, use mvt_double here.
|
||||
struct serial_val {
|
||||
int type = 0;
|
||||
std::string s = "";
|
||||
int type;
|
||||
std::string s;
|
||||
|
||||
bool operator<(const serial_val &o) const;
|
||||
bool operator!=(const serial_val &o) const;
|
||||
|
||||
serial_val() {
|
||||
type = 0;
|
||||
}
|
||||
|
||||
serial_val(int t, const std::string &val)
|
||||
: type(t), s(val) {
|
||||
}
|
||||
};
|
||||
|
||||
struct serial_feature {
|
||||
@@ -47,31 +62,65 @@ struct serial_feature {
|
||||
bool has_id = false;
|
||||
unsigned long long id = 0;
|
||||
|
||||
bool has_tippecanoe_minzoom = false;
|
||||
int tippecanoe_minzoom = 0;
|
||||
|
||||
bool has_tippecanoe_maxzoom = false;
|
||||
int tippecanoe_maxzoom = 0;
|
||||
int tippecanoe_minzoom = -1;
|
||||
int tippecanoe_maxzoom = -1;
|
||||
|
||||
drawvec geometry = drawvec();
|
||||
unsigned long long index = 0;
|
||||
unsigned long long label_point = 0;
|
||||
long long extent = 0;
|
||||
|
||||
// These fields are not directly serialized, but are used
|
||||
// to create the keys and values references into the string pool
|
||||
// during initial serialization
|
||||
|
||||
std::vector<std::string> full_keys{};
|
||||
std::vector<serial_val> full_values{};
|
||||
|
||||
// These fields are generated from full_keys and full_values
|
||||
// during initial serialization and then replace the string
|
||||
// representations:
|
||||
|
||||
std::vector<long long> keys{};
|
||||
std::vector<long long> values{};
|
||||
|
||||
// XXX This isn't serialized. Should it be here?
|
||||
// These fields are used during tiling,
|
||||
// but are not serialized and are not expected
|
||||
// to be provided by frontends:
|
||||
|
||||
long long bbox[4] = {0, 0, 0, 0};
|
||||
std::vector<std::string> full_keys{};
|
||||
std::vector<serial_val> full_values{};
|
||||
std::string layername = "";
|
||||
bool dropped = false;
|
||||
drawvec edge_nodes;
|
||||
drawvec edge_nodes; // what nodes at the tile edge were added during clipping?
|
||||
|
||||
#define FEATURE_DROPPED -1
|
||||
#define FEATURE_KEPT 0
|
||||
// <0: dropped
|
||||
// 0: kept
|
||||
// >0: sequence number of additional feature kept by retain-points-multiplier
|
||||
int dropped = FEATURE_DROPPED; // was this feature dropped by rate?
|
||||
|
||||
// unsigned long long drop_by; // dot-dropping priority
|
||||
bool reduced; // is polygon dust
|
||||
bool coalesced; // was coalesced from multiple features
|
||||
int line_detail; // current tile resolution being used for simplification
|
||||
int extra_detail; // extra tile resolution to retain in output
|
||||
int maxzoom;
|
||||
double spacing; // feature spacing for --calculate-feature-density
|
||||
double simplification; // simplification level at this zoom level
|
||||
std::vector<ssize_t> arc_polygon; // used in --detect-shared-borders
|
||||
ssize_t renamed; // used in --detect-shared-borders logic
|
||||
long long clustered; // does this feature need the clustered/point_count attributes?
|
||||
const char *stringpool; // string pool for keys/values lookup
|
||||
std::shared_ptr<std::string> tile_stringpool; // string pool for mvt_value construction
|
||||
std::set<std::string> need_tilestats;
|
||||
std::unordered_map<std::string, accum_state> attribute_accum_state;
|
||||
|
||||
int z; // tile being produced
|
||||
int tx;
|
||||
int ty;
|
||||
};
|
||||
|
||||
std::string serialize_feature(serial_feature *sf, long long wx, long long wy);
|
||||
serial_feature deserialize_feature(std::string &geoms, unsigned z, unsigned tx, unsigned ty, unsigned *initial_x, unsigned *initial_y);
|
||||
serial_feature deserialize_feature(std::string const &geoms, unsigned z, unsigned tx, unsigned ty, unsigned *initial_x, unsigned *initial_y);
|
||||
|
||||
struct reader {
|
||||
int poolfd = -1;
|
||||
@@ -94,14 +143,15 @@ struct reader {
|
||||
std::atomic<long long> nodepos;
|
||||
|
||||
long long file_bbox[4] = {0, 0, 0, 0};
|
||||
|
||||
long long file_bbox1[4] = {0xFFFFFFFF, 0xFFFFFFFF, 0, 0}; // standard -180 to 180 world plane
|
||||
long long file_bbox2[4] = {0x1FFFFFFFF, 0xFFFFFFFF, 0x100000000, 0}; // 0 to 360 world plane
|
||||
|
||||
struct stat geomst {};
|
||||
|
||||
char *geom_map = NULL;
|
||||
|
||||
std::vector<ssize_t> key_dedup = std::vector<ssize_t>(655536, -1);
|
||||
std::vector<ssize_t> value_dedup = std::vector<ssize_t>(655536, -1);
|
||||
|
||||
reader()
|
||||
: geompos(0), indexpos(0), vertexpos(0), nodepos(0) {
|
||||
}
|
||||
@@ -168,7 +218,7 @@ struct serialization_state {
|
||||
|
||||
std::map<std::string, layermap_entry> *layermap = NULL;
|
||||
|
||||
std::map<std::string, int> const *attribute_types = NULL;
|
||||
std::unordered_map<std::string, int> const *attribute_types = NULL;
|
||||
std::set<std::string> *exclude = NULL;
|
||||
std::set<std::string> *include = NULL;
|
||||
int exclude_all = 0;
|
||||
@@ -220,7 +270,7 @@ struct node {
|
||||
|
||||
int nodecmp(const void *void1, const void *void2);
|
||||
|
||||
int serialize_feature(struct serialization_state *sst, serial_feature &sf);
|
||||
void coerce_value(std::string const &key, int &vt, std::string &val, std::map<std::string, int> const *attribute_types);
|
||||
int serialize_feature(struct serialization_state *sst, serial_feature &sf, std::string const &layername);
|
||||
void coerce_value(std::string const &key, int &vt, std::string &val, std::unordered_map<std::string, int> const *attribute_types);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,575 @@
|
||||
#include <stdio.h>
|
||||
#include <algorithm>
|
||||
#include "geometry.hpp"
|
||||
#include "serial.hpp"
|
||||
#include "options.hpp"
|
||||
|
||||
// This should all be removed and replaced with --no-simplification-of-shared-nodes
|
||||
|
||||
// Does not fix up moveto/lineto
|
||||
static drawvec reverse_subring(drawvec const &dv) {
|
||||
drawvec out;
|
||||
|
||||
for (size_t i = dv.size(); i > 0; i--) {
|
||||
out.push_back(dv[i - 1]);
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
struct edge {
|
||||
unsigned x1 = 0;
|
||||
unsigned y1 = 0;
|
||||
unsigned x2 = 0;
|
||||
unsigned y2 = 0;
|
||||
unsigned ring = 0;
|
||||
|
||||
edge(unsigned _x1, unsigned _y1, unsigned _x2, unsigned _y2, unsigned _ring) {
|
||||
x1 = _x1;
|
||||
y1 = _y1;
|
||||
x2 = _x2;
|
||||
y2 = _y2;
|
||||
ring = _ring;
|
||||
}
|
||||
|
||||
bool operator<(const edge &s) const {
|
||||
long long cmp = (long long) y1 - s.y1;
|
||||
if (cmp == 0) {
|
||||
cmp = (long long) x1 - s.x1;
|
||||
}
|
||||
if (cmp == 0) {
|
||||
cmp = (long long) y2 - s.y2;
|
||||
}
|
||||
if (cmp == 0) {
|
||||
cmp = (long long) x2 - s.x2;
|
||||
}
|
||||
return cmp < 0;
|
||||
}
|
||||
};
|
||||
|
||||
struct edgecmp_ring {
|
||||
bool operator()(const edge &a, const edge &b) {
|
||||
long long cmp = (long long) a.y1 - b.y1;
|
||||
if (cmp == 0) {
|
||||
cmp = (long long) a.x1 - b.x1;
|
||||
}
|
||||
if (cmp == 0) {
|
||||
cmp = (long long) a.y2 - b.y2;
|
||||
}
|
||||
if (cmp == 0) {
|
||||
cmp = (long long) a.x2 - b.x2;
|
||||
}
|
||||
if (cmp == 0) {
|
||||
cmp = (long long) a.ring - b.ring;
|
||||
}
|
||||
return cmp < 0;
|
||||
}
|
||||
} edgecmp_ring;
|
||||
|
||||
bool edges_same(std::pair<std::vector<edge>::iterator, std::vector<edge>::iterator> e1, std::pair<std::vector<edge>::iterator, std::vector<edge>::iterator> e2) {
|
||||
if ((e2.second - e2.first) != (e1.second - e1.first)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
while (e1.first != e1.second) {
|
||||
if (e1.first->ring != e2.first->ring) {
|
||||
return false;
|
||||
}
|
||||
|
||||
++e1.first;
|
||||
++e2.first;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool find_common_edges(std::vector<serial_feature> &features, int z, int line_detail, double simplification, int maxzoom, double merge_fraction) {
|
||||
size_t merge_count = ceil((1 - merge_fraction) * features.size());
|
||||
|
||||
for (size_t i = 0; i < features.size(); i++) {
|
||||
if (features[i].t == VT_POLYGON) {
|
||||
{
|
||||
drawvec &g = features[i].geometry;
|
||||
drawvec out;
|
||||
|
||||
for (size_t k = 0; k < g.size(); k++) {
|
||||
if (g[k].op == VT_LINETO && k > 0 && g[k - 1] == g[k]) {
|
||||
;
|
||||
} else {
|
||||
out.push_back(g[k]);
|
||||
}
|
||||
}
|
||||
|
||||
features[i].geometry = out;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Construct a mapping from all polygon edges to the set of rings
|
||||
// that each edge appears in. (The ring number is across all polygons;
|
||||
// we don't need to look it back up, just to tell where it changes.)
|
||||
|
||||
std::vector<edge> edges;
|
||||
size_t ring = 0;
|
||||
for (size_t i = 0; i < features.size(); i++) {
|
||||
if (features[i].t == VT_POLYGON) {
|
||||
{
|
||||
for (size_t k = 0; k + 1 < features[i].geometry.size(); k++) {
|
||||
if (features[i].geometry[k].op == VT_MOVETO) {
|
||||
ring++;
|
||||
}
|
||||
|
||||
if (features[i].geometry[k + 1].op == VT_LINETO) {
|
||||
drawvec dv;
|
||||
if (features[i].geometry[k] < features[i].geometry[k + 1]) {
|
||||
dv.push_back(features[i].geometry[k]);
|
||||
dv.push_back(features[i].geometry[k + 1]);
|
||||
} else {
|
||||
dv.push_back(features[i].geometry[k + 1]);
|
||||
dv.push_back(features[i].geometry[k]);
|
||||
}
|
||||
|
||||
edges.push_back(edge(dv[0].x, dv[0].y, dv[1].x, dv[1].y, ring));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::sort(edges.begin(), edges.end(), edgecmp_ring);
|
||||
std::set<draw> necessaries;
|
||||
|
||||
// Now mark all the points where the set of rings using the edge on one side
|
||||
// is not the same as the set of rings using the edge on the other side.
|
||||
|
||||
for (size_t i = 0; i < features.size(); i++) {
|
||||
if (features[i].t == VT_POLYGON) {
|
||||
{
|
||||
drawvec &g = features[i].geometry;
|
||||
|
||||
for (size_t k = 0; k < g.size(); k++) {
|
||||
g[k].necessary = 0;
|
||||
}
|
||||
|
||||
for (size_t a = 0; a < g.size(); a++) {
|
||||
if (g[a].op == VT_MOVETO) {
|
||||
size_t b;
|
||||
|
||||
for (b = a + 1; b < g.size(); b++) {
|
||||
if (g[b].op != VT_LINETO) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// -1 because of duplication at the end
|
||||
size_t s = b - a - 1;
|
||||
|
||||
if (s > 0) {
|
||||
drawvec left;
|
||||
if (g[a + (s - 1) % s] < g[a]) {
|
||||
left.push_back(g[a + (s - 1) % s]);
|
||||
left.push_back(g[a]);
|
||||
} else {
|
||||
left.push_back(g[a]);
|
||||
left.push_back(g[a + (s - 1) % s]);
|
||||
}
|
||||
if (left[1] < left[0]) {
|
||||
fprintf(stderr, "left misordered\n");
|
||||
}
|
||||
std::pair<std::vector<edge>::iterator, std::vector<edge>::iterator> e1 = std::equal_range(edges.begin(), edges.end(), edge(left[0].x, left[0].y, left[1].x, left[1].y, 0));
|
||||
|
||||
for (size_t k = 0; k < s; k++) {
|
||||
drawvec right;
|
||||
|
||||
if (g[a + k] < g[a + k + 1]) {
|
||||
right.push_back(g[a + k]);
|
||||
right.push_back(g[a + k + 1]);
|
||||
} else {
|
||||
right.push_back(g[a + k + 1]);
|
||||
right.push_back(g[a + k]);
|
||||
}
|
||||
|
||||
std::pair<std::vector<edge>::iterator, std::vector<edge>::iterator> e2 = std::equal_range(edges.begin(), edges.end(), edge(right[0].x, right[0].y, right[1].x, right[1].y, 0));
|
||||
|
||||
if (right[1] < right[0]) {
|
||||
fprintf(stderr, "left misordered\n");
|
||||
}
|
||||
|
||||
if (e1.first == e1.second || e2.first == e2.second) {
|
||||
fprintf(stderr, "Internal error: polygon edge lookup failed for %lld,%lld to %lld,%lld or %lld,%lld to %lld,%lld\n", left[0].x, left[0].y, left[1].x, left[1].y, right[0].x, right[0].y, right[1].x, right[1].y);
|
||||
exit(EXIT_IMPOSSIBLE);
|
||||
}
|
||||
|
||||
if (!edges_same(e1, e2)) {
|
||||
g[a + k].necessary = 1;
|
||||
necessaries.insert(g[a + k]);
|
||||
}
|
||||
|
||||
e1 = e2;
|
||||
}
|
||||
}
|
||||
|
||||
a = b - 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
edges.clear();
|
||||
std::map<drawvec, size_t> arcs;
|
||||
std::multimap<ssize_t, size_t> merge_candidates; // from arc to serial_feature
|
||||
|
||||
// Roll rings that include a necessary point around so they start at one
|
||||
|
||||
for (size_t i = 0; i < features.size(); i++) {
|
||||
if (features[i].t == VT_POLYGON) {
|
||||
{
|
||||
drawvec &g = features[i].geometry;
|
||||
|
||||
for (size_t k = 0; k < g.size(); k++) {
|
||||
if (necessaries.count(g[k]) != 0) {
|
||||
g[k].necessary = 1;
|
||||
}
|
||||
}
|
||||
|
||||
for (size_t k = 0; k < g.size(); k++) {
|
||||
if (g[k].op == VT_MOVETO) {
|
||||
ssize_t necessary = -1;
|
||||
ssize_t lowest = k;
|
||||
size_t l;
|
||||
for (l = k + 1; l < g.size(); l++) {
|
||||
if (g[l].op != VT_LINETO) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (g[l].necessary) {
|
||||
necessary = l;
|
||||
}
|
||||
if (g[l] < g[lowest]) {
|
||||
lowest = l;
|
||||
}
|
||||
}
|
||||
|
||||
if (necessary < 0) {
|
||||
necessary = lowest;
|
||||
// Add a necessary marker if there was none in the ring,
|
||||
// so the arc code below can find it.
|
||||
g[lowest].necessary = 1;
|
||||
}
|
||||
|
||||
{
|
||||
drawvec tmp;
|
||||
|
||||
// l - 1 because the endpoint is duplicated
|
||||
for (size_t m = necessary; m < l - 1; m++) {
|
||||
tmp.push_back(g[m]);
|
||||
}
|
||||
for (ssize_t m = k; m < necessary; m++) {
|
||||
tmp.push_back(g[m]);
|
||||
}
|
||||
|
||||
// replace the endpoint
|
||||
tmp.push_back(g[necessary]);
|
||||
|
||||
if (tmp.size() != l - k) {
|
||||
fprintf(stderr, "internal error shifting ring\n");
|
||||
exit(EXIT_IMPOSSIBLE);
|
||||
}
|
||||
|
||||
for (size_t m = 0; m < tmp.size(); m++) {
|
||||
if (m == 0) {
|
||||
tmp[m].op = VT_MOVETO;
|
||||
} else {
|
||||
tmp[m].op = VT_LINETO;
|
||||
}
|
||||
|
||||
g[k + m] = tmp[m];
|
||||
}
|
||||
}
|
||||
|
||||
// Now peel off each set of segments from one necessary point to the next
|
||||
// into an "arc" as in TopoJSON
|
||||
|
||||
for (size_t m = k; m < l; m++) {
|
||||
if (!g[m].necessary) {
|
||||
fprintf(stderr, "internal error in arc building\n");
|
||||
exit(EXIT_IMPOSSIBLE);
|
||||
}
|
||||
|
||||
drawvec arc;
|
||||
size_t n;
|
||||
for (n = m; n < l; n++) {
|
||||
arc.push_back(g[n]);
|
||||
if (n > m && g[n].necessary) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
auto f = arcs.find(arc);
|
||||
if (f == arcs.end()) {
|
||||
drawvec arc2 = reverse_subring(arc);
|
||||
|
||||
auto f2 = arcs.find(arc2);
|
||||
if (f2 == arcs.end()) {
|
||||
// Add new arc
|
||||
size_t added = arcs.size() + 1;
|
||||
arcs.insert(std::pair<drawvec, size_t>(arc, added));
|
||||
features[i].arc_polygon.push_back(added);
|
||||
merge_candidates.insert(std::pair<ssize_t, size_t>(added, i));
|
||||
} else {
|
||||
features[i].arc_polygon.push_back(-(ssize_t) f2->second);
|
||||
merge_candidates.insert(std::pair<ssize_t, size_t>(-(ssize_t) f2->second, i));
|
||||
}
|
||||
} else {
|
||||
features[i].arc_polygon.push_back(f->second);
|
||||
merge_candidates.insert(std::pair<ssize_t, size_t>(f->second, i));
|
||||
}
|
||||
|
||||
m = n - 1;
|
||||
}
|
||||
|
||||
features[i].arc_polygon.push_back(0);
|
||||
|
||||
k = l - 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Simplify each arc
|
||||
|
||||
std::vector<drawvec> simplified_arcs;
|
||||
|
||||
for (auto ai = arcs.begin(); ai != arcs.end(); ++ai) {
|
||||
if (simplified_arcs.size() < ai->second + 1) {
|
||||
simplified_arcs.resize(ai->second + 1);
|
||||
}
|
||||
|
||||
drawvec dv = ai->first;
|
||||
for (size_t i = 0; i < dv.size(); i++) {
|
||||
if (i == 0) {
|
||||
dv[i].op = VT_MOVETO;
|
||||
} else {
|
||||
dv[i].op = VT_LINETO;
|
||||
}
|
||||
}
|
||||
if (!(prevent[P_SIMPLIFY] || (z == maxzoom && prevent[P_SIMPLIFY_LOW]) || (z < maxzoom && additional[A_GRID_LOW_ZOOMS]))) {
|
||||
// tx and ty are 0 here because we aren't trying to do anything with the shared_nodes_map
|
||||
simplified_arcs[ai->second] = simplify_lines(dv, z, 0, 0, line_detail, !(prevent[P_CLIPPING] || prevent[P_DUPLICATION]), simplification, 4, drawvec(), NULL, 0);
|
||||
} else {
|
||||
simplified_arcs[ai->second] = dv;
|
||||
}
|
||||
}
|
||||
|
||||
// If necessary, merge some adjacent polygons into some other polygons
|
||||
|
||||
struct merge_order {
|
||||
ssize_t edge = 0;
|
||||
unsigned long long gap = 0;
|
||||
size_t p1 = 0;
|
||||
size_t p2 = 0;
|
||||
|
||||
bool operator<(const merge_order &m) const {
|
||||
return gap < m.gap;
|
||||
}
|
||||
};
|
||||
std::vector<merge_order> order;
|
||||
|
||||
for (ssize_t i = 0; i < (ssize_t) simplified_arcs.size(); i++) {
|
||||
auto r1 = merge_candidates.equal_range(i);
|
||||
for (auto r1i = r1.first; r1i != r1.second; ++r1i) {
|
||||
auto r2 = merge_candidates.equal_range(-i);
|
||||
for (auto r2i = r2.first; r2i != r2.second; ++r2i) {
|
||||
if (r1i->second != r2i->second) {
|
||||
merge_order mo;
|
||||
mo.edge = i;
|
||||
if (features[r1i->second].index > features[r2i->second].index) {
|
||||
mo.gap = features[r1i->second].index - features[r2i->second].index;
|
||||
} else {
|
||||
mo.gap = features[r2i->second].index - features[r1i->second].index;
|
||||
}
|
||||
mo.p1 = r1i->second;
|
||||
mo.p2 = r2i->second;
|
||||
order.push_back(mo);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
std::sort(order.begin(), order.end());
|
||||
|
||||
size_t merged = 0;
|
||||
for (size_t o = 0; o < order.size(); o++) {
|
||||
if (merged >= merge_count) {
|
||||
break;
|
||||
}
|
||||
|
||||
size_t i = order[o].p1;
|
||||
while (features[i].renamed >= 0) {
|
||||
i = features[i].renamed;
|
||||
}
|
||||
size_t i2 = order[o].p2;
|
||||
while (features[i2].renamed >= 0) {
|
||||
i2 = features[i2].renamed;
|
||||
}
|
||||
|
||||
for (size_t j = 0; j < features[i].arc_polygon.size() && merged < merge_count; j++) {
|
||||
if (features[i].arc_polygon[j] == order[o].edge) {
|
||||
{
|
||||
// XXX snap links
|
||||
if (features[order[o].p2].arc_polygon.size() > 0) {
|
||||
// This has to merge the ring that contains the anti-arc to this arc
|
||||
// into the current ring, and then add whatever other rings were in
|
||||
// that feature on to the end.
|
||||
//
|
||||
// This can't be good for keeping parent-child relationships among
|
||||
// the rings in order, but Wagyu should sort that out later
|
||||
|
||||
std::vector<ssize_t> additions;
|
||||
std::vector<ssize_t> &here = features[i].arc_polygon;
|
||||
std::vector<ssize_t> &other = features[i2].arc_polygon;
|
||||
|
||||
#if 0
|
||||
printf("seeking %zd\n", features[i].arc_polygon[j]);
|
||||
printf("before: ");
|
||||
for (size_t k = 0; k < here.size(); k++) {
|
||||
printf("%zd ", here[k]);
|
||||
}
|
||||
printf("\n");
|
||||
printf("other: ");
|
||||
for (size_t k = 0; k < other.size(); k++) {
|
||||
printf("%zd ", other[k]);
|
||||
}
|
||||
printf("\n");
|
||||
#endif
|
||||
|
||||
for (size_t k = 0; k < other.size(); k++) {
|
||||
size_t l;
|
||||
for (l = k; l < other.size(); l++) {
|
||||
if (other[l] == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (l >= other.size()) {
|
||||
l--;
|
||||
}
|
||||
|
||||
#if 0
|
||||
for (size_t m = k; m <= l; m++) {
|
||||
printf("%zd ", other[m]);
|
||||
}
|
||||
printf("\n");
|
||||
#endif
|
||||
|
||||
size_t m;
|
||||
for (m = k; m <= l; m++) {
|
||||
if (other[m] == -features[i].arc_polygon[j]) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (m <= l) {
|
||||
// Found the shared arc
|
||||
|
||||
here.erase(here.begin() + j);
|
||||
|
||||
size_t off = 0;
|
||||
for (size_t n = m + 1; n < l; n++) {
|
||||
here.insert(here.begin() + j + off, other[n]);
|
||||
off++;
|
||||
}
|
||||
for (size_t n = k; n < m; n++) {
|
||||
here.insert(here.begin() + j + off, other[n]);
|
||||
off++;
|
||||
}
|
||||
} else {
|
||||
// Looking at some other ring
|
||||
|
||||
for (size_t n = k; n <= l; n++) {
|
||||
additions.push_back(other[n]);
|
||||
}
|
||||
}
|
||||
|
||||
k = l;
|
||||
}
|
||||
|
||||
features[i2].arc_polygon.clear();
|
||||
features[i2].renamed = i;
|
||||
merged++;
|
||||
|
||||
for (size_t k = 0; k < additions.size(); k++) {
|
||||
features[i].arc_polygon.push_back(additions[k]);
|
||||
}
|
||||
|
||||
#if 0
|
||||
printf("after: ");
|
||||
for (size_t k = 0; k < here.size(); k++) {
|
||||
printf("%zd ", here[k]);
|
||||
}
|
||||
printf("\n");
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
for (size_t k = 0; k + 1 < here.size(); k++) {
|
||||
if (here[k] != 0 && here[k + 1] != 0) {
|
||||
if (simplified_arcs[here[k + 1]][0] != simplified_arcs[here[k]][simplified_arcs[here[k]].size() - 1]) {
|
||||
printf("error from %zd to %zd\n", here[k], here[k + 1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Turn the arc representations of the polygons back into standard polygon geometries
|
||||
|
||||
for (size_t i = 0; i < features.size(); i++) {
|
||||
if (features[i].t == VT_POLYGON) {
|
||||
features[i].geometry.clear();
|
||||
bool at_start = true;
|
||||
draw first(-1, 0, 0);
|
||||
|
||||
for (size_t j = 0; j < features[i].arc_polygon.size(); j++) {
|
||||
ssize_t p = features[i].arc_polygon[j];
|
||||
|
||||
if (p == 0) {
|
||||
if (first.op >= 0) {
|
||||
features[i].geometry.push_back(first);
|
||||
first = draw(-1, 0, 0);
|
||||
}
|
||||
at_start = true;
|
||||
} else if (p > 0) {
|
||||
for (size_t k = 0; k + 1 < simplified_arcs[p].size(); k++) {
|
||||
if (at_start) {
|
||||
features[i].geometry.push_back(draw(VT_MOVETO, simplified_arcs[p][k].x, simplified_arcs[p][k].y));
|
||||
first = draw(VT_LINETO, simplified_arcs[p][k].x, simplified_arcs[p][k].y);
|
||||
} else {
|
||||
features[i].geometry.push_back(draw(VT_LINETO, simplified_arcs[p][k].x, simplified_arcs[p][k].y));
|
||||
}
|
||||
at_start = 0;
|
||||
}
|
||||
} else { /* p < 0 */
|
||||
for (ssize_t k = simplified_arcs[-p].size() - 1; k > 0; k--) {
|
||||
if (at_start) {
|
||||
features[i].geometry.push_back(draw(VT_MOVETO, simplified_arcs[-p][k].x, simplified_arcs[-p][k].y));
|
||||
first = draw(VT_LINETO, simplified_arcs[-p][k].x, simplified_arcs[-p][k].y);
|
||||
} else {
|
||||
features[i].geometry.push_back(draw(VT_LINETO, simplified_arcs[-p][k].x, simplified_arcs[-p][k].y));
|
||||
}
|
||||
at_start = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (merged >= merge_count) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
bool find_common_edges(std::vector<serial_feature> &features, int z, int line_detail, double simplification, int maxzoom, double merge_fraction);
|
||||
+1
@@ -10,6 +10,7 @@
|
||||
"minzoom": "0",
|
||||
"name": "tests/accumulate/out/-z3_-Ethesum%3asum_-Etheproduct%3aproduct_-Ethemax%3amax_-Ethemin%3amin_-Ethemean%3amean_-Etheconcat%3aconcat_-Ethecomma%3acomma_-r1_-K100.json.check.mbtiles",
|
||||
"strategies": "[{\"coalesced_as_needed\":78},{\"coalesced_as_needed\":65},{\"coalesced_as_needed\":43},{\"coalesced_as_needed\":17}]",
|
||||
"tippecanoe_decisions": "{\"basezoom\":3,\"droprate\":1,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
"maxzoom": "0",
|
||||
"minzoom": "0",
|
||||
"name": "tests/layer-json/out.mbtiles",
|
||||
"tippecanoe_decisions": "{\"basezoom\":0,\"droprate\":1,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
@@ -9,389 +9,13 @@
|
||||
"maxzoom": "0",
|
||||
"minzoom": "0",
|
||||
"name": "tests/loop/out/-z0_-O200_--drop-fraction-as-needed.json.check.mbtiles",
|
||||
"strategies": "[{\"dropped_as_needed\":811,\"feature_count_desired\":1000}]",
|
||||
"strategies": "[{\"dropped_as_needed\":999,\"feature_count_desired\":1000}]",
|
||||
"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, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 0.966797, 0.966751 ] } }
|
||||
] }
|
||||
] }
|
||||
] }
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
[
|
||||
{ "zoom": 11, "x": 326, "y": 791, "bytes": 376, "compressed": true, "layers": { "muni": { "points": 14, "lines": 0, "polygons": 0, "extent": 4096 } } }
|
||||
,
|
||||
{ "zoom": 11, "x": 327, "y": 792, "bytes": 6533, "compressed": true, "layers": { "muni": { "points": 528, "lines": 0, "polygons": 0, "extent": 4096 } } }
|
||||
{ "zoom": 11, "x": 327, "y": 792, "bytes": 6543, "compressed": true, "layers": { "muni": { "points": 528, "lines": 0, "polygons": 0, "extent": 4096 } } }
|
||||
,
|
||||
{ "zoom": 11, "x": 327, "y": 791, "bytes": 45265, "compressed": true, "layers": { "muni": { "points": 4284, "lines": 0, "polygons": 0, "extent": 4096 }, "subway": { "points": 19, "lines": 0, "polygons": 0, "extent": 4096 } } }
|
||||
{ "zoom": 11, "x": 327, "y": 791, "bytes": 45475, "compressed": true, "layers": { "muni": { "points": 4284, "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 } } }
|
||||
]
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
"minzoom": "11",
|
||||
"name": "tests/muni/out/-Z11_-z13_-B15.json.check.mbtiles",
|
||||
"strategies": "[{},{},{},{},{},{},{},{},{},{},{},{\"dropped_by_rate\":4727},{\"dropped_by_rate\":4643},{\"dropped_by_rate\":4210}]",
|
||||
"tippecanoe_decisions": "{\"basezoom\":15,\"droprate\":2.5,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
"minzoom": "11",
|
||||
"name": "tests/muni/out/-Z11_-z13_-Bf2000.json.check.mbtiles",
|
||||
"strategies": "[{},{},{},{},{},{},{},{},{},{},{},{\"dropped_by_rate\":2910},{},{}]",
|
||||
"tippecanoe_decisions": "{\"basezoom\":12,\"droprate\":2.5,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
"maxzoom": "13",
|
||||
"minzoom": "11",
|
||||
"name": "tests/muni/out/-Z11_-z13_-M10000.json.check.mbtiles",
|
||||
"strategies": "[{},{},{},{},{},{},{},{},{},{},{},{\"dropped_by_rate\":18540,\"detail_reduced\":4,\"tile_size_desired\":10857},{\"dropped_by_rate\":6391,\"detail_reduced\":3,\"tile_size_desired\":10700},{}]",
|
||||
"strategies": "[{},{},{},{},{},{},{},{},{},{},{},{\"dropped_by_rate\":18540,\"detail_reduced\":4,\"tile_size_desired\":10887},{\"dropped_by_rate\":6391,\"detail_reduced\":3,\"tile_size_desired\":10721},{}]",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
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
@@ -9,7 +9,7 @@
|
||||
"maxzoom": "13",
|
||||
"minzoom": "11",
|
||||
"name": "tests/muni/out/-Z11_-z13_-M5000_-as.json.check.mbtiles",
|
||||
"strategies": "[{},{},{},{},{},{},{},{},{},{},{},{\"dropped_by_rate\":4080,\"dropped_as_needed\":482,\"tile_size_desired\":10857},{\"dropped_by_rate\":2974,\"dropped_as_needed\":1304,\"tile_size_desired\":10700},{\"dropped_as_needed\":3036,\"tile_size_desired\":9646}]",
|
||||
"strategies": "[{},{},{},{},{},{},{},{},{},{},{},{\"dropped_by_rate\":4080,\"dropped_as_needed\":482,\"tile_size_desired\":10887},{\"dropped_by_rate\":2974,\"dropped_as_needed\":1302,\"tile_size_desired\":10721},{\"dropped_as_needed\":3042,\"tile_size_desired\":9664}]",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
@@ -645,6 +645,8 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Gonzalez Dr. & Crespi Dr." }, "geometry": { "type": "Point", "coordinates": [ -122.475564, 37.719694 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Garfield St & Beverly St" }, "geometry": { "type": "Point", "coordinates": [ -122.471530, 37.719728 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Garfield St & Byxbee St" }, "geometry": { "type": "Point", "coordinates": [ -122.469728, 37.719745 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Garfield St & Victoria St" }, "geometry": { "type": "Point", "coordinates": [ -122.465436, 37.719609 ] } }
|
||||
@@ -993,6 +995,8 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Irving St & 2nd Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.458634, 37.764439 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Frederick St & Willard St" }, "geometry": { "type": "Point", "coordinates": [ -122.454686, 37.766084 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Lawton St & 7th Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.464085, 37.758603 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "1697 7th Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.463570, 37.756771 ] } }
|
||||
@@ -1005,7 +1009,7 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Geary Blvd & Collins St" }, "geometry": { "type": "Point", "coordinates": [ -122.449987, 37.782231 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Euclid Ave & Presidio Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.446640, 37.785232 ] } }
|
||||
{ "type": "Feature", "properties": { "name": "Presidio Ave & California St" }, "geometry": { "type": "Point", "coordinates": [ -122.446725, 37.787369 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Sutter St & Baker St" }, "geometry": { "type": "Point", "coordinates": [ -122.443292, 37.784758 ] } }
|
||||
,
|
||||
@@ -2569,8 +2573,6 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Clement St & 20th Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.479845, 37.782307 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Clement St & 20th Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.479137, 37.782222 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Geary Blvd & 20th Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.479481, 37.780221 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Clement St & 18th Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.477506, 37.782290 ] } }
|
||||
@@ -2815,7 +2817,7 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Broad St & Arch St" }, "geometry": { "type": "Point", "coordinates": [ -122.467378, 37.712514 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Alemany Blvd & St Charles Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.469460, 37.710358 ] } }
|
||||
{ "type": "Feature", "properties": { "name": "St Charles Ave & Alemany Blvd" }, "geometry": { "type": "Point", "coordinates": [ -122.469331, 37.710281 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Randolph St & Arch St" }, "geometry": { "type": "Point", "coordinates": [ -122.467217, 37.714203 ] } }
|
||||
,
|
||||
@@ -3017,7 +3019,7 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Ulloa St & Lenox Way" }, "geometry": { "type": "Point", "coordinates": [ -122.466263, 37.741170 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "West Portal Station Inbound" }, "geometry": { "type": "Point", "coordinates": [ -122.465522, 37.741153 ] } }
|
||||
{ "type": "Feature", "properties": { "name": "West Portal Ave & Ulloa St" }, "geometry": { "type": "Point", "coordinates": [ -122.465909, 37.740763 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "West Portal Ave & 14th Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.469052, 37.738099 ] } }
|
||||
,
|
||||
@@ -3071,7 +3073,7 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "MYRA WAY & DALEWOOD" }, "geometry": { "type": "Point", "coordinates": [ -122.453946, 37.736690 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "19th Ave & Sloat Blvd" }, "geometry": { "type": "Point", "coordinates": [ -122.474974, 37.734713 ] } }
|
||||
{ "type": "Feature", "properties": { "name": "Sloat Blvd & 19th Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.474492, 37.734781 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "19th Ave & Ocean Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.475103, 37.732787 ] } }
|
||||
,
|
||||
@@ -3135,8 +3137,6 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Plymouth Ave & Mangels Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.457765, 37.732236 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Plymouth Ave & Mangels Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.457647, 37.732092 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Monterey Blvd & Faxon Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.459085, 37.730691 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Plymouth Ave & Monterey Blvd" }, "geometry": { "type": "Point", "coordinates": [ -122.457529, 37.731107 ] } }
|
||||
@@ -3501,8 +3501,6 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Clement St & 10th Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.468998, 37.782799 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Clement St & 10th Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.468365, 37.782697 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Geary Blvd & 9th Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.467647, 37.780984 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Clement St & 8th Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.466874, 37.782901 ] } }
|
||||
@@ -3559,7 +3557,7 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Euclid Ave & Jordan Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.456961, 37.783859 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "California St & Cherry St" }, "geometry": { "type": "Point", "coordinates": [ -122.456328, 37.785970 ] } }
|
||||
{ "type": "Feature", "properties": { "name": "California St & Maple St" }, "geometry": { "type": "Point", "coordinates": [ -122.455212, 37.786250 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Euclid Ave & Parker Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.454751, 37.783961 ] } }
|
||||
,
|
||||
@@ -3985,7 +3983,7 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Ortega St & 10th Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.466477, 37.752886 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "9th Ave & Ortega St" }, "geometry": { "type": "Point", "coordinates": [ -122.465630, 37.752937 ] } }
|
||||
{ "type": "Feature", "properties": { "name": "Ortega St & 9th Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.465630, 37.752776 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Clarendon Ave & Galewood Circle" }, "geometry": { "type": "Point", "coordinates": [ -122.455856, 37.753073 ] } }
|
||||
,
|
||||
@@ -4003,8 +4001,6 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Fillmore St & Grove St" }, "geometry": { "type": "Point", "coordinates": [ -122.431372, 37.776999 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Hayes St & Fillmore St" }, "geometry": { "type": "Point", "coordinates": [ -122.430836, 37.775803 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Fillmore St & Oak St" }, "geometry": { "type": "Point", "coordinates": [ -122.430825, 37.774268 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "14th St & Sanchez St" }, "geometry": { "type": "Point", "coordinates": [ -122.431276, 37.767534 ] } }
|
||||
@@ -4127,7 +4123,7 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Fillmore St & Chestnut St" }, "geometry": { "type": "Point", "coordinates": [ -122.436469, 37.800892 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Fillmore St & Lombard St" }, "geometry": { "type": "Point", "coordinates": [ -122.435954, 37.799705 ] } }
|
||||
{ "type": "Feature", "properties": { "name": "Fillmore St & Lombard St" }, "geometry": { "type": "Point", "coordinates": [ -122.436050, 37.799595 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Steiner St & Union St" }, "geometry": { "type": "Point", "coordinates": [ -122.437059, 37.796789 ] } }
|
||||
,
|
||||
@@ -4249,7 +4245,7 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Sunnydale Ave & Santos St" }, "geometry": { "type": "Point", "coordinates": [ -122.417532, 37.712233 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Visitacion Ave & Hahn St" }, "geometry": { "type": "Point", "coordinates": [ -122.415183, 37.713532 ] } }
|
||||
{ "type": "Feature", "properties": { "name": "Hahn St & Visitacion Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.415226, 37.713396 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Hahn St & Sunnydale Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.416052, 37.712021 ] } }
|
||||
,
|
||||
@@ -4497,7 +4493,7 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Bernal Heights Blvd & Powhattan St" }, "geometry": { "type": "Point", "coordinates": [ -122.411224, 37.741450 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Bernal Heights Blvd & Powhattan Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.410666, 37.741510 ] } }
|
||||
{ "type": "Feature", "properties": { "name": "Bernal Heights Blvd & Bradford St" }, "geometry": { "type": "Point", "coordinates": [ -122.409775, 37.741832 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Cortland Ave & Ellsworth St" }, "geometry": { "type": "Point", "coordinates": [ -122.414614, 37.738829 ] } }
|
||||
,
|
||||
@@ -4579,7 +4575,7 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Crescent Ave & Anderson St" }, "geometry": { "type": "Point", "coordinates": [ -122.415687, 37.734892 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "945 Ellsworth St" }, "geometry": { "type": "Point", "coordinates": [ -122.417758, 37.732813 ] } }
|
||||
{ "type": "Feature", "properties": { "name": "909 Ellsworth St" }, "geometry": { "type": "Point", "coordinates": [ -122.416792, 37.732838 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "831 Ellsworth St" }, "geometry": { "type": "Point", "coordinates": [ -122.415258, 37.733271 ] } }
|
||||
,
|
||||
@@ -4947,8 +4943,6 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Fillmore St & Grove St" }, "geometry": { "type": "Point", "coordinates": [ -122.431372, 37.776999 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Hayes St & Fillmore St" }, "geometry": { "type": "Point", "coordinates": [ -122.430836, 37.775803 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Hayes St & Webster St" }, "geometry": { "type": "Point", "coordinates": [ -122.429881, 37.776057 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Mcallister St & Laguna St" }, "geometry": { "type": "Point", "coordinates": [ -122.426952, 37.779187 ] } }
|
||||
@@ -5027,11 +5021,11 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Ellis St & Jones St" }, "geometry": { "type": "Point", "coordinates": [ -122.413155, 37.784876 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Eddy St & Jones St" }, "geometry": { "type": "Point", "coordinates": [ -122.412425, 37.783884 ] } }
|
||||
{ "type": "Feature", "properties": { "name": "Post St & Taylor St" }, "geometry": { "type": "Point", "coordinates": [ -122.411320, 37.787878 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Geary Blvd & Taylor St" }, "geometry": { "type": "Point", "coordinates": [ -122.411685, 37.786979 ] } }
|
||||
{ "type": "Feature", "properties": { "name": "Geary Blvd & Mason St" }, "geometry": { "type": "Point", "coordinates": [ -122.410280, 37.787174 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "O'Farrell St & Mason St" }, "geometry": { "type": "Point", "coordinates": [ -122.410655, 37.786038 ] } }
|
||||
{ "type": "Feature", "properties": { "name": "Ellis St & Taylor St" }, "geometry": { "type": "Point", "coordinates": [ -122.411449, 37.785088 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Eddy St & Taylor St" }, "geometry": { "type": "Point", "coordinates": [ -122.410784, 37.784105 ] } }
|
||||
,
|
||||
@@ -5091,7 +5085,7 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Hermann St & Fillmore St" }, "geometry": { "type": "Point", "coordinates": [ -122.429924, 37.770308 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Church St & Duboce Ave" }, "geometry": { "type": "Point", "coordinates": [ -122.429162, 37.769502 ] } }
|
||||
{ "type": "Feature", "properties": { "name": "Duboce Ave & Church St - Ramp" }, "geometry": { "type": "Point", "coordinates": [ -122.429130, 37.769460 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "14th St & Church St" }, "geometry": { "type": "Point", "coordinates": [ -122.429087, 37.767772 ] } }
|
||||
,
|
||||
@@ -5399,7 +5393,7 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "20th St & Rhode Island St" }, "geometry": { "type": "Point", "coordinates": [ -122.402233, 37.759621 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Southern Heights Ave & Rhode Island St" }, "geometry": { "type": "Point", "coordinates": [ -122.401772, 37.758391 ] } }
|
||||
{ "type": "Feature", "properties": { "name": "De Haro St & 19th St" }, "geometry": { "type": "Point", "coordinates": [ -122.401117, 37.760936 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "De Haro St & 20th St" }, "geometry": { "type": "Point", "coordinates": [ -122.401031, 37.759663 ] } }
|
||||
,
|
||||
@@ -5447,7 +5441,7 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Tennessee St & 18th St" }, "geometry": { "type": "Point", "coordinates": [ -122.389659, 37.762904 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "18th St & 3rd St" }, "geometry": { "type": "Point", "coordinates": [ -122.388929, 37.762988 ] } }
|
||||
{ "type": "Feature", "properties": { "name": "3rd St & Mariposa St" }, "geometry": { "type": "Point", "coordinates": [ -122.388843, 37.762971 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Connecticut St & 19th St" }, "geometry": { "type": "Point", "coordinates": [ -122.397469, 37.761326 ] } }
|
||||
,
|
||||
@@ -5533,7 +5527,7 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Jefferson St & Powell St" }, "geometry": { "type": "Point", "coordinates": [ -122.413359, 37.808597 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Beach St & Mason St" }, "geometry": { "type": "Point", "coordinates": [ -122.414120, 37.807411 ] } }
|
||||
{ "type": "Feature", "properties": { "name": "North Point St & Mason St" }, "geometry": { "type": "Point", "coordinates": [ -122.414238, 37.806563 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "North Point St & Mason St" }, "geometry": { "type": "Point", "coordinates": [ -122.413455, 37.806520 ] } }
|
||||
,
|
||||
@@ -5675,7 +5669,7 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Hyde St & Pine St" }, "geometry": { "type": "Point", "coordinates": [ -122.417296, 37.790167 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Bush St & Hyde St" }, "geometry": { "type": "Point", "coordinates": [ -122.416577, 37.789150 ] } }
|
||||
{ "type": "Feature", "properties": { "name": "Sutter St & Hyde St" }, "geometry": { "type": "Point", "coordinates": [ -122.416910, 37.788217 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Sutter St & Leavenworth St" }, "geometry": { "type": "Point", "coordinates": [ -122.415268, 37.788429 ] } }
|
||||
,
|
||||
@@ -5711,8 +5705,6 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Bay St & Midway St" }, "geometry": { "type": "Point", "coordinates": [ -122.409164, 37.806097 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Kearny St & North Point St" }, "geometry": { "type": "Point", "coordinates": [ -122.407211, 37.807182 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "The Embarcadero & Bay St" }, "geometry": { "type": "Point", "coordinates": [ -122.406278, 37.806944 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "The Embarcadero & Bay St" }, "geometry": { "type": "Point", "coordinates": [ -122.405430, 37.806614 ] } }
|
||||
@@ -5777,7 +5769,7 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Clay St & Kearny St" }, "geometry": { "type": "Point", "coordinates": [ -122.404411, 37.794474 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Powell St & California St" }, "geometry": { "type": "Point", "coordinates": [ -122.409292, 37.792210 ] } }
|
||||
{ "type": "Feature", "properties": { "name": "Powell St & California St" }, "geometry": { "type": "Point", "coordinates": [ -122.409142, 37.792304 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "California St & Stockton St" }, "geometry": { "type": "Point", "coordinates": [ -122.407554, 37.792312 ] } }
|
||||
,
|
||||
@@ -5815,7 +5807,7 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Bush St & Battery St" }, "geometry": { "type": "Point", "coordinates": [ -122.399765, 37.791312 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Market St & Sansome St" }, "geometry": { "type": "Point", "coordinates": [ -122.400409, 37.790159 ] } }
|
||||
{ "type": "Feature", "properties": { "name": "2nd St & Market St" }, "geometry": { "type": "Point", "coordinates": [ -122.401310, 37.789065 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "name": "Broadway & Davis St" }, "geometry": { "type": "Point", "coordinates": [ -122.398585, 37.798967 ] } }
|
||||
,
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
"minzoom": "11",
|
||||
"name": "tests/muni/out/-Z11_-z13_-rf2000.json.check.mbtiles",
|
||||
"strategies": "[{},{},{},{},{},{},{},{},{},{},{},{\"dropped_by_rate\":2542},{\"dropped_by_rate\":1547},{}]",
|
||||
"tippecanoe_decisions": "{\"basezoom\":13,\"droprate\":1.4510341140028376,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
"minzoom": "11",
|
||||
"name": "tests/muni/out/-Z11_-z13_-rf2000_-Bg.json.check.mbtiles",
|
||||
"strategies": "[{},{},{},{},{},{},{},{},{},{},{},{\"dropped_by_rate\":2546},{},{}]",
|
||||
"tippecanoe_decisions": "{\"basezoom\":12,\"droprate\":2.1055,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
"minzoom": "11",
|
||||
"name": "tests/muni/out/-Z11_-z13_-rf2000_-g2.json.check.mbtiles",
|
||||
"strategies": "[{},{},{},{},{},{},{},{},{},{},{},{\"dropped_by_rate\":1349,\"dropped_by_gamma\":963},{\"dropped_by_rate\":747,\"dropped_by_gamma\":752},{\"dropped_by_gamma\":514}]",
|
||||
"tippecanoe_decisions": "{\"basezoom\":13,\"droprate\":1.176222768016331,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
"minzoom": "0",
|
||||
"name": "tests/muni/out/-r1_-K20.json.check.mbtiles",
|
||||
"strategies": "[{\"coalesced_as_needed\":4608},{\"coalesced_as_needed\":4608},{\"coalesced_as_needed\":4608},{\"coalesced_as_needed\":4608},{\"coalesced_as_needed\":4608},{\"coalesced_as_needed\":4607},{\"coalesced_as_needed\":4607},{\"coalesced_as_needed\":4606},{\"coalesced_as_needed\":6005},{\"coalesced_as_needed\":5393},{\"coalesced_as_needed\":5012},{\"coalesced_as_needed\":4727},{\"coalesced_as_needed\":4577},{\"coalesced_as_needed\":4003},{\"coalesced_as_needed\":3005}]",
|
||||
"tippecanoe_decisions": "{\"basezoom\":14,\"droprate\":1,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
+33436
File diff suppressed because one or more lines are too long
+23842
File diff suppressed because one or more lines are too long
+34708
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
+308
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+599
-130
File diff suppressed because one or more lines are too long
@@ -9,7 +9,12 @@
|
||||
"maxzoom": "5",
|
||||
"minzoom": "0",
|
||||
"name": "tests/ne_110m_admin_0_countries/out/-ae_-zg_-M5000_--drop-smallest-as-needed.json.check.mbtiles",
|
||||
<<<<<<< HEAD
|
||||
"strategies": "[{\"tile_size_desired\":39166},{\"dropped_as_needed\":200,\"tile_size_desired\":25142},{\"dropped_as_needed\":187,\"tiny_polygons\":1,\"tile_size_desired\":21205},{\"dropped_as_needed\":154,\"tile_size_desired\":10768},{\"dropped_as_needed\":79,\"tile_size_desired\":6603},{\"tiny_polygons\":2}]",
|
||||
=======
|
||||
"strategies": "[{\"dropped_as_needed\":174,\"tile_size_desired\":39241},{\"dropped_as_needed\":200,\"tile_size_desired\":25163},{\"dropped_as_needed\":187,\"tiny_polygons\":1,\"tile_size_desired\":21214},{\"dropped_as_needed\":154,\"tile_size_desired\":10758},{\"dropped_as_needed\":79,\"tile_size_desired\":6601},{\"tiny_polygons\":2}]",
|
||||
"tippecanoe_decisions": "{\"basezoom\":0,\"droprate\":2.5,\"retain_points_multiplier\":1}",
|
||||
>>>>>>> origin/main
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -9,7 +9,11 @@
|
||||
"maxzoom": "5",
|
||||
"minzoom": "0",
|
||||
"name": "tests/ne_110m_admin_0_countries/out/-z5_-M5000_--coalesce-densest-as-needed.json.check.mbtiles",
|
||||
<<<<<<< HEAD
|
||||
"strategies": "[{\"coalesced_as_needed\":528,\"detail_reduced\":2,\"tiny_polygons\":2,\"tile_size_desired\":39186},{\"coalesced_as_needed\":212,\"tile_size_desired\":25143},{\"coalesced_as_needed\":190,\"tiny_polygons\":1,\"tile_size_desired\":21211},{\"coalesced_as_needed\":159,\"tile_size_desired\":10760},{\"coalesced_as_needed\":51,\"tile_size_desired\":6597},{\"tiny_polygons\":1}]",
|
||||
=======
|
||||
"strategies": "[{\"coalesced_as_needed\":528,\"detail_reduced\":2,\"tiny_polygons\":2,\"tile_size_desired\":39242},{\"coalesced_as_needed\":212,\"tile_size_desired\":25160},{\"coalesced_as_needed\":190,\"tiny_polygons\":1,\"tile_size_desired\":21223},{\"coalesced_as_needed\":159,\"tile_size_desired\":10749},{\"coalesced_as_needed\":51,\"tile_size_desired\":6591},{\"tiny_polygons\":1}]",
|
||||
>>>>>>> origin/main
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
+753
-85
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -9,7 +9,11 @@
|
||||
"maxzoom": "5",
|
||||
"minzoom": "0",
|
||||
"name": "tests/ne_110m_admin_0_countries/out/-z5_-M5000_--drop-smallest-as-needed.json.check.mbtiles",
|
||||
<<<<<<< HEAD
|
||||
"strategies": "[{\"dropped_as_needed\":174,\"tile_size_desired\":39186},{\"dropped_as_needed\":202,\"tile_size_desired\":25143},{\"dropped_as_needed\":190,\"tile_size_desired\":21211},{\"dropped_as_needed\":155,\"tile_size_desired\":10760},{\"dropped_as_needed\":78,\"tile_size_desired\":6597},{\"tiny_polygons\":1}]",
|
||||
=======
|
||||
"strategies": "[{\"dropped_as_needed\":174,\"tile_size_desired\":39242},{\"dropped_as_needed\":202,\"tile_size_desired\":25160},{\"dropped_as_needed\":190,\"tile_size_desired\":21223},{\"dropped_as_needed\":155,\"tile_size_desired\":10749},{\"dropped_as_needed\":78,\"tile_size_desired\":6591},{\"tiny_polygons\":1}]",
|
||||
>>>>>>> origin/main
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
+1
-1
@@ -9,7 +9,7 @@
|
||||
"maxzoom": "5",
|
||||
"minzoom": "0",
|
||||
"name": "tests/ne_110m_admin_1_states_provinces_lines/out/-z5_-M500_--drop-smallest-as-needed.json.check.mbtiles",
|
||||
"strategies": "[{\"dropped_as_needed\":92,\"tile_size_desired\":1377},{\"dropped_as_needed\":96,\"tile_size_desired\":1738},{\"dropped_as_needed\":115,\"tile_size_desired\":1303},{\"dropped_as_needed\":127,\"tile_size_desired\":1154},{\"dropped_as_needed\":105,\"tile_size_desired\":1228},{\"dropped_as_needed\":106,\"tile_size_desired\":1077}]",
|
||||
"strategies": "[{\"dropped_as_needed\":92,\"tile_size_desired\":1385},{\"dropped_as_needed\":96,\"tile_size_desired\":1739},{\"dropped_as_needed\":115,\"tile_size_desired\":1304},{\"dropped_as_needed\":127,\"tile_size_desired\":1154},{\"dropped_as_needed\":105,\"tile_size_desired\":1228},{\"dropped_as_needed\":106,\"tile_size_desired\":1077}]",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
+1
@@ -10,6 +10,7 @@
|
||||
"minzoom": "0",
|
||||
"name": "tests/ne_110m_populated_places/out/--smallest-maximum-zoom-guess_2_-Bf20_-rf20_-pb.json.check.mbtiles",
|
||||
"strategies": "[{\"dropped_by_rate\":237},{\"dropped_by_rate\":229},{}]",
|
||||
"tippecanoe_decisions": "{\"basezoom\":2,\"droprate\":6.599999999999999,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"maxzoom": "3",
|
||||
"minzoom": "0",
|
||||
"name": "tests/ne_110m_populated_places/out/--smallest-maximum-zoom-guess_3_-Bg.json.check.mbtiles",
|
||||
"tippecanoe_decisions": "{\"basezoom\":0,\"droprate\":2.5,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
"minzoom": "0",
|
||||
"name": "tests/ne_110m_populated_places/out/--smallest-maximum-zoom-guess_3_-rp.json.check.mbtiles",
|
||||
"strategies": "[{\"dropped_by_rate\":230},{\"dropped_by_rate\":231},{\"dropped_by_rate\":160},{}]",
|
||||
"tippecanoe_decisions": "{\"basezoom\":3,\"droprate\":2.6582825467008166,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
+1
@@ -9,6 +9,7 @@
|
||||
"maxzoom": "8",
|
||||
"minzoom": "0",
|
||||
"name": "tests/ne_110m_populated_places/out/-r1_-z8_-J_tests%2ffeature-filter%2fplaces-filter.json.check.mbtiles",
|
||||
"tippecanoe_decisions": "{\"basezoom\":8,\"droprate\":1,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
+1
-1
@@ -17,7 +17,7 @@
|
||||
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
|
||||
{ "type": "Feature", "properties": { "NAME": "Vancouver" }, "geometry": { "type": "Point", "coordinates": [ -123.134766, 49.267805 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Denver" }, "geometry": { "type": "Point", "coordinates": [ -104.941406, 39.707187 ] } }
|
||||
{ "type": "Feature", "properties": { "NAME": "San Francisco" }, "geometry": { "type": "Point", "coordinates": [ -122.431641, 37.788081 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Chicago" }, "geometry": { "type": "Point", "coordinates": [ -87.714844, 41.836828 ] } }
|
||||
,
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
"minzoom": "0",
|
||||
"name": "tests/ne_110m_populated_places/out/-yNAME_-z5_-B3.json.check.mbtiles",
|
||||
"strategies": "[{\"dropped_by_rate\":227},{\"dropped_by_rate\":227},{\"dropped_by_rate\":152},{},{},{}]",
|
||||
"tippecanoe_decisions": "{\"basezoom\":3,\"droprate\":2.5,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
"minzoom": "0",
|
||||
"name": "tests/ne_110m_populated_places/out/-yNAME_-z5_-r1.5.json.check.mbtiles",
|
||||
"strategies": "[{\"dropped_by_rate\":211},{\"dropped_by_rate\":214},{\"dropped_by_rate\":179},{\"dropped_by_rate\":138},{\"dropped_by_rate\":70},{}]",
|
||||
"tippecanoe_decisions": "{\"basezoom\":5,\"droprate\":1.5,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
+24
-27
@@ -9,7 +9,8 @@
|
||||
"maxzoom": "2",
|
||||
"minzoom": "0",
|
||||
"name": "tests/ne_110m_populated_places/out/-z0_-M10000_--drop-densest-as-needed_--extend-zooms-if-still-dropping-maximum_2.json.check.mbtiles",
|
||||
"strategies": "[{\"dropped_as_needed\":219,\"tile_size_desired\":74691},{\"dropped_as_needed\":207,\"tile_size_desired\":44398},{\"dropped_as_needed\":181,\"tile_size_desired\":35126}]",
|
||||
"strategies": "[{\"dropped_as_needed\":220,\"tile_size_desired\":75535},{\"dropped_as_needed\":207,\"tile_size_desired\":44899},{\"dropped_as_needed\":182,\"tile_size_desired\":35505}]",
|
||||
"tippecanoe_decisions": "{\"basezoom\":0,\"droprate\":2.5,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
@@ -21,29 +22,27 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 1, "NATSCALE": 300, "LABELRANK": 1, "FEATURECLA": "Populated place", "NAME": "Chicago", "DIFFASCII": 0, "NAMEASCII": "Chicago", "ADM0CAP": 0, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "United States", "SOV_A3": "USA", "ADM0NAME": "United States of America", "ADM0_A3": "USA", "ADM1NAME": "Illinois", "ISO_A2": "US", "LATITUDE": 41.829991, "LONGITUDE": -87.750055, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 8990000, "POP_MIN": 2841952, "POP_OTHER": 3635101, "RANK_MAX": 13, "RANK_MIN": 12, "GEONAMEID": 4887398, "MEGANAME": "Chicago", "LS_NAME": "Chicago", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 3747798, "MAX_POP20": 5069998, "MAX_POP50": 8416660, "MAX_POP300": 8416660, "MAX_POP310": 8450289, "MAX_NATSCA": 300, "MIN_AREAKM": 1345, "MAX_AREAKM": 4804, "MIN_AREAMI": 519, "MAX_AREAMI": 1855, "MIN_PERKM": 471, "MAX_PERKM": 2946, "MIN_PERMI": 293, "MAX_PERMI": 1830, "MIN_BBXMIN": -88.408333, "MAX_BBXMIN": -88.03629, "MIN_BBXMAX": -87.528138, "MAX_BBXMAX": -87.125, "MIN_BBYMIN": 41.391667, "MAX_BBYMIN": 41.458333, "MIN_BBYMAX": 42.000972, "MAX_BBYMAX": 42.491667, "MEAN_BBXC": -87.85874, "MEAN_BBYC": 41.832719, "COMPARE": 0, "GN_ASCII": "Chicago", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 0, "GN_POP": 2841952, "ELEVATION": 179, "GTOPO30": 181, "TIMEZONE": "America/Chicago", "GEONAMESNO": "GeoNames match with ascii name + lat + long whole numbers.", "UN_FID": 531, "UN_ADM0": "United States of America", "UN_LAT": 41.82, "UN_LONG": -87.64, "POP1950": 4999, "POP1955": 5565, "POP1960": 6183, "POP1965": 6639, "POP1970": 7106, "POP1975": 7160, "POP1980": 7216, "POP1985": 7285, "POP1990": 7374, "POP1995": 7839, "POP2000": 8333, "POP2005": 8820, "POP2010": 8990, "POP2015": 9211, "POP2020": 9516, "POP2025": 9756, "POP2050": 9932 }, "geometry": { "type": "Point", "coordinates": [ -87.714844, 41.836828 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 6, "FEATURECLA": "Admin-0 capital", "NAME": "Havana", "NAMEALT": "La Habana", "DIFFASCII": 0, "NAMEASCII": "Havana", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Cuba", "SOV_A3": "CUB", "ADM0NAME": "Cuba", "ADM0_A3": "CUB", "ADM1NAME": "Ciudad de la Habana", "ISO_A2": "CU", "LATITUDE": 23.131959, "LONGITUDE": -82.364182, "CHANGED": 5, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 2174000, "POP_MIN": 1990917, "POP_OTHER": 1930305, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 3553478, "MEGANAME": "La Habana", "LS_NAME": "Havana", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1990917, "MAX_POP20": 2051170, "MAX_POP50": 2051170, "MAX_POP300": 2051170, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 323, "MAX_AREAKM": 362, "MIN_AREAMI": 125, "MAX_AREAMI": 140, "MIN_PERKM": 240, "MAX_PERKM": 286, "MIN_PERMI": 149, "MAX_PERMI": 177, "MIN_BBXMIN": -82.533333, "MAX_BBXMIN": -82.533333, "MIN_BBXMAX": -82.208333, "MAX_BBXMAX": -82.208333, "MIN_BBYMIN": 22.916667, "MAX_BBYMIN": 22.975161, "MIN_BBYMAX": 23.183333, "MAX_BBYMAX": 23.183333, "MEAN_BBXC": -82.354344, "MEAN_BBYC": 23.076845, "COMPARE": 0, "GN_ASCII": "Havana", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 2, "GN_POP": 2163824, "ELEVATION": 0, "GTOPO30": 5, "TIMEZONE": "America/Havana", "GEONAMESNO": "GeoNames match general.", "UN_FID": 172, "UN_ADM0": "Cuba", "UN_LAT": 23.04, "UN_LONG": -82.41, "POP1950": 1116, "POP1955": 1289, "POP1960": 1436, "POP1965": 1598, "POP1970": 1779, "POP1975": 1848, "POP1980": 1913, "POP1985": 2005, "POP1990": 2108, "POP1995": 2183, "POP2000": 2187, "POP2005": 2189, "POP2010": 2174, "POP2015": 2159, "POP2020": 2151, "POP2025": 2150, "POP2050": 2150, "CITYALT": "Havana" }, "geometry": { "type": "Point", "coordinates": [ -82.353516, 23.160563 ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 0, "FEATURECLA": "Admin-0 capital", "NAME": "Nassau", "DIFFASCII": 0, "NAMEASCII": "Nassau", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Bahamas, The", "SOV_A3": "BHS", "ADM0NAME": "The Bahamas", "ADM0_A3": "BHS", "ISO_A2": "BS", "LATITUDE": 25.08339, "LONGITUDE": -77.350044, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 227940, "POP_MIN": 160966, "POP_OTHER": 0, "RANK_MAX": 10, "RANK_MIN": 9, "GEONAMEID": 3571824, "LS_NAME": "Nassau", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 160966, "MAX_POP20": 160966, "MAX_POP50": 160966, "MAX_POP300": 160966, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 84, "MAX_AREAKM": 84, "MIN_AREAMI": 32, "MAX_AREAMI": 32, "MIN_PERKM": 66, "MAX_PERKM": 66, "MIN_PERMI": 41, "MAX_PERMI": 41, "MIN_BBXMIN": -77.4, "MAX_BBXMIN": -77.4, "MIN_BBXMAX": -77.258333, "MAX_BBXMAX": -77.258333, "MIN_BBYMIN": 25, "MAX_BBYMIN": 25, "MIN_BBYMAX": 25.091667, "MAX_BBYMAX": 25.091667, "MEAN_BBXC": -77.335571, "MEAN_BBYC": 25.04483, "COMPARE": 0, "GN_ASCII": "Nassau", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 23, "GN_POP": 227940, "ELEVATION": 0, "GTOPO30": 3, "TIMEZONE": "America/Nassau", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ -77.343750, 25.085599 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital", "NAME": "Paramaribo", "DIFFASCII": 0, "NAMEASCII": "Paramaribo", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Suriname", "SOV_A3": "SUR", "ADM0NAME": "Suriname", "ADM0_A3": "SUR", "ADM1NAME": "Paramaribo", "ISO_A2": "SR", "LATITUDE": 5.83503, "LONGITUDE": -55.167031, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 254169, "POP_MIN": 223757, "POP_OTHER": 248161, "RANK_MAX": 10, "RANK_MIN": 10, "GEONAMEID": 3383330, "LS_NAME": "Paramaribo", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 254169, "MAX_POP20": 254169, "MAX_POP50": 254169, "MAX_POP300": 254169, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 104, "MAX_AREAKM": 105, "MIN_AREAMI": 40, "MAX_AREAMI": 40, "MIN_PERKM": 83, "MAX_PERKM": 85, "MIN_PERMI": 51, "MAX_PERMI": 53, "MIN_BBXMIN": -55.283333, "MAX_BBXMIN": -55.283333, "MIN_BBXMAX": -55.107566, "MAX_BBXMAX": -55.1, "MIN_BBYMIN": 5.766667, "MAX_BBYMIN": 5.766667, "MIN_BBYMAX": 5.866667, "MAX_BBYMAX": 5.866667, "MEAN_BBXC": -55.188737, "MEAN_BBYC": 5.826428, "COMPARE": 0, "GN_ASCII": "Paramaribo", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 16, "GN_POP": 223757, "ELEVATION": 0, "GTOPO30": 3, "TIMEZONE": "America/Paramaribo", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ -55.195312, 5.878332 ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital", "NAME": "Reykjavík", "DIFFASCII": 1, "NAMEASCII": "Reykjavik", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Iceland", "SOV_A3": "ISL", "ADM0NAME": "Iceland", "ADM0_A3": "ISL", "ADM1NAME": "Suðurnes", "ISO_A2": "IS", "LATITUDE": 64.150024, "LONGITUDE": -21.950014, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 166212, "POP_MIN": 113906, "POP_OTHER": 160116, "RANK_MAX": 9, "RANK_MIN": 9, "GEONAMEID": 3413829, "LS_NAME": "Reykjavik", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 166212, "MAX_POP20": 166212, "MAX_POP50": 166212, "MAX_POP300": 166212, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 75, "MAX_AREAKM": 75, "MIN_AREAMI": 29, "MAX_AREAMI": 29, "MIN_PERKM": 119, "MAX_PERKM": 119, "MIN_PERMI": 74, "MAX_PERMI": 74, "MIN_BBXMIN": -22.008333, "MAX_BBXMIN": -22.008333, "MIN_BBXMAX": -21.75, "MAX_BBXMAX": -21.75, "MIN_BBYMIN": 64.05, "MAX_BBYMIN": 64.05, "MIN_BBYMAX": 64.166667, "MAX_BBYMAX": 64.166667, "MEAN_BBXC": -21.8825, "MEAN_BBYC": 64.116125, "COMPARE": 0, "GN_ASCII": "Reykjavik", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 39, "GN_POP": 113906, "ELEVATION": 0, "GTOPO30": 16, "TIMEZONE": "Atlantic/Reykjavik", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ -21.972656, 64.168107 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital", "NAME": "Dublin", "DIFFASCII": 0, "NAMEASCII": "Dublin", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "Ireland", "SOV_A3": "IRL", "ADM0NAME": "Ireland", "ADM0_A3": "IRL", "ADM1NAME": "Dublin", "ISO_A2": "IE", "LATITUDE": 53.333061, "LONGITUDE": -6.248906, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 1059000, "POP_MIN": 968976, "POP_OTHER": 22478, "RANK_MAX": 12, "RANK_MIN": 11, "GEONAMEID": 2964574, "MEGANAME": "Dublin", "LS_NAME": "Dublin2", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 968976, "MAX_POP20": 968976, "MAX_POP50": 968976, "MAX_POP300": 968976, "MAX_POP310": 968976, "MAX_NATSCA": 300, "MIN_AREAKM": 351, "MAX_AREAKM": 351, "MIN_AREAMI": 135, "MAX_AREAMI": 135, "MIN_PERKM": 250, "MAX_PERKM": 250, "MIN_PERMI": 155, "MAX_PERMI": 155, "MIN_BBXMIN": -6.533333, "MAX_BBXMIN": -6.533333, "MIN_BBXMAX": -6.041667, "MAX_BBXMAX": -6.041667, "MIN_BBYMIN": 53.175, "MAX_BBYMIN": 53.175, "MIN_BBYMAX": 53.433333, "MAX_BBYMAX": 53.433333, "MEAN_BBXC": -6.278983, "MEAN_BBYC": 53.329717, "COMPARE": 0, "GN_ASCII": "Dublin", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 7, "GN_POP": 1024027, "ELEVATION": 0, "GTOPO30": 9, "TIMEZONE": "Europe/Dublin", "GEONAMESNO": "GeoNames match general.", "UN_FID": 302, "UN_ADM0": "Ireland", "UN_LAT": 53.34, "UN_LONG": -6.25, "POP1950": 626, "POP1955": 647, "POP1960": 661, "POP1965": 723, "POP1970": 771, "POP1975": 833, "POP1980": 903, "POP1985": 920, "POP1990": 916, "POP1995": 946, "POP2000": 989, "POP2005": 1037, "POP2010": 1059, "POP2015": 1098, "POP2020": 1177, "POP2025": 1257, "POP2050": 1332 }, "geometry": { "type": "Point", "coordinates": [ -6.240234, 53.330873 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 6, "NATSCALE": 30, "LABELRANK": 0, "FEATURECLA": "Admin-0 capital alt", "NAME": "Bir Lehlou", "DIFFASCII": 0, "NAMEASCII": "Bir Lehlou", "ADM0CAP": 0, "CAPALT": 1, "CAPIN": "Claimed as inte", "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Western Sahara", "SOV_A3": "SAH", "ADM0NAME": "Western Sahara", "ADM0_A3": "SAH", "ISO_A2": "EH", "LATITUDE": 26.119167, "LONGITUDE": -9.652522, "CHANGED": 4, "NAMEDIFF": 1, "DIFFNOTE": "Added place.", "POP_MAX": 500, "POP_MIN": 200, "POP_OTHER": 0, "RANK_MAX": 2, "RANK_MIN": 1, "GEONAMEID": -1, "LS_MATCH": 2, "CHECKME": 0, "MAX_POP10": 0, "MAX_POP20": 0, "MAX_POP50": 0, "MAX_POP300": 0, "MAX_POP310": 0, "MAX_NATSCA": 0, "MIN_AREAKM": 0, "MAX_AREAKM": 0, "MIN_AREAMI": 0, "MAX_AREAMI": 0, "MIN_PERKM": 0, "MAX_PERKM": 0, "MIN_PERMI": 0, "MAX_PERMI": 0, "MIN_BBXMIN": 0, "MAX_BBXMIN": 0, "MIN_BBXMAX": 0, "MAX_BBXMAX": 0, "MIN_BBYMIN": 0, "MAX_BBYMIN": 0, "MIN_BBYMAX": 0, "MAX_BBYMAX": 0, "MEAN_BBXC": 0, "MEAN_BBYC": 0, "COMPARE": 1, "ADMIN1_COD": 0, "GN_POP": 0, "ELEVATION": 0, "GTOPO30": 0, "GEONAMESNO": "No GeoNames match due to small population, not in GeoNames, or poor NEV placement.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ -9.667969, 26.115986 ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 0, "FEATURECLA": "Admin-0 capital", "NAME": "Praia", "DIFFASCII": 0, "NAMEASCII": "Praia", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Cape Verde", "SOV_A3": "CPV", "ADM0NAME": "Cape Verde", "ADM0_A3": "CPV", "ISO_A2": "CV", "LATITUDE": 14.916698, "LONGITUDE": -23.516689, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 113364, "POP_MIN": 88859, "POP_OTHER": 89205, "RANK_MAX": 9, "RANK_MIN": 8, "GEONAMEID": 3374333, "LS_NAME": "Praia", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 88859, "MAX_POP20": 88859, "MAX_POP50": 88859, "MAX_POP300": 88859, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 37, "MAX_AREAKM": 37, "MIN_AREAMI": 14, "MAX_AREAMI": 14, "MIN_PERKM": 40, "MAX_PERKM": 40, "MIN_PERMI": 25, "MAX_PERMI": 25, "MIN_BBXMIN": -23.541667, "MAX_BBXMIN": -23.541667, "MIN_BBXMAX": -23.483333, "MAX_BBXMAX": -23.483333, "MIN_BBYMIN": 14.9, "MAX_BBYMIN": 14.9, "MIN_BBYMAX": 14.983333, "MAX_BBYMAX": 14.983333, "MEAN_BBXC": -23.514907, "MEAN_BBYC": 14.938056, "COMPARE": 0, "GN_ASCII": "Praia", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 0, "GN_POP": 113364, "ELEVATION": 0, "GTOPO30": -9999, "TIMEZONE": "Atlantic/Cape_Verde", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ -23.554688, 14.944785 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 7, "FEATURECLA": "Admin-0 capital", "NAME": "Quito", "DIFFASCII": 0, "NAMEASCII": "Quito", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Ecuador", "SOV_A3": "ECU", "ADM0NAME": "Ecuador", "ADM0_A3": "ECU", "ADM1NAME": "Pichincha", "ISO_A2": "EC", "LATITUDE": -0.214988, "LONGITUDE": -78.500051, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 1701000, "POP_MIN": 1399814, "POP_OTHER": 1435528, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 3652462, "MEGANAME": "Quito", "LS_NAME": "Quito", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1472051, "MAX_POP20": 1892286, "MAX_POP50": 1892286, "MAX_POP300": 1892286, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 334, "MAX_AREAKM": 496, "MIN_AREAMI": 129, "MAX_AREAMI": 191, "MIN_PERKM": 233, "MAX_PERKM": 359, "MIN_PERMI": 145, "MAX_PERMI": 223, "MIN_BBXMIN": -78.591667, "MAX_BBXMIN": -78.591667, "MIN_BBXMAX": -78.291667, "MAX_BBXMAX": -78.291667, "MIN_BBYMIN": -0.391667, "MAX_BBYMIN": -0.30257, "MIN_BBYMAX": 0.025, "MAX_BBYMAX": 0.025, "MEAN_BBXC": -78.460061, "MEAN_BBYC": -0.198438, "COMPARE": 0, "GN_ASCII": "Quito", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 18, "GN_POP": 1399814, "ELEVATION": 0, "GTOPO30": 2764, "TIMEZONE": "America/Guayaquil", "GEONAMESNO": "GeoNames match general.", "UN_FID": 178, "UN_ADM0": "Ecuador", "UN_LAT": -0.22, "UN_LONG": -78.52, "POP1950": 206, "POP1955": 257, "POP1960": 319, "POP1965": 399, "POP1970": 501, "POP1975": 628, "POP1980": 780, "POP1985": 936, "POP1990": 1088, "POP1995": 1217, "POP2000": 1357, "POP2005": 1593, "POP2010": 1701, "POP2015": 1846, "POP2020": 2035, "POP2025": 2189, "POP2050": 2316 }, "geometry": { "type": "Point", "coordinates": [ -78.486328, -0.175781 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 0, "NATSCALE": 600, "LABELRANK": 1, "FEATURECLA": "Admin-1 capital", "NAME": "Sao Paulo", "NAMEALT": "Sao Paulo|São Paulo", "DIFFASCII": 0, "NAMEASCII": "Sao Paulo", "ADM0CAP": 0, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "Brazil", "SOV_A3": "BRA", "ADM0NAME": "Brazil", "ADM0_A3": "BRA", "ADM1NAME": "São Paulo", "ISO_A2": "BR", "LATITUDE": -23.55868, "LONGITUDE": -46.62502, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 18845000, "POP_MIN": 10021295, "POP_OTHER": 11522944, "RANK_MAX": 14, "RANK_MIN": 14, "GEONAMEID": 3448439, "MEGANAME": "São Paulo", "LS_NAME": "Sao Paolo", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 12495084, "MAX_POP20": 17425624, "MAX_POP50": 18203351, "MAX_POP300": 18203351, "MAX_POP310": 18203351, "MAX_NATSCA": 300, "MIN_AREAKM": 1434, "MAX_AREAKM": 2667, "MIN_AREAMI": 554, "MAX_AREAMI": 1030, "MIN_PERKM": 532, "MAX_PERKM": 1086, "MIN_PERMI": 330, "MAX_PERMI": 675, "MIN_BBXMIN": -47.058333, "MAX_BBXMIN": -47.056372, "MIN_BBXMAX": -46.383333, "MAX_BBXMAX": -46.108333, "MIN_BBYMIN": -23.891667, "MAX_BBYMIN": -23.842331, "MIN_BBYMAX": -23.358333, "MAX_BBYMAX": -23.241667, "MEAN_BBXC": -46.651489, "MEAN_BBYC": -23.558961, "COMPARE": 0, "GN_ASCII": "Sao Paulo", "FEATURE_CL": "P", "FEATURE_CO": "PPLA", "ADMIN1_COD": 27, "GN_POP": 10021295, "ELEVATION": 0, "GTOPO30": 631, "TIMEZONE": "America/Sao_Paulo", "GEONAMESNO": "GeoNames match general.", "UN_FID": 491, "UN_ADM0": "Brazil", "UN_LAT": -23.58, "UN_LONG": -46.62, "POP1950": 2334, "POP1955": 3044, "POP1960": 3970, "POP1965": 5494, "POP1970": 7620, "POP1975": 9614, "POP1980": 12089, "POP1985": 13395, "POP1990": 14776, "POP1995": 15948, "POP2000": 17099, "POP2005": 18333, "POP2010": 18845, "POP2015": 19582, "POP2020": 20544, "POP2025": 21124, "POP2050": 21428, "CITYALT": "Sao Paulo" }, "geometry": { "type": "Point", "coordinates": [ -46.669922, -23.563987 ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital", "NAME": "Montevideo", "DIFFASCII": 0, "NAMEASCII": "Montevideo", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Uruguay", "SOV_A3": "URY", "ADM0NAME": "Uruguay", "ADM0_A3": "URY", "ADM1NAME": "Montevideo", "ISO_A2": "UY", "LATITUDE": -34.858042, "LONGITUDE": -56.171052, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 1513000, "POP_MIN": 5324, "POP_OTHER": 1276128, "RANK_MAX": 12, "RANK_MIN": 5, "GEONAMEID": 5038018, "MEGANAME": "Montevideo", "LS_NAME": "Montevideo", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1381747, "MAX_POP20": 1381747, "MAX_POP50": 1381747, "MAX_POP300": 1381747, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 347, "MAX_AREAKM": 347, "MIN_AREAMI": 134, "MAX_AREAMI": 134, "MIN_PERKM": 266, "MAX_PERKM": 266, "MIN_PERMI": 165, "MAX_PERMI": 165, "MIN_BBXMIN": -56.291667, "MAX_BBXMIN": -56.291667, "MIN_BBXMAX": -55.8, "MAX_BBXMAX": -55.8, "MIN_BBYMIN": -34.933333, "MAX_BBYMIN": -34.933333, "MIN_BBYMAX": -34.65, "MAX_BBYMAX": -34.65, "MEAN_BBXC": -56.12273, "MEAN_BBYC": -34.828337, "COMPARE": 0, "GN_ASCII": "Montevideo", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 0, "GN_POP": 5324, "ELEVATION": 284, "GTOPO30": 305, "TIMEZONE": "America/Chicago", "GEONAMESNO": "GeoNames match general.", "UN_FID": 579, "UN_ADM0": "Uruguay", "UN_LAT": -34.92, "UN_LONG": -56.16, "POP1950": 1212, "POP1955": 1248, "POP1960": 1285, "POP1965": 1323, "POP1970": 1362, "POP1975": 1403, "POP1980": 1454, "POP1985": 1508, "POP1990": 1546, "POP1995": 1584, "POP2000": 1561, "POP2005": 1525, "POP2010": 1513, "POP2015": 1504, "POP2020": 1506, "POP2025": 1515, "POP2050": 1520 }, "geometry": { "type": "Point", "coordinates": [ -56.162109, -34.885931 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 0, "NATSCALE": 600, "LABELRANK": 1, "FEATURECLA": "Populated place", "NAME": "Rio de Janeiro", "DIFFASCII": 0, "NAMEASCII": "Rio de Janeiro", "ADM0CAP": 0, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "Brazil", "SOV_A3": "BRA", "ADM0NAME": "Brazil", "ADM0_A3": "BRA", "ADM1NAME": "Rio de Janeiro", "ISO_A2": "BR", "LATITUDE": -22.925023, "LONGITUDE": -43.225021, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 11748000, "POP_MIN": 2010175, "POP_OTHER": 1821489, "RANK_MAX": 14, "RANK_MIN": 12, "GEONAMEID": 3451190, "MEGANAME": "Rio de Janeiro", "LS_NAME": "Rio de Janeiro", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 2010175, "MAX_POP20": 8118691, "MAX_POP50": 8889292, "MAX_POP300": 8889292, "MAX_POP310": 8889292, "MAX_NATSCA": 300, "MIN_AREAKM": 316, "MAX_AREAKM": 1472, "MIN_AREAMI": 122, "MAX_AREAMI": 568, "MIN_PERKM": 203, "MAX_PERKM": 691, "MIN_PERMI": 126, "MAX_PERMI": 429, "MIN_BBXMIN": -43.75, "MAX_BBXMIN": -43.499182, "MIN_BBXMAX": -43.158333, "MAX_BBXMAX": -43.15, "MIN_BBYMIN": -23.033333, "MAX_BBYMIN": -23.033333, "MIN_BBYMAX": -22.837896, "MAX_BBYMAX": -22.575, "MEAN_BBXC": -43.407551, "MEAN_BBYC": -22.856463, "COMPARE": 0, "GN_ASCII": "Rio de Janeiro", "FEATURE_CL": "P", "FEATURE_CO": "PPLA", "ADMIN1_COD": 21, "GN_POP": 6023699, "ELEVATION": 0, "GTOPO30": 19, "TIMEZONE": "America/Sao_Paulo", "GEONAMESNO": "Geonames ascii name + lat.d + long.d matching.", "UN_FID": 489, "UN_ADM0": "Brazil", "UN_LAT": -22.72, "UN_LONG": -43.45, "POP1950": 2950, "POP1955": 3592, "POP1960": 4374, "POP1965": 5387, "POP1970": 6637, "POP1975": 7557, "POP1980": 8583, "POP1985": 9086, "POP1990": 9595, "POP1995": 10174, "POP2000": 10803, "POP2005": 11469, "POP2010": 11748, "POP2015": 12171, "POP2020": 12775, "POP2025": 13179, "POP2050": 13413 }, "geometry": { "type": "Point", "coordinates": [ -43.242188, -22.917923 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 7, "FEATURECLA": "Admin-0 capital", "NAME": "Oslo", "DIFFASCII": 0, "NAMEASCII": "Oslo", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "Kingdom of Norway", "SOV_A3": "NOR", "ADM0NAME": "Norway", "ADM0_A3": "NOR", "ADM1NAME": "Oslo", "ISO_A2": "NO", "LATITUDE": 59.91669, "LONGITUDE": 10.749979, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 835000, "POP_MIN": 580000, "POP_OTHER": 701804, "RANK_MAX": 11, "RANK_MIN": 11, "GEONAMEID": 3143244, "MEGANAME": "Oslo", "LS_NAME": "Oslo", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 731563, "MAX_POP20": 731563, "MAX_POP50": 762374, "MAX_POP300": 762374, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 329, "MAX_AREAKM": 362, "MIN_AREAMI": 127, "MAX_AREAMI": 140, "MIN_PERKM": 340, "MAX_PERKM": 390, "MIN_PERMI": 211, "MAX_PERMI": 243, "MIN_BBXMIN": 10.333333, "MAX_BBXMIN": 10.440355, "MIN_BBXMAX": 11.091667, "MAX_BBXMAX": 11.091667, "MIN_BBYMIN": 59.708333, "MAX_BBYMIN": 59.708333, "MIN_BBYMAX": 60.066667, "MAX_BBYMAX": 60.066667, "MEAN_BBXC": 10.756508, "MEAN_BBYC": 59.906118, "COMPARE": 0, "GN_ASCII": "Oslo", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 12, "GN_POP": 580000, "ELEVATION": 0, "GTOPO30": 11, "TIMEZONE": "Europe/Oslo", "GEONAMESNO": "GeoNames match general.", "UN_FID": 397, "UN_ADM0": "Norway", "UN_LAT": 59.93, "UN_LONG": 10.71, "POP1950": 468, "POP1955": 533, "POP1960": 578, "POP1965": 610, "POP1970": 643, "POP1975": 644, "POP1980": 643, "POP1985": 662, "POP1990": 684, "POP1995": 729, "POP2000": 774, "POP2005": 816, "POP2010": 835, "POP2015": 858, "POP2020": 885, "POP2025": 909, "POP2050": 936 }, "geometry": { "type": "Point", "coordinates": [ 10.722656, 59.933000 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 0, "NATSCALE": 600, "LABELRANK": 2, "FEATURECLA": "Admin-0 capital", "NAME": "Moscow", "NAMEPAR": "Moskva", "DIFFASCII": 0, "NAMEASCII": "Moscow", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "Russia", "SOV_A3": "RUS", "ADM0NAME": "Russia", "ADM0_A3": "RUS", "ADM1NAME": "Moskva", "ISO_A2": "RU", "LATITUDE": 55.752164, "LONGITUDE": 37.615523, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 10452000, "POP_MIN": 10452000, "POP_OTHER": 10585385, "RANK_MAX": 14, "RANK_MIN": 14, "GEONAMEID": 524901, "MEGANAME": "Moskva", "LS_NAME": "Moscow", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 11029015, "MAX_POP20": 11030955, "MAX_POP50": 11547877, "MAX_POP300": 11547877, "MAX_POP310": 11547877, "MAX_NATSCA": 300, "MIN_AREAKM": 1434, "MAX_AREAKM": 1639, "MIN_AREAMI": 554, "MAX_AREAMI": 633, "MIN_PERKM": 875, "MAX_PERKM": 1135, "MIN_PERMI": 544, "MAX_PERMI": 705, "MIN_BBXMIN": 37.233333, "MAX_BBXMIN": 37.233333, "MIN_BBXMAX": 38.075401, "MAX_BBXMAX": 38.3, "MIN_BBYMIN": 55.341667, "MAX_BBYMIN": 55.533007, "MIN_BBYMAX": 56.075, "MAX_BBYMAX": 56.075, "MEAN_BBXC": 37.643636, "MEAN_BBYC": 55.754996, "COMPARE": 0, "GN_ASCII": "Moscow", "ADMIN1_COD": 0, "GN_POP": 0, "ELEVATION": 0, "GTOPO30": 0, "GEONAMESNO": "GeoNames match general + researched.", "UN_FID": 426, "UN_ADM0": "Russian Federation", "UN_LAT": 55.74, "UN_LONG": 37.7, "POP1950": 5356, "POP1955": 5749, "POP1960": 6170, "POP1965": 6622, "POP1970": 7106, "POP1975": 7623, "POP1980": 8136, "POP1985": 8580, "POP1990": 8987, "POP1995": 9201, "POP2000": 10016, "POP2005": 10416, "POP2010": 10452, "POP2015": 10495, "POP2020": 10524, "POP2025": 10526, "POP2050": 10526, "CITYALT": "Moscow" }, "geometry": { "type": "Point", "coordinates": [ 37.617188, 55.776573 ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital", "NAME": "Tbilisi", "NAMEALT": "T'Bilisi", "DIFFASCII": 0, "NAMEASCII": "Tbilisi", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Georgia", "SOV_A3": "GEO", "ADM0NAME": "Georgia", "ADM0_A3": "GEO", "ADM1NAME": "Tbilisi", "ISO_A2": "GE", "LATITUDE": 41.72501, "LONGITUDE": 44.790795, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 1100000, "POP_MIN": 1005257, "POP_OTHER": 977179, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 611717, "MEGANAME": "Tbilisi", "LS_NAME": "Tbilisi", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1005257, "MAX_POP20": 1005257, "MAX_POP50": 1007529, "MAX_POP300": 1007529, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 131, "MAX_AREAKM": 135, "MIN_AREAMI": 51, "MAX_AREAMI": 52, "MIN_PERKM": 128, "MAX_PERKM": 133, "MIN_PERMI": 80, "MAX_PERMI": 83, "MIN_BBXMIN": 44.708333, "MAX_BBXMIN": 44.708333, "MIN_BBXMAX": 44.933333, "MAX_BBXMAX": 44.933333, "MIN_BBYMIN": 41.616667, "MAX_BBYMIN": 41.627355, "MIN_BBYMAX": 41.825, "MAX_BBYMAX": 41.825, "MEAN_BBXC": 44.822812, "MEAN_BBYC": 41.722167, "COMPARE": 0, "GN_ASCII": "Tbilisi", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 0, "GN_POP": 1049498, "ELEVATION": 0, "GTOPO30": 420, "TIMEZONE": "Asia/Tbilisi", "GEONAMESNO": "GeoNames match general.", "UN_FID": 191, "UN_ADM0": "Georgia", "UN_LAT": 41.72, "UN_LONG": 44.78, "POP1950": 612, "POP1955": 659, "POP1960": 718, "POP1965": 803, "POP1970": 897, "POP1975": 992, "POP1980": 1090, "POP1985": 1177, "POP1990": 1224, "POP1995": 1160, "POP2000": 1100, "POP2005": 1093, "POP2010": 1100, "POP2015": 1108, "POP2020": 1113, "POP2025": 1114, "POP2050": 1114, "CITYALT": "T'Bilisi" }, "geometry": { "type": "Point", "coordinates": [ 44.824219, 41.705729 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital", "NAME": "Yerevan", "DIFFASCII": 0, "NAMEASCII": "Yerevan", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Armenia", "SOV_A3": "ARM", "ADM0NAME": "Armenia", "ADM0_A3": "ARM", "ADM1NAME": "Erevan", "ISO_A2": "AM", "LATITUDE": 40.181151, "LONGITUDE": 44.513551, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 1102000, "POP_MIN": 1093485, "POP_OTHER": 1154748, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 616052, "MEGANAME": "Yerevan", "LS_NAME": "Yerevan", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 1200842, "MAX_POP20": 1200842, "MAX_POP50": 1200842, "MAX_POP300": 1200842, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 191, "MAX_AREAKM": 191, "MIN_AREAMI": 74, "MAX_AREAMI": 74, "MIN_PERKM": 166, "MAX_PERKM": 166, "MIN_PERMI": 103, "MAX_PERMI": 103, "MIN_BBXMIN": 44.391667, "MAX_BBXMIN": 44.391667, "MIN_BBXMAX": 44.6, "MAX_BBXMAX": 44.6, "MIN_BBYMIN": 39.925, "MAX_BBYMIN": 39.925, "MIN_BBYMAX": 40.241667, "MAX_BBYMAX": 40.241667, "MEAN_BBXC": 44.506293, "MEAN_BBYC": 40.127356, "COMPARE": 0, "GN_ASCII": "Yerevan", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 11, "GN_POP": 1093485, "ELEVATION": 0, "GTOPO30": 1002, "TIMEZONE": "Asia/Yerevan", "GEONAMESNO": "GeoNames match general.", "UN_FID": 377, "UN_ADM0": "Armenia", "UN_LAT": 40.2, "UN_LONG": 44.53, "POP1950": 341, "POP1955": 431, "POP1960": 538, "POP1965": 648, "POP1970": 778, "POP1975": 911, "POP1980": 1042, "POP1985": 1123, "POP1990": 1175, "POP1995": 1142, "POP2000": 1111, "POP2005": 1103, "POP2010": 1102, "POP2015": 1102, "POP2020": 1102, "POP2025": 1102, "POP2050": 1102 }, "geometry": { "type": "Point", "coordinates": [ 44.472656, 40.178873 ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 4, "NATSCALE": 50, "LABELRANK": 5, "FEATURECLA": "Admin-0 capital", "NAME": "Juba", "DIFFASCII": 0, "NAMEASCII": "Juba", "ADM0CAP": 0, "CAPALT": 1, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "South Sudan", "SOV_A3": "SSD", "ADM0NAME": "South Sudan", "ADM0_A3": "SSD", "ADM1NAME": "Central Equatoria", "ISO_A2": "SS", "LATITUDE": 4.829975, "LONGITUDE": 31.580026, "CHANGED": 20, "NAMEDIFF": 0, "DIFFNOTE": "Changed country.", "POP_MAX": 111975, "POP_MIN": 111975, "POP_OTHER": 111975, "RANK_MAX": 9, "RANK_MIN": 9, "GEONAMEID": 373303, "LS_NAME": "Juba", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 111975, "MAX_POP20": 111975, "MAX_POP50": 111975, "MAX_POP300": 0, "MAX_POP310": 0, "MAX_NATSCA": 50, "MIN_AREAKM": 21, "MAX_AREAKM": 21, "MIN_AREAMI": 8, "MAX_AREAMI": 8, "MIN_PERKM": 30, "MAX_PERKM": 30, "MIN_PERMI": 18, "MAX_PERMI": 18, "MIN_BBXMIN": 31.575, "MAX_BBXMIN": 31.575, "MIN_BBXMAX": 31.625, "MAX_BBXMAX": 31.625, "MIN_BBYMIN": 4.816667, "MAX_BBYMIN": 4.816667, "MIN_BBYMAX": 4.883333, "MAX_BBYMAX": 4.883333, "MEAN_BBXC": 31.6015, "MEAN_BBYC": 4.845167, "COMPARE": 0, "GN_ASCII": "Juba", "FEATURE_CL": "P", "FEATURE_CO": "PPLA", "ADMIN1_COD": 44, "GN_POP": 0, "ELEVATION": 0, "GTOPO30": 551, "TIMEZONE": "Africa/Khartoum", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 31.552734, 4.828260 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 6, "FEATURECLA": "Admin-0 capital", "NAME": "Astana", "DIFFASCII": 0, "NAMEASCII": "Astana", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Kazakhstan", "SOV_A3": "KAZ", "ADM0NAME": "Kazakhstan", "ADM0_A3": "KAZ", "ADM1NAME": "Aqmola", "ISO_A2": "KZ", "LATITUDE": 51.181125, "LONGITUDE": 71.427774, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 345604, "POP_MIN": 325021, "POP_OTHER": 317445, "RANK_MAX": 10, "RANK_MIN": 10, "GEONAMEID": 1526273, "LS_NAME": "Astana", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 325021, "MAX_POP20": 325021, "MAX_POP50": 325021, "MAX_POP300": 325021, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 104, "MAX_AREAKM": 104, "MIN_AREAMI": 40, "MAX_AREAMI": 40, "MIN_PERKM": 101, "MAX_PERKM": 101, "MIN_PERMI": 63, "MAX_PERMI": 63, "MIN_BBXMIN": 71.325, "MAX_BBXMIN": 71.325, "MIN_BBXMAX": 71.533333, "MAX_BBXMAX": 71.533333, "MIN_BBYMIN": 51.1, "MAX_BBYMIN": 51.1, "MIN_BBYMAX": 51.225, "MAX_BBYMAX": 51.225, "MEAN_BBXC": 71.43275, "MEAN_BBYC": 51.164443, "COMPARE": 0, "GN_ASCII": "Astana", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 5, "GN_POP": 345604, "ELEVATION": 0, "GTOPO30": 339, "TIMEZONE": "Asia/Qyzylorda", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 71.455078, 51.179343 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 2, "FEATURECLA": "Admin-0 capital", "NAME": "Islamabad", "DIFFASCII": 0, "NAMEASCII": "Islamabad", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Pakistan", "SOV_A3": "PAK", "ADM0NAME": "Pakistan", "ADM0_A3": "PAK", "ADM1NAME": "F.C.T.", "ISO_A2": "PK", "LATITUDE": 33.699996, "LONGITUDE": 73.166634, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 780000, "POP_MIN": 601600, "POP_OTHER": 893673, "RANK_MAX": 11, "RANK_MIN": 11, "GEONAMEID": 1176615, "MEGANAME": "Islamabad", "LS_NAME": "Islamabad", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 742356, "MAX_POP20": 742356, "MAX_POP50": 7482035, "MAX_POP300": 7482969, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 772, "MAX_AREAKM": 5463, "MIN_AREAMI": 298, "MAX_AREAMI": 2109, "MIN_PERKM": 545, "MAX_PERKM": 4154, "MIN_PERMI": 339, "MAX_PERMI": 2581, "MIN_BBXMIN": 72.286464, "MAX_BBXMIN": 73.033333, "MIN_BBXMAX": 73.516667, "MAX_BBXMAX": 73.816667, "MIN_BBYMIN": 32.7, "MAX_BBYMIN": 33.258333, "MIN_BBYMAX": 33.766667, "MAX_BBYMAX": 34.533333, "MEAN_BBXC": 73.182617, "MEAN_BBYC": 33.557939, "COMPARE": 0, "GN_ASCII": "Islamabad", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 8, "GN_POP": 601600, "ELEVATION": 0, "GTOPO30": 497, "TIMEZONE": "Asia/Karachi", "GEONAMESNO": "GeoNames match general.", "UN_FID": 401, "UN_ADM0": "Pakistan", "UN_LAT": 33.71, "UN_LONG": 73.06, "POP1950": 36, "POP1955": 41, "POP1960": 45, "POP1965": 56, "POP1970": 70, "POP1975": 107, "POP1980": 189, "POP1985": 260, "POP1990": 343, "POP1995": 452, "POP2000": 594, "POP2005": 732, "POP2010": 780, "POP2015": 851, "POP2020": 988, "POP2025": 1148, "POP2050": 1320 }, "geometry": { "type": "Point", "coordinates": [ 73.125000, 33.724340 ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 1, "NATSCALE": 300, "LABELRANK": 1, "FEATURECLA": "Admin-0 capital", "NAME": "New Delhi", "DIFFASCII": 0, "NAMEASCII": "New Delhi", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 0, "SOV0NAME": "India", "SOV_A3": "IND", "ADM0NAME": "India", "ADM0_A3": "IND", "ADM1NAME": "Delhi", "ISO_A2": "IN", "LATITUDE": 28.600023, "LONGITUDE": 77.19998, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 317797, "POP_MIN": 317797, "POP_OTHER": 8060107, "RANK_MAX": 10, "RANK_MIN": 10, "GEONAMEID": 1261481, "LS_NAME": "New Delhi", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 8761047, "MAX_POP20": 13414375, "MAX_POP50": 32426336, "MAX_POP300": 32424761, "MAX_POP310": 224908923, "MAX_NATSCA": 300, "MIN_AREAKM": 864, "MAX_AREAKM": 186559, "MIN_AREAMI": 334, "MAX_AREAMI": 72030, "MIN_PERKM": 244, "MAX_PERKM": 130296, "MIN_PERMI": 152, "MAX_PERMI": 80962, "MIN_BBXMIN": 71.033333, "MAX_BBXMIN": 76.943289, "MIN_BBXMAX": 77.43183, "MAX_BBXMAX": 82.566667, "MIN_BBYMIN": 24, "MAX_BBYMIN": 28.152007, "MIN_BBYMAX": 28.738629, "MAX_BBYMAX": 33.466667, "MEAN_BBXC": 77.27294500000001, "MEAN_BBYC": 28.382537, "COMPARE": 0, "GN_ASCII": "New Delhi", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 7, "GN_POP": 317797, "ELEVATION": 0, "GTOPO30": 205, "TIMEZONE": "Asia/Kolkata", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 77.167969, 28.613459 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 7, "FEATURECLA": "Admin-0 capital", "NAME": "Ulaanbaatar", "DIFFASCII": 0, "NAMEASCII": "Ulaanbaatar", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Mongolia", "SOV_A3": "MNG", "ADM0NAME": "Mongolia", "ADM0_A3": "MNG", "ADM1NAME": "Ulaanbaatar", "ISO_A2": "MN", "LATITUDE": 47.916673, "LONGITUDE": 106.916616, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 885000, "POP_MIN": 769612, "POP_OTHER": 765359, "RANK_MAX": 11, "RANK_MIN": 11, "GEONAMEID": 2028462, "MEGANAME": "Ulaanbaatar", "LS_NAME": "Ulaanbaatar", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 769612, "MAX_POP20": 769612, "MAX_POP50": 769612, "MAX_POP300": 769612, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 143, "MAX_AREAKM": 143, "MIN_AREAMI": 55, "MAX_AREAMI": 55, "MIN_PERKM": 144, "MAX_PERKM": 144, "MIN_PERMI": 89, "MAX_PERMI": 89, "MIN_BBXMIN": 106.725, "MAX_BBXMIN": 106.725, "MIN_BBXMAX": 107.041667, "MAX_BBXMAX": 107.041667, "MIN_BBYMIN": 47.883333, "MAX_BBYMIN": 47.883333, "MIN_BBYMAX": 48.016667, "MAX_BBYMAX": 48.016667, "MEAN_BBXC": 106.883013, "MEAN_BBYC": 47.932237, "COMPARE": 0, "GN_ASCII": "Ulaanbaatar", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 20, "GN_POP": 844818, "ELEVATION": 0, "GTOPO30": 1299, "TIMEZONE": "Asia/Ulaanbaatar", "GEONAMESNO": "GeoNames match general.", "UN_FID": 367, "UN_ADM0": "Mongolia", "UN_LAT": 47.92, "UN_LONG": 106.91, "POP1950": 70, "POP1955": 112, "POP1960": 179, "POP1965": 248, "POP1970": 298, "POP1975": 356, "POP1980": 423, "POP1985": 492, "POP1990": 572, "POP1995": 661, "POP2000": 763, "POP2005": 856, "POP2010": 885, "POP2015": 919, "POP2020": 978, "POP2025": 1044, "POP2050": 1112 }, "geometry": { "type": "Point", "coordinates": [ 106.875000, 47.931066 ] } }
|
||||
,
|
||||
@@ -51,9 +50,9 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 1, "NATSCALE": 300, "LABELRANK": 2, "FEATURECLA": "Admin-1 region capital", "NAME": "Osaka", "NAMEALT": "Osaka-Kobe", "DIFFASCII": 0, "NAMEASCII": "Osaka", "ADM0CAP": 0, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "Japan", "SOV_A3": "JPN", "ADM0NAME": "Japan", "ADM0_A3": "JPN", "ADM1NAME": "Osaka", "ISO_A2": "JP", "LATITUDE": 34.750035, "LONGITUDE": 135.460145, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Changed feature to Admin-0 region capital.", "POP_MAX": 11294000, "POP_MIN": 2592413, "POP_OTHER": 9630783, "RANK_MAX": 14, "RANK_MIN": 12, "GEONAMEID": 1853909, "MEGANAME": "Osaka-Kobe", "LS_NAME": "Osaka", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 10169723, "MAX_POP20": 10259448, "MAX_POP50": 13292739, "MAX_POP300": 15645640, "MAX_POP310": 15645640, "MAX_NATSCA": 300, "MIN_AREAKM": 1561, "MAX_AREAKM": 2861, "MIN_AREAMI": 603, "MAX_AREAMI": 1105, "MIN_PERKM": 546, "MAX_PERKM": 1202, "MIN_PERMI": 339, "MAX_PERMI": 747, "MIN_BBXMIN": 134.508333, "MAX_BBXMIN": 135.304598, "MIN_BBXMAX": 135.883333, "MAX_BBXMAX": 135.883333, "MIN_BBYMIN": 34.325, "MAX_BBYMIN": 34.408333, "MIN_BBYMAX": 34.916667, "MAX_BBYMAX": 35.1, "MEAN_BBXC": 135.475415, "MEAN_BBYC": 34.676719, "COMPARE": 0, "GN_ASCII": "Osaka", "FEATURE_CL": "P", "FEATURE_CO": "PPLA", "ADMIN1_COD": 32, "GN_POP": 2592413, "ELEVATION": 0, "GTOPO30": 4, "TIMEZONE": "Asia/Tokyo", "GEONAMESNO": "GeoNames rough area, rough name.", "UN_FID": 315, "UN_ADM0": "Japan", "UN_LAT": 34.63, "UN_LONG": 135.51, "POP1950": 4147, "POP1955": 5120, "POP1960": 6227, "POP1965": 7654, "POP1970": 9408, "POP1975": 9844, "POP1980": 9990, "POP1985": 10350, "POP1990": 11035, "POP1995": 11052, "POP2000": 11165, "POP2005": 11258, "POP2010": 11294, "POP2015": 11337, "POP2020": 11365, "POP2025": 11368, "POP2050": 11368, "CITYALT": "Osaka" }, "geometry": { "type": "Point", "coordinates": [ 135.439453, 34.741612 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 6, "NATSCALE": 30, "LABELRANK": 0, "FEATURECLA": "Admin-0 capital", "NAME": "Palikir", "DIFFASCII": 0, "NAMEASCII": "Palikir", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Federated States of Micronesia", "SOV_A3": "FSM", "ADM0NAME": "Federated States of Micronesia", "ADM0_A3": "FSM", "ISO_A2": "FM", "LATITUDE": 6.916644, "LONGITUDE": 158.149974, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 4645, "POP_MIN": 4645, "POP_OTHER": 0, "RANK_MAX": 4, "RANK_MIN": 4, "GEONAMEID": 2081986, "LS_NAME": "Palikir", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 412, "MAX_POP20": 412, "MAX_POP50": 412, "MAX_POP300": 412, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 1, "MAX_AREAKM": 1, "MIN_AREAMI": 0, "MAX_AREAMI": 0, "MIN_PERKM": 4, "MAX_PERKM": 4, "MIN_PERMI": 2, "MAX_PERMI": 2, "MIN_BBXMIN": 158.158333, "MAX_BBXMIN": 158.158333, "MIN_BBXMAX": 158.166667, "MAX_BBXMAX": 158.166667, "MIN_BBYMIN": 6.908333, "MAX_BBYMIN": 6.908333, "MIN_BBYMAX": 6.916667, "MAX_BBYMAX": 6.916667, "MEAN_BBXC": 158.1625, "MEAN_BBYC": 6.9125, "COMPARE": 0, "GN_ASCII": "Palikir", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 2, "GN_POP": 4645, "ELEVATION": 0, "GTOPO30": 159, "TIMEZONE": "Pacific/Ponape", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 158.115234, 6.926427 ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 6, "NATSCALE": 30, "LABELRANK": 0, "FEATURECLA": "Admin-0 capital", "NAME": "Majuro", "DIFFASCII": 0, "NAMEASCII": "Majuro", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Marshall Islands", "SOV_A3": "MHL", "ADM0NAME": "Marshall Islands", "ADM0_A3": "MHL", "ISO_A2": "MH", "LATITUDE": 7.103004, "LONGITUDE": 171.38, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 25400, "POP_MIN": 20500, "POP_OTHER": 0, "RANK_MAX": 7, "RANK_MIN": 7, "GEONAMEID": 2113779, "LS_NAME": "Majuro", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 2084, "MAX_POP20": 2084, "MAX_POP50": 2084, "MAX_POP300": 2084, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 3, "MAX_AREAKM": 3, "MIN_AREAMI": 1, "MAX_AREAMI": 1, "MIN_PERKM": 7, "MAX_PERKM": 7, "MIN_PERMI": 5, "MAX_PERMI": 5, "MIN_BBXMIN": 171.366667, "MAX_BBXMIN": 171.366667, "MIN_BBXMAX": 171.375, "MAX_BBXMAX": 171.375, "MIN_BBYMIN": 7.091667, "MAX_BBYMIN": 7.091667, "MIN_BBYMAX": 7.116667, "MAX_BBYMAX": 7.116667, "MEAN_BBXC": 171.370833, "MEAN_BBYC": 7.104167, "COMPARE": 0, "GN_ASCII": "Majuro", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 0, "GN_POP": 20500, "ELEVATION": 0, "GTOPO30": 1, "TIMEZONE": "Pacific/Majuro", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 171.386719, 7.100893 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 6, "FEATURECLA": "Admin-0 capital", "NAME": "Lusaka", "DIFFASCII": 0, "NAMEASCII": "Lusaka", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Zambia", "SOV_A3": "ZMB", "ADM0NAME": "Zambia", "ADM0_A3": "ZMB", "ADM1NAME": "Lusaka", "ISO_A2": "ZM", "LATITUDE": -15.416644, "LONGITUDE": 28.283328, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 1328000, "POP_MIN": 1267440, "POP_OTHER": 1240558, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 909137, "MEGANAME": "Lusaka", "LS_NAME": "Lusaka", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1289566, "MAX_POP20": 1289566, "MAX_POP50": 1289566, "MAX_POP300": 1289566, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 183, "MAX_AREAKM": 183, "MIN_AREAMI": 71, "MAX_AREAMI": 71, "MIN_PERKM": 122, "MAX_PERKM": 122, "MIN_PERMI": 76, "MAX_PERMI": 76, "MIN_BBXMIN": 28.225, "MAX_BBXMIN": 28.225, "MIN_BBXMAX": 28.416667, "MAX_BBXMAX": 28.416667, "MIN_BBYMIN": -15.483333, "MAX_BBYMIN": -15.483333, "MIN_BBYMAX": -15.333333, "MAX_BBYMAX": -15.333333, "MEAN_BBXC": 28.308596, "MEAN_BBYC": -15.403941, "COMPARE": 0, "GN_ASCII": "Lusaka", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 9, "GN_POP": 1267440, "ELEVATION": 0, "GTOPO30": 1277, "TIMEZONE": "Africa/Lusaka", "GEONAMESNO": "GeoNames match general.", "UN_FID": 589, "UN_ADM0": "Zambia", "UN_LAT": -15.42, "UN_LONG": 28.17, "POP1950": 31, "POP1955": 53, "POP1960": 91, "POP1965": 160, "POP1970": 278, "POP1975": 385, "POP1980": 533, "POP1985": 636, "POP1990": 757, "POP1995": 902, "POP2000": 1073, "POP2005": 1261, "POP2010": 1328, "POP2015": 1421, "POP2020": 1587, "POP2025": 1797, "POP2050": 2047 }, "geometry": { "type": "Point", "coordinates": [ 28.300781, -15.453680 ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 7, "FEATURECLA": "Admin-0 capital", "NAME": "Gaborone", "DIFFASCII": 0, "NAMEASCII": "Gaborone", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Botswana", "SOV_A3": "BWA", "ADM0NAME": "Botswana", "ADM0_A3": "BWA", "ADM1NAME": "South-East", "ISO_A2": "BW", "LATITUDE": -24.646313, "LONGITUDE": 25.911948, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 208411, "POP_MIN": 159243, "POP_OTHER": 158896, "RANK_MAX": 10, "RANK_MIN": 9, "GEONAMEID": 933773, "LS_NAME": "Gaborone", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 159243, "MAX_POP20": 159243, "MAX_POP50": 159243, "MAX_POP300": 159243, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 72, "MAX_AREAKM": 72, "MIN_AREAMI": 28, "MAX_AREAMI": 28, "MIN_PERKM": 59, "MAX_PERKM": 59, "MIN_PERMI": 37, "MAX_PERMI": 37, "MIN_BBXMIN": 25.858333, "MAX_BBXMIN": 25.858333, "MIN_BBXMAX": 25.991667, "MAX_BBXMAX": 25.991667, "MIN_BBYMIN": -24.7, "MAX_BBYMIN": -24.7, "MIN_BBYMAX": -24.6, "MAX_BBYMAX": -24.6, "MEAN_BBXC": 25.925091, "MEAN_BBYC": -24.656793, "COMPARE": 0, "GN_ASCII": "Gaborone", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 9, "GN_POP": 208411, "ELEVATION": 0, "GTOPO30": 1006, "TIMEZONE": "Africa/Gaborone", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 25.927734, -24.607069 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 0, "FEATURECLA": "Admin-0 capital", "NAME": "Victoria", "DIFFASCII": 0, "NAMEASCII": "Victoria", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Seychelles", "SOV_A3": "SYC", "ADM0NAME": "Seychelles", "ADM0_A3": "SYC", "ISO_A2": "SC", "LATITUDE": -4.616632, "LONGITUDE": 55.44999, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 33576, "POP_MIN": 22881, "POP_OTHER": 33737, "RANK_MAX": 7, "RANK_MIN": 7, "GEONAMEID": 241131, "LS_NAME": "Victoria4", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 33576, "MAX_POP20": 33576, "MAX_POP50": 33576, "MAX_POP300": 33576, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 15, "MAX_AREAKM": 15, "MIN_AREAMI": 6, "MAX_AREAMI": 6, "MIN_PERKM": 26, "MAX_PERKM": 26, "MIN_PERMI": 16, "MAX_PERMI": 16, "MIN_BBXMIN": 55.416667, "MAX_BBXMIN": 55.416667, "MIN_BBXMAX": 55.475, "MAX_BBXMAX": 55.475, "MIN_BBYMIN": -4.65, "MAX_BBYMIN": -4.65, "MIN_BBYMAX": -4.6, "MAX_BBYMAX": -4.6, "MEAN_BBXC": 55.45, "MEAN_BBYC": -4.626389, "COMPARE": 0, "GN_ASCII": "Victoria", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 0, "GN_POP": 22881, "ELEVATION": 0, "GTOPO30": -9999, "TIMEZONE": "Indian/Mahe", "GEONAMESNO": "GeoNames match general + researched.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 55.458984, -4.653080 ] } }
|
||||
,
|
||||
@@ -235,7 +234,7 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 1, "FEATURECLA": "Admin-0 capital", "NAME": "Brasilia", "NAMEALT": "Brasília", "DIFFASCII": 0, "NAMEASCII": "Brasilia", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Brazil", "SOV_A3": "BRA", "ADM0NAME": "Brazil", "ADM0_A3": "BRA", "ADM1NAME": "Distrito Federal", "ISO_A2": "BR", "LATITUDE": -15.78334, "LONGITUDE": -47.916052, "CHANGED": 5, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 3716996, "POP_MIN": 2562963, "POP_OTHER": 1772679, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 3469058, "MEGANAME": "Brasília", "LS_NAME": "Brasilia", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1838722, "MAX_POP20": 1836390, "MAX_POP50": 1838722, "MAX_POP300": 1838722, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 436, "MAX_AREAKM": 439, "MIN_AREAMI": 168, "MAX_AREAMI": 169, "MIN_PERKM": 311, "MAX_PERKM": 318, "MIN_PERMI": 193, "MAX_PERMI": 197, "MIN_BBXMIN": -48.158333, "MAX_BBXMIN": -48.158333, "MIN_BBXMAX": -47.783333, "MAX_BBXMAX": -47.783333, "MIN_BBYMIN": -15.941667, "MAX_BBYMIN": -15.941667, "MIN_BBYMAX": -15.7, "MAX_BBYMAX": -15.7, "MEAN_BBXC": -47.9714, "MEAN_BBYC": -15.824583, "COMPARE": 0, "GN_ASCII": "Brasilia", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 7, "GN_POP": 2207718, "ELEVATION": 0, "GTOPO30": 1092, "TIMEZONE": "America/Sao_Paulo", "GEONAMESNO": "GeoNames match general.", "UN_FID": 472, "UN_ADM0": "Brazil", "UN_LAT": -15.79, "UN_LONG": -47.89, "POP1950": 36, "POP1955": 70, "POP1960": 137, "POP1965": 268, "POP1970": 525, "POP1975": 827, "POP1980": 1293, "POP1985": 1559, "POP1990": 1863, "POP1995": 2257, "POP2000": 2746, "POP2005": 3341, "POP2010": 3599, "POP2015": 3938, "POP2020": 4284, "POP2025": 4463, "POP2050": 4578, "CITYALT": "Brasilia" }, "geometry": { "type": "Point", "coordinates": [ -47.922363, -15.771109 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 1, "NATSCALE": 300, "LABELRANK": 3, "FEATURECLA": "Admin-0 capital", "NAME": "Buenos Aires", "DIFFASCII": 0, "NAMEASCII": "Buenos Aires", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "Argentina", "SOV_A3": "ARG", "ADM0NAME": "Argentina", "ADM0_A3": "ARG", "ADM1NAME": "Ciudad de Buenos Aires", "ISO_A2": "AR", "LATITUDE": -34.602502, "LONGITUDE": -58.397531, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 12795000, "POP_MIN": 10929146, "POP_OTHER": 10271457, "RANK_MAX": 14, "RANK_MIN": 14, "GEONAMEID": 3435910, "MEGANAME": "Buenos Aires", "LS_NAME": "Buenos Aires", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 10929146, "MAX_POP20": 10991915, "MAX_POP50": 12611862, "MAX_POP300": 12611862, "MAX_POP310": 12611862, "MAX_NATSCA": 300, "MIN_AREAKM": 1675, "MAX_AREAKM": 2447, "MIN_AREAMI": 647, "MAX_AREAMI": 945, "MIN_PERKM": 570, "MAX_PERKM": 1064, "MIN_PERMI": 354, "MAX_PERMI": 661, "MIN_BBXMIN": -59.016667, "MAX_BBXMIN": -58.757731, "MIN_BBXMAX": -58.175, "MAX_BBXMAX": -57.816667, "MIN_BBYMIN": -35.008333, "MAX_BBYMIN": -35.008333, "MIN_BBYMAX": -34.375, "MAX_BBYMAX": -34.366667, "MEAN_BBXC": -58.50845, "MEAN_BBYC": -34.681331, "COMPARE": 0, "GN_ASCII": "Buenos Aires", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 7, "GN_POP": 13076300, "ELEVATION": 0, "GTOPO30": 13, "TIMEZONE": "America/Argentina/Buenos_Aires", "GEONAMESNO": "GeoNames match general.", "UN_FID": 201, "UN_ADM0": "Argentina", "UN_LAT": -34.62, "UN_LONG": -58.44, "POP1950": 5098, "POP1955": 5799, "POP1960": 6598, "POP1965": 7317, "POP1970": 8105, "POP1975": 8745, "POP1980": 9422, "POP1985": 9959, "POP1990": 10513, "POP1995": 11154, "POP2000": 11847, "POP2005": 12553, "POP2010": 12795, "POP2015": 13089, "POP2020": 13432, "POP2025": 13653, "POP2050": 13768 }, "geometry": { "type": "Point", "coordinates": [ -58.403320, -34.597042 ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 0, "NATSCALE": 600, "LABELRANK": 1, "FEATURECLA": "Admin-1 capital", "NAME": "Sao Paulo", "NAMEALT": "Sao Paulo|São Paulo", "DIFFASCII": 0, "NAMEASCII": "Sao Paulo", "ADM0CAP": 0, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "Brazil", "SOV_A3": "BRA", "ADM0NAME": "Brazil", "ADM0_A3": "BRA", "ADM1NAME": "São Paulo", "ISO_A2": "BR", "LATITUDE": -23.55868, "LONGITUDE": -46.62502, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 18845000, "POP_MIN": 10021295, "POP_OTHER": 11522944, "RANK_MAX": 14, "RANK_MIN": 14, "GEONAMEID": 3448439, "MEGANAME": "São Paulo", "LS_NAME": "Sao Paolo", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 12495084, "MAX_POP20": 17425624, "MAX_POP50": 18203351, "MAX_POP300": 18203351, "MAX_POP310": 18203351, "MAX_NATSCA": 300, "MIN_AREAKM": 1434, "MAX_AREAKM": 2667, "MIN_AREAMI": 554, "MAX_AREAMI": 1030, "MIN_PERKM": 532, "MAX_PERKM": 1086, "MIN_PERMI": 330, "MAX_PERMI": 675, "MIN_BBXMIN": -47.058333, "MAX_BBXMIN": -47.056372, "MIN_BBXMAX": -46.383333, "MAX_BBXMAX": -46.108333, "MIN_BBYMIN": -23.891667, "MAX_BBYMIN": -23.842331, "MIN_BBYMAX": -23.358333, "MAX_BBYMAX": -23.241667, "MEAN_BBXC": -46.651489, "MEAN_BBYC": -23.558961, "COMPARE": 0, "GN_ASCII": "Sao Paulo", "FEATURE_CL": "P", "FEATURE_CO": "PPLA", "ADMIN1_COD": 27, "GN_POP": 10021295, "ELEVATION": 0, "GTOPO30": 631, "TIMEZONE": "America/Sao_Paulo", "GEONAMESNO": "GeoNames match general.", "UN_FID": 491, "UN_ADM0": "Brazil", "UN_LAT": -23.58, "UN_LONG": -46.62, "POP1950": 2334, "POP1955": 3044, "POP1960": 3970, "POP1965": 5494, "POP1970": 7620, "POP1975": 9614, "POP1980": 12089, "POP1985": 13395, "POP1990": 14776, "POP1995": 15948, "POP2000": 17099, "POP2005": 18333, "POP2010": 18845, "POP2015": 19582, "POP2020": 20544, "POP2025": 21124, "POP2050": 21428, "CITYALT": "Sao Paulo" }, "geometry": { "type": "Point", "coordinates": [ -46.625977, -23.563987 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 0, "NATSCALE": 600, "LABELRANK": 1, "FEATURECLA": "Populated place", "NAME": "Rio de Janeiro", "DIFFASCII": 0, "NAMEASCII": "Rio de Janeiro", "ADM0CAP": 0, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "Brazil", "SOV_A3": "BRA", "ADM0NAME": "Brazil", "ADM0_A3": "BRA", "ADM1NAME": "Rio de Janeiro", "ISO_A2": "BR", "LATITUDE": -22.925023, "LONGITUDE": -43.225021, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 11748000, "POP_MIN": 2010175, "POP_OTHER": 1821489, "RANK_MAX": 14, "RANK_MIN": 12, "GEONAMEID": 3451190, "MEGANAME": "Rio de Janeiro", "LS_NAME": "Rio de Janeiro", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 2010175, "MAX_POP20": 8118691, "MAX_POP50": 8889292, "MAX_POP300": 8889292, "MAX_POP310": 8889292, "MAX_NATSCA": 300, "MIN_AREAKM": 316, "MAX_AREAKM": 1472, "MIN_AREAMI": 122, "MAX_AREAMI": 568, "MIN_PERKM": 203, "MAX_PERKM": 691, "MIN_PERMI": 126, "MAX_PERMI": 429, "MIN_BBXMIN": -43.75, "MAX_BBXMIN": -43.499182, "MIN_BBXMAX": -43.158333, "MAX_BBXMAX": -43.15, "MIN_BBYMIN": -23.033333, "MAX_BBYMIN": -23.033333, "MIN_BBYMAX": -22.837896, "MAX_BBYMAX": -22.575, "MEAN_BBXC": -43.407551, "MEAN_BBYC": -22.856463, "COMPARE": 0, "GN_ASCII": "Rio de Janeiro", "FEATURE_CL": "P", "FEATURE_CO": "PPLA", "ADMIN1_COD": 21, "GN_POP": 6023699, "ELEVATION": 0, "GTOPO30": 19, "TIMEZONE": "America/Sao_Paulo", "GEONAMESNO": "Geonames ascii name + lat.d + long.d matching.", "UN_FID": 489, "UN_ADM0": "Brazil", "UN_LAT": -22.72, "UN_LONG": -43.45, "POP1950": 2950, "POP1955": 3592, "POP1960": 4374, "POP1965": 5387, "POP1970": 6637, "POP1975": 7557, "POP1980": 8583, "POP1985": 9086, "POP1990": 9595, "POP1995": 10174, "POP2000": 10803, "POP2005": 11469, "POP2010": 11748, "POP2015": 12171, "POP2020": 12775, "POP2025": 13179, "POP2050": 13413 }, "geometry": { "type": "Point", "coordinates": [ -43.220215, -22.917923 ] } }
|
||||
] }
|
||||
@@ -267,7 +266,7 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 1, "NATSCALE": 300, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital", "NAME": "Dakar", "DIFFASCII": 0, "NAMEASCII": "Dakar", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Senegal", "SOV_A3": "SEN", "ADM0NAME": "Senegal", "ADM0_A3": "SEN", "ADM1NAME": "Dakar", "ISO_A2": "SM", "LATITUDE": 14.715832, "LONGITUDE": -17.47313, "CHANGED": 5, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 2604000, "POP_MIN": 2476400, "POP_OTHER": 2470140, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 2253354, "MEGANAME": "Dakar", "LS_NAME": "Dakar", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 2635239, "MAX_POP20": 2634882, "MAX_POP50": 2660614, "MAX_POP300": 2660614, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 257, "MAX_AREAKM": 302, "MIN_AREAMI": 99, "MAX_AREAMI": 117, "MIN_PERKM": 222, "MAX_PERKM": 288, "MIN_PERMI": 138, "MAX_PERMI": 179, "MIN_BBXMIN": -17.533333, "MAX_BBXMIN": -17.533333, "MIN_BBXMAX": -17.2, "MAX_BBXMAX": -17.125, "MIN_BBYMIN": 14.65, "MAX_BBYMIN": 14.65, "MIN_BBYMAX": 14.825, "MAX_BBYMAX": 14.825, "MEAN_BBXC": -17.343779, "MEAN_BBYC": 14.742828, "COMPARE": 0, "GN_ASCII": "Dakar", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 1, "GN_POP": 2476400, "ELEVATION": 0, "GTOPO30": 14, "TIMEZONE": "Africa/Dakar", "GEONAMESNO": "GeoNames match general.", "UN_FID": 447, "UN_ADM0": "Senegal", "UN_LAT": 14.68, "UN_LONG": -17.45, "POP1950": 211, "POP1955": 235, "POP1960": 359, "POP1965": 473, "POP1970": 610, "POP1975": 782, "POP1980": 957, "POP1985": 1162, "POP1990": 1405, "POP1995": 1688, "POP2000": 2029, "POP2005": 2434, "POP2010": 2604, "POP2015": 2856, "POP2020": 3275, "POP2025": 3726, "POP2050": 4225 }, "geometry": { "type": "Point", "coordinates": [ -17.468262, 14.711135 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 6, "FEATURECLA": "Admin-0 capital", "NAME": "Bamako", "DIFFASCII": 0, "NAMEASCII": "Bamako", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Mali", "SOV_A3": "MLI", "ADM0NAME": "Mali", "ADM0_A3": "MLI", "ADM1NAME": "Bamako", "ISO_A2": "ML", "LATITUDE": 12.650015, "LONGITUDE": -8.000039, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 1494000, "POP_MIN": 1297281, "POP_OTHER": 1301407, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 2460596, "MEGANAME": "Bamako", "LS_NAME": "Bamako", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1316564, "MAX_POP20": 1316564, "MAX_POP50": 1316564, "MAX_POP300": 1316564, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 172, "MAX_AREAKM": 172, "MIN_AREAMI": 66, "MAX_AREAMI": 66, "MIN_PERKM": 106, "MAX_PERKM": 106, "MIN_PERMI": 66, "MAX_PERMI": 66, "MIN_BBXMIN": -8.058333, "MAX_BBXMIN": -8.058333, "MIN_BBXMAX": -7.908333, "MAX_BBXMAX": -7.908333, "MIN_BBYMIN": 12.541667, "MAX_BBYMIN": 12.541667, "MIN_BBYMAX": 12.716667, "MAX_BBYMAX": 12.716667, "MEAN_BBXC": -7.987419, "MEAN_BBYC": 12.626173, "COMPARE": 0, "GN_ASCII": "Bamako", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 1, "GN_POP": 1297281, "ELEVATION": 0, "GTOPO30": 350, "TIMEZONE": "Africa/Bamako", "GEONAMESNO": "GeoNames match general.", "UN_FID": 349, "UN_ADM0": "Mali", "UN_LAT": 12.65, "UN_LONG": -7.98, "POP1950": 89, "POP1955": 111, "POP1960": 130, "POP1965": 158, "POP1970": 222, "POP1975": 363, "POP1980": 489, "POP1985": 608, "POP1990": 746, "POP1995": 910, "POP2000": 1110, "POP2005": 1368, "POP2010": 1494, "POP2015": 1708, "POP2020": 2130, "POP2025": 2633, "POP2050": 3214 }, "geometry": { "type": "Point", "coordinates": [ -7.998047, 12.661778 ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital", "NAME": "Ouagadougou", "DIFFASCII": 0, "NAMEASCII": "Ouagadougou", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Burkina Faso", "SOV_A3": "BFA", "ADM0NAME": "Burkina Faso", "ADM0_A3": "BFA", "ADM1NAME": "Kadiogo", "ISO_A2": "BF", "LATITUDE": 12.370316, "LONGITUDE": -1.524724, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 1149000, "POP_MIN": 835457, "POP_OTHER": 713874, "RANK_MAX": 12, "RANK_MIN": 11, "GEONAMEID": 2357048, "MEGANAME": "Ouagadougou", "LS_NAME": "Ouagadougou", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 835457, "MAX_POP20": 835457, "MAX_POP50": 835457, "MAX_POP300": 835457, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 236, "MAX_AREAKM": 236, "MIN_AREAMI": 91, "MAX_AREAMI": 91, "MIN_PERKM": 133, "MAX_PERKM": 133, "MIN_PERMI": 83, "MAX_PERMI": 83, "MIN_BBXMIN": -1.616667, "MAX_BBXMIN": -1.616667, "MIN_BBXMAX": -1.433333, "MAX_BBXMAX": -1.433333, "MIN_BBYMIN": 12.275, "MAX_BBYMIN": 12.275, "MIN_BBYMAX": 12.483333, "MAX_BBYMAX": 12.483333, "MEAN_BBXC": -1.521746, "MEAN_BBYC": 12.365975, "COMPARE": 0, "GN_ASCII": "Ouagadougou", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 53, "GN_POP": 1086505, "ELEVATION": 0, "GTOPO30": 307, "TIMEZONE": "Africa/Ouagadougou", "GEONAMESNO": "GeoNames match general.", "UN_FID": 578, "UN_ADM0": "Burkina Faso", "UN_LAT": 12.48, "UN_LONG": -1.67, "POP1950": 33, "POP1955": 46, "POP1960": 59, "POP1965": 82, "POP1970": 111, "POP1975": 149, "POP1980": 257, "POP1985": 424, "POP1990": 537, "POP1995": 667, "POP2000": 828, "POP2005": 1044, "POP2010": 1149, "POP2015": 1324, "POP2020": 1676, "POP2025": 2111, "POP2050": 2632 }, "geometry": { "type": "Point", "coordinates": [ -1.516113, 12.382928 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 7, "FEATURECLA": "Admin-0 capital", "NAME": "Quito", "DIFFASCII": 0, "NAMEASCII": "Quito", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Ecuador", "SOV_A3": "ECU", "ADM0NAME": "Ecuador", "ADM0_A3": "ECU", "ADM1NAME": "Pichincha", "ISO_A2": "EC", "LATITUDE": -0.214988, "LONGITUDE": -78.500051, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 1701000, "POP_MIN": 1399814, "POP_OTHER": 1435528, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 3652462, "MEGANAME": "Quito", "LS_NAME": "Quito", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1472051, "MAX_POP20": 1892286, "MAX_POP50": 1892286, "MAX_POP300": 1892286, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 334, "MAX_AREAKM": 496, "MIN_AREAMI": 129, "MAX_AREAMI": 191, "MIN_PERKM": 233, "MAX_PERKM": 359, "MIN_PERMI": 145, "MAX_PERMI": 223, "MIN_BBXMIN": -78.591667, "MAX_BBXMIN": -78.591667, "MIN_BBXMAX": -78.291667, "MAX_BBXMAX": -78.291667, "MIN_BBYMIN": -0.391667, "MAX_BBYMIN": -0.30257, "MIN_BBYMAX": 0.025, "MAX_BBYMAX": 0.025, "MEAN_BBXC": -78.460061, "MEAN_BBYC": -0.198438, "COMPARE": 0, "GN_ASCII": "Quito", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 18, "GN_POP": 1399814, "ELEVATION": 0, "GTOPO30": 2764, "TIMEZONE": "America/Guayaquil", "GEONAMESNO": "GeoNames match general.", "UN_FID": 178, "UN_ADM0": "Ecuador", "UN_LAT": -0.22, "UN_LONG": -78.52, "POP1950": 206, "POP1955": 257, "POP1960": 319, "POP1965": 399, "POP1970": 501, "POP1975": 628, "POP1980": 780, "POP1985": 936, "POP1990": 1088, "POP1995": 1217, "POP2000": 1357, "POP2005": 1593, "POP2010": 1701, "POP2015": 1846, "POP2020": 2035, "POP2025": 2189, "POP2050": 2316 }, "geometry": { "type": "Point", "coordinates": [ -78.508301, -0.219726 ] } }
|
||||
,
|
||||
@@ -287,9 +286,9 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 6, "FEATURECLA": "Admin-0 capital", "NAME": "Windhoek", "DIFFASCII": 0, "NAMEASCII": "Windhoek", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Namibia", "SOV_A3": "NAM", "ADM0NAME": "Namibia", "ADM0_A3": "NAM", "ADM1NAME": "Khomas", "ISO_A2": "NA", "LATITUDE": -22.570006, "LONGITUDE": 17.083546, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 268132, "POP_MIN": 262796, "POP_OTHER": 262796, "RANK_MAX": 10, "RANK_MIN": 10, "GEONAMEID": 3352136, "LS_NAME": "Windhoek", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 262796, "MAX_POP20": 262796, "MAX_POP50": 262796, "MAX_POP300": 262796, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 89, "MAX_AREAKM": 89, "MIN_AREAMI": 35, "MAX_AREAMI": 35, "MIN_PERKM": 60, "MAX_PERKM": 60, "MIN_PERMI": 37, "MAX_PERMI": 37, "MIN_BBXMIN": 17.008333, "MAX_BBXMIN": 17.008333, "MIN_BBXMAX": 17.116667, "MAX_BBXMAX": 17.116667, "MIN_BBYMIN": -22.625, "MAX_BBYMIN": -22.625, "MIN_BBYMAX": -22.491667, "MAX_BBYMAX": -22.491667, "MEAN_BBXC": 17.064196, "MEAN_BBYC": -22.551143, "COMPARE": 0, "GN_ASCII": "Windhoek", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 21, "GN_POP": 268132, "ELEVATION": 0, "GTOPO30": 1722, "TIMEZONE": "Africa/Windhoek", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 17.072754, -22.573438 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 4, "NATSCALE": 50, "LABELRANK": 0, "FEATURECLA": "Admin-0 capital", "NAME": "Kigali", "DIFFASCII": 0, "NAMEASCII": "Kigali", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Rwanda", "SOV_A3": "RWA", "ADM0NAME": "Rwanda", "ADM0_A3": "RWA", "ADM1NAME": "Kigali City", "ISO_A2": "RW", "LATITUDE": -1.95359, "LONGITUDE": 30.060532, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 860000, "POP_MIN": 745261, "POP_OTHER": 1152904, "RANK_MAX": 11, "RANK_MIN": 11, "GEONAMEID": 202061, "MEGANAME": "Kigali", "LS_NAME": "Kigali", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1046787, "MAX_POP20": 2263899, "MAX_POP50": 5065653, "MAX_POP300": 7102391, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 601, "MAX_AREAKM": 8753, "MIN_AREAMI": 232, "MAX_AREAMI": 3380, "MIN_PERKM": 735, "MAX_PERKM": 9184, "MIN_PERMI": 457, "MAX_PERMI": 5707, "MIN_BBXMIN": 29.166667, "MAX_BBXMIN": 29.833333, "MIN_BBXMAX": 30.233333, "MAX_BBXMAX": 30.475, "MIN_BBYMIN": -2.991667, "MAX_BBYMIN": -2.075, "MIN_BBYMAX": -1.76663, "MAX_BBYMAX": -1.075, "MEAN_BBXC": 29.913775, "MEAN_BBYC": -2.034427, "COMPARE": 0, "GN_ASCII": "Kigali", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 9, "GN_POP": 745261, "ELEVATION": 0, "GTOPO30": 1568, "TIMEZONE": "Africa/Kigali", "GEONAMESNO": "GeoNames match general.", "UN_FID": 439, "UN_ADM0": "Rwanda", "UN_LAT": -1.95, "UN_LONG": 30.05, "POP1950": 18, "POP1955": 25, "POP1960": 34, "POP1965": 45, "POP1970": 59, "POP1975": 90, "POP1980": 128, "POP1985": 168, "POP1990": 219, "POP1995": 289, "POP2000": 497, "POP2005": 775, "POP2010": 860, "POP2015": 947, "POP2020": 1152, "POP2025": 1413, "POP2050": 1715 }, "geometry": { "type": "Point", "coordinates": [ 30.058594, -1.955187 ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 6, "FEATURECLA": "Admin-0 capital", "NAME": "Lusaka", "DIFFASCII": 0, "NAMEASCII": "Lusaka", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Zambia", "SOV_A3": "ZMB", "ADM0NAME": "Zambia", "ADM0_A3": "ZMB", "ADM1NAME": "Lusaka", "ISO_A2": "ZM", "LATITUDE": -15.416644, "LONGITUDE": 28.283328, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 1328000, "POP_MIN": 1267440, "POP_OTHER": 1240558, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 909137, "MEGANAME": "Lusaka", "LS_NAME": "Lusaka", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1289566, "MAX_POP20": 1289566, "MAX_POP50": 1289566, "MAX_POP300": 1289566, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 183, "MAX_AREAKM": 183, "MIN_AREAMI": 71, "MAX_AREAMI": 71, "MIN_PERKM": 122, "MAX_PERKM": 122, "MIN_PERMI": 76, "MAX_PERMI": 76, "MIN_BBXMIN": 28.225, "MAX_BBXMIN": 28.225, "MIN_BBXMAX": 28.416667, "MAX_BBXMAX": 28.416667, "MIN_BBYMIN": -15.483333, "MAX_BBYMIN": -15.483333, "MIN_BBYMAX": -15.333333, "MAX_BBYMAX": -15.333333, "MEAN_BBXC": 28.308596, "MEAN_BBYC": -15.403941, "COMPARE": 0, "GN_ASCII": "Lusaka", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 9, "GN_POP": 1267440, "ELEVATION": 0, "GTOPO30": 1277, "TIMEZONE": "Africa/Lusaka", "GEONAMESNO": "GeoNames match general.", "UN_FID": 589, "UN_ADM0": "Zambia", "UN_LAT": -15.42, "UN_LONG": 28.17, "POP1950": 31, "POP1955": 53, "POP1960": 91, "POP1965": 160, "POP1970": 278, "POP1975": 385, "POP1980": 533, "POP1985": 636, "POP1990": 757, "POP1995": 902, "POP2000": 1073, "POP2005": 1261, "POP2010": 1328, "POP2015": 1421, "POP2020": 1587, "POP2025": 1797, "POP2050": 2047 }, "geometry": { "type": "Point", "coordinates": [ 28.278809, -15.411319 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital", "NAME": "Lilongwe", "DIFFASCII": 0, "NAMEASCII": "Lilongwe", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Malawi", "SOV_A3": "MWI", "ADM0NAME": "Malawi", "ADM0_A3": "MWI", "ADM1NAME": "Lilongwe", "ISO_A2": "MW", "LATITUDE": -13.983295, "LONGITUDE": 33.783302, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 646750, "POP_MIN": 646750, "POP_OTHER": 1061388, "RANK_MAX": 11, "RANK_MIN": 11, "GEONAMEID": 927967, "LS_NAME": "Lilongwe", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 965164, "MAX_POP20": 912521, "MAX_POP50": 989470, "MAX_POP300": 989470, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 1100, "MAX_AREAKM": 1373, "MIN_AREAMI": 425, "MAX_AREAMI": 530, "MIN_PERKM": 1360, "MAX_PERKM": 1658, "MIN_PERMI": 845, "MAX_PERMI": 1030, "MIN_BBXMIN": 33.508333, "MAX_BBXMIN": 33.508333, "MIN_BBXMAX": 34.187755, "MAX_BBXMAX": 34.608333, "MIN_BBYMIN": -14.433333, "MAX_BBYMIN": -14.408333, "MIN_BBYMAX": -13.691667, "MAX_BBYMAX": -13.641667, "MEAN_BBXC": 33.888699, "MEAN_BBYC": -14.028166, "COMPARE": 0, "GN_ASCII": "Lilongwe", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 11, "GN_POP": 646750, "ELEVATION": 0, "GTOPO30": 1025, "TIMEZONE": "Africa/Blantyre", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 33.793945, -13.987376 ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 7, "FEATURECLA": "Admin-0 capital", "NAME": "Gaborone", "DIFFASCII": 0, "NAMEASCII": "Gaborone", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Botswana", "SOV_A3": "BWA", "ADM0NAME": "Botswana", "ADM0_A3": "BWA", "ADM1NAME": "South-East", "ISO_A2": "BW", "LATITUDE": -24.646313, "LONGITUDE": 25.911948, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 208411, "POP_MIN": 159243, "POP_OTHER": 158896, "RANK_MAX": 10, "RANK_MIN": 9, "GEONAMEID": 933773, "LS_NAME": "Gaborone", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 159243, "MAX_POP20": 159243, "MAX_POP50": 159243, "MAX_POP300": 159243, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 72, "MAX_AREAKM": 72, "MIN_AREAMI": 28, "MAX_AREAMI": 28, "MIN_PERKM": 59, "MAX_PERKM": 59, "MIN_PERMI": 37, "MAX_PERMI": 37, "MIN_BBXMIN": 25.858333, "MAX_BBXMIN": 25.858333, "MIN_BBXMAX": 25.991667, "MAX_BBXMAX": 25.991667, "MIN_BBYMIN": -24.7, "MAX_BBYMIN": -24.7, "MIN_BBYMAX": -24.6, "MAX_BBYMAX": -24.6, "MEAN_BBXC": 25.925091, "MEAN_BBYC": -24.656793, "COMPARE": 0, "GN_ASCII": "Gaborone", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 9, "GN_POP": 208411, "ELEVATION": 0, "GTOPO30": 1006, "TIMEZONE": "Africa/Gaborone", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 25.905762, -24.647017 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 0, "FEATURECLA": "Admin-0 capital", "NAME": "Victoria", "DIFFASCII": 0, "NAMEASCII": "Victoria", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Seychelles", "SOV_A3": "SYC", "ADM0NAME": "Seychelles", "ADM0_A3": "SYC", "ISO_A2": "SC", "LATITUDE": -4.616632, "LONGITUDE": 55.44999, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 33576, "POP_MIN": 22881, "POP_OTHER": 33737, "RANK_MAX": 7, "RANK_MIN": 7, "GEONAMEID": 241131, "LS_NAME": "Victoria4", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 33576, "MAX_POP20": 33576, "MAX_POP50": 33576, "MAX_POP300": 33576, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 15, "MAX_AREAKM": 15, "MIN_AREAMI": 6, "MAX_AREAMI": 6, "MIN_PERKM": 26, "MAX_PERKM": 26, "MIN_PERMI": 16, "MAX_PERMI": 16, "MIN_BBXMIN": 55.416667, "MAX_BBXMIN": 55.416667, "MIN_BBXMAX": 55.475, "MAX_BBXMAX": 55.475, "MIN_BBYMIN": -4.65, "MAX_BBYMIN": -4.65, "MIN_BBYMAX": -4.6, "MAX_BBYMAX": -4.6, "MEAN_BBXC": 55.45, "MEAN_BBYC": -4.626389, "COMPARE": 0, "GN_ASCII": "Victoria", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 0, "GN_POP": 22881, "ELEVATION": 0, "GTOPO30": -9999, "TIMEZONE": "Indian/Mahe", "GEONAMESNO": "GeoNames match general + researched.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 55.458984, -4.609278 ] } }
|
||||
,
|
||||
@@ -307,33 +306,31 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 4, "NATSCALE": 50, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital alt", "NAME": "The Hague", "DIFFASCII": 0, "NAMEASCII": "The Hague", "ADM0CAP": 0, "CAPALT": 1, "CAPIN": "Official, legis", "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Kingdom of the Netherlands", "SOV_A3": "NLD", "ADM0NAME": "Netherlands", "ADM0_A3": "NLD", "ADM1NAME": "Zuid-Holland", "ISO_A2": "NL", "LATITUDE": 52.080037, "LONGITUDE": 4.269961, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 1406000, "POP_MIN": 501725, "POP_OTHER": 688599, "RANK_MAX": 12, "RANK_MIN": 11, "GEONAMEID": 2747373, "LS_NAME": "The Hague", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 708489, "MAX_POP20": 708489, "MAX_POP50": 2312867, "MAX_POP300": 0, "MAX_POP310": 0, "MAX_NATSCA": 50, "MIN_AREAKM": 195, "MAX_AREAKM": 710, "MIN_AREAMI": 75, "MAX_AREAMI": 274, "MIN_PERKM": 217, "MAX_PERKM": 764, "MIN_PERMI": 135, "MAX_PERMI": 475, "MIN_BBXMIN": 4.15, "MAX_BBXMIN": 4.15, "MIN_BBXMAX": 4.45, "MAX_BBXMAX": 4.749141, "MIN_BBYMIN": 51.766667, "MAX_BBYMIN": 51.958333, "MIN_BBYMAX": 52.158333, "MAX_BBYMAX": 52.158333, "MEAN_BBXC": 4.355912, "MEAN_BBYC": 52.021475, "COMPARE": 0, "GN_ASCII": "Den Haag", "FEATURE_CL": "P", "FEATURE_CO": "PPLG", "ADMIN1_COD": 11, "GN_POP": 474292, "ELEVATION": 0, "GTOPO30": 1, "TIMEZONE": "Europe/Amsterdam", "GEONAMESNO": "GeoNames rough area, rough name.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 4.262695, 52.079506 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 7, "FEATURECLA": "Admin-0 capital", "NAME": "Prague", "NAMEPAR": "Praha", "DIFFASCII": 0, "NAMEASCII": "Prague", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "Czech Republic", "SOV_A3": "CZE", "ADM0NAME": "Czech Republic", "ADM0_A3": "CZE", "ADM1NAME": "Prague", "ISO_A2": "CZ", "LATITUDE": 50.083337, "LONGITUDE": 14.46598, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 1162000, "POP_MIN": 2087, "POP_OTHER": 1088042, "RANK_MAX": 12, "RANK_MIN": 4, "GEONAMEID": 4548393, "MEGANAME": "Praha", "LS_NAME": "Prague", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1115771, "MAX_POP20": 1115771, "MAX_POP50": 1115771, "MAX_POP300": 1115771, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 317, "MAX_AREAKM": 317, "MIN_AREAMI": 122, "MAX_AREAMI": 122, "MIN_PERKM": 249, "MAX_PERKM": 249, "MIN_PERMI": 155, "MAX_PERMI": 155, "MIN_BBXMIN": 14.266667, "MAX_BBXMIN": 14.266667, "MIN_BBXMAX": 14.616667, "MAX_BBXMAX": 14.616667, "MIN_BBYMIN": 49.95, "MAX_BBYMIN": 49.95, "MIN_BBYMAX": 50.183333, "MAX_BBYMAX": 50.183333, "MEAN_BBXC": 14.445557, "MEAN_BBYC": 50.073451, "COMPARE": 0, "GN_ASCII": "Prague", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 0, "GN_POP": 2087, "ELEVATION": 308, "GTOPO30": 306, "TIMEZONE": "America/Chicago", "GEONAMESNO": "GeoNames match general.", "UN_FID": 173, "UN_ADM0": "Czech Republic", "UN_LAT": 50.1, "UN_LONG": 14.45, "POP1950": 935, "POP1955": 967, "POP1960": 1001, "POP1965": 1038, "POP1970": 1076, "POP1975": 1126, "POP1980": 1179, "POP1985": 1197, "POP1990": 1212, "POP1995": 1194, "POP2000": 1172, "POP2005": 1164, "POP2010": 1162, "POP2015": 1160, "POP2020": 1159, "POP2025": 1159, "POP2050": 1159, "CITYALT": "Prague" }, "geometry": { "type": "Point", "coordinates": [ 14.458008, 50.078295 ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 5, "FEATURECLA": "Admin-0 capital", "NAME": "Warsaw", "NAMEPAR": "Warszawa", "DIFFASCII": 0, "NAMEASCII": "Warsaw", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "Poland", "SOV_A3": "POL", "ADM0NAME": "Poland", "ADM0_A3": "POL", "ADM1NAME": "Masovian", "ISO_A2": "PL", "LATITUDE": 52.250001, "LONGITUDE": 21, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 1707000, "POP_MIN": 1702139, "POP_OTHER": 2012431, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 756135, "MEGANAME": "Warszawa", "LS_NAME": "Warsaw", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 2129163, "MAX_POP20": 2129163, "MAX_POP50": 2129163, "MAX_POP300": 2129163, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 802, "MAX_AREAKM": 802, "MIN_AREAMI": 310, "MAX_AREAMI": 310, "MIN_PERKM": 759, "MAX_PERKM": 759, "MIN_PERMI": 471, "MAX_PERMI": 471, "MIN_BBXMIN": 20.666667, "MAX_BBXMIN": 20.666667, "MIN_BBXMAX": 21.358333, "MAX_BBXMAX": 21.358333, "MIN_BBYMIN": 52.033333, "MAX_BBYMIN": 52.033333, "MIN_BBYMAX": 52.433333, "MAX_BBYMAX": 52.433333, "MEAN_BBXC": 21.031458, "MEAN_BBYC": 52.230916, "COMPARE": 0, "GN_ASCII": "Warsaw", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 78, "GN_POP": 1702139, "ELEVATION": 0, "GTOPO30": 94, "TIMEZONE": "Europe/Warsaw", "GEONAMESNO": "GeoNames match general.", "UN_FID": 418, "UN_ADM0": "Poland", "UN_LAT": 52.24, "UN_LONG": 21.01, "POP1950": 768, "POP1955": 942, "POP1960": 1119, "POP1965": 1212, "POP1970": 1300, "POP1975": 1444, "POP1980": 1565, "POP1985": 1596, "POP1990": 1628, "POP1995": 1652, "POP2000": 1666, "POP2005": 1693, "POP2010": 1707, "POP2015": 1724, "POP2020": 1735, "POP2025": 1736, "POP2050": 1736, "CITYALT": "Warsaw" }, "geometry": { "type": "Point", "coordinates": [ 21.005859, 52.254709 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 7, "FEATURECLA": "Admin-0 capital", "NAME": "Helsinki", "DIFFASCII": 0, "NAMEASCII": "Helsinki", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "Finland", "SOV_A3": "FIN", "ADM0NAME": "Finland", "ADM0_A3": "FIN", "ADM1NAME": "Southern Finland", "ISO_A2": "FI", "LATITUDE": 60.175563, "LONGITUDE": 24.934126, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 1115000, "POP_MIN": 558457, "POP_OTHER": 762958, "RANK_MAX": 12, "RANK_MIN": 11, "GEONAMEID": 658225, "MEGANAME": "Helsinki", "LS_NAME": "Helsinki", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 852233, "MAX_POP20": 852233, "MAX_POP50": 852233, "MAX_POP300": 852233, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 513, "MAX_AREAKM": 513, "MIN_AREAMI": 198, "MAX_AREAMI": 198, "MIN_PERKM": 550, "MAX_PERKM": 550, "MIN_PERMI": 342, "MAX_PERMI": 342, "MIN_BBXMIN": 24.558333, "MAX_BBXMIN": 24.558333, "MIN_BBXMAX": 25.191667, "MAX_BBXMAX": 25.191667, "MIN_BBYMIN": 60.116667, "MAX_BBYMIN": 60.116667, "MIN_BBYMAX": 60.433333, "MAX_BBYMAX": 60.433333, "MEAN_BBXC": 24.910042, "MEAN_BBYC": 60.254779, "COMPARE": 0, "GN_ASCII": "Helsinki", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 13, "GN_POP": 558457, "ELEVATION": 0, "GTOPO30": 23, "TIMEZONE": "Europe/Helsinki", "GEONAMESNO": "GeoNames match general.", "UN_FID": 183, "UN_ADM0": "Finland", "UN_LAT": 60.19, "UN_LONG": 24.97, "POP1950": 366, "POP1955": 405, "POP1960": 448, "POP1965": 478, "POP1970": 507, "POP1975": 582, "POP1980": 674, "POP1985": 724, "POP1990": 872, "POP1995": 943, "POP2000": 1019, "POP2005": 1094, "POP2010": 1115, "POP2015": 1139, "POP2020": 1169, "POP2025": 1195, "POP2050": 1220 }, "geometry": { "type": "Point", "coordinates": [ 24.938965, 60.174306 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital", "NAME": "Vilnius", "DIFFASCII": 0, "NAMEASCII": "Vilnius", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Lithuania", "SOV_A3": "LTU", "ADM0NAME": "Lithuania", "ADM0_A3": "LTU", "ADM1NAME": "Vilniaus", "ISO_A2": "LT", "LATITUDE": 54.683366, "LONGITUDE": 25.316635, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 542366, "POP_MIN": 507029, "POP_OTHER": 494356, "RANK_MAX": 11, "RANK_MIN": 11, "GEONAMEID": 593116, "LS_NAME": "Vilnius", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 507029, "MAX_POP20": 507029, "MAX_POP50": 507029, "MAX_POP300": 507029, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 126, "MAX_AREAKM": 126, "MIN_AREAMI": 49, "MAX_AREAMI": 49, "MIN_PERKM": 162, "MAX_PERKM": 162, "MIN_PERMI": 101, "MAX_PERMI": 101, "MIN_BBXMIN": 25.166667, "MAX_BBXMIN": 25.166667, "MIN_BBXMAX": 25.391667, "MAX_BBXMAX": 25.391667, "MIN_BBYMIN": 54.575, "MAX_BBYMIN": 54.575, "MIN_BBYMAX": 54.775, "MAX_BBYMAX": 54.775, "MEAN_BBXC": 25.259623, "MEAN_BBYC": 54.692063, "COMPARE": 0, "GN_ASCII": "Vilnius", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 65, "GN_POP": 542366, "ELEVATION": 0, "GTOPO30": 125, "TIMEZONE": "Europe/Vilnius", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 25.312500, 54.686534 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 0, "NATSCALE": 600, "LABELRANK": 2, "FEATURECLA": "Admin-0 capital", "NAME": "Moscow", "NAMEPAR": "Moskva", "DIFFASCII": 0, "NAMEASCII": "Moscow", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "Russia", "SOV_A3": "RUS", "ADM0NAME": "Russia", "ADM0_A3": "RUS", "ADM1NAME": "Moskva", "ISO_A2": "RU", "LATITUDE": 55.752164, "LONGITUDE": 37.615523, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 10452000, "POP_MIN": 10452000, "POP_OTHER": 10585385, "RANK_MAX": 14, "RANK_MIN": 14, "GEONAMEID": 524901, "MEGANAME": "Moskva", "LS_NAME": "Moscow", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 11029015, "MAX_POP20": 11030955, "MAX_POP50": 11547877, "MAX_POP300": 11547877, "MAX_POP310": 11547877, "MAX_NATSCA": 300, "MIN_AREAKM": 1434, "MAX_AREAKM": 1639, "MIN_AREAMI": 554, "MAX_AREAMI": 633, "MIN_PERKM": 875, "MAX_PERKM": 1135, "MIN_PERMI": 544, "MAX_PERMI": 705, "MIN_BBXMIN": 37.233333, "MAX_BBXMIN": 37.233333, "MIN_BBXMAX": 38.075401, "MAX_BBXMAX": 38.3, "MIN_BBYMIN": 55.341667, "MAX_BBYMIN": 55.533007, "MIN_BBYMAX": 56.075, "MAX_BBYMAX": 56.075, "MEAN_BBXC": 37.643636, "MEAN_BBYC": 55.754996, "COMPARE": 0, "GN_ASCII": "Moscow", "ADMIN1_COD": 0, "GN_POP": 0, "ELEVATION": 0, "GTOPO30": 0, "GEONAMESNO": "GeoNames match general + researched.", "UN_FID": 426, "UN_ADM0": "Russian Federation", "UN_LAT": 55.74, "UN_LONG": 37.7, "POP1950": 5356, "POP1955": 5749, "POP1960": 6170, "POP1965": 6622, "POP1970": 7106, "POP1975": 7623, "POP1980": 8136, "POP1985": 8580, "POP1990": 8987, "POP1995": 9201, "POP2000": 10016, "POP2005": 10416, "POP2010": 10452, "POP2015": 10495, "POP2020": 10524, "POP2025": 10526, "POP2050": 10526, "CITYALT": "Moscow" }, "geometry": { "type": "Point", "coordinates": [ 37.617188, 55.751849 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 5, "FEATURECLA": "Admin-0 capital", "NAME": "Algiers", "NAMEALT": "El Djazaïr", "DIFFASCII": 0, "NAMEASCII": "Algiers", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Algeria", "SOV_A3": "DZA", "ADM0NAME": "Algeria", "ADM0_A3": "DZA", "ADM1NAME": "Alger", "ISO_A2": "DZ", "LATITUDE": 36.763065, "LONGITUDE": 3.050553, "CHANGED": 5, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 3354000, "POP_MIN": 1977663, "POP_OTHER": 3332619, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 2507480, "MEGANAME": "El Djazaïr", "LS_NAME": "Algiers", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 3368320, "MAX_POP20": 3698473, "MAX_POP50": 4203253, "MAX_POP300": 4203253, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 886, "MAX_AREAKM": 1275, "MIN_AREAMI": 342, "MAX_AREAMI": 492, "MIN_PERKM": 798, "MAX_PERKM": 1192, "MIN_PERMI": 496, "MAX_PERMI": 741, "MIN_BBXMIN": 2.641667, "MAX_BBXMIN": 2.808333, "MIN_BBXMAX": 3.548211, "MAX_BBXMAX": 3.741667, "MIN_BBYMIN": 36.45, "MAX_BBYMIN": 36.508333, "MIN_BBYMAX": 36.816667, "MAX_BBYMAX": 36.816667, "MEAN_BBXC": 3.101671, "MEAN_BBYC": 36.673641, "COMPARE": 0, "GN_ASCII": "Algiers", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 1, "GN_POP": 1977663, "ELEVATION": 0, "GTOPO30": 1, "TIMEZONE": "Africa/Algiers", "GEONAMESNO": "GeoNames match general.", "UN_FID": 6, "UN_ADM0": "Algeria", "UN_LAT": 36.78, "UN_LONG": 3.05, "POP1950": 516, "POP1955": 623, "POP1960": 872, "POP1965": 1049, "POP1970": 1254, "POP1975": 1499, "POP1980": 1621, "POP1985": 1672, "POP1990": 1908, "POP1995": 2295, "POP2000": 2754, "POP2005": 3199, "POP2010": 3354, "POP2015": 3574, "POP2020": 3922, "POP2025": 4235, "POP2050": 4499, "CITYALT": "Algiers" }, "geometry": { "type": "Point", "coordinates": [ 3.054199, 36.756490 ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital", "NAME": "Tbilisi", "NAMEALT": "T'Bilisi", "DIFFASCII": 0, "NAMEASCII": "Tbilisi", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Georgia", "SOV_A3": "GEO", "ADM0NAME": "Georgia", "ADM0_A3": "GEO", "ADM1NAME": "Tbilisi", "ISO_A2": "GE", "LATITUDE": 41.72501, "LONGITUDE": 44.790795, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 1100000, "POP_MIN": 1005257, "POP_OTHER": 977179, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 611717, "MEGANAME": "Tbilisi", "LS_NAME": "Tbilisi", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1005257, "MAX_POP20": 1005257, "MAX_POP50": 1007529, "MAX_POP300": 1007529, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 131, "MAX_AREAKM": 135, "MIN_AREAMI": 51, "MAX_AREAMI": 52, "MIN_PERKM": 128, "MAX_PERKM": 133, "MIN_PERMI": 80, "MAX_PERMI": 83, "MIN_BBXMIN": 44.708333, "MAX_BBXMIN": 44.708333, "MIN_BBXMAX": 44.933333, "MAX_BBXMAX": 44.933333, "MIN_BBYMIN": 41.616667, "MAX_BBYMIN": 41.627355, "MIN_BBYMAX": 41.825, "MAX_BBYMAX": 41.825, "MEAN_BBXC": 44.822812, "MEAN_BBYC": 41.722167, "COMPARE": 0, "GN_ASCII": "Tbilisi", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 0, "GN_POP": 1049498, "ELEVATION": 0, "GTOPO30": 420, "TIMEZONE": "Asia/Tbilisi", "GEONAMESNO": "GeoNames match general.", "UN_FID": 191, "UN_ADM0": "Georgia", "UN_LAT": 41.72, "UN_LONG": 44.78, "POP1950": 612, "POP1955": 659, "POP1960": 718, "POP1965": 803, "POP1970": 897, "POP1975": 992, "POP1980": 1090, "POP1985": 1177, "POP1990": 1224, "POP1995": 1160, "POP2000": 1100, "POP2005": 1093, "POP2010": 1100, "POP2015": 1108, "POP2020": 1113, "POP2025": 1114, "POP2050": 1114, "CITYALT": "T'Bilisi" }, "geometry": { "type": "Point", "coordinates": [ 44.780273, 41.722131 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 7, "FEATURECLA": "Admin-0 capital", "NAME": "Tripoli", "DIFFASCII": 0, "NAMEASCII": "Tripoli", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Libya", "SOV_A3": "LBY", "ADM0NAME": "Libya", "ADM0_A3": "LBY", "ADM1NAME": "Tajura' wa an Nawahi al Arba", "ISO_A2": "LY", "LATITUDE": 32.8925, "LONGITUDE": 13.180012, "CHANGED": 5, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 2189000, "POP_MIN": 229398, "POP_OTHER": 1149981, "RANK_MAX": 12, "RANK_MIN": 10, "GEONAMEID": -1, "MEGANAME": "Tarabulus", "LS_NAME": "Tripoli1", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1173386, "MAX_POP20": 1173386, "MAX_POP50": 1173386, "MAX_POP300": 1173386, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 195, "MAX_AREAKM": 195, "MIN_AREAMI": 75, "MAX_AREAMI": 75, "MIN_PERKM": 142, "MAX_PERKM": 142, "MIN_PERMI": 88, "MAX_PERMI": 88, "MIN_BBXMIN": 12.983333, "MAX_BBXMIN": 12.983333, "MIN_BBXMAX": 13.408333, "MAX_BBXMAX": 13.408333, "MIN_BBYMIN": 32.808333, "MAX_BBYMIN": 32.808333, "MIN_BBYMAX": 32.908333, "MAX_BBYMAX": 32.908333, "MEAN_BBXC": 13.19322, "MEAN_BBYC": 32.862069, "COMPARE": 0, "ADMIN1_COD": 9, "GN_POP": 229398, "ELEVATION": 0, "GTOPO30": 31, "UN_FID": 344, "UN_ADM0": "Libyan Arab Jamahiriya", "UN_LAT": 34.34, "UN_LONG": 36, "POP1950": 106, "POP1955": 136, "POP1960": 174, "POP1965": 235, "POP1970": 398, "POP1975": 611, "POP1980": 797, "POP1985": 1056, "POP1990": 1500, "POP1995": 1678, "POP2000": 1877, "POP2005": 2098, "POP2010": 2189, "POP2015": 2322, "POP2020": 2532, "POP2025": 2713, "POP2050": 2855, "CITYALT": "Tripoli" }, "geometry": { "type": "Point", "coordinates": [ 13.183594, 32.898038 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital", "NAME": "Lome", "NAMEALT": "Lomé", "DIFFASCII": 0, "NAMEASCII": "Lome", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Togo", "SOV_A3": "TGO", "ADM0NAME": "Togo", "ADM0_A3": "TGO", "ADM1NAME": "Maritime", "ISO_A2": "TG", "LATITUDE": 6.131937, "LONGITUDE": 1.222757, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 1452000, "POP_MIN": 749700, "POP_OTHER": 1256715, "RANK_MAX": 12, "RANK_MIN": 11, "GEONAMEID": 2365267, "MEGANAME": "Lomé", "LS_NAME": "Lome", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 954448, "MAX_POP20": 953569, "MAX_POP50": 954013, "MAX_POP300": 953569, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 343, "MAX_AREAKM": 364, "MIN_AREAMI": 133, "MAX_AREAMI": 140, "MIN_PERKM": 353, "MAX_PERKM": 360, "MIN_PERMI": 219, "MAX_PERMI": 224, "MIN_BBXMIN": 0.95, "MAX_BBXMIN": 0.95, "MIN_BBXMAX": 1.483333, "MAX_BBXMAX": 1.483333, "MIN_BBYMIN": 6.025, "MAX_BBYMIN": 6.025, "MIN_BBYMAX": 6.283333, "MAX_BBYMAX": 6.283333, "MEAN_BBXC": 1.190359, "MEAN_BBYC": 6.153924, "COMPARE": 0, "GN_ASCII": "Lome", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 24, "GN_POP": 749700, "ELEVATION": 0, "GTOPO30": 64, "TIMEZONE": "Africa/Lome", "GEONAMESNO": "GeoNames match general.", "UN_FID": 497, "UN_ADM0": "Togo", "UN_LAT": 6.1, "UN_LONG": 1.2, "POP1950": 33, "POP1955": 56, "POP1960": 95, "POP1965": 138, "POP1970": 192, "POP1975": 257, "POP1980": 344, "POP1985": 466, "POP1990": 619, "POP1995": 796, "POP2000": 1023, "POP2005": 1315, "POP2010": 1452, "POP2015": 1669, "POP2020": 2038, "POP2025": 2410, "POP2050": 2791, "CITYALT": "Lome" }, "geometry": { "type": "Point", "coordinates": [ 1.230469, 6.140555 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 6, "FEATURECLA": "Admin-0 capital", "NAME": "Yaounde", "NAMEALT": "Yaoundé", "DIFFASCII": 0, "NAMEASCII": "Yaounde", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Cameroon", "SOV_A3": "CMR", "ADM0NAME": "Cameroon", "ADM0_A3": "CMR", "ADM1NAME": "Centre", "ISO_A2": "CM", "LATITUDE": 3.866701, "LONGITUDE": 11.516651, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 1611000, "POP_MIN": 1060587, "POP_OTHER": 1060747, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 2220957, "MEGANAME": "Yaoundé", "LS_NAME": "Yaounde", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1060587, "MAX_POP20": 1060587, "MAX_POP50": 1060587, "MAX_POP300": 1060587, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 197, "MAX_AREAKM": 197, "MIN_AREAMI": 76, "MAX_AREAMI": 76, "MIN_PERKM": 116, "MAX_PERKM": 116, "MIN_PERMI": 72, "MAX_PERMI": 72, "MIN_BBXMIN": 11.433333, "MAX_BBXMIN": 11.433333, "MIN_BBXMAX": 11.6, "MAX_BBXMAX": 11.6, "MIN_BBYMIN": 3.775, "MAX_BBYMIN": 3.775, "MIN_BBYMAX": 3.983333, "MAX_BBYMAX": 3.983333, "MEAN_BBXC": 11.518344, "MEAN_BBYC": 3.865639, "COMPARE": 0, "GN_ASCII": "Yaounde", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 11, "GN_POP": 1299369, "ELEVATION": 0, "GTOPO30": 733, "TIMEZONE": "Africa/Douala", "GEONAMESNO": "GeoNames match general.", "UN_FID": 9, "UN_ADM0": "Cameroon", "UN_LAT": 3.86, "UN_LONG": 11.51, "POP1950": 32, "POP1955": 49, "POP1960": 75, "POP1965": 112, "POP1970": 183, "POP1975": 292, "POP1980": 415, "POP1985": 578, "POP1990": 754, "POP1995": 948, "POP2000": 1192, "POP2005": 1489, "POP2010": 1611, "POP2015": 1787, "POP2020": 2058, "POP2025": 2312, "POP2050": 2549, "CITYALT": "Yaounde" }, "geometry": { "type": "Point", "coordinates": [ 11.513672, 3.864255 ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 7, "FEATURECLA": "Admin-0 capital", "NAME": "Bangui", "DIFFASCII": 0, "NAMEASCII": "Bangui", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Central African Republic", "SOV_A3": "CAF", "ADM0NAME": "Central African Republic", "ADM0_A3": "CAF", "ADM1NAME": "Bangui", "ISO_A2": "CF", "LATITUDE": 4.366644, "LONGITUDE": 18.558288, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 831925, "POP_MIN": 622771, "POP_OTHER": 782274, "RANK_MAX": 11, "RANK_MIN": 11, "GEONAMEID": 2389853, "LS_NAME": "Bangui", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 792886, "MAX_POP20": 792886, "MAX_POP50": 831925, "MAX_POP300": 831925, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 90, "MAX_AREAKM": 103, "MIN_AREAMI": 35, "MAX_AREAMI": 40, "MIN_PERKM": 91, "MAX_PERKM": 107, "MIN_PERMI": 57, "MAX_PERMI": 67, "MIN_BBXMIN": 18.491667, "MAX_BBXMIN": 18.491667, "MIN_BBXMAX": 18.614651, "MAX_BBXMAX": 18.625, "MIN_BBYMIN": 4.316667, "MAX_BBYMIN": 4.316667, "MIN_BBYMAX": 4.483333, "MAX_BBYMAX": 4.483333, "MEAN_BBXC": 18.546436, "MEAN_BBYC": 4.388157, "COMPARE": 0, "GN_ASCII": "Bangui", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 18, "GN_POP": 542393, "ELEVATION": 0, "GTOPO30": 373, "TIMEZONE": "Africa/Bangui", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 18.566895, 4.368320 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 0, "NATSCALE": 600, "LABELRANK": 3, "FEATURECLA": "Admin-0 capital", "NAME": "Cairo", "NAMEALT": "Al-Qahirah", "DIFFASCII": 0, "NAMEASCII": "Cairo", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "Egypt", "SOV_A3": "EGY", "ADM0NAME": "Egypt", "ADM0_A3": "EGY", "ADM1NAME": "Al Qahirah", "ISO_A2": "EG", "LATITUDE": 30.04996, "LONGITUDE": 31.249968, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 11893000, "POP_MIN": 7734614, "POP_OTHER": 13720557, "RANK_MAX": 14, "RANK_MIN": 13, "GEONAMEID": 360630, "MEGANAME": "Al-Qahirah", "LS_NAME": "Cairo", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 14936123, "MAX_POP20": 15091561, "MAX_POP50": 29872827, "MAX_POP300": 30682197, "MAX_POP310": 30696820, "MAX_NATSCA": 300, "MIN_AREAKM": 1479, "MAX_AREAKM": 4900, "MIN_AREAMI": 571, "MAX_AREAMI": 1892, "MIN_PERKM": 1365, "MAX_PERKM": 5010, "MIN_PERMI": 848, "MAX_PERMI": 3113, "MIN_BBXMIN": 30.641667, "MAX_BBXMIN": 30.991693, "MIN_BBXMAX": 31.672096, "MAX_BBXMAX": 31.733333, "MIN_BBYMIN": 29.3, "MAX_BBYMIN": 29.8, "MIN_BBYMAX": 30.531354, "MAX_BBYMAX": 31.158333, "MEAN_BBXC": 31.273845, "MEAN_BBYC": 30.353647, "COMPARE": 0, "GN_ASCII": "Cairo", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 11, "GN_POP": 7734614, "ELEVATION": 0, "GTOPO30": 23, "TIMEZONE": "Africa/Cairo", "GEONAMESNO": "GeoNames match general.", "UN_FID": 515, "UN_ADM0": "Egypt", "UN_LAT": 30.07, "UN_LONG": 31.25, "POP1950": 2494, "POP1955": 3029, "POP1960": 3680, "POP1965": 4738, "POP1970": 5585, "POP1975": 6450, "POP1980": 7349, "POP1985": 8328, "POP1990": 9061, "POP1995": 9707, "POP2000": 10534, "POP2005": 11487, "POP2010": 11893, "POP2015": 12503, "POP2020": 13465, "POP2025": 14451, "POP2050": 15561, "CITYALT": "Cairo" }, "geometry": { "type": "Point", "coordinates": [ 31.245117, 30.050077 ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital alt", "NAME": "Tel Aviv-Yafo", "NAMEALT": "Tel Aviv-Jaffa", "DIFFASCII": 0, "NAMEASCII": "Tel Aviv-Yafo", "ADM0CAP": 0, "CAPALT": 1, "CAPIN": "While Jerulsale", "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Israel", "SOV_A3": "ISR", "ADM0NAME": "Israel", "ADM0_A3": "ISR", "ADM1NAME": "Tel Aviv", "ISO_A2": "IL", "LATITUDE": 32.079991, "LONGITUDE": 34.770012, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 3112000, "POP_MIN": 378358, "POP_OTHER": 2306851, "RANK_MAX": 12, "RANK_MIN": 10, "GEONAMEID": 293394, "MEGANAME": "Tel Aviv-Yafo", "LS_NAME": "Tel Aviv-Yafo", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 2324568, "MAX_POP20": 2324568, "MAX_POP50": 2324568, "MAX_POP300": 0, "MAX_POP310": 0, "MAX_NATSCA": 50, "MIN_AREAKM": 436, "MAX_AREAKM": 436, "MIN_AREAMI": 168, "MAX_AREAMI": 168, "MIN_PERKM": 386, "MAX_PERKM": 386, "MIN_PERMI": 240, "MAX_PERMI": 240, "MIN_BBXMIN": 34.716667, "MAX_BBXMIN": 34.716667, "MIN_BBXMAX": 34.958333, "MAX_BBXMAX": 34.958333, "MIN_BBYMIN": 31.85, "MAX_BBYMIN": 31.85, "MIN_BBYMAX": 32.208333, "MAX_BBYMAX": 32.208333, "MEAN_BBXC": 34.836735, "MEAN_BBYC": 32.030266, "COMPARE": 0, "GN_ASCII": "Tel Aviv-Yafo", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 5, "GN_POP": 378358, "ELEVATION": 0, "GTOPO30": -9999, "TIMEZONE": "Asia/Jerusalem", "GEONAMESNO": "GeoNames match general.", "UN_FID": 304, "UN_ADM0": "Israel", "UN_LAT": 32.04, "UN_LONG": 34.76, "POP1950": 418, "POP1955": 556, "POP1960": 738, "POP1965": 882, "POP1970": 1029, "POP1975": 1206, "POP1980": 1416, "POP1985": 1681, "POP1990": 2026, "POP1995": 2442, "POP2000": 2752, "POP2005": 3012, "POP2010": 3112, "POP2015": 3256, "POP2020": 3453, "POP2025": 3600, "POP2050": 3726, "CITYALT": "Tel Aviv-Jaffa" }, "geometry": { "type": "Point", "coordinates": [ 34.760742, 32.082575 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 5, "FEATURECLA": "Admin-0 capital", "NAME": "Khartoum", "NAMEALT": "Al-Khartum", "DIFFASCII": 0, "NAMEASCII": "Khartoum", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Sudan", "SOV_A3": "SDN", "ADM0NAME": "Sudan", "ADM0_A3": "SDN", "ADM1NAME": "Khartoum", "ISO_A2": "SD", "LATITUDE": 15.588078, "LONGITUDE": 32.534179, "CHANGED": 5, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 4754000, "POP_MIN": 1974647, "POP_OTHER": 2325931, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 379252, "MEGANAME": "Al-Khartum", "LS_NAME": "Khartoum", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 2395309, "MAX_POP20": 2395309, "MAX_POP50": 2395309, "MAX_POP300": 4542697, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 348, "MAX_AREAKM": 630, "MIN_AREAMI": 134, "MAX_AREAMI": 243, "MIN_PERKM": 237, "MAX_PERKM": 424, "MIN_PERMI": 147, "MAX_PERMI": 263, "MIN_BBXMIN": 32.341667, "MAX_BBXMIN": 32.458333, "MIN_BBXMAX": 32.691667, "MAX_BBXMAX": 32.691667, "MIN_BBYMIN": 15.325, "MAX_BBYMIN": 15.325, "MIN_BBYMAX": 15.699422, "MAX_BBYMAX": 15.825, "MEAN_BBXC": 32.550462, "MEAN_BBYC": 15.559101, "COMPARE": 0, "GN_ASCII": "Khartoum", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 29, "GN_POP": 1974647, "ELEVATION": 0, "GTOPO30": 378, "TIMEZONE": "Africa/Khartoum", "GEONAMESNO": "GeoNames match general.", "UN_FID": 466, "UN_ADM0": "Sudan", "UN_LAT": 15.55, "UN_LONG": 32.52, "POP1950": 183, "POP1955": 252, "POP1960": 347, "POP1965": 477, "POP1970": 657, "POP1975": 886, "POP1980": 1164, "POP1985": 1611, "POP1990": 2360, "POP1995": 3242, "POP2000": 3949, "POP2005": 4518, "POP2010": 4754, "POP2015": 5185, "POP2020": 6077, "POP2025": 7017, "POP2050": 7937, "CITYALT": "Khartoum" }, "geometry": { "type": "Point", "coordinates": [ 32.541504, 15.580711 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 6, "FEATURECLA": "Admin-0 capital", "NAME": "Sanaa", "NAMEALT": "Sana'a'", "DIFFASCII": 0, "NAMEASCII": "Sanaa", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Yemen", "SOV_A3": "YEM", "ADM0NAME": "Yemen", "ADM0_A3": "YEM", "ADM1NAME": "Amanat Al Asimah", "ISO_A2": "YE", "LATITUDE": 15.354733, "LONGITUDE": 44.206593, "CHANGED": 5, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 2008000, "POP_MIN": 1835853, "POP_OTHER": 1742507, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 71137, "MEGANAME": "Sana'a'", "LS_NAME": "Sanaa", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1835853, "MAX_POP20": 1835853, "MAX_POP50": 1835853, "MAX_POP300": 1835853, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 160, "MAX_AREAKM": 160, "MIN_AREAMI": 62, "MAX_AREAMI": 62, "MIN_PERKM": 132, "MAX_PERKM": 132, "MIN_PERMI": 82, "MAX_PERMI": 82, "MIN_BBXMIN": 44.15, "MAX_BBXMIN": 44.15, "MIN_BBXMAX": 44.258333, "MAX_BBXMAX": 44.258333, "MIN_BBYMIN": 15.266667, "MAX_BBYMIN": 15.266667, "MIN_BBYMAX": 15.508333, "MAX_BBYMAX": 15.508333, "MEAN_BBXC": 44.206615, "MEAN_BBYC": 15.376031, "COMPARE": 0, "GN_ASCII": "Sanaa", "ADMIN1_COD": 0, "GN_POP": 0, "ELEVATION": 0, "GTOPO30": 0, "GEONAMESNO": "GeoNames match general + researched.", "UN_FID": 587, "UN_ADM0": "Yemen", "UN_LAT": 15.36, "UN_LONG": 44.2, "POP1950": 46, "POP1955": 58, "POP1960": 72, "POP1965": 89, "POP1970": 111, "POP1975": 141, "POP1980": 238, "POP1985": 402, "POP1990": 653, "POP1995": 1034, "POP2000": 1365, "POP2005": 1801, "POP2010": 2008, "POP2015": 2345, "POP2020": 2955, "POP2025": 3636, "POP2050": 4382, "CITYALT": "Sanaa" }, "geometry": { "type": "Point", "coordinates": [ 44.208984, 15.347762 ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 1, "NATSCALE": 300, "LABELRANK": 3, "FEATURECLA": "Admin-0 capital", "NAME": "Addis Ababa", "DIFFASCII": 0, "NAMEASCII": "Addis Ababa", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Ethiopia", "SOV_A3": "ETH", "ADM0NAME": "Ethiopia", "ADM0_A3": "ETH", "ADM1NAME": "Addis Ababa", "ISO_A2": "ET", "LATITUDE": 9.03331, "LONGITUDE": 38.700004, "CHANGED": 5, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 3100000, "POP_MIN": 2757729, "POP_OTHER": 3013653, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 344979, "MEGANAME": "Addis Ababa", "LS_NAME": "Addis Ababa", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 2984087, "MAX_POP20": 3176486, "MAX_POP50": 3491912, "MAX_POP300": 3450173, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 462, "MAX_AREAKM": 1182, "MIN_AREAMI": 178, "MAX_AREAMI": 457, "MIN_PERKM": 397, "MAX_PERKM": 1325, "MIN_PERMI": 247, "MAX_PERMI": 823, "MIN_BBXMIN": 38.575, "MAX_BBXMIN": 38.575, "MIN_BBXMAX": 38.966667, "MAX_BBXMAX": 39.483333, "MIN_BBYMIN": 8.033333, "MAX_BBYMIN": 8.67178, "MIN_BBYMAX": 9.125, "MAX_BBYMAX": 9.125, "MEAN_BBXC": 38.919464, "MEAN_BBYC": 8.825709, "COMPARE": 0, "GN_ASCII": "Addis Ababa", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 44, "GN_POP": 2757729, "ELEVATION": 0, "GTOPO30": 2363, "TIMEZONE": "Africa/Addis_Ababa", "GEONAMESNO": "GeoNames match general.", "UN_FID": 180, "UN_ADM0": "Ethiopia", "UN_LAT": 9.02, "UN_LONG": 38.7, "POP1950": 392, "POP1955": 451, "POP1960": 519, "POP1965": 597, "POP1970": 729, "POP1975": 926, "POP1980": 1175, "POP1985": 1476, "POP1990": 1791, "POP1995": 2157, "POP2000": 2493, "POP2005": 2902, "POP2010": 3100, "POP2015": 3453, "POP2020": 4184, "POP2025": 5083, "POP2050": 6156 }, "geometry": { "type": "Point", "coordinates": [ 38.693848, 9.037003 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 6, "FEATURECLA": "Admin-0 capital", "NAME": "Astana", "DIFFASCII": 0, "NAMEASCII": "Astana", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Kazakhstan", "SOV_A3": "KAZ", "ADM0NAME": "Kazakhstan", "ADM0_A3": "KAZ", "ADM1NAME": "Aqmola", "ISO_A2": "KZ", "LATITUDE": 51.181125, "LONGITUDE": 71.427774, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 345604, "POP_MIN": 325021, "POP_OTHER": 317445, "RANK_MAX": 10, "RANK_MIN": 10, "GEONAMEID": 1526273, "LS_NAME": "Astana", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 325021, "MAX_POP20": 325021, "MAX_POP50": 325021, "MAX_POP300": 325021, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 104, "MAX_AREAKM": 104, "MIN_AREAMI": 40, "MAX_AREAMI": 40, "MIN_PERKM": 101, "MAX_PERKM": 101, "MIN_PERMI": 63, "MAX_PERMI": 63, "MIN_BBXMIN": 71.325, "MAX_BBXMIN": 71.325, "MIN_BBXMAX": 71.533333, "MAX_BBXMAX": 71.533333, "MIN_BBYMIN": 51.1, "MAX_BBYMIN": 51.1, "MIN_BBYMAX": 51.225, "MAX_BBYMAX": 51.225, "MEAN_BBXC": 71.43275, "MEAN_BBYC": 51.164443, "COMPARE": 0, "GN_ASCII": "Astana", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 5, "GN_POP": 345604, "ELEVATION": 0, "GTOPO30": 339, "TIMEZONE": "Asia/Qyzylorda", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 71.433105, 51.179343 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 1, "NATSCALE": 300, "LABELRANK": 1, "FEATURECLA": "Admin-1 capital", "NAME": "Urumqi", "NAMEALT": "Ürümqi|Wulumqi", "DIFFASCII": 0, "NAMEASCII": "Urumqi", "ADM0CAP": 0, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "China", "SOV_A3": "CHN", "ADM0NAME": "China", "ADM0_A3": "CHN", "ADM1NAME": "Xinjiang Uygur", "ISO_A2": "CN", "LATITUDE": 43.805012, "LONGITUDE": 87.575006, "CHANGED": 5, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 2151000, "POP_MIN": 1508225, "POP_OTHER": 2044401, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 1529102, "MEGANAME": "Ürümqi (Wulumqi)", "LS_NAME": "Urumqi", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 2066046, "MAX_POP20": 2066046, "MAX_POP50": 2066046, "MAX_POP300": 2066046, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 361, "MAX_AREAKM": 361, "MIN_AREAMI": 139, "MAX_AREAMI": 139, "MIN_PERKM": 318, "MAX_PERKM": 318, "MIN_PERMI": 198, "MAX_PERMI": 198, "MIN_BBXMIN": 87.358333, "MAX_BBXMIN": 87.358333, "MIN_BBXMAX": 87.725, "MAX_BBXMAX": 87.725, "MIN_BBYMIN": 43.641667, "MAX_BBYMIN": 43.641667, "MIN_BBYMAX": 44.016667, "MAX_BBYMAX": 44.016667, "MEAN_BBXC": 87.578494, "MEAN_BBYC": 43.854525, "COMPARE": 0, "GN_ASCII": "Urumqi", "FEATURE_CL": "P", "FEATURE_CO": "PPLA", "ADMIN1_COD": 13, "GN_POP": 1508225, "ELEVATION": 0, "GTOPO30": 915, "TIMEZONE": "Asia/Urumqi", "GEONAMESNO": "GeoNames match general.", "UN_FID": 118, "UN_ADM0": "China", "UN_LAT": 43.78, "UN_LONG": 87.58, "POP1950": 253, "POP1955": 312, "POP1960": 384, "POP1965": 472, "POP1970": 581, "POP1975": 715, "POP1980": 881, "POP1985": 1029, "POP1990": 1161, "POP1995": 1417, "POP2000": 1730, "POP2005": 2025, "POP2010": 2151, "POP2015": 2340, "POP2020": 2620, "POP2025": 2851, "POP2050": 3038, "CITYALT": "Urumqi" }, "geometry": { "type": "Point", "coordinates": [ 87.583008, 43.802819 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 1, "NATSCALE": 300, "LABELRANK": 8, "FEATURECLA": "Admin-1 capital", "NAME": "Dubai", "NAMEPAR": "Dubayy", "DIFFASCII": 0, "NAMEASCII": "Dubai", "ADM0CAP": 0, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "United Arab Emirates", "SOV_A3": "ARE", "ADM0NAME": "United Arab Emirates", "ADM0_A3": "ARE", "ADM1NAME": "Dubay", "ISO_A2": "AE", "LATITUDE": 25.229996, "LONGITUDE": 55.279974, "CHANGED": 1, "NAMEDIFF": 1, "DIFFNOTE": "Name changed.", "POP_MAX": 1379000, "POP_MIN": 1137347, "POP_OTHER": 1166878, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 292223, "MEGANAME": "Dubayy", "LS_NAME": "Dubayy", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1193251, "MAX_POP20": 2244726, "MAX_POP50": 2244726, "MAX_POP300": 2244726, "MAX_POP310": 2244726, "MAX_NATSCA": 300, "MIN_AREAKM": 187, "MAX_AREAKM": 407, "MIN_AREAMI": 72, "MAX_AREAMI": 157, "MIN_PERKM": 158, "MAX_PERKM": 278, "MIN_PERMI": 98, "MAX_PERMI": 173, "MIN_BBXMIN": 55.175, "MAX_BBXMIN": 55.175, "MIN_BBXMAX": 55.437142, "MAX_BBXMAX": 55.533333, "MIN_BBYMIN": 25.1, "MAX_BBYMIN": 25.1, "MIN_BBYMAX": 25.308333, "MAX_BBYMAX": 25.433333, "MEAN_BBXC": 55.361736, "MEAN_BBYC": 25.258666, "COMPARE": 1, "GN_ASCII": "Dubai", "FEATURE_CL": "P", "FEATURE_CO": "PPLA", "ADMIN1_COD": 3, "GN_POP": 1137347, "ELEVATION": 0, "GTOPO30": 9, "TIMEZONE": "Asia/Dubai", "GEONAMESNO": "GeoNames match general.", "UN_FID": 498, "UN_ADM0": "United Arab Emirates", "UN_LAT": 25.27, "UN_LONG": 55.32, "POP1950": 20, "POP1955": 28, "POP1960": 40, "POP1965": 51, "POP1970": 80, "POP1975": 167, "POP1980": 254, "POP1985": 345, "POP1990": 473, "POP1995": 650, "POP2000": 938, "POP2005": 1272, "POP2010": 1379, "POP2015": 1516, "POP2020": 1709, "POP2025": 1894, "POP2050": 2077, "CITYALT": "Dubai" }, "geometry": { "type": "Point", "coordinates": [ 55.283203, 25.224820 ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital", "NAME": "Ashgabat", "DIFFASCII": 0, "NAMEASCII": "Ashgabat", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Turkmenistan", "SOV_A3": "TKM", "ADM0NAME": "Turkmenistan", "ADM0_A3": "TKM", "ADM1NAME": "Ahal", "ISO_A2": "TM", "LATITUDE": 37.949995, "LONGITUDE": 58.383299, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 727700, "POP_MIN": 577982, "POP_OTHER": 556048, "RANK_MAX": 11, "RANK_MIN": 11, "GEONAMEID": 162183, "LS_NAME": "Ashgabat", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 577982, "MAX_POP20": 589324, "MAX_POP50": 589324, "MAX_POP300": 589324, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 108, "MAX_AREAKM": 128, "MIN_AREAMI": 42, "MAX_AREAMI": 49, "MIN_PERKM": 109, "MAX_PERKM": 144, "MIN_PERMI": 68, "MAX_PERMI": 90, "MIN_BBXMIN": 58.2, "MAX_BBXMIN": 58.28637, "MIN_BBXMAX": 58.483333, "MAX_BBXMAX": 58.483333, "MIN_BBYMIN": 37.866667, "MAX_BBYMIN": 37.866667, "MIN_BBYMAX": 38.016667, "MAX_BBYMAX": 38.016667, "MEAN_BBXC": 58.371343, "MEAN_BBYC": 37.94619, "COMPARE": 0, "GN_ASCII": "Ashgabat", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 1, "GN_POP": 727700, "ELEVATION": 0, "GTOPO30": 219, "TIMEZONE": "Asia/Ashgabat", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 58.381348, 37.944198 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital", "NAME": "Mogadishu", "NAMEALT": "Muqdisho", "DIFFASCII": 0, "NAMEASCII": "Mogadishu", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Somalia", "SOV_A3": "SOM", "ADM0NAME": "Somalia", "ADM0_A3": "SOM", "ADM1NAME": "Banaadir", "ISO_A2": "SO", "LATITUDE": 2.066681, "LONGITUDE": 45.366678, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 1100000, "POP_MIN": 875388, "POP_OTHER": 849392, "RANK_MAX": 12, "RANK_MIN": 11, "GEONAMEID": 53654, "MEGANAME": "Muqdisho", "LS_NAME": "Mogadishu", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 875388, "MAX_POP20": 875388, "MAX_POP50": 875388, "MAX_POP300": 875388, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 99, "MAX_AREAKM": 99, "MIN_AREAMI": 38, "MAX_AREAMI": 38, "MIN_PERKM": 68, "MAX_PERKM": 68, "MIN_PERMI": 43, "MAX_PERMI": 43, "MIN_BBXMIN": 45.25, "MAX_BBXMIN": 45.25, "MIN_BBXMAX": 45.416667, "MAX_BBXMAX": 45.416667, "MIN_BBYMIN": 2, "MAX_BBYMIN": 2, "MIN_BBYMAX": 2.116667, "MAX_BBYMAX": 2.116667, "MEAN_BBXC": 45.331178, "MEAN_BBYC": 2.054239, "COMPARE": 0, "GN_ASCII": "Mogadishu", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 2, "GN_POP": 2587183, "ELEVATION": 0, "GTOPO30": 39, "TIMEZONE": "Africa/Mogadishu", "GEONAMESNO": "GeoNames match general.", "UN_FID": 454, "UN_ADM0": "Somalia", "UN_LAT": 2.04, "UN_LONG": 45.34, "POP1950": 69, "POP1955": 73, "POP1960": 94, "POP1965": 146, "POP1970": 272, "POP1975": 445, "POP1980": 551, "POP1985": 747, "POP1990": 1035, "POP1995": 1147, "POP2000": 1201, "POP2005": 1415, "POP2010": 1100, "POP2015": 1500, "POP2020": 1794, "POP2025": 2142, "POP2050": 2529, "CITYALT": "Mogadishu" }, "geometry": { "type": "Point", "coordinates": [ 45.373535, 2.064982 ] } }
|
||||
,
|
||||
@@ -341,7 +338,7 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 6, "FEATURECLA": "Admin-0 capital", "NAME": "Kathmandu", "DIFFASCII": 0, "NAMEASCII": "Kathmandu", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Nepal", "SOV_A3": "NPL", "ADM0NAME": "Nepal", "ADM0_A3": "NPL", "ADM1NAME": "Bhaktapur", "ISO_A2": "NP", "LATITUDE": 27.716692, "LONGITUDE": 85.316642, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 895000, "POP_MIN": 895000, "POP_OTHER": 1099610, "RANK_MAX": 11, "RANK_MIN": 11, "GEONAMEID": 1283240, "MEGANAME": "Kathmandu", "LS_NAME": "Kathmandu", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1154222, "MAX_POP20": 2297630, "MAX_POP50": 2297630, "MAX_POP300": 2297630, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 233, "MAX_AREAKM": 580, "MIN_AREAMI": 90, "MAX_AREAMI": 224, "MIN_PERKM": 228, "MAX_PERKM": 511, "MIN_PERMI": 142, "MAX_PERMI": 318, "MIN_BBXMIN": 85.108333, "MAX_BBXMIN": 85.108333, "MIN_BBXMAX": 85.450066, "MAX_BBXMAX": 85.675, "MIN_BBYMIN": 27.541667, "MAX_BBYMIN": 27.669456, "MIN_BBYMAX": 27.85, "MAX_BBYMAX": 27.85, "MEAN_BBXC": 85.356097, "MEAN_BBYC": 27.697735, "COMPARE": 0, "GN_ASCII": "Kathmandu", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 0, "GN_POP": 1442271, "ELEVATION": 1317, "GTOPO30": 1304, "TIMEZONE": "Asia/Kathmandu", "GEONAMESNO": "GeoNames match general.", "UN_FID": 378, "UN_ADM0": "Nepal", "UN_LAT": 27.71, "UN_LONG": 85.31, "POP1950": 104, "POP1955": 110, "POP1960": 119, "POP1965": 132, "POP1970": 147, "POP1975": 180, "POP1980": 225, "POP1985": 297, "POP1990": 398, "POP1995": 509, "POP2000": 644, "POP2005": 815, "POP2010": 895, "POP2015": 1029, "POP2020": 1284, "POP2025": 1578, "POP2050": 1907 }, "geometry": { "type": "Point", "coordinates": [ 85.319824, 27.722436 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 0, "FEATURECLA": "Admin-0 capital", "NAME": "Male", "DIFFASCII": 0, "NAMEASCII": "Male", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Maldives", "SOV_A3": "MDV", "ADM0NAME": "Maldives", "ADM0_A3": "MDV", "ISO_A2": "MV", "LATITUDE": 4.166708, "LONGITUDE": 73.499947, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 112927, "POP_MIN": 103693, "POP_OTHER": 0, "RANK_MAX": 9, "RANK_MIN": 9, "GEONAMEID": 3174186, "LS_NAME": "Male", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 112927, "MAX_POP20": 112927, "MAX_POP50": 112927, "MAX_POP300": 112927, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 3, "MAX_AREAKM": 3, "MIN_AREAMI": 1, "MAX_AREAMI": 1, "MIN_PERKM": 7, "MAX_PERKM": 7, "MIN_PERMI": 5, "MAX_PERMI": 5, "MIN_BBXMIN": 73.5, "MAX_BBXMIN": 73.5, "MIN_BBXMAX": 73.516667, "MAX_BBXMAX": 73.516667, "MIN_BBYMIN": 4.166667, "MAX_BBYMIN": 4.166667, "MIN_BBYMAX": 4.183333, "MAX_BBYMAX": 4.183333, "MEAN_BBXC": 73.508333, "MEAN_BBYC": 4.175, "COMPARE": 0, "GN_ASCII": "Male", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 17, "GN_POP": 2138, "ELEVATION": 0, "GTOPO30": 672, "TIMEZONE": "Europe/Rome", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 73.498535, 4.171115 ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 6, "FEATURECLA": "Admin-0 capital", "NAME": "Colombo", "DIFFASCII": 0, "NAMEASCII": "Colombo", "ADM0CAP": 1, "CAPALT": 0, "CAPIN": "De facto, admin", "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Sri Lanka", "SOV_A3": "LKA", "ADM0NAME": "Sri Lanka", "ADM0_A3": "LKA", "ADM1NAME": "Colombo", "ISO_A2": "LK", "LATITUDE": 6.931966, "LONGITUDE": 79.857751, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 217000, "POP_MIN": 217000, "POP_OTHER": 2490974, "RANK_MAX": 10, "RANK_MIN": 10, "GEONAMEID": 3465927, "LS_NAME": "Colombo", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 2664418, "MAX_POP20": 2742979, "MAX_POP50": 2742979, "MAX_POP300": 9759831, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 1054, "MAX_AREAKM": 6238, "MIN_AREAMI": 407, "MAX_AREAMI": 2408, "MIN_PERKM": 847, "MAX_PERKM": 5343, "MIN_PERMI": 526, "MAX_PERMI": 3320, "MIN_BBXMIN": 79.8, "MAX_BBXMIN": 79.8, "MIN_BBXMAX": 80.097553, "MAX_BBXMAX": 80.833333, "MIN_BBYMIN": 5.916667, "MAX_BBYMIN": 6.854447, "MIN_BBYMAX": 7.633333, "MAX_BBYMAX": 7.8, "MEAN_BBXC": 79.996849, "MEAN_BBYC": 7.222799, "COMPARE": 0, "GN_ASCII": "Colombo", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 18, "GN_POP": 217000, "ELEVATION": 0, "GTOPO30": 927, "TIMEZONE": "America/Sao_Paulo", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 79.848633, 6.926427 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 2, "FEATURECLA": "Admin-0 capital", "NAME": "Dhaka", "DIFFASCII": 0, "NAMEASCII": "Dhaka", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Bangladesh", "SOV_A3": "BGD", "ADM0NAME": "Bangladesh", "ADM0_A3": "BGD", "ADM1NAME": "Dhaka", "ISO_A2": "BD", "LATITUDE": 23.72306, "LONGITUDE": 90.408579, "CHANGED": 5, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 12797394, "POP_MIN": 7000940, "POP_OTHER": 14995538, "RANK_MAX": 14, "RANK_MIN": 13, "GEONAMEID": 1185241, "MEGANAME": "Dhaka", "LS_NAME": "Dhaka", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 14548962, "MAX_POP20": 21394172, "MAX_POP50": 53845691, "MAX_POP300": 78549234, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 3528, "MAX_AREAKM": 49912, "MIN_AREAMI": 1362, "MAX_AREAMI": 19271, "MIN_PERKM": 1439, "MAX_PERKM": 19314, "MIN_PERMI": 894, "MAX_PERMI": 12001, "MIN_BBXMIN": 88.133791, "MAX_BBXMIN": 89.9, "MIN_BBXMAX": 90.816777, "MAX_BBXMAX": 92.908333, "MIN_BBYMIN": 22.858333, "MAX_BBYMIN": 23.482936, "MIN_BBYMAX": 24.247407, "MAX_BBYMAX": 25.583333, "MEAN_BBXC": 90.400679, "MEAN_BBYC": 24.105092, "COMPARE": 0, "GN_ASCII": "Dhaka", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 81, "GN_POP": 10356500, "ELEVATION": 0, "GTOPO30": 4, "TIMEZONE": "Asia/Dhaka", "GEONAMESNO": "GeoNames match general.", "UN_FID": 369, "UN_ADM0": "Bangladesh", "UN_LAT": 23.7, "UN_LONG": 90.4, "POP1950": 336, "POP1955": 409, "POP1960": 508, "POP1965": 821, "POP1970": 1374, "POP1975": 2221, "POP1980": 3266, "POP1985": 4660, "POP1990": 6621, "POP1995": 8332, "POP2000": 10285, "POP2005": 12576, "POP2010": 13485, "POP2015": 14796, "POP2020": 17015, "POP2025": 19422, "POP2050": 22015 }, "geometry": { "type": "Point", "coordinates": [ 90.417480, 23.725012 ] } }
|
||||
,
|
||||
@@ -385,7 +382,7 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 6, "FEATURECLA": "Admin-0 capital", "NAME": "Kuala Lumpur", "DIFFASCII": 0, "NAMEASCII": "Kuala Lumpur", "ADM0CAP": 1, "CAPALT": 0, "CAPIN": "Official and le", "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "Malaysia", "SOV_A3": "MYS", "ADM0NAME": "Malaysia", "ADM0_A3": "MYS", "ADM1NAME": "Selangor", "ISO_A2": "MY", "LATITUDE": 3.166666, "LONGITUDE": 101.699983, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 1448000, "POP_MIN": 1448000, "POP_OTHER": 2667990, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 1735161, "MEGANAME": "Kuala Lumpur", "LS_NAME": "Kuala Lumpur", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 2750755, "MAX_POP20": 2750755, "MAX_POP50": 3468789, "MAX_POP300": 4983714, "MAX_POP310": 4983714, "MAX_NATSCA": 300, "MIN_AREAKM": 666, "MAX_AREAKM": 1700, "MIN_AREAMI": 257, "MAX_AREAMI": 657, "MIN_PERKM": 350, "MAX_PERKM": 1111, "MIN_PERMI": 217, "MAX_PERMI": 690, "MIN_BBXMIN": 101.358333, "MAX_BBXMIN": 101.491667, "MIN_BBXMAX": 101.841667, "MAX_BBXMAX": 101.891667, "MIN_BBYMIN": 2.7, "MAX_BBYMIN": 3.040173, "MIN_BBYMAX": 3.475, "MAX_BBYMAX": 3.475, "MEAN_BBXC": 101.644598, "MEAN_BBYC": 3.131431, "COMPARE": 0, "GN_ASCII": "Kuala Lumpur", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 14, "GN_POP": 1453975, "ELEVATION": 0, "GTOPO30": 62, "TIMEZONE": "Asia/Kuala_Lumpur", "GEONAMESNO": "GeoNames match general.", "UN_FID": 348, "UN_ADM0": "Malaysia", "UN_LAT": 3.14, "UN_LONG": 101.7, "POP1950": 208, "POP1955": 281, "POP1960": 344, "POP1965": 394, "POP1970": 451, "POP1975": 645, "POP1980": 921, "POP1985": 1016, "POP1990": 1120, "POP1995": 1213, "POP2000": 1306, "POP2005": 1405, "POP2010": 1448, "POP2015": 1519, "POP2020": 1670, "POP2025": 1820, "POP2050": 1938 }, "geometry": { "type": "Point", "coordinates": [ 101.689453, 3.162456 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 0, "NATSCALE": 600, "LABELRANK": 0, "FEATURECLA": "Admin-0 region capital", "NAME": "Hong Kong", "DIFFASCII": 0, "NAMEASCII": "Hong Kong", "ADM0CAP": 0, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "China", "SOV_A3": "CHN", "ADM0NAME": "Hong Kong S.A.R.", "ADM0_A3": "HKG", "ISO_A2": "HK", "LATITUDE": 22.304981, "LONGITUDE": 114.185009, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 7206000, "POP_MIN": 4551579, "POP_OTHER": 4549026, "RANK_MAX": 13, "RANK_MIN": 12, "GEONAMEID": 1819729, "MEGANAME": "Hong Kong", "LS_NAME": "Hong Kong", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 4551579, "MAX_POP20": 15779579, "MAX_POP50": 16718429, "MAX_POP300": 16718429, "MAX_POP310": 42594594, "MAX_NATSCA": 300, "MIN_AREAKM": 202, "MAX_AREAKM": 10661, "MIN_AREAMI": 78, "MAX_AREAMI": 4116, "MIN_PERKM": 219, "MAX_PERKM": 7493, "MIN_PERMI": 136, "MAX_PERMI": 4656, "MIN_BBXMIN": 112.533333, "MAX_BBXMIN": 113.983333, "MIN_BBXMAX": 114.3, "MAX_BBXMAX": 114.775, "MIN_BBYMIN": 21.925, "MAX_BBYMIN": 22.2, "MIN_BBYMAX": 22.4, "MAX_BBYMAX": 24.033333, "MEAN_BBXC": 114.035195, "MEAN_BBYC": 22.679605, "COMPARE": 0, "GN_ASCII": "Hong Kong", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 0, "GN_POP": 7012738, "ELEVATION": 0, "GTOPO30": -9999, "TIMEZONE": "Asia/Hong_Kong", "GEONAMESNO": "GeoNames match general.", "UN_FID": 210, "UN_ADM0": "China, Hong Kong Special Administrative Region", "UN_LAT": 22.27, "UN_LONG": 114.17, "POP1950": 1682, "POP1955": 2121, "POP1960": 2620, "POP1965": 3191, "POP1970": 3458, "POP1975": 3943, "POP1980": 4609, "POP1985": 5070, "POP1990": 5677, "POP1995": 6206, "POP2000": 6662, "POP2005": 7057, "POP2010": 7206, "POP2015": 7419, "POP2020": 7744, "POP2025": 8040, "POP2050": 8305 }, "geometry": { "type": "Point", "coordinates": [ 114.191895, 22.309426 ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 0, "NATSCALE": 600, "LABELRANK": 1, "FEATURECLA": "Admin-1 capital", "NAME": "Shanghai", "DIFFASCII": 0, "NAMEASCII": "Shanghai", "ADM0CAP": 0, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "China", "SOV_A3": "CHN", "ADM0NAME": "China", "ADM0_A3": "CHN", "ADM1NAME": "Shanghai", "ISO_A2": "CN", "LATITUDE": 31.216452, "LONGITUDE": 121.436505, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 14987000, "POP_MIN": 14608512, "POP_OTHER": 16803572, "RANK_MAX": 14, "RANK_MIN": 14, "GEONAMEID": 1796236, "MEGANAME": "Shanghai", "LS_NAME": "Shanghai", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 16172884, "MAX_POP20": 16172884, "MAX_POP50": 26630672, "MAX_POP300": 26631586, "MAX_POP310": 40576904, "MAX_NATSCA": 300, "MIN_AREAKM": 3792, "MAX_AREAKM": 16400, "MIN_AREAMI": 1464, "MAX_AREAMI": 6332, "MIN_PERKM": 2219, "MAX_PERKM": 12342, "MIN_PERMI": 1379, "MAX_PERMI": 7669, "MIN_BBXMIN": 119.016667, "MAX_BBXMIN": 121.013757, "MIN_BBXMAX": 121.9, "MAX_BBXMAX": 121.9, "MIN_BBYMIN": 30.191667, "MAX_BBYMIN": 30.7, "MIN_BBYMAX": 31.65, "MAX_BBYMAX": 32.308333, "MEAN_BBXC": 121.053901, "MEAN_BBYC": 31.253289, "COMPARE": 0, "GN_ASCII": "Shanghai", "FEATURE_CL": "P", "FEATURE_CO": "PPLA", "ADMIN1_COD": 23, "GN_POP": 14608512, "ELEVATION": 0, "GTOPO30": 6, "TIMEZONE": "Asia/Shanghai", "GEONAMESNO": "GeoNames match general.", "UN_FID": 98, "UN_ADM0": "China", "UN_LAT": 31.24, "UN_LONG": 121.47, "POP1950": 6066, "POP1955": 6299, "POP1960": 6542, "POP1965": 6793, "POP1970": 7055, "POP1975": 7326, "POP1980": 7608, "POP1985": 7901, "POP1990": 8205, "POP1995": 10423, "POP2000": 13243, "POP2005": 14503, "POP2010": 14987, "POP2015": 15789, "POP2020": 17214, "POP2025": 18466, "POP2050": 19412 }, "geometry": { "type": "Point", "coordinates": [ 121.442871, 31.222197 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 4, "NATSCALE": 50, "LABELRANK": 5, "FEATURECLA": "Admin-0 capital alt", "NAME": "Baguio City", "DIFFASCII": 0, "NAMEASCII": "Baguio City", "ADM0CAP": 0, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Philippines", "SOV_A3": "PHL", "ADM0NAME": "Philippines", "ADM0_A3": "PHL", "ADM1NAME": "Benguet", "ISO_A2": "PH", "LATITUDE": 16.429991, "LONGITUDE": 120.569943, "CHANGED": 40, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 447824, "POP_MIN": 272714, "POP_OTHER": 164877, "RANK_MAX": 10, "RANK_MIN": 10, "GEONAMEID": 1728930, "LS_NAME": "Baguio City", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 447824, "MAX_POP20": 447824, "MAX_POP50": 447824, "MAX_POP300": 447824, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 89, "MAX_AREAKM": 89, "MIN_AREAMI": 34, "MAX_AREAMI": 34, "MIN_PERKM": 78, "MAX_PERKM": 78, "MIN_PERMI": 48, "MAX_PERMI": 48, "MIN_BBXMIN": 120.541667, "MAX_BBXMIN": 120.541667, "MIN_BBXMAX": 120.65, "MAX_BBXMAX": 120.65, "MIN_BBYMIN": 16.358333, "MAX_BBYMIN": 16.358333, "MIN_BBYMAX": 16.483333, "MAX_BBYMAX": 16.483333, "MEAN_BBXC": 120.598765, "MEAN_BBYC": 16.421065, "COMPARE": 0, "GN_ASCII": "Baguio", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 0, "GN_POP": 272714, "ELEVATION": 0, "GTOPO30": 1448, "TIMEZONE": "Asia/Manila", "GEONAMESNO": "GeoNames spatial join with similar names only.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 120.563965, 16.425548 ] } }
|
||||
,
|
||||
@@ -395,7 +392,7 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 6, "NATSCALE": 30, "LABELRANK": 0, "FEATURECLA": "Admin-0 capital", "NAME": "Palikir", "DIFFASCII": 0, "NAMEASCII": "Palikir", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Federated States of Micronesia", "SOV_A3": "FSM", "ADM0NAME": "Federated States of Micronesia", "ADM0_A3": "FSM", "ISO_A2": "FM", "LATITUDE": 6.916644, "LONGITUDE": 158.149974, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 4645, "POP_MIN": 4645, "POP_OTHER": 0, "RANK_MAX": 4, "RANK_MIN": 4, "GEONAMEID": 2081986, "LS_NAME": "Palikir", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 412, "MAX_POP20": 412, "MAX_POP50": 412, "MAX_POP300": 412, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 1, "MAX_AREAKM": 1, "MIN_AREAMI": 0, "MAX_AREAMI": 0, "MIN_PERKM": 4, "MAX_PERKM": 4, "MIN_PERMI": 2, "MAX_PERMI": 2, "MIN_BBXMIN": 158.158333, "MAX_BBXMIN": 158.158333, "MIN_BBXMAX": 158.166667, "MAX_BBXMAX": 158.166667, "MIN_BBYMIN": 6.908333, "MAX_BBYMIN": 6.908333, "MIN_BBYMAX": 6.916667, "MAX_BBYMAX": 6.916667, "MEAN_BBXC": 158.1625, "MEAN_BBYC": 6.9125, "COMPARE": 0, "GN_ASCII": "Palikir", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 2, "GN_POP": 4645, "ELEVATION": 0, "GTOPO30": 159, "TIMEZONE": "Pacific/Ponape", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 158.159180, 6.926427 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 6, "NATSCALE": 30, "LABELRANK": 0, "FEATURECLA": "Admin-0 capital", "NAME": "Majuro", "DIFFASCII": 0, "NAMEASCII": "Majuro", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Marshall Islands", "SOV_A3": "MHL", "ADM0NAME": "Marshall Islands", "ADM0_A3": "MHL", "ISO_A2": "MH", "LATITUDE": 7.103004, "LONGITUDE": 171.38, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 25400, "POP_MIN": 20500, "POP_OTHER": 0, "RANK_MAX": 7, "RANK_MIN": 7, "GEONAMEID": 2113779, "LS_NAME": "Majuro", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 2084, "MAX_POP20": 2084, "MAX_POP50": 2084, "MAX_POP300": 2084, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 3, "MAX_AREAKM": 3, "MIN_AREAMI": 1, "MAX_AREAMI": 1, "MIN_PERKM": 7, "MAX_PERKM": 7, "MIN_PERMI": 5, "MAX_PERMI": 5, "MIN_BBXMIN": 171.366667, "MAX_BBXMIN": 171.366667, "MIN_BBXMAX": 171.375, "MAX_BBXMAX": 171.375, "MIN_BBYMIN": 7.091667, "MAX_BBYMIN": 7.091667, "MIN_BBYMAX": 7.116667, "MAX_BBYMAX": 7.116667, "MEAN_BBXC": 171.370833, "MEAN_BBYC": 7.104167, "COMPARE": 0, "GN_ASCII": "Majuro", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 0, "GN_POP": 20500, "ELEVATION": 0, "GTOPO30": 1, "TIMEZONE": "Pacific/Majuro", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 171.386719, 7.100893 ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 6, "NATSCALE": 30, "LABELRANK": 0, "FEATURECLA": "Admin-0 capital", "NAME": "Tarawa", "DIFFASCII": 0, "NAMEASCII": "Tarawa", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Kiribati", "SOV_A3": "KIR", "ADM0NAME": "Kiribati", "ADM0_A3": "KIR", "ISO_A2": "KI", "LATITUDE": 1.338188, "LONGITUDE": 173.017571, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Location adjusted. Changed scale rank.", "POP_MAX": 28802, "POP_MIN": 22534, "POP_OTHER": 0, "RANK_MAX": 7, "RANK_MIN": 7, "GEONAMEID": 2110079, "LS_NAME": "Tarawa", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 22534, "MAX_POP20": 22534, "MAX_POP50": 22534, "MAX_POP300": 22534, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 12, "MAX_AREAKM": 12, "MIN_AREAMI": 5, "MAX_AREAMI": 5, "MIN_PERKM": 28, "MAX_PERKM": 28, "MIN_PERMI": 17, "MAX_PERMI": 17, "MIN_BBXMIN": 172.966667, "MAX_BBXMIN": 172.966667, "MIN_BBXMAX": 173.058333, "MAX_BBXMAX": 173.058333, "MIN_BBYMIN": 1.325, "MAX_BBYMIN": 1.325, "MIN_BBYMAX": 1.358333, "MAX_BBYMAX": 1.358333, "MEAN_BBXC": 173.015476, "MEAN_BBYC": 1.33869, "COMPARE": 0, "GN_ASCII": "Tarawa", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 0, "GN_POP": 28802, "ELEVATION": 0, "GTOPO30": 1, "TIMEZONE": "Pacific/Tarawa", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 173.012695, 1.340210 ] } }
|
||||
] }
|
||||
] }
|
||||
] }
|
||||
|
||||
+1
@@ -9,6 +9,7 @@
|
||||
"maxzoom": "0",
|
||||
"minzoom": "0",
|
||||
"name": "tests/ne_110m_populated_places/out/-z0_-r1_-yNAME_-ySOV0NAME_-yELEVATION_-YNAME%3aCity_-YSOV0NAME%3aCountry.json.check.mbtiles",
|
||||
"tippecanoe_decisions": "{\"basezoom\":0,\"droprate\":1,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
+206
@@ -0,0 +1,206 @@
|
||||
{ "type": "FeatureCollection", "properties": {
|
||||
"antimeridian_adjusted_bounds": "-175.220564,-41.299973,179.216647,64.150023",
|
||||
"bounds": "-175.220564,-41.299973,179.216647,64.150023",
|
||||
"center": "0.000000,0.000000,0",
|
||||
"description": "tests/ne_110m_populated_places/out/-z0_-r2_-B3_-yNAME_--retain-points-multiplier_3_--order-by_NAME.json.check.mbtiles",
|
||||
"format": "pbf",
|
||||
"generator_options": "./tippecanoe -q -a@ -f -o tests/ne_110m_populated_places/out/-z0_-r2_-B3_-yNAME_--retain-points-multiplier_3_--order-by_NAME.json.check.mbtiles -z0 -r2 -B3 -yNAME --retain-points-multiplier 3 --order-by NAME tests/ne_110m_populated_places/in.json",
|
||||
"json": "{\"vector_layers\":[{\"id\":\"in\",\"description\":\"\",\"minzoom\":0,\"maxzoom\":0,\"fields\":{\"NAME\":\"String\",\"tippecanoe:retain_points_multiplier_first\":\"Boolean\",\"tippecanoe:retain_points_multiplier_sequence\":\"Number\"}}],\"tilestats\":{\"layerCount\":1,\"layers\":[{\"layer\":\"in\",\"count\":243,\"geometry\":\"Point\",\"attributeCount\":3,\"attributes\":[{\"attribute\":\"NAME\",\"count\":243,\"type\":\"string\",\"values\":[\"Abidjan\",\"Abu Dhabi\",\"Abuja\",\"Accra\",\"Addis Ababa\",\"Algiers\",\"Amman\",\"Amsterdam\",\"Andorra\",\"Ankara\",\"Antananarivo\",\"Apia\",\"Ashgabat\",\"Asmara\",\"Astana\",\"Asuncion\",\"Athens\",\"Atlanta\",\"Auckland\",\"Baghdad\",\"Baguio City\",\"Baku\",\"Bamako\",\"Bandar Seri Begawan\",\"Bangalore\",\"Bangkok\",\"Bangui\",\"Banjul\",\"Basseterre\",\"Beijing\",\"Beirut\",\"Belgrade\",\"Belmopan\",\"Berlin\",\"Bern\",\"Bir Lehlou\",\"Bishkek\",\"Bissau\",\"Bloemfontein\",\"Bogota\",\"Brasilia\",\"Bratislava\",\"Brazzaville\",\"Bridgetown\",\"Brussels\",\"Bucharest\",\"Budapest\",\"Buenos Aires\",\"Bujumbura\",\"Cairo\",\"Canberra\",\"Cape Town\",\"Caracas\",\"Casablanca\",\"Castries\",\"Chengdu\",\"Chicago\",\"Chisinau\",\"Colombo\",\"Conakry\",\"Cotonou\",\"Dakar\",\"Damascus\",\"Dar es Salaam\",\"Denver\",\"Dhaka\",\"Dili\",\"Djibouti\",\"Dodoma\",\"Doha\",\"Dubai\",\"Dublin\",\"Dushanbe\",\"Freetown\",\"Funafuti\",\"Gaborone\",\"Geneva\",\"Georgetown\",\"Guatemala\",\"Hanoi\",\"Harare\",\"Hargeysa\",\"Havana\",\"Helsinki\",\"Hong Kong\",\"Honiara\",\"Houston\",\"Islamabad\",\"Istanbul\",\"Jakarta\",\"Jerusalem\",\"Johannesburg\",\"Juba\",\"Kabul\",\"Kampala\",\"Kathmandu\",\"Khartoum\",\"Kiev\",\"Kigali\",\"Kingston\"]},{\"attribute\":\"tippecanoe:retain_points_multiplier_first\",\"count\":1,\"type\":\"boolean\",\"values\":[true]},{\"attribute\":\"tippecanoe:retain_points_multiplier_sequence\",\"count\":93,\"type\":\"number\",\"values\":[0,1,10,11,12,13,14,15,16,17,18,19,2,20,21,22,23,24,25,26,27,28,29,3,30,31,32,33,34,35,36,37,38,39,4,40,41,42,43,44,45,46,47,48,49,5,50,51,52,53,54,55,56,57,58,59,6,60,61,62,63,64,65,66,67,68,69,7,70,71,72,73,74,75,76,77,78,79,8,80,81,82,83,84,85,86,87,88,89,9,90,91,92],\"min\":0,\"max\":92}]}]}}",
|
||||
"maxzoom": "0",
|
||||
"minzoom": "0",
|
||||
"name": "tests/ne_110m_populated_places/out/-z0_-r2_-B3_-yNAME_--retain-points-multiplier_3_--order-by_NAME.json.check.mbtiles",
|
||||
"strategies": "[{\"dropped_by_rate\":150}]",
|
||||
"tippecanoe_decisions": "{\"basezoom\":3,\"droprate\":2,\"retain_points_multiplier\":3}",
|
||||
"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": { "NAME": "Astana", "tippecanoe:retain_points_multiplier_sequence": 41, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 71.455078, 51.179343 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Bishkek", "tippecanoe:retain_points_multiplier_sequence": 29 }, "geometry": { "type": "Point", "coordinates": [ 74.619141, 42.875964 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Tashkent", "tippecanoe:retain_points_multiplier_sequence": 67 }, "geometry": { "type": "Point", "coordinates": [ 69.257812, 41.310824 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Bangkok", "tippecanoe:retain_points_multiplier_sequence": 68, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 100.546875, 13.752725 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Vientiane", "tippecanoe:retain_points_multiplier_sequence": 42 }, "geometry": { "type": "Point", "coordinates": [ 102.568359, 17.978733 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Hanoi", "tippecanoe:retain_points_multiplier_sequence": 51 }, "geometry": { "type": "Point", "coordinates": [ 105.820312, 21.043491 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Berlin", "tippecanoe:retain_points_multiplier_sequence": 72, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 13.359375, 52.536273 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Warsaw", "tippecanoe:retain_points_multiplier_sequence": 55 }, "geometry": { "type": "Point", "coordinates": [ 21.005859, 52.268157 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Prague", "tippecanoe:retain_points_multiplier_sequence": 59 }, "geometry": { "type": "Point", "coordinates": [ 14.501953, 50.064192 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Bir Lehlou", "tippecanoe:retain_points_multiplier_sequence": 3, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ -9.667969, 26.115986 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Nouakchott", "tippecanoe:retain_points_multiplier_sequence": 39 }, "geometry": { "type": "Point", "coordinates": [ -15.996094, 18.062312 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Dakar", "tippecanoe:retain_points_multiplier_sequence": 70 }, "geometry": { "type": "Point", "coordinates": [ -17.490234, 14.689881 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Bucharest", "tippecanoe:retain_points_multiplier_sequence": 53, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 26.103516, 44.465151 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Istanbul", "tippecanoe:retain_points_multiplier_sequence": 83 }, "geometry": { "type": "Point", "coordinates": [ 29.003906, 41.112469 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Chisinau", "tippecanoe:retain_points_multiplier_sequence": 26 }, "geometry": { "type": "Point", "coordinates": [ 28.828125, 46.980252 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Cairo", "tippecanoe:retain_points_multiplier_sequence": 87, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 31.289062, 30.069094 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Tel Aviv-Yafo", "tippecanoe:retain_points_multiplier_sequence": 61 }, "geometry": { "type": "Point", "coordinates": [ 34.804688, 32.101190 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Beirut", "tippecanoe:retain_points_multiplier_sequence": 40 }, "geometry": { "type": "Point", "coordinates": [ 35.507812, 33.870416 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Dublin", "tippecanoe:retain_points_multiplier_sequence": 57, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ -6.240234, 53.330873 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "London", "tippecanoe:retain_points_multiplier_sequence": 82 }, "geometry": { "type": "Point", "coordinates": [ -0.087891, 51.508742 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Praia", "tippecanoe:retain_points_multiplier_sequence": 49 }, "geometry": { "type": "Point", "coordinates": [ -23.554688, 14.944785 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Funafuti", "tippecanoe:retain_points_multiplier_sequence": 1, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 179.208984, -8.494105 ], [ -180.791016, -8.494105 ] ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Auckland", "tippecanoe:retain_points_multiplier_sequence": 71 }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 174.726562, -36.879621 ], [ -185.273438, -36.879621 ] ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Suva", "tippecanoe:retain_points_multiplier_sequence": 37 }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 178.417969, -18.145852 ], [ -181.582031, -18.145852 ] ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Guatemala", "tippecanoe:retain_points_multiplier_sequence": 35, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ -90.527344, 14.604847 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Chicago", "tippecanoe:retain_points_multiplier_sequence": 65 }, "geometry": { "type": "Point", "coordinates": [ -87.714844, 41.836828 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Toronto", "tippecanoe:retain_points_multiplier_sequence": 77 }, "geometry": { "type": "Point", "coordinates": [ -79.453125, 43.707594 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Hong Kong", "tippecanoe:retain_points_multiplier_sequence": 92, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 114.169922, 22.268764 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Taipei", "tippecanoe:retain_points_multiplier_sequence": 79 }, "geometry": { "type": "Point", "coordinates": [ 121.552734, 25.005973 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Shanghai", "tippecanoe:retain_points_multiplier_sequence": 88 }, "geometry": { "type": "Point", "coordinates": [ 121.464844, 31.203405 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Jakarta", "tippecanoe:retain_points_multiplier_sequence": 86, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 106.787109, -6.140555 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Port Moresby", "tippecanoe:retain_points_multiplier_sequence": 25 }, "geometry": { "type": "Point", "coordinates": [ 147.216797, -9.449062 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Dili", "tippecanoe:retain_points_multiplier_sequence": 19 }, "geometry": { "type": "Point", "coordinates": [ 125.595703, -8.581021 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Kabul", "tippecanoe:retain_points_multiplier_sequence": 78, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 69.169922, 34.524661 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Islamabad", "tippecanoe:retain_points_multiplier_sequence": 23 }, "geometry": { "type": "Point", "coordinates": [ 73.125000, 33.724340 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "New Delhi", "tippecanoe:retain_points_multiplier_sequence": 75 }, "geometry": { "type": "Point", "coordinates": [ 77.167969, 28.613459 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Khartoum", "tippecanoe:retain_points_multiplier_sequence": 54, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 32.519531, 15.623037 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Kampala", "tippecanoe:retain_points_multiplier_sequence": 21 }, "geometry": { "type": "Point", "coordinates": [ 32.607422, 0.351560 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Juba", "tippecanoe:retain_points_multiplier_sequence": 6 }, "geometry": { "type": "Point", "coordinates": [ 31.552734, 4.828260 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Kingston", "tippecanoe:retain_points_multiplier_sequence": 31, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ -76.728516, 17.978733 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Port-au-Prince", "tippecanoe:retain_points_multiplier_sequence": 20 }, "geometry": { "type": "Point", "coordinates": [ -72.333984, 18.562947 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Santo Domingo", "tippecanoe:retain_points_multiplier_sequence": 60 }, "geometry": { "type": "Point", "coordinates": [ -69.873047, 18.479609 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Kingstown", "tippecanoe:retain_points_multiplier_sequence": 14, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ -61.171875, 13.154376 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Saint George's", "tippecanoe:retain_points_multiplier_sequence": 15 }, "geometry": { "type": "Point", "coordinates": [ -61.699219, 12.039321 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Bridgetown", "tippecanoe:retain_points_multiplier_sequence": 13 }, "geometry": { "type": "Point", "coordinates": [ -59.589844, 13.068777 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Kinshasa", "tippecanoe:retain_points_multiplier_sequence": 74, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 15.292969, -4.302591 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Luanda", "tippecanoe:retain_points_multiplier_sequence": 63 }, "geometry": { "type": "Point", "coordinates": [ 13.271484, -8.841651 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Windhoek", "tippecanoe:retain_points_multiplier_sequence": 28 }, "geometry": { "type": "Point", "coordinates": [ 17.050781, -22.593726 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Lima", "tippecanoe:retain_points_multiplier_sequence": 69, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ -77.080078, -12.039321 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "La Paz", "tippecanoe:retain_points_multiplier_sequence": 45 }, "geometry": { "type": "Point", "coordinates": [ -68.115234, -16.467695 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Valparaiso", "tippecanoe:retain_points_multiplier_sequence": 38 }, "geometry": { "type": "Point", "coordinates": [ -71.630859, -33.063924 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Luxembourg", "tippecanoe:retain_points_multiplier_sequence": 0, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 6.152344, 49.610710 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Andorra", "tippecanoe:retain_points_multiplier_sequence": 4 }, "geometry": { "type": "Point", "coordinates": [ 1.494141, 42.488302 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Paris", "tippecanoe:retain_points_multiplier_sequence": 89 }, "geometry": { "type": "Point", "coordinates": [ 2.373047, 48.864715 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Malabo", "tippecanoe:retain_points_multiplier_sequence": 33, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 8.789062, 3.776559 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Ndjamena", "tippecanoe:retain_points_multiplier_sequence": 32 }, "geometry": { "type": "Point", "coordinates": [ 15.029297, 12.125264 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Libreville", "tippecanoe:retain_points_multiplier_sequence": 36 }, "geometry": { "type": "Point", "coordinates": [ 9.492188, 0.351560 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Male", "tippecanoe:retain_points_multiplier_sequence": 48, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 73.476562, 4.127285 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Sri Jawewardenepura Kotte", "tippecanoe:retain_points_multiplier_sequence": 9 }, "geometry": { "type": "Point", "coordinates": [ 79.980469, 6.926427 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Colombo", "tippecanoe:retain_points_multiplier_sequence": 27 }, "geometry": { "type": "Point", "coordinates": [ 79.892578, 6.926427 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Manama", "tippecanoe:retain_points_multiplier_sequence": 16, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 50.625000, 26.273714 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Dubai", "tippecanoe:retain_points_multiplier_sequence": 66 }, "geometry": { "type": "Point", "coordinates": [ 55.283203, 25.244696 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Doha", "tippecanoe:retain_points_multiplier_sequence": 8 }, "geometry": { "type": "Point", "coordinates": [ 51.503906, 25.324167 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Maseru", "tippecanoe:retain_points_multiplier_sequence": 30, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 27.509766, -29.305561 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Pretoria", "tippecanoe:retain_points_multiplier_sequence": 24 }, "geometry": { "type": "Point", "coordinates": [ 28.212891, -25.720735 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Mbabane", "tippecanoe:retain_points_multiplier_sequence": 5 }, "geometry": { "type": "Point", "coordinates": [ 31.113281, -26.352498 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Melekeok", "tippecanoe:retain_points_multiplier_sequence": 2, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 134.648438, 7.449624 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Osaka", "tippecanoe:retain_points_multiplier_sequence": 73 }, "geometry": { "type": "Point", "coordinates": [ 135.439453, 34.741612 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Kyoto", "tippecanoe:retain_points_multiplier_sequence": 11 }, "geometry": { "type": "Point", "coordinates": [ 135.791016, 35.029996 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Nairobi", "tippecanoe:retain_points_multiplier_sequence": 85, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 36.826172, -1.318243 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Dar es Salaam", "tippecanoe:retain_points_multiplier_sequence": 56 }, "geometry": { "type": "Point", "coordinates": [ 39.287109, -6.839170 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Dodoma", "tippecanoe:retain_points_multiplier_sequence": 10 }, "geometry": { "type": "Point", "coordinates": [ 35.771484, -6.140555 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "New York", "tippecanoe:retain_points_multiplier_sequence": 81, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ -74.003906, 40.780541 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Nassau", "tippecanoe:retain_points_multiplier_sequence": 50 }, "geometry": { "type": "Point", "coordinates": [ -77.343750, 25.085599 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Belmopan", "tippecanoe:retain_points_multiplier_sequence": 44 }, "geometry": { "type": "Point", "coordinates": [ -88.769531, 17.224758 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Ouagadougou", "tippecanoe:retain_points_multiplier_sequence": 46, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ -1.494141, 12.382928 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Yamoussoukro", "tippecanoe:retain_points_multiplier_sequence": 43 }, "geometry": { "type": "Point", "coordinates": [ -5.273438, 6.839170 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Monrovia", "tippecanoe:retain_points_multiplier_sequence": 58 }, "geometry": { "type": "Point", "coordinates": [ -10.810547, 6.315299 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Rome", "tippecanoe:retain_points_multiplier_sequence": 84, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 12.480469, 41.902277 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Budapest", "tippecanoe:retain_points_multiplier_sequence": 52 }, "geometry": { "type": "Point", "coordinates": [ 19.072266, 47.517201 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Bratislava", "tippecanoe:retain_points_multiplier_sequence": 7 }, "geometry": { "type": "Point", "coordinates": [ 17.138672, 48.166085 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Sao Paulo", "tippecanoe:retain_points_multiplier_sequence": 91, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ -46.669922, -23.563987 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Rio de Janeiro", "tippecanoe:retain_points_multiplier_sequence": 90 }, "geometry": { "type": "Point", "coordinates": [ -43.242188, -22.917923 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Montevideo", "tippecanoe:retain_points_multiplier_sequence": 17 }, "geometry": { "type": "Point", "coordinates": [ -56.162109, -34.885931 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Skopje", "tippecanoe:retain_points_multiplier_sequence": 12, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 21.445312, 41.967659 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Tallinn", "tippecanoe:retain_points_multiplier_sequence": 34 }, "geometry": { "type": "Point", "coordinates": [ 24.697266, 59.445075 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Helsinki", "tippecanoe:retain_points_multiplier_sequence": 62 }, "geometry": { "type": "Point", "coordinates": [ 24.960938, 60.196156 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Valletta", "tippecanoe:retain_points_multiplier_sequence": 47, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 14.501953, 35.889050 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Niamey", "tippecanoe:retain_points_multiplier_sequence": 22 }, "geometry": { "type": "Point", "coordinates": [ 2.109375, 13.496473 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Lome", "tippecanoe:retain_points_multiplier_sequence": 18 }, "geometry": { "type": "Point", "coordinates": [ 1.230469, 6.140555 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Vancouver", "tippecanoe:retain_points_multiplier_sequence": 76, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ -123.134766, 49.267805 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "San Francisco", "tippecanoe:retain_points_multiplier_sequence": 64 }, "geometry": { "type": "Point", "coordinates": [ -122.431641, 37.788081 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Los Angeles", "tippecanoe:retain_points_multiplier_sequence": 80 }, "geometry": { "type": "Point", "coordinates": [ -118.212891, 34.016242 ] } }
|
||||
] }
|
||||
] }
|
||||
] }
|
||||
+206
@@ -0,0 +1,206 @@
|
||||
{ "type": "FeatureCollection", "properties": {
|
||||
"antimeridian_adjusted_bounds": "-175.220564,-41.299973,179.216647,64.150023",
|
||||
"bounds": "-175.220564,-41.299973,179.216647,64.150023",
|
||||
"center": "0.000000,0.000000,0",
|
||||
"description": "tests/ne_110m_populated_places/out/-z0_-r2_-B3_-yNAME_--retain-points-multiplier_3_--preserve-input-order.json.check.mbtiles",
|
||||
"format": "pbf",
|
||||
"generator_options": "./tippecanoe -q -a@ -f -o tests/ne_110m_populated_places/out/-z0_-r2_-B3_-yNAME_--retain-points-multiplier_3_--preserve-input-order.json.check.mbtiles -z0 -r2 -B3 -yNAME --retain-points-multiplier 3 --preserve-input-order tests/ne_110m_populated_places/in.json",
|
||||
"json": "{\"vector_layers\":[{\"id\":\"in\",\"description\":\"\",\"minzoom\":0,\"maxzoom\":0,\"fields\":{\"NAME\":\"String\",\"tippecanoe:retain_points_multiplier_first\":\"Boolean\",\"tippecanoe:retain_points_multiplier_sequence\":\"Number\"}}],\"tilestats\":{\"layerCount\":1,\"layers\":[{\"layer\":\"in\",\"count\":243,\"geometry\":\"Point\",\"attributeCount\":3,\"attributes\":[{\"attribute\":\"NAME\",\"count\":243,\"type\":\"string\",\"values\":[\"Abidjan\",\"Abu Dhabi\",\"Abuja\",\"Accra\",\"Addis Ababa\",\"Algiers\",\"Amman\",\"Amsterdam\",\"Andorra\",\"Ankara\",\"Antananarivo\",\"Apia\",\"Ashgabat\",\"Asmara\",\"Astana\",\"Asuncion\",\"Athens\",\"Atlanta\",\"Auckland\",\"Baghdad\",\"Baguio City\",\"Baku\",\"Bamako\",\"Bandar Seri Begawan\",\"Bangalore\",\"Bangkok\",\"Bangui\",\"Banjul\",\"Basseterre\",\"Beijing\",\"Beirut\",\"Belgrade\",\"Belmopan\",\"Berlin\",\"Bern\",\"Bir Lehlou\",\"Bishkek\",\"Bissau\",\"Bloemfontein\",\"Bogota\",\"Brasilia\",\"Bratislava\",\"Brazzaville\",\"Bridgetown\",\"Brussels\",\"Bucharest\",\"Budapest\",\"Buenos Aires\",\"Bujumbura\",\"Cairo\",\"Canberra\",\"Cape Town\",\"Caracas\",\"Casablanca\",\"Castries\",\"Chengdu\",\"Chicago\",\"Chisinau\",\"Colombo\",\"Conakry\",\"Cotonou\",\"Dakar\",\"Damascus\",\"Dar es Salaam\",\"Denver\",\"Dhaka\",\"Dili\",\"Djibouti\",\"Dodoma\",\"Doha\",\"Dubai\",\"Dublin\",\"Dushanbe\",\"Freetown\",\"Funafuti\",\"Gaborone\",\"Geneva\",\"Georgetown\",\"Guatemala\",\"Hanoi\",\"Harare\",\"Hargeysa\",\"Havana\",\"Helsinki\",\"Hong Kong\",\"Honiara\",\"Houston\",\"Islamabad\",\"Istanbul\",\"Jakarta\",\"Jerusalem\",\"Johannesburg\",\"Juba\",\"Kabul\",\"Kampala\",\"Kathmandu\",\"Khartoum\",\"Kiev\",\"Kigali\",\"Kingston\"]},{\"attribute\":\"tippecanoe:retain_points_multiplier_first\",\"count\":1,\"type\":\"boolean\",\"values\":[true]},{\"attribute\":\"tippecanoe:retain_points_multiplier_sequence\",\"count\":93,\"type\":\"number\",\"values\":[0,1,10,11,12,13,14,15,16,17,18,19,2,20,21,22,23,24,25,26,27,28,29,3,30,31,32,33,34,35,36,37,38,39,4,40,41,42,43,44,45,46,47,48,49,5,50,51,52,53,54,55,56,57,58,59,6,60,61,62,63,64,65,66,67,68,69,7,70,71,72,73,74,75,76,77,78,79,8,80,81,82,83,84,85,86,87,88,89,9,90,91,92],\"min\":0,\"max\":92}]}]}}",
|
||||
"maxzoom": "0",
|
||||
"minzoom": "0",
|
||||
"name": "tests/ne_110m_populated_places/out/-z0_-r2_-B3_-yNAME_--retain-points-multiplier_3_--preserve-input-order.json.check.mbtiles",
|
||||
"strategies": "[{\"dropped_by_rate\":150}]",
|
||||
"tippecanoe_decisions": "{\"basezoom\":3,\"droprate\":2,\"retain_points_multiplier\":3}",
|
||||
"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": { "NAME": "Luxembourg", "tippecanoe:retain_points_multiplier_sequence": 0, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 6.152344, 49.610710 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Andorra", "tippecanoe:retain_points_multiplier_sequence": 4 }, "geometry": { "type": "Point", "coordinates": [ 1.494141, 42.488302 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Paris", "tippecanoe:retain_points_multiplier_sequence": 89 }, "geometry": { "type": "Point", "coordinates": [ 2.373047, 48.864715 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Funafuti", "tippecanoe:retain_points_multiplier_sequence": 1, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 179.208984, -8.494105 ], [ -180.791016, -8.494105 ] ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Auckland", "tippecanoe:retain_points_multiplier_sequence": 71 }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 174.726562, -36.879621 ], [ -185.273438, -36.879621 ] ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Suva", "tippecanoe:retain_points_multiplier_sequence": 37 }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 178.417969, -18.145852 ], [ -181.582031, -18.145852 ] ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Melekeok", "tippecanoe:retain_points_multiplier_sequence": 2, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 134.648438, 7.449624 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Osaka", "tippecanoe:retain_points_multiplier_sequence": 73 }, "geometry": { "type": "Point", "coordinates": [ 135.439453, 34.741612 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Kyoto", "tippecanoe:retain_points_multiplier_sequence": 11 }, "geometry": { "type": "Point", "coordinates": [ 135.791016, 35.029996 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Bir Lehlou", "tippecanoe:retain_points_multiplier_sequence": 3, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ -9.667969, 26.115986 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Nouakchott", "tippecanoe:retain_points_multiplier_sequence": 39 }, "geometry": { "type": "Point", "coordinates": [ -15.996094, 18.062312 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Dakar", "tippecanoe:retain_points_multiplier_sequence": 70 }, "geometry": { "type": "Point", "coordinates": [ -17.490234, 14.689881 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Skopje", "tippecanoe:retain_points_multiplier_sequence": 12, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 21.445312, 41.967659 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Tallinn", "tippecanoe:retain_points_multiplier_sequence": 34 }, "geometry": { "type": "Point", "coordinates": [ 24.697266, 59.445075 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Helsinki", "tippecanoe:retain_points_multiplier_sequence": 62 }, "geometry": { "type": "Point", "coordinates": [ 24.960938, 60.196156 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Kingstown", "tippecanoe:retain_points_multiplier_sequence": 14, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ -61.171875, 13.154376 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Saint George's", "tippecanoe:retain_points_multiplier_sequence": 15 }, "geometry": { "type": "Point", "coordinates": [ -61.699219, 12.039321 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Bridgetown", "tippecanoe:retain_points_multiplier_sequence": 13 }, "geometry": { "type": "Point", "coordinates": [ -59.589844, 13.068777 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Manama", "tippecanoe:retain_points_multiplier_sequence": 16, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 50.625000, 26.273714 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Dubai", "tippecanoe:retain_points_multiplier_sequence": 66 }, "geometry": { "type": "Point", "coordinates": [ 55.283203, 25.244696 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Doha", "tippecanoe:retain_points_multiplier_sequence": 8 }, "geometry": { "type": "Point", "coordinates": [ 51.503906, 25.324167 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Maseru", "tippecanoe:retain_points_multiplier_sequence": 30, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 27.509766, -29.305561 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Pretoria", "tippecanoe:retain_points_multiplier_sequence": 24 }, "geometry": { "type": "Point", "coordinates": [ 28.212891, -25.720735 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Mbabane", "tippecanoe:retain_points_multiplier_sequence": 5 }, "geometry": { "type": "Point", "coordinates": [ 31.113281, -26.352498 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Kingston", "tippecanoe:retain_points_multiplier_sequence": 31, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ -76.728516, 17.978733 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Port-au-Prince", "tippecanoe:retain_points_multiplier_sequence": 20 }, "geometry": { "type": "Point", "coordinates": [ -72.333984, 18.562947 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Santo Domingo", "tippecanoe:retain_points_multiplier_sequence": 60 }, "geometry": { "type": "Point", "coordinates": [ -69.873047, 18.479609 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Malabo", "tippecanoe:retain_points_multiplier_sequence": 33, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 8.789062, 3.776559 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Ndjamena", "tippecanoe:retain_points_multiplier_sequence": 32 }, "geometry": { "type": "Point", "coordinates": [ 15.029297, 12.125264 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Libreville", "tippecanoe:retain_points_multiplier_sequence": 36 }, "geometry": { "type": "Point", "coordinates": [ 9.492188, 0.351560 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Guatemala", "tippecanoe:retain_points_multiplier_sequence": 35, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ -90.527344, 14.604847 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Chicago", "tippecanoe:retain_points_multiplier_sequence": 65 }, "geometry": { "type": "Point", "coordinates": [ -87.714844, 41.836828 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Toronto", "tippecanoe:retain_points_multiplier_sequence": 77 }, "geometry": { "type": "Point", "coordinates": [ -79.453125, 43.707594 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Astana", "tippecanoe:retain_points_multiplier_sequence": 41, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 71.455078, 51.179343 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Bishkek", "tippecanoe:retain_points_multiplier_sequence": 29 }, "geometry": { "type": "Point", "coordinates": [ 74.619141, 42.875964 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Tashkent", "tippecanoe:retain_points_multiplier_sequence": 67 }, "geometry": { "type": "Point", "coordinates": [ 69.257812, 41.310824 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Ouagadougou", "tippecanoe:retain_points_multiplier_sequence": 46, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ -1.494141, 12.382928 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Yamoussoukro", "tippecanoe:retain_points_multiplier_sequence": 43 }, "geometry": { "type": "Point", "coordinates": [ -5.273438, 6.839170 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Monrovia", "tippecanoe:retain_points_multiplier_sequence": 58 }, "geometry": { "type": "Point", "coordinates": [ -10.810547, 6.315299 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Valletta", "tippecanoe:retain_points_multiplier_sequence": 47, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 14.501953, 35.889050 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Niamey", "tippecanoe:retain_points_multiplier_sequence": 22 }, "geometry": { "type": "Point", "coordinates": [ 2.109375, 13.496473 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Lome", "tippecanoe:retain_points_multiplier_sequence": 18 }, "geometry": { "type": "Point", "coordinates": [ 1.230469, 6.140555 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Male", "tippecanoe:retain_points_multiplier_sequence": 48, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 73.476562, 4.127285 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Sri Jawewardenepura Kotte", "tippecanoe:retain_points_multiplier_sequence": 9 }, "geometry": { "type": "Point", "coordinates": [ 79.980469, 6.926427 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Colombo", "tippecanoe:retain_points_multiplier_sequence": 27 }, "geometry": { "type": "Point", "coordinates": [ 79.892578, 6.926427 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Bucharest", "tippecanoe:retain_points_multiplier_sequence": 53, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 26.103516, 44.465151 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Istanbul", "tippecanoe:retain_points_multiplier_sequence": 83 }, "geometry": { "type": "Point", "coordinates": [ 29.003906, 41.112469 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Chisinau", "tippecanoe:retain_points_multiplier_sequence": 26 }, "geometry": { "type": "Point", "coordinates": [ 28.828125, 46.980252 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Khartoum", "tippecanoe:retain_points_multiplier_sequence": 54, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 32.519531, 15.623037 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Kampala", "tippecanoe:retain_points_multiplier_sequence": 21 }, "geometry": { "type": "Point", "coordinates": [ 32.607422, 0.351560 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Juba", "tippecanoe:retain_points_multiplier_sequence": 6 }, "geometry": { "type": "Point", "coordinates": [ 31.552734, 4.828260 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Dublin", "tippecanoe:retain_points_multiplier_sequence": 57, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ -6.240234, 53.330873 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "London", "tippecanoe:retain_points_multiplier_sequence": 82 }, "geometry": { "type": "Point", "coordinates": [ -0.087891, 51.508742 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Praia", "tippecanoe:retain_points_multiplier_sequence": 49 }, "geometry": { "type": "Point", "coordinates": [ -23.554688, 14.944785 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Bangkok", "tippecanoe:retain_points_multiplier_sequence": 68, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 100.546875, 13.752725 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Vientiane", "tippecanoe:retain_points_multiplier_sequence": 42 }, "geometry": { "type": "Point", "coordinates": [ 102.568359, 17.978733 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Hanoi", "tippecanoe:retain_points_multiplier_sequence": 51 }, "geometry": { "type": "Point", "coordinates": [ 105.820312, 21.043491 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Lima", "tippecanoe:retain_points_multiplier_sequence": 69, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ -77.080078, -12.039321 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "La Paz", "tippecanoe:retain_points_multiplier_sequence": 45 }, "geometry": { "type": "Point", "coordinates": [ -68.115234, -16.467695 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Valparaiso", "tippecanoe:retain_points_multiplier_sequence": 38 }, "geometry": { "type": "Point", "coordinates": [ -71.630859, -33.063924 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Berlin", "tippecanoe:retain_points_multiplier_sequence": 72, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 13.359375, 52.536273 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Warsaw", "tippecanoe:retain_points_multiplier_sequence": 55 }, "geometry": { "type": "Point", "coordinates": [ 21.005859, 52.268157 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Prague", "tippecanoe:retain_points_multiplier_sequence": 59 }, "geometry": { "type": "Point", "coordinates": [ 14.501953, 50.064192 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Kinshasa", "tippecanoe:retain_points_multiplier_sequence": 74, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 15.292969, -4.302591 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Luanda", "tippecanoe:retain_points_multiplier_sequence": 63 }, "geometry": { "type": "Point", "coordinates": [ 13.271484, -8.841651 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Windhoek", "tippecanoe:retain_points_multiplier_sequence": 28 }, "geometry": { "type": "Point", "coordinates": [ 17.050781, -22.593726 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Vancouver", "tippecanoe:retain_points_multiplier_sequence": 76, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ -123.134766, 49.267805 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "San Francisco", "tippecanoe:retain_points_multiplier_sequence": 64 }, "geometry": { "type": "Point", "coordinates": [ -122.431641, 37.788081 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Los Angeles", "tippecanoe:retain_points_multiplier_sequence": 80 }, "geometry": { "type": "Point", "coordinates": [ -118.212891, 34.016242 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Kabul", "tippecanoe:retain_points_multiplier_sequence": 78, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 69.169922, 34.524661 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Islamabad", "tippecanoe:retain_points_multiplier_sequence": 23 }, "geometry": { "type": "Point", "coordinates": [ 73.125000, 33.724340 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "New Delhi", "tippecanoe:retain_points_multiplier_sequence": 75 }, "geometry": { "type": "Point", "coordinates": [ 77.167969, 28.613459 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "New York", "tippecanoe:retain_points_multiplier_sequence": 81, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ -74.003906, 40.780541 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Nassau", "tippecanoe:retain_points_multiplier_sequence": 50 }, "geometry": { "type": "Point", "coordinates": [ -77.343750, 25.085599 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Belmopan", "tippecanoe:retain_points_multiplier_sequence": 44 }, "geometry": { "type": "Point", "coordinates": [ -88.769531, 17.224758 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Rome", "tippecanoe:retain_points_multiplier_sequence": 84, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 12.480469, 41.902277 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Budapest", "tippecanoe:retain_points_multiplier_sequence": 52 }, "geometry": { "type": "Point", "coordinates": [ 19.072266, 47.517201 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Bratislava", "tippecanoe:retain_points_multiplier_sequence": 7 }, "geometry": { "type": "Point", "coordinates": [ 17.138672, 48.166085 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Nairobi", "tippecanoe:retain_points_multiplier_sequence": 85, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 36.826172, -1.318243 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Dar es Salaam", "tippecanoe:retain_points_multiplier_sequence": 56 }, "geometry": { "type": "Point", "coordinates": [ 39.287109, -6.839170 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Dodoma", "tippecanoe:retain_points_multiplier_sequence": 10 }, "geometry": { "type": "Point", "coordinates": [ 35.771484, -6.140555 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Jakarta", "tippecanoe:retain_points_multiplier_sequence": 86, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 106.787109, -6.140555 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Port Moresby", "tippecanoe:retain_points_multiplier_sequence": 25 }, "geometry": { "type": "Point", "coordinates": [ 147.216797, -9.449062 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Dili", "tippecanoe:retain_points_multiplier_sequence": 19 }, "geometry": { "type": "Point", "coordinates": [ 125.595703, -8.581021 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Cairo", "tippecanoe:retain_points_multiplier_sequence": 87, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 31.289062, 30.069094 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Tel Aviv-Yafo", "tippecanoe:retain_points_multiplier_sequence": 61 }, "geometry": { "type": "Point", "coordinates": [ 34.804688, 32.101190 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Beirut", "tippecanoe:retain_points_multiplier_sequence": 40 }, "geometry": { "type": "Point", "coordinates": [ 35.507812, 33.870416 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Sao Paulo", "tippecanoe:retain_points_multiplier_sequence": 91, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ -46.669922, -23.563987 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Rio de Janeiro", "tippecanoe:retain_points_multiplier_sequence": 90 }, "geometry": { "type": "Point", "coordinates": [ -43.242188, -22.917923 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Montevideo", "tippecanoe:retain_points_multiplier_sequence": 17 }, "geometry": { "type": "Point", "coordinates": [ -56.162109, -34.885931 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Hong Kong", "tippecanoe:retain_points_multiplier_sequence": 92, "tippecanoe:retain_points_multiplier_first": true }, "geometry": { "type": "Point", "coordinates": [ 114.169922, 22.268764 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Taipei", "tippecanoe:retain_points_multiplier_sequence": 79 }, "geometry": { "type": "Point", "coordinates": [ 121.552734, 25.005973 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Shanghai", "tippecanoe:retain_points_multiplier_sequence": 88 }, "geometry": { "type": "Point", "coordinates": [ 121.464844, 31.203405 ] } }
|
||||
] }
|
||||
] }
|
||||
] }
|
||||
@@ -9,7 +9,7 @@
|
||||
"maxzoom": "1",
|
||||
"minzoom": "0",
|
||||
"name": "tests/ne_110m_populated_places/out/-z1_-M10000_--coalesce-smallest-as-needed.json.check.mbtiles",
|
||||
"strategies": "[{\"dropped_by_rate\":145,\"coalesced_as_needed\":74,\"tile_size_desired\":32932},{\"coalesced_as_needed\":226,\"tile_size_desired\":44398}]",
|
||||
"strategies": "[{\"dropped_by_rate\":145,\"coalesced_as_needed\":77,\"tile_size_desired\":33283},{\"coalesced_as_needed\":226,\"tile_size_desired\":44899}]",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
@@ -17,11 +17,11 @@
|
||||
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 1, "NATSCALE": 300, "LABELRANK": 2, "FEATURECLA": "Populated place", "NAME": "Vancouver", "DIFFASCII": 0, "NAMEASCII": "Vancouver", "ADM0CAP": 0, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Canada", "SOV_A3": "CAN", "ADM0NAME": "Canada", "ADM0_A3": "CAN", "ADM1NAME": "British Columbia", "ISO_A2": "CA", "LATITUDE": 49.273417, "LONGITUDE": -123.121644, "CHANGED": 5, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 2313328, "POP_MIN": 603502, "POP_OTHER": 482002, "RANK_MAX": 12, "RANK_MIN": 11, "GEONAMEID": 6173331, "MEGANAME": "Vancouver", "LS_NAME": "Vancouver2", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1590116, "MAX_POP20": 1588839, "MAX_POP50": 1590116, "MAX_POP300": 1590116, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 706, "MAX_AREAKM": 708, "MIN_AREAMI": 273, "MAX_AREAMI": 273, "MIN_PERKM": 398, "MAX_PERKM": 405, "MIN_PERMI": 248, "MAX_PERMI": 251, "MIN_BBXMIN": -123.283333, "MAX_BBXMIN": -123.283333, "MIN_BBXMAX": -122.708333, "MAX_BBXMAX": -122.708333, "MIN_BBYMIN": 49.1, "MAX_BBYMIN": 49.1, "MIN_BBYMAX": 49.383333, "MAX_BBYMAX": 49.383333, "MEAN_BBXC": -122.982768, "MEAN_BBYC": 49.228888, "COMPARE": 0, "GN_ASCII": "Vancouver", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 2, "GN_POP": 1837969, "ELEVATION": 0, "GTOPO30": 63, "TIMEZONE": "America/Vancouver", "GEONAMESNO": "Geonames ascii name + lat.d + long.d matching.", "UN_FID": 15, "UN_ADM0": "Canada", "UN_LAT": 49.27, "UN_LONG": -122.96, "POP1950": 556, "POP1955": 588, "POP1960": 620, "POP1965": 836, "POP1970": 1045, "POP1975": 1150, "POP1980": 1247, "POP1985": 1359, "POP1990": 1559, "POP1995": 1789, "POP2000": 1959, "POP2005": 2093, "POP2010": 2146, "POP2015": 2219, "POP2020": 2310, "POP2025": 2380, "POP2050": 2444 }, "geometry": { "type": "Point", "coordinates": [ -123.134766, 49.267805 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 0, "NATSCALE": 600, "LABELRANK": 1, "FEATURECLA": "Populated place", "NAME": "Los Angeles", "NAMEALT": "Los Angeles-Long Beach-Santa Ana", "DIFFASCII": 0, "NAMEASCII": "Los Angeles", "ADM0CAP": 0, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "United States", "SOV_A3": "USA", "ADM0NAME": "United States of America", "ADM0_A3": "USA", "ADM1NAME": "California", "ISO_A2": "US", "LATITUDE": 33.989978, "LONGITUDE": -118.179981, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 12500000, "POP_MIN": 3694820, "POP_OTHER": 142265, "RANK_MAX": 14, "RANK_MIN": 12, "GEONAMEID": 5368361, "MEGANAME": "Los Angeles-Long Beach-Santa Ana", "LS_NAME": "Los Angeles1", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 4976870, "MAX_POP20": 6558538, "MAX_POP50": 14868745, "MAX_POP300": 14870543, "MAX_POP310": 14903021, "MAX_NATSCA": 300, "MIN_AREAKM": 1338, "MAX_AREAKM": 5803, "MIN_AREAMI": 517, "MAX_AREAMI": 2241, "MIN_PERKM": 534, "MAX_PERKM": 2202, "MIN_PERMI": 332, "MAX_PERMI": 1369, "MIN_BBXMIN": -118.991667, "MAX_BBXMIN": -118.966667, "MIN_BBXMAX": -117.857183, "MAX_BBXMAX": -117.008333, "MIN_BBYMIN": 33.391667, "MAX_BBYMIN": 33.862631, "MIN_BBYMAX": 34.241667, "MAX_BBYMAX": 34.333333, "MEAN_BBXC": -118.107478, "MEAN_BBYC": 33.980609, "COMPARE": 0, "GN_ASCII": "Los Angeles", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 0, "GN_POP": 3694820, "ELEVATION": 89, "GTOPO30": 115, "TIMEZONE": "America/Los_Angeles", "GEONAMESNO": "GeoNames match with ascii name + lat + long whole numbers.", "UN_FID": 547, "UN_ADM0": "United States of America", "UN_LAT": 34, "UN_LONG": -118.25, "POP1950": 4046, "POP1955": 5154, "POP1960": 6530, "POP1965": 7408, "POP1970": 8378, "POP1975": 8926, "POP1980": 9512, "POP1985": 10181, "POP1990": 10883, "POP1995": 11339, "POP2000": 11814, "POP2005": 12307, "POP2010": 12500, "POP2015": 12773, "POP2020": 13160, "POP2025": 13461, "POP2050": 13672, "CITYALT": "Los Angeles" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ -118.125000, 33.943360 ], [ -90.527344, 14.604847 ], [ -79.365234, 43.707594 ] ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 0, "NATSCALE": 600, "LABELRANK": 1, "FEATURECLA": "Populated place", "NAME": "Los Angeles", "NAMEALT": "Los Angeles-Long Beach-Santa Ana", "DIFFASCII": 0, "NAMEASCII": "Los Angeles", "ADM0CAP": 0, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "United States", "SOV_A3": "USA", "ADM0NAME": "United States of America", "ADM0_A3": "USA", "ADM1NAME": "California", "ISO_A2": "US", "LATITUDE": 33.989978, "LONGITUDE": -118.179981, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 12500000, "POP_MIN": 3694820, "POP_OTHER": 142265, "RANK_MAX": 14, "RANK_MIN": 12, "GEONAMEID": 5368361, "MEGANAME": "Los Angeles-Long Beach-Santa Ana", "LS_NAME": "Los Angeles1", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 4976870, "MAX_POP20": 6558538, "MAX_POP50": 14868745, "MAX_POP300": 14870543, "MAX_POP310": 14903021, "MAX_NATSCA": 300, "MIN_AREAKM": 1338, "MAX_AREAKM": 5803, "MIN_AREAMI": 517, "MAX_AREAMI": 2241, "MIN_PERKM": 534, "MAX_PERKM": 2202, "MIN_PERMI": 332, "MAX_PERMI": 1369, "MIN_BBXMIN": -118.991667, "MAX_BBXMIN": -118.966667, "MIN_BBXMAX": -117.857183, "MAX_BBXMAX": -117.008333, "MIN_BBYMIN": 33.391667, "MAX_BBYMIN": 33.862631, "MIN_BBYMAX": 34.241667, "MAX_BBYMAX": 34.333333, "MEAN_BBXC": -118.107478, "MEAN_BBYC": 33.980609, "COMPARE": 0, "GN_ASCII": "Los Angeles", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 0, "GN_POP": 3694820, "ELEVATION": 89, "GTOPO30": 115, "TIMEZONE": "America/Los_Angeles", "GEONAMESNO": "GeoNames match with ascii name + lat + long whole numbers.", "UN_FID": 547, "UN_ADM0": "United States of America", "UN_LAT": 34, "UN_LONG": -118.25, "POP1950": 4046, "POP1955": 5154, "POP1960": 6530, "POP1965": 7408, "POP1970": 8378, "POP1975": 8926, "POP1980": 9512, "POP1985": 10181, "POP1990": 10883, "POP1995": 11339, "POP2000": 11814, "POP2005": 12307, "POP2010": 12500, "POP2015": 12773, "POP2020": 13160, "POP2025": 13461, "POP2050": 13672, "CITYALT": "Los Angeles" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ -118.125000, 33.943360 ], [ -100.283203, 25.641526 ] ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 1, "NATSCALE": 300, "LABELRANK": 2, "FEATURECLA": "Admin-1 capital", "NAME": "Monterrey", "DIFFASCII": 0, "NAMEASCII": "Monterrey", "ADM0CAP": 0, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Mexico", "SOV_A3": "MEX", "ADM0NAME": "Mexico", "ADM0_A3": "MEX", "ADM1NAME": "Nuevo León", "ISO_A2": "MX", "LATITUDE": 25.669995, "LONGITUDE": -100.329985, "CHANGED": 5, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 3712000, "POP_MIN": 1122874, "POP_OTHER": 3225636, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 3995465, "MEGANAME": "Monterrey", "LS_NAME": "Monterrey", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 3296184, "MAX_POP20": 3296184, "MAX_POP50": 3296184, "MAX_POP300": 3296184, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 594, "MAX_AREAKM": 594, "MIN_AREAMI": 229, "MAX_AREAMI": 229, "MIN_PERKM": 208, "MAX_PERKM": 208, "MIN_PERMI": 130, "MAX_PERMI": 130, "MIN_BBXMIN": -100.5, "MAX_BBXMIN": -100.5, "MIN_BBXMAX": -100.125, "MAX_BBXMAX": -100.125, "MIN_BBYMIN": 25.575, "MAX_BBYMIN": 25.575, "MIN_BBYMAX": 25.85, "MAX_BBYMAX": 25.85, "MEAN_BBXC": -100.290632, "MEAN_BBYC": 25.71613, "COMPARE": 0, "GN_ASCII": "Monterrey", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 19, "GN_POP": 1122874, "ELEVATION": 0, "GTOPO30": 563, "TIMEZONE": "America/Monterrey", "GEONAMESNO": "Geonames ascii name + lat.d + long.d matching.", "UN_FID": 359, "UN_ADM0": "Mexico", "UN_LAT": 25.67, "UN_LONG": -100.31, "POP1950": 356, "POP1955": 498, "POP1960": 698, "POP1965": 943, "POP1970": 1267, "POP1975": 1589, "POP1980": 1992, "POP1985": 2273, "POP1990": 2594, "POP1995": 2961, "POP2000": 3266, "POP2005": 3579, "POP2010": 3712, "POP2015": 3901, "POP2020": 4140, "POP2025": 4298, "POP2050": 4413 }, "geometry": { "type": "Point", "coordinates": [ -100.283203, 25.641526 ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital", "NAME": "Guatemala", "NAMEALT": "Ciudad de Guatemala (Guatemala City)", "DIFFASCII": 0, "NAMEASCII": "Guatemala", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Guatemala", "SOV_A3": "GTM", "ADM0NAME": "Guatemala", "ADM0_A3": "GTM", "ADM1NAME": "Guatemala", "ISO_A2": "GT", "LATITUDE": 14.621135, "LONGITUDE": -90.526966, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 1024000, "POP_MIN": 994938, "POP_OTHER": 2391150, "RANK_MAX": 12, "RANK_MIN": 11, "GEONAMEID": 3598132, "MEGANAME": "Ciudad de Guatemala (Guatemala City)", "LS_NAME": "Guatemala", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 2420941, "MAX_POP20": 2417882, "MAX_POP50": 2419489, "MAX_POP300": 2419489, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 410, "MAX_AREAKM": 419, "MIN_AREAMI": 158, "MAX_AREAMI": 162, "MIN_PERKM": 274, "MAX_PERKM": 288, "MIN_PERMI": 170, "MAX_PERMI": 179, "MIN_BBXMIN": -90.658333, "MAX_BBXMIN": -90.658333, "MIN_BBXMAX": -90.425, "MAX_BBXMAX": -90.425, "MIN_BBYMIN": 14.433333, "MAX_BBYMIN": 14.441667, "MIN_BBYMAX": 14.783333, "MAX_BBYMAX": 14.783333, "MEAN_BBXC": -90.54419, "MEAN_BBYC": 14.603015, "COMPARE": 0, "GN_ASCII": "Guatemala City", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 7, "GN_POP": 994938, "ELEVATION": 0, "GTOPO30": 1533, "TIMEZONE": "America/Guatemala", "GEONAMESNO": "GeoNames match general.", "UN_FID": 206, "UN_ADM0": "Guatemala", "UN_LAT": 14.61, "UN_LONG": -90.52, "POP1950": 287, "POP1955": 370, "POP1960": 476, "POP1965": 592, "POP1970": 660, "POP1975": 715, "POP1980": 749, "POP1985": 776, "POP1990": 803, "POP1995": 839, "POP2000": 908, "POP2005": 984, "POP2010": 1024, "POP2015": 1104, "POP2020": 1281, "POP2025": 1481, "POP2050": 1690, "CITYALT": "Guatemala" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ -90.527344, 14.604847 ], [ -79.365234, 43.707594 ], [ -82.353516, 23.079732 ], [ -76.992188, 38.891033 ] ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 6, "FEATURECLA": "Admin-0 capital", "NAME": "Havana", "NAMEALT": "La Habana", "DIFFASCII": 0, "NAMEASCII": "Havana", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Cuba", "SOV_A3": "CUB", "ADM0NAME": "Cuba", "ADM0_A3": "CUB", "ADM1NAME": "Ciudad de la Habana", "ISO_A2": "CU", "LATITUDE": 23.131959, "LONGITUDE": -82.364182, "CHANGED": 5, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 2174000, "POP_MIN": 1990917, "POP_OTHER": 1930305, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 3553478, "MEGANAME": "La Habana", "LS_NAME": "Havana", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1990917, "MAX_POP20": 2051170, "MAX_POP50": 2051170, "MAX_POP300": 2051170, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 323, "MAX_AREAKM": 362, "MIN_AREAMI": 125, "MAX_AREAMI": 140, "MIN_PERKM": 240, "MAX_PERKM": 286, "MIN_PERMI": 149, "MAX_PERMI": 177, "MIN_BBXMIN": -82.533333, "MAX_BBXMIN": -82.533333, "MIN_BBXMAX": -82.208333, "MAX_BBXMAX": -82.208333, "MIN_BBYMIN": 22.916667, "MAX_BBYMIN": 22.975161, "MIN_BBYMAX": 23.183333, "MAX_BBYMAX": 23.183333, "MEAN_BBXC": -82.354344, "MEAN_BBYC": 23.076845, "COMPARE": 0, "GN_ASCII": "Havana", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 2, "GN_POP": 2163824, "ELEVATION": 0, "GTOPO30": 5, "TIMEZONE": "America/Havana", "GEONAMESNO": "GeoNames match general.", "UN_FID": 172, "UN_ADM0": "Cuba", "UN_LAT": 23.04, "UN_LONG": -82.41, "POP1950": 1116, "POP1955": 1289, "POP1960": 1436, "POP1965": 1598, "POP1970": 1779, "POP1975": 1848, "POP1980": 1913, "POP1985": 2005, "POP1990": 2108, "POP1995": 2183, "POP2000": 2187, "POP2005": 2189, "POP2010": 2174, "POP2015": 2159, "POP2020": 2151, "POP2025": 2150, "POP2050": 2150, "CITYALT": "Havana" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ -82.353516, 23.079732 ], [ -76.992188, 38.891033 ], [ -88.769531, 17.224758 ], [ -89.208984, 13.667338 ], [ -79.541016, 8.928487 ], [ -72.333984, 18.562947 ], [ -61.347656, 15.284185 ], [ -61.699219, 12.039321 ], [ -66.884766, 10.487812 ], [ -55.107422, 5.790897 ], [ -7.558594, 33.578015 ], [ -9.667969, 26.115986 ], [ -15.996094, 18.062312 ], [ -13.623047, 9.535749 ] ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital", "NAME": "Belmopan", "DIFFASCII": 0, "NAMEASCII": "Belmopan", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Belize", "SOV_A3": "BLZ", "ADM0NAME": "Belize", "ADM0_A3": "BLZ", "ADM1NAME": "Cayo", "ISO_A2": "BZ", "LATITUDE": 17.252034, "LONGITUDE": -88.767073, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 15220, "POP_MIN": 13381, "POP_OTHER": 15220, "RANK_MAX": 6, "RANK_MIN": 6, "GEONAMEID": 3582672, "LS_NAME": "Belmopan", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 15220, "MAX_POP20": 15220, "MAX_POP50": 15220, "MAX_POP300": 15220, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 9, "MAX_AREAKM": 9, "MIN_AREAMI": 3, "MAX_AREAMI": 3, "MIN_PERKM": 16, "MAX_PERKM": 16, "MIN_PERMI": 10, "MAX_PERMI": 10, "MIN_BBXMIN": -88.783333, "MAX_BBXMIN": -88.783333, "MIN_BBXMAX": -88.75, "MAX_BBXMAX": -88.75, "MIN_BBYMIN": 17.233333, "MAX_BBYMIN": 17.233333, "MIN_BBYMAX": 17.266667, "MAX_BBYMAX": 17.266667, "MEAN_BBXC": -88.767803, "MEAN_BBYC": 17.248864, "COMPARE": 0, "GN_ASCII": "Belmopan", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 2, "GN_POP": 13381, "ELEVATION": 0, "GTOPO30": 63, "TIMEZONE": "America/Belize", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "MultiPoint", "coordinates": [ [ -88.769531, 17.224758 ], [ -89.208984, 13.667338 ], [ -79.541016, 8.928487 ], [ -72.333984, 18.562947 ], [ -61.347656, 15.284185 ], [ -61.699219, 12.039321 ], [ -66.884766, 10.487812 ], [ -55.107422, 5.790897 ], [ -7.558594, 33.578015 ], [ -9.667969, 26.115986 ], [ -15.996094, 18.062312 ], [ -13.623047, 9.535749 ] ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 4, "NATSCALE": 50, "LABELRANK": 0, "FEATURECLA": "Admin-0 capital", "NAME": "Basseterre", "DIFFASCII": 0, "NAMEASCII": "Basseterre", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Saint Kitts and Nevis", "SOV_A3": "KNA", "ADM0NAME": "Saint Kitts and Nevis", "ADM0_A3": "KNA", "ISO_A2": "KN", "LATITUDE": 17.30203, "LONGITUDE": -62.717009, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 21887, "POP_MIN": 15500, "POP_OTHER": 21887, "RANK_MAX": 7, "RANK_MIN": 6, "GEONAMEID": 3575551, "LS_NAME": "Basseterre", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 21887, "MAX_POP20": 21887, "MAX_POP50": 21887, "MAX_POP300": 21887, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 7, "MAX_AREAKM": 7, "MIN_AREAMI": 3, "MAX_AREAMI": 3, "MIN_PERKM": 16, "MAX_PERKM": 16, "MIN_PERMI": 10, "MAX_PERMI": 10, "MIN_BBXMIN": -62.741667, "MAX_BBXMIN": -62.741667, "MIN_BBXMAX": -62.708333, "MAX_BBXMAX": -62.708333, "MIN_BBYMIN": 17.291667, "MAX_BBYMIN": 17.291667, "MIN_BBYMAX": 17.333333, "MAX_BBYMAX": 17.333333, "MEAN_BBXC": -62.726389, "MEAN_BBYC": 17.306019, "COMPARE": 0, "GN_ASCII": "Basseterre", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 3, "GN_POP": 12920, "ELEVATION": 0, "GTOPO30": 1, "TIMEZONE": "America/St_Kitts", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ -62.666016, 17.308688 ] } }
|
||||
,
|
||||
@@ -29,30 +29,24 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 4, "NATSCALE": 50, "LABELRANK": 5, "FEATURECLA": "Admin-0 capital alt", "NAME": "Laayoune", "DIFFASCII": 0, "NAMEASCII": "Laayoune", "ADM0CAP": 0, "CAPALT": 1, "CAPIN": "Claimed as capi", "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Morocco", "SOV_A3": "MAR", "ADM0NAME": "Morocco", "ADM0_A3": "MAR", "ADM1NAME": "Laâyoune - Boujdour - Sakia El Hamra", "ISO_A2": "MA", "LATITUDE": 27.149982, "LONGITUDE": -13.200006, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 188084, "POP_MIN": 176365, "POP_OTHER": 176365, "RANK_MAX": 9, "RANK_MIN": 9, "GEONAMEID": 2462881, "LS_NAME": "Laayoune", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 176365, "MAX_POP20": 176365, "MAX_POP50": 176365, "MAX_POP300": 0, "MAX_POP310": 0, "MAX_NATSCA": 50, "MIN_AREAKM": 21, "MAX_AREAKM": 21, "MIN_AREAMI": 8, "MAX_AREAMI": 8, "MIN_PERKM": 26, "MAX_PERKM": 26, "MIN_PERMI": 16, "MAX_PERMI": 16, "MIN_BBXMIN": -13.225, "MAX_BBXMIN": -13.225, "MIN_BBXMAX": -13.158333, "MAX_BBXMAX": -13.158333, "MIN_BBYMIN": 27.125, "MAX_BBYMIN": 27.125, "MIN_BBYMAX": 27.175, "MAX_BBYMAX": 27.175, "MEAN_BBXC": -13.194643, "MEAN_BBYC": 27.146131, "COMPARE": 0, "GN_ASCII": "Ejbei Uad el Aabd", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 0, "GN_POP": 188084, "ELEVATION": 0, "GTOPO30": 72, "TIMEZONE": "Africa/El_Aaiun", "GEONAMESNO": "GeoNames rough area, rough name.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ -13.183594, 27.137368 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 6, "FEATURECLA": "Admin-0 capital", "NAME": "Bamako", "DIFFASCII": 0, "NAMEASCII": "Bamako", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Mali", "SOV_A3": "MLI", "ADM0NAME": "Mali", "ADM0_A3": "MLI", "ADM1NAME": "Bamako", "ISO_A2": "ML", "LATITUDE": 12.650015, "LONGITUDE": -8.000039, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 1494000, "POP_MIN": 1297281, "POP_OTHER": 1301407, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 2460596, "MEGANAME": "Bamako", "LS_NAME": "Bamako", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1316564, "MAX_POP20": 1316564, "MAX_POP50": 1316564, "MAX_POP300": 1316564, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 172, "MAX_AREAKM": 172, "MIN_AREAMI": 66, "MAX_AREAMI": 66, "MIN_PERKM": 106, "MAX_PERKM": 106, "MIN_PERMI": 66, "MAX_PERMI": 66, "MIN_BBXMIN": -8.058333, "MAX_BBXMIN": -8.058333, "MIN_BBXMAX": -7.908333, "MAX_BBXMAX": -7.908333, "MIN_BBYMIN": 12.541667, "MAX_BBYMIN": 12.541667, "MIN_BBYMAX": 12.716667, "MAX_BBYMAX": 12.716667, "MEAN_BBXC": -7.987419, "MEAN_BBYC": 12.626173, "COMPARE": 0, "GN_ASCII": "Bamako", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 1, "GN_POP": 1297281, "ELEVATION": 0, "GTOPO30": 350, "TIMEZONE": "Africa/Bamako", "GEONAMESNO": "GeoNames match general.", "UN_FID": 349, "UN_ADM0": "Mali", "UN_LAT": 12.65, "UN_LONG": -7.98, "POP1950": 89, "POP1955": 111, "POP1960": 130, "POP1965": 158, "POP1970": 222, "POP1975": 363, "POP1980": 489, "POP1985": 608, "POP1990": 746, "POP1995": 910, "POP2000": 1110, "POP2005": 1368, "POP2010": 1494, "POP2015": 1708, "POP2020": 2130, "POP2025": 2633, "POP2050": 3214 }, "geometry": { "type": "MultiPoint", "coordinates": [ [ -7.998047, 12.640338 ], [ -5.273438, 6.839170 ], [ -0.175781, 5.528511 ], [ -68.115234, -16.551962 ] ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 6, "FEATURECLA": "Admin-0 capital", "NAME": "Bamako", "DIFFASCII": 0, "NAMEASCII": "Bamako", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Mali", "SOV_A3": "MLI", "ADM0NAME": "Mali", "ADM0_A3": "MLI", "ADM1NAME": "Bamako", "ISO_A2": "ML", "LATITUDE": 12.650015, "LONGITUDE": -8.000039, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 1494000, "POP_MIN": 1297281, "POP_OTHER": 1301407, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 2460596, "MEGANAME": "Bamako", "LS_NAME": "Bamako", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1316564, "MAX_POP20": 1316564, "MAX_POP50": 1316564, "MAX_POP300": 1316564, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 172, "MAX_AREAKM": 172, "MIN_AREAMI": 66, "MAX_AREAMI": 66, "MIN_PERKM": 106, "MAX_PERKM": 106, "MIN_PERMI": 66, "MAX_PERMI": 66, "MIN_BBXMIN": -8.058333, "MAX_BBXMIN": -8.058333, "MIN_BBXMAX": -7.908333, "MAX_BBXMAX": -7.908333, "MIN_BBYMIN": 12.541667, "MAX_BBYMIN": 12.541667, "MIN_BBYMAX": 12.716667, "MAX_BBYMAX": 12.716667, "MEAN_BBXC": -7.987419, "MEAN_BBYC": 12.626173, "COMPARE": 0, "GN_ASCII": "Bamako", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 1, "GN_POP": 1297281, "ELEVATION": 0, "GTOPO30": 350, "TIMEZONE": "Africa/Bamako", "GEONAMESNO": "GeoNames match general.", "UN_FID": 349, "UN_ADM0": "Mali", "UN_LAT": 12.65, "UN_LONG": -7.98, "POP1950": 89, "POP1955": 111, "POP1960": 130, "POP1965": 158, "POP1970": 222, "POP1975": 363, "POP1980": 489, "POP1985": 608, "POP1990": 746, "POP1995": 910, "POP2000": 1110, "POP2005": 1368, "POP2010": 1494, "POP2015": 1708, "POP2020": 2130, "POP2025": 2633, "POP2050": 3214 }, "geometry": { "type": "MultiPoint", "coordinates": [ [ -7.998047, 12.640338 ], [ -5.273438, 6.839170 ], [ -0.175781, 5.528511 ], [ -68.115234, -16.551962 ], [ -65.214844, -19.062118 ] ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 7, "FEATURECLA": "Admin-0 capital", "NAME": "Quito", "DIFFASCII": 0, "NAMEASCII": "Quito", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Ecuador", "SOV_A3": "ECU", "ADM0NAME": "Ecuador", "ADM0_A3": "ECU", "ADM1NAME": "Pichincha", "ISO_A2": "EC", "LATITUDE": -0.214988, "LONGITUDE": -78.500051, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 1701000, "POP_MIN": 1399814, "POP_OTHER": 1435528, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 3652462, "MEGANAME": "Quito", "LS_NAME": "Quito", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1472051, "MAX_POP20": 1892286, "MAX_POP50": 1892286, "MAX_POP300": 1892286, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 334, "MAX_AREAKM": 496, "MIN_AREAMI": 129, "MAX_AREAMI": 191, "MIN_PERKM": 233, "MAX_PERKM": 359, "MIN_PERMI": 145, "MAX_PERMI": 223, "MIN_BBXMIN": -78.591667, "MAX_BBXMIN": -78.591667, "MIN_BBXMAX": -78.291667, "MAX_BBXMAX": -78.291667, "MIN_BBYMIN": -0.391667, "MAX_BBYMIN": -0.30257, "MIN_BBYMAX": 0.025, "MAX_BBYMAX": 0.025, "MEAN_BBXC": -78.460061, "MEAN_BBYC": -0.198438, "COMPARE": 0, "GN_ASCII": "Quito", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 18, "GN_POP": 1399814, "ELEVATION": 0, "GTOPO30": 2764, "TIMEZONE": "America/Guayaquil", "GEONAMESNO": "GeoNames match general.", "UN_FID": 178, "UN_ADM0": "Ecuador", "UN_LAT": -0.22, "UN_LONG": -78.52, "POP1950": 206, "POP1955": 257, "POP1960": 319, "POP1965": 399, "POP1970": 501, "POP1975": 628, "POP1980": 780, "POP1985": 936, "POP1990": 1088, "POP1995": 1217, "POP2000": 1357, "POP2005": 1593, "POP2010": 1701, "POP2015": 1846, "POP2020": 2035, "POP2025": 2189, "POP2050": 2316 }, "geometry": { "type": "Point", "coordinates": [ -78.486328, -0.263671 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 6, "FEATURECLA": "Admin-0 capital", "NAME": "Sucre", "DIFFASCII": 0, "NAMEASCII": "Sucre", "ADM0CAP": 1, "CAPALT": 0, "CAPIN": "Official (const", "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Bolivia", "SOV_A3": "BOL", "ADM0NAME": "Bolivia", "ADM0_A3": "BOL", "ADM1NAME": "Chuquisaca", "ISO_A2": "BO", "LATITUDE": -19.040971, "LONGITUDE": -65.259516, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 224838, "POP_MIN": 221736, "POP_OTHER": 221736, "RANK_MAX": 10, "RANK_MIN": 10, "GEONAMEID": 3903987, "LS_NAME": "Sucre", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 221736, "MAX_POP20": 221736, "MAX_POP50": 221736, "MAX_POP300": 221736, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 34, "MAX_AREAKM": 34, "MIN_AREAMI": 13, "MAX_AREAMI": 13, "MIN_PERKM": 32, "MAX_PERKM": 32, "MIN_PERMI": 20, "MAX_PERMI": 20, "MIN_BBXMIN": -65.3, "MAX_BBXMIN": -65.3, "MIN_BBXMAX": -65.225, "MAX_BBXMAX": -65.225, "MIN_BBYMIN": -19.066667, "MAX_BBYMIN": -19.066667, "MIN_BBYMAX": -18.991667, "MAX_BBYMAX": -18.991667, "MEAN_BBXC": -65.260317, "MEAN_BBYC": -19.030556, "COMPARE": 0, "GN_ASCII": "Sucre", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 1, "GN_POP": 224838, "ELEVATION": 0, "GTOPO30": 2759, "TIMEZONE": "America/La_Paz", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "MultiPoint", "coordinates": [ [ -65.214844, -19.062118 ], [ -57.656250, -25.324167 ], [ -56.162109, -34.885931 ], [ 4.921875, 52.321911 ], [ 6.152344, 49.610710 ], [ 6.152344, 46.195042 ], [ 9.580078, 47.100045 ], [ 13.447266, 52.536273 ], [ 21.005859, 52.214339 ], [ 15.996094, 45.767523 ], [ 12.480469, 41.902277 ], [ 19.072266, 47.457809 ], [ 19.248047, 42.423457 ], [ 21.181641, 42.682435 ] ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 7, "FEATURECLA": "Admin-0 capital", "NAME": "Asuncion", "NAMEALT": "Asunción", "DIFFASCII": 0, "NAMEASCII": "Asuncion", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Paraguay", "SOV_A3": "PRY", "ADM0NAME": "Paraguay", "ADM0_A3": "PRY", "ADM1NAME": "Asunción", "ISO_A2": "PY", "LATITUDE": -25.296403, "LONGITUDE": -57.641505, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 1870000, "POP_MIN": 11693, "POP_OTHER": 636771, "RANK_MAX": 12, "RANK_MIN": 6, "GEONAMEID": 1730025, "MEGANAME": "Asunción", "LS_NAME": "Asuncion", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 745924, "MAX_POP20": 1829910, "MAX_POP50": 2141255, "MAX_POP300": 2141255, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 105, "MAX_AREAKM": 651, "MIN_AREAMI": 41, "MAX_AREAMI": 251, "MIN_PERKM": 63, "MAX_PERKM": 331, "MIN_PERMI": 39, "MAX_PERMI": 206, "MIN_BBXMIN": -57.675, "MAX_BBXMIN": -57.675, "MIN_BBXMAX": -57.543999, "MAX_BBXMAX": -57.316667, "MIN_BBYMIN": -25.491667, "MAX_BBYMIN": -25.391667, "MIN_BBYMAX": -25.208333, "MAX_BBYMAX": -25.1, "MEAN_BBXC": -57.535385, "MEAN_BBYC": -25.307462, "COMPARE": 0, "GN_ASCII": "Asuncion", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 24, "GN_POP": 11693, "ELEVATION": 0, "GTOPO30": 24, "TIMEZONE": "Asia/Manila", "GEONAMESNO": "GeoNames match general.", "UN_FID": 409, "UN_ADM0": "Paraguay", "UN_LAT": -25.3, "UN_LONG": -57.62, "POP1950": 258, "POP1955": 314, "POP1960": 382, "POP1965": 461, "POP1970": 552, "POP1975": 654, "POP1980": 770, "POP1985": 914, "POP1990": 1091, "POP1995": 1287, "POP2000": 1507, "POP2005": 1762, "POP2010": 1870, "POP2015": 2030, "POP2020": 2277, "POP2025": 2506, "POP2050": 2715, "CITYALT": "Asuncion" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ -57.656250, -25.324167 ], [ -56.162109, -34.885931 ], [ 4.921875, 52.321911 ], [ 6.152344, 49.610710 ], [ 6.152344, 46.195042 ], [ 9.580078, 47.100045 ], [ 13.447266, 52.536273 ], [ 21.005859, 52.214339 ], [ 15.996094, 45.767523 ], [ 12.480469, 41.902277 ], [ 19.072266, 47.457809 ], [ 19.248047, 42.423457 ], [ 21.181641, 42.682435 ], [ 24.960938, 60.152442 ], [ 30.498047, 50.401515 ], [ 28.916016, 46.980252 ], [ 37.617188, 55.727110 ], [ 10.195312, 36.809285 ], [ 14.501953, 35.889050 ], [ 2.548828, 6.402648 ], [ 3.427734, 6.402648 ], [ 8.789062, 3.688855 ], [ 15.029297, 12.125264 ], [ 23.730469, 37.996163 ] ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 7, "FEATURECLA": "Admin-0 capital", "NAME": "Oslo", "DIFFASCII": 0, "NAMEASCII": "Oslo", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "Kingdom of Norway", "SOV_A3": "NOR", "ADM0NAME": "Norway", "ADM0_A3": "NOR", "ADM1NAME": "Oslo", "ISO_A2": "NO", "LATITUDE": 59.91669, "LONGITUDE": 10.749979, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 835000, "POP_MIN": 580000, "POP_OTHER": 701804, "RANK_MAX": 11, "RANK_MIN": 11, "GEONAMEID": 3143244, "MEGANAME": "Oslo", "LS_NAME": "Oslo", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 731563, "MAX_POP20": 731563, "MAX_POP50": 762374, "MAX_POP300": 762374, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 329, "MAX_AREAKM": 362, "MIN_AREAMI": 127, "MAX_AREAMI": 140, "MIN_PERKM": 340, "MAX_PERKM": 390, "MIN_PERMI": 211, "MAX_PERMI": 243, "MIN_BBXMIN": 10.333333, "MAX_BBXMIN": 10.440355, "MIN_BBXMAX": 11.091667, "MAX_BBXMAX": 11.091667, "MIN_BBYMIN": 59.708333, "MAX_BBYMIN": 59.708333, "MIN_BBYMAX": 60.066667, "MAX_BBYMAX": 60.066667, "MEAN_BBXC": 10.756508, "MEAN_BBYC": 59.906118, "COMPARE": 0, "GN_ASCII": "Oslo", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 12, "GN_POP": 580000, "ELEVATION": 0, "GTOPO30": 11, "TIMEZONE": "Europe/Oslo", "GEONAMESNO": "GeoNames match general.", "UN_FID": 397, "UN_ADM0": "Norway", "UN_LAT": 59.93, "UN_LONG": 10.71, "POP1950": 468, "POP1955": 533, "POP1960": 578, "POP1965": 610, "POP1970": 643, "POP1975": 644, "POP1980": 643, "POP1985": 662, "POP1990": 684, "POP1995": 729, "POP2000": 774, "POP2005": 816, "POP2010": 835, "POP2015": 858, "POP2020": 885, "POP2025": 909, "POP2050": 936 }, "geometry": { "type": "Point", "coordinates": [ 10.810547, 59.888937 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 7, "FEATURECLA": "Admin-0 capital", "NAME": "Helsinki", "DIFFASCII": 0, "NAMEASCII": "Helsinki", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "Finland", "SOV_A3": "FIN", "ADM0NAME": "Finland", "ADM0_A3": "FIN", "ADM1NAME": "Southern Finland", "ISO_A2": "FI", "LATITUDE": 60.175563, "LONGITUDE": 24.934126, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 1115000, "POP_MIN": 558457, "POP_OTHER": 762958, "RANK_MAX": 12, "RANK_MIN": 11, "GEONAMEID": 658225, "MEGANAME": "Helsinki", "LS_NAME": "Helsinki", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 852233, "MAX_POP20": 852233, "MAX_POP50": 852233, "MAX_POP300": 852233, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 513, "MAX_AREAKM": 513, "MIN_AREAMI": 198, "MAX_AREAMI": 198, "MIN_PERKM": 550, "MAX_PERKM": 550, "MIN_PERMI": 342, "MAX_PERMI": 342, "MIN_BBXMIN": 24.558333, "MAX_BBXMIN": 24.558333, "MIN_BBXMAX": 25.191667, "MAX_BBXMAX": 25.191667, "MIN_BBYMIN": 60.116667, "MAX_BBYMIN": 60.116667, "MIN_BBYMAX": 60.433333, "MAX_BBYMAX": 60.433333, "MEAN_BBXC": 24.910042, "MEAN_BBYC": 60.254779, "COMPARE": 0, "GN_ASCII": "Helsinki", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 13, "GN_POP": 558457, "ELEVATION": 0, "GTOPO30": 23, "TIMEZONE": "Europe/Helsinki", "GEONAMESNO": "GeoNames match general.", "UN_FID": 183, "UN_ADM0": "Finland", "UN_LAT": 60.19, "UN_LONG": 24.97, "POP1950": 366, "POP1955": 405, "POP1960": 448, "POP1965": 478, "POP1970": 507, "POP1975": 582, "POP1980": 674, "POP1985": 724, "POP1990": 872, "POP1995": 943, "POP2000": 1019, "POP2005": 1094, "POP2010": 1115, "POP2015": 1139, "POP2020": 1169, "POP2025": 1195, "POP2050": 1220 }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 24.960938, 60.152442 ], [ 30.498047, 50.401515 ], [ 28.916016, 46.980252 ], [ 37.617188, 55.727110 ], [ 10.195312, 36.809285 ], [ 14.501953, 35.889050 ], [ 2.548828, 6.402648 ], [ 3.427734, 6.402648 ], [ 8.789062, 3.688855 ], [ 15.029297, 12.125264 ] ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital", "NAME": "Vilnius", "DIFFASCII": 0, "NAMEASCII": "Vilnius", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Lithuania", "SOV_A3": "LTU", "ADM0NAME": "Lithuania", "ADM0_A3": "LTU", "ADM1NAME": "Vilniaus", "ISO_A2": "LT", "LATITUDE": 54.683366, "LONGITUDE": 25.316635, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 542366, "POP_MIN": 507029, "POP_OTHER": 494356, "RANK_MAX": 11, "RANK_MIN": 11, "GEONAMEID": 593116, "LS_NAME": "Vilnius", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 507029, "MAX_POP20": 507029, "MAX_POP50": 507029, "MAX_POP300": 507029, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 126, "MAX_AREAKM": 126, "MIN_AREAMI": 49, "MAX_AREAMI": 49, "MIN_PERKM": 162, "MAX_PERKM": 162, "MIN_PERMI": 101, "MAX_PERMI": 101, "MIN_BBXMIN": 25.166667, "MAX_BBXMIN": 25.166667, "MIN_BBXMAX": 25.391667, "MAX_BBXMAX": 25.391667, "MIN_BBYMIN": 54.575, "MAX_BBYMIN": 54.575, "MIN_BBYMAX": 54.775, "MAX_BBYMAX": 54.775, "MEAN_BBXC": 25.259623, "MEAN_BBYC": 54.692063, "COMPARE": 0, "GN_ASCII": "Vilnius", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 65, "GN_POP": 542366, "ELEVATION": 0, "GTOPO30": 125, "TIMEZONE": "Europe/Vilnius", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 25.312500, 54.673831 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 1, "NATSCALE": 300, "LABELRANK": 6, "FEATURECLA": "Admin-0 capital", "NAME": "Athens", "NAMEPAR": "Athínai", "NAMEALT": "Athinai", "DIFFASCII": 0, "NAMEASCII": "Athens", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "Greece", "SOV_A3": "GRC", "ADM0NAME": "Greece", "ADM0_A3": "GRC", "ADM1NAME": "Attiki", "ISO_A2": "GR", "LATITUDE": 37.983326, "LONGITUDE": 23.733321, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 3242000, "POP_MIN": 729137, "POP_OTHER": 112572, "RANK_MAX": 12, "RANK_MIN": 11, "GEONAMEID": 264371, "MEGANAME": "Athínai", "LS_NAME": "Athens2", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 2352834, "MAX_POP20": 3010089, "MAX_POP50": 3010089, "MAX_POP300": 3010089, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 340, "MAX_AREAKM": 509, "MIN_AREAMI": 131, "MAX_AREAMI": 196, "MIN_PERKM": 199, "MAX_PERKM": 296, "MIN_PERMI": 124, "MAX_PERMI": 184, "MIN_BBXMIN": 23.483333, "MAX_BBXMIN": 23.591667, "MIN_BBXMAX": 23.916667, "MAX_BBXMAX": 23.916667, "MIN_BBYMIN": 37.9, "MAX_BBYMIN": 37.908333, "MIN_BBYMAX": 38.158333, "MAX_BBYMAX": 38.158333, "MEAN_BBXC": 23.741514, "MEAN_BBYC": 38.032045, "COMPARE": 0, "GN_ASCII": "Athens", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 0, "GN_POP": 729137, "ELEVATION": 70, "GTOPO30": 110, "TIMEZONE": "Europe/Athens", "GEONAMESNO": "GeoNames match general.", "UN_FID": 198, "UN_ADM0": "Greece", "UN_LAT": 37.94, "UN_LONG": 23.65, "POP1950": 1347, "POP1955": 1563, "POP1960": 1814, "POP1965": 2121, "POP1970": 2485, "POP1975": 2738, "POP1980": 2987, "POP1985": 3047, "POP1990": 3070, "POP1995": 3122, "POP2000": 3179, "POP2005": 3230, "POP2010": 3242, "POP2015": 3256, "POP2020": 3278, "POP2025": 3300, "POP2050": 3326, "CITYALT": "Athens" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 23.730469, 37.996163 ], [ 33.398438, 35.173808 ], [ 35.507812, 33.870416 ], [ 44.560547, 40.178873 ], [ 35.947266, 31.952162 ], [ 31.640625, 4.828260 ], [ 44.208984, 15.368950 ], [ 38.759766, 9.015302 ] ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 0, "FEATURECLA": "Admin-0 capital", "NAME": "Nicosia", "DIFFASCII": 0, "NAMEASCII": "Nicosia", "ADM0CAP": 1, "CAPALT": 0, "CAPIN": "Capital of both", "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Cyprus", "SOV_A3": "CYP", "ADM0NAME": "Cyprus", "ADM0_A3": "CYP", "ISO_A2": "CY", "LATITUDE": 35.166676, "LONGITUDE": 33.366635, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 224300, "POP_MIN": 200452, "POP_OTHER": 222985, "RANK_MAX": 10, "RANK_MIN": 10, "GEONAMEID": 146268, "LS_NAME": "Nicosia", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 224300, "MAX_POP20": 224300, "MAX_POP50": 224300, "MAX_POP300": 224300, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 128, "MAX_AREAKM": 128, "MIN_AREAMI": 49, "MAX_AREAMI": 49, "MIN_PERKM": 109, "MAX_PERKM": 109, "MIN_PERMI": 68, "MAX_PERMI": 68, "MIN_BBXMIN": 33.275, "MAX_BBXMIN": 33.275, "MIN_BBXMAX": 33.425, "MAX_BBXMAX": 33.425, "MIN_BBYMIN": 35.041667, "MAX_BBYMIN": 35.041667, "MIN_BBYMAX": 35.225, "MAX_BBYMAX": 35.225, "MEAN_BBXC": 33.352244, "MEAN_BBYC": 35.15, "COMPARE": 0, "GN_ASCII": "Nicosia", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 4, "GN_POP": 200452, "ELEVATION": 0, "GTOPO30": 128, "TIMEZONE": "Asia/Nicosia", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 33.398438, 35.173808 ], [ 35.507812, 33.870416 ], [ 44.560547, 40.178873 ], [ 35.947266, 31.952162 ], [ 31.640625, 4.828260 ], [ 44.208984, 15.368950 ], [ 38.759766, 9.015302 ] ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 1, "NATSCALE": 300, "LABELRANK": 6, "FEATURECLA": "Admin-0 capital", "NAME": "Tashkent", "DIFFASCII": 0, "NAMEASCII": "Tashkent", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Uzbekistan", "SOV_A3": "UZB", "ADM0NAME": "Uzbekistan", "ADM0_A3": "UZB", "ADM1NAME": "Tashkent", "ISO_A2": "UZ", "LATITUDE": 41.311702, "LONGITUDE": 69.294933, "CHANGED": 5, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 2184000, "POP_MIN": 1978028, "POP_OTHER": 2806287, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 1512569, "MEGANAME": "Tashkent", "LS_NAME": "Tashkent", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 2865234, "MAX_POP20": 2865890, "MAX_POP50": 2865890, "MAX_POP300": 2865890, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 639, "MAX_AREAKM": 643, "MIN_AREAMI": 247, "MAX_AREAMI": 248, "MIN_PERKM": 377, "MAX_PERKM": 383, "MIN_PERMI": 234, "MAX_PERMI": 238, "MIN_BBXMIN": 69.05, "MAX_BBXMIN": 69.05, "MIN_BBXMAX": 69.436467, "MAX_BBXMAX": 69.45, "MIN_BBYMIN": 41.141667, "MAX_BBYMIN": 41.141667, "MIN_BBYMAX": 41.483333, "MAX_BBYMAX": 41.483333, "MEAN_BBXC": 69.256717, "MEAN_BBYC": 41.318916, "COMPARE": 0, "GN_ASCII": "Tashkent", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 13, "GN_POP": 1978028, "ELEVATION": 0, "GTOPO30": 460, "TIMEZONE": "Asia/Tashkent", "GEONAMESNO": "GeoNames match general.", "UN_FID": 580, "UN_ADM0": "Uzbekistan", "UN_LAT": 41.24, "UN_LONG": 69.34, "POP1950": 755, "POP1955": 843, "POP1960": 964, "POP1965": 1165, "POP1970": 1403, "POP1975": 1612, "POP1980": 1818, "POP1985": 1958, "POP1990": 2100, "POP1995": 2116, "POP2000": 2135, "POP2005": 2158, "POP2010": 2184, "POP2015": 2247, "POP2020": 2416, "POP2025": 2636, "POP2050": 2892 }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 69.345703, 41.310824 ], [ 87.626953, 43.771094 ] ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 1, "NATSCALE": 300, "LABELRANK": 6, "FEATURECLA": "Admin-0 capital", "NAME": "Tashkent", "DIFFASCII": 0, "NAMEASCII": "Tashkent", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Uzbekistan", "SOV_A3": "UZB", "ADM0NAME": "Uzbekistan", "ADM0_A3": "UZB", "ADM1NAME": "Tashkent", "ISO_A2": "UZ", "LATITUDE": 41.311702, "LONGITUDE": 69.294933, "CHANGED": 5, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 2184000, "POP_MIN": 1978028, "POP_OTHER": 2806287, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 1512569, "MEGANAME": "Tashkent", "LS_NAME": "Tashkent", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 2865234, "MAX_POP20": 2865890, "MAX_POP50": 2865890, "MAX_POP300": 2865890, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 639, "MAX_AREAKM": 643, "MIN_AREAMI": 247, "MAX_AREAMI": 248, "MIN_PERKM": 377, "MAX_PERKM": 383, "MIN_PERMI": 234, "MAX_PERMI": 238, "MIN_BBXMIN": 69.05, "MAX_BBXMIN": 69.05, "MIN_BBXMAX": 69.436467, "MAX_BBXMAX": 69.45, "MIN_BBYMIN": 41.141667, "MAX_BBYMIN": 41.141667, "MIN_BBYMAX": 41.483333, "MAX_BBYMAX": 41.483333, "MEAN_BBXC": 69.256717, "MEAN_BBYC": 41.318916, "COMPARE": 0, "GN_ASCII": "Tashkent", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 13, "GN_POP": 1978028, "ELEVATION": 0, "GTOPO30": 460, "TIMEZONE": "Asia/Tashkent", "GEONAMESNO": "GeoNames match general.", "UN_FID": 580, "UN_ADM0": "Uzbekistan", "UN_LAT": 41.24, "UN_LONG": 69.34, "POP1950": 755, "POP1955": 843, "POP1960": 964, "POP1965": 1165, "POP1970": 1403, "POP1975": 1612, "POP1980": 1818, "POP1985": 1958, "POP1990": 2100, "POP1995": 2116, "POP2000": 2135, "POP2005": 2158, "POP2010": 2184, "POP2015": 2247, "POP2020": 2416, "POP2025": 2636, "POP2050": 2892 }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 69.345703, 41.310824 ], [ 87.626953, 43.771094 ], [ 47.988281, 29.382175 ], [ 50.625000, 26.194877 ], [ 54.404297, 24.447150 ] ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital", "NAME": "Kuwait", "NAMEALT": "Al Kuwayt|Kuwait City", "DIFFASCII": 0, "NAMEASCII": "Kuwait", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Kuwait", "SOV_A3": "KWT", "ADM0NAME": "Kuwait", "ADM0_A3": "KWT", "ADM1NAME": "Al Kuwayt", "ISO_A2": "KW", "LATITUDE": 29.369718, "LONGITUDE": 47.978301, "CHANGED": 5, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 2063000, "POP_MIN": 60064, "POP_OTHER": 1682968, "RANK_MAX": 12, "RANK_MIN": 8, "GEONAMEID": 285787, "MEGANAME": "Al Kuwayt (Kuwait City)", "LS_NAME": "Kuwait", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 1732952, "MAX_POP20": 2142805, "MAX_POP50": 2142805, "MAX_POP300": 2142805, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 264, "MAX_AREAKM": 366, "MIN_AREAMI": 102, "MAX_AREAMI": 141, "MIN_PERKM": 162, "MAX_PERKM": 249, "MIN_PERMI": 101, "MAX_PERMI": 155, "MIN_BBXMIN": 47.8, "MAX_BBXMIN": 47.821052, "MIN_BBXMAX": 48.1, "MAX_BBXMAX": 48.15, "MIN_BBYMIN": 29.066667, "MAX_BBYMIN": 29.225, "MIN_BBYMAX": 29.391667, "MAX_BBYMAX": 29.391667, "MEAN_BBXC": 47.993999, "MEAN_BBYC": 29.277119, "COMPARE": 0, "GN_ASCII": "Kuwait", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 0, "GN_POP": 60064, "ELEVATION": 0, "GTOPO30": 12, "TIMEZONE": "Asia/Kuwait", "GEONAMESNO": "GeoNames match general.", "UN_FID": 339, "UN_ADM0": "Kuwait", "UN_LAT": 29.38, "UN_LONG": 47.97, "POP1950": 63, "POP1955": 106, "POP1960": 179, "POP1965": 303, "POP1970": 553, "POP1975": 688, "POP1980": 891, "POP1985": 1122, "POP1990": 1392, "POP1995": 1190, "POP2000": 1499, "POP2005": 1888, "POP2010": 2063, "POP2015": 2305, "POP2020": 2592, "POP2025": 2790, "POP2050": 2956, "CITYALT": "Kuwait" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 47.988281, 29.382175 ], [ 50.625000, 26.194877 ], [ 54.404297, 24.447150 ], [ 58.623047, 23.563987 ], [ 69.169922, 34.524661 ] ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 1, "NATSCALE": 300, "LABELRANK": 1, "FEATURECLA": "Admin-0 capital", "NAME": "New Delhi", "DIFFASCII": 0, "NAMEASCII": "New Delhi", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 0, "SOV0NAME": "India", "SOV_A3": "IND", "ADM0NAME": "India", "ADM0_A3": "IND", "ADM1NAME": "Delhi", "ISO_A2": "IN", "LATITUDE": 28.600023, "LONGITUDE": 77.19998, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 317797, "POP_MIN": 317797, "POP_OTHER": 8060107, "RANK_MAX": 10, "RANK_MIN": 10, "GEONAMEID": 1261481, "LS_NAME": "New Delhi", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 8761047, "MAX_POP20": 13414375, "MAX_POP50": 32426336, "MAX_POP300": 32424761, "MAX_POP310": 224908923, "MAX_NATSCA": 300, "MIN_AREAKM": 864, "MAX_AREAKM": 186559, "MIN_AREAMI": 334, "MAX_AREAMI": 72030, "MIN_PERKM": 244, "MAX_PERKM": 130296, "MIN_PERMI": 152, "MAX_PERMI": 80962, "MIN_BBXMIN": 71.033333, "MAX_BBXMIN": 76.943289, "MIN_BBXMAX": 77.43183, "MAX_BBXMAX": 82.566667, "MIN_BBYMIN": 24, "MAX_BBYMIN": 28.152007, "MIN_BBYMAX": 28.738629, "MAX_BBYMAX": 33.466667, "MEAN_BBXC": 77.27294500000001, "MEAN_BBYC": 28.382537, "COMPARE": 0, "GN_ASCII": "New Delhi", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 7, "GN_POP": 317797, "ELEVATION": 0, "GTOPO30": 205, "TIMEZONE": "Asia/Kolkata", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 77.255859, 28.613459 ], [ 88.330078, 22.512557 ], [ 77.607422, 12.983148 ], [ 79.980469, 6.839170 ], [ 96.152344, 16.804541 ], [ 102.656250, 17.978733 ], [ 101.689453, 3.162456 ], [ 103.886719, 1.230374 ], [ 121.464844, 31.203405 ] ] } }
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital", "NAME": "Muscat", "DIFFASCII": 0, "NAMEASCII": "Muscat", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Oman", "SOV_A3": "OMN", "ADM0NAME": "Oman", "ADM0_A3": "OMN", "ADM1NAME": "Muscat", "ISO_A2": "OM", "LATITUDE": 23.613325, "LONGITUDE": 58.593312, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 734697, "POP_MIN": 586861, "POP_OTHER": 586861, "RANK_MAX": 11, "RANK_MIN": 11, "GEONAMEID": 287286, "LS_NAME": "Muscat", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 586861, "MAX_POP20": 586861, "MAX_POP50": 586861, "MAX_POP300": 586861, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 104, "MAX_AREAKM": 104, "MIN_AREAMI": 40, "MAX_AREAMI": 40, "MIN_PERKM": 121, "MAX_PERKM": 121, "MIN_PERMI": 75, "MAX_PERMI": 75, "MIN_BBXMIN": 58.333333, "MAX_BBXMIN": 58.333333, "MIN_BBXMAX": 58.6, "MAX_BBXMAX": 58.6, "MIN_BBYMIN": 23.558333, "MAX_BBYMIN": 23.558333, "MIN_BBYMAX": 23.641667, "MAX_BBYMAX": 23.641667, "MEAN_BBXC": 58.474684, "MEAN_BBYC": 23.599306, "COMPARE": 0, "GN_ASCII": "Muscat", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 6, "GN_POP": 797000, "ELEVATION": 0, "GTOPO30": 69, "TIMEZONE": "Asia/Muscat", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 58.623047, 23.563987 ], [ 69.169922, 34.524661 ], [ 77.255859, 28.613459 ], [ 88.330078, 22.512557 ], [ 77.607422, 12.983148 ], [ 79.980469, 6.839170 ], [ 96.152344, 16.804541 ], [ 102.656250, 17.978733 ], [ 101.689453, 3.162456 ], [ 103.886719, 1.230374 ], [ 121.464844, 31.203405 ], [ 125.771484, 39.027719 ], [ 121.025391, 14.604847 ] ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 2, "FEATURECLA": "Admin-0 capital", "NAME": "Dhaka", "DIFFASCII": 0, "NAMEASCII": "Dhaka", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Bangladesh", "SOV_A3": "BGD", "ADM0NAME": "Bangladesh", "ADM0_A3": "BGD", "ADM1NAME": "Dhaka", "ISO_A2": "BD", "LATITUDE": 23.72306, "LONGITUDE": 90.408579, "CHANGED": 5, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 12797394, "POP_MIN": 7000940, "POP_OTHER": 14995538, "RANK_MAX": 14, "RANK_MIN": 13, "GEONAMEID": 1185241, "MEGANAME": "Dhaka", "LS_NAME": "Dhaka", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 14548962, "MAX_POP20": 21394172, "MAX_POP50": 53845691, "MAX_POP300": 78549234, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 3528, "MAX_AREAKM": 49912, "MIN_AREAMI": 1362, "MAX_AREAMI": 19271, "MIN_PERKM": 1439, "MAX_PERKM": 19314, "MIN_PERMI": 894, "MAX_PERMI": 12001, "MIN_BBXMIN": 88.133791, "MAX_BBXMIN": 89.9, "MIN_BBXMAX": 90.816777, "MAX_BBXMAX": 92.908333, "MIN_BBYMIN": 22.858333, "MAX_BBYMIN": 23.482936, "MIN_BBYMAX": 24.247407, "MAX_BBYMAX": 25.583333, "MEAN_BBXC": 90.400679, "MEAN_BBYC": 24.105092, "COMPARE": 0, "GN_ASCII": "Dhaka", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 81, "GN_POP": 10356500, "ELEVATION": 0, "GTOPO30": 4, "TIMEZONE": "Asia/Dhaka", "GEONAMESNO": "GeoNames match general.", "UN_FID": 369, "UN_ADM0": "Bangladesh", "UN_LAT": 23.7, "UN_LONG": 90.4, "POP1950": 336, "POP1955": 409, "POP1960": 508, "POP1965": 821, "POP1970": 1374, "POP1975": 2221, "POP1980": 3266, "POP1985": 4660, "POP1990": 6621, "POP1995": 8332, "POP2000": 10285, "POP2005": 12576, "POP2010": 13485, "POP2015": 14796, "POP2020": 17015, "POP2025": 19422, "POP2050": 22015 }, "geometry": { "type": "Point", "coordinates": [ 90.439453, 23.725012 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 6, "FEATURECLA": "Admin-0 capital", "NAME": "Pyongyang", "NAMEALT": "P'yongyang", "DIFFASCII": 0, "NAMEASCII": "Pyongyang", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Korea, North", "SOV_A3": "PRK", "ADM0NAME": "North Korea", "ADM0_A3": "PRK", "ADM1NAME": "P'yongyang", "ISO_A2": "KP", "LATITUDE": 39.019439, "LONGITUDE": 125.754691, "CHANGED": 5, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 3300000, "POP_MIN": 2498797, "POP_OTHER": 2483216, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 1871859, "MEGANAME": "P'yongyang", "LS_NAME": "Pyongyang", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 2498797, "MAX_POP20": 2498797, "MAX_POP50": 2498797, "MAX_POP300": 2498797, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 446, "MAX_AREAKM": 447, "MIN_AREAMI": 172, "MAX_AREAMI": 173, "MIN_PERKM": 510, "MAX_PERKM": 511, "MIN_PERMI": 317, "MAX_PERMI": 318, "MIN_BBXMIN": 125.608333, "MAX_BBXMIN": 125.608333, "MIN_BBXMAX": 125.891667, "MAX_BBXMAX": 125.891667, "MIN_BBYMIN": 38.825, "MAX_BBYMIN": 38.825, "MIN_BBYMAX": 39.191667, "MAX_BBYMAX": 39.191667, "MEAN_BBXC": 125.742428, "MEAN_BBYC": 38.996997, "COMPARE": 0, "GN_ASCII": "Pyongyang", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 12, "GN_POP": 3222000, "ELEVATION": 0, "GTOPO30": 13, "TIMEZONE": "Asia/Pyongyang", "GEONAMESNO": "GeoNames match general.", "UN_FID": 327, "UN_ADM0": "Democratic People's Republic of Korea", "UN_LAT": 39.02, "UN_LONG": 125.75, "POP1950": 516, "POP1955": 577, "POP1960": 646, "POP1965": 769, "POP1970": 987, "POP1975": 1348, "POP1980": 1842, "POP1985": 2195, "POP1990": 2526, "POP1995": 2838, "POP2000": 3117, "POP2005": 3265, "POP2010": 3300, "POP2015": 3346, "POP2020": 3434, "POP2025": 3537, "POP2050": 3630 }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 125.771484, 39.027719 ], [ 121.025391, 14.604847 ] ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 6, "NATSCALE": 30, "LABELRANK": 0, "FEATURECLA": "Admin-0 capital", "NAME": "Melekeok", "DIFFASCII": 0, "NAMEASCII": "Melekeok", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Palau", "SOV_A3": "PLW", "ADM0NAME": "Palau", "ADM0_A3": "PLW", "ISO_A2": "PW", "LATITUDE": 7.487396, "LONGITUDE": 134.626548, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Location adjusted. Changed scale rank.", "POP_MAX": 7026, "POP_MIN": 7026, "POP_OTHER": 0, "RANK_MAX": 5, "RANK_MIN": 5, "GEONAMEID": 1559804, "LS_NAME": "Melekeok", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 0, "MAX_POP20": 0, "MAX_POP50": 0, "MAX_POP300": 7026, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 6, "MAX_AREAKM": 6, "MIN_AREAMI": 2, "MAX_AREAMI": 2, "MIN_PERKM": 15, "MAX_PERKM": 15, "MIN_PERMI": 9, "MAX_PERMI": 9, "MIN_BBXMIN": 134.466667, "MAX_BBXMIN": 134.466667, "MIN_BBXMAX": 134.5, "MAX_BBXMAX": 134.5, "MIN_BBYMIN": 7.325, "MAX_BBYMIN": 7.325, "MIN_BBYMAX": 7.35, "MAX_BBYMAX": 7.35, "MEAN_BBXC": 134.481548, "MEAN_BBYC": 7.339881, "COMPARE": 0, "GN_ASCII": "Melekeok", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 0, "GN_POP": 217, "ELEVATION": 0, "GTOPO30": 1, "TIMEZONE": "Pacific/Palau", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 134.648438, 7.449624 ], [ 139.746094, 35.675147 ], [ 171.386719, 7.100893 ], [ 15.292969, -4.390229 ], [ 29.355469, -3.425692 ], [ 31.025391, -17.811456 ], [ 39.287109, -6.839170 ], [ 43.242188, -11.695273 ], [ 26.279297, -29.152161 ], [ 28.212891, -25.720735 ], [ 32.607422, -25.958045 ], [ 47.548828, -18.895893 ], [ 159.960938, -9.449062 ], [ 179.208984, -8.581021 ], [ -180.791016, -8.581021 ] ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 6, "FEATURECLA": "Admin-0 capital", "NAME": "Windhoek", "DIFFASCII": 0, "NAMEASCII": "Windhoek", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Namibia", "SOV_A3": "NAM", "ADM0NAME": "Namibia", "ADM0_A3": "NAM", "ADM1NAME": "Khomas", "ISO_A2": "NA", "LATITUDE": -22.570006, "LONGITUDE": 17.083546, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 268132, "POP_MIN": 262796, "POP_OTHER": 262796, "RANK_MAX": 10, "RANK_MIN": 10, "GEONAMEID": 3352136, "LS_NAME": "Windhoek", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 262796, "MAX_POP20": 262796, "MAX_POP50": 262796, "MAX_POP300": 262796, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 89, "MAX_AREAKM": 89, "MIN_AREAMI": 35, "MAX_AREAMI": 35, "MIN_PERKM": 60, "MAX_PERKM": 60, "MIN_PERMI": 37, "MAX_PERMI": 37, "MIN_BBXMIN": 17.008333, "MAX_BBXMIN": 17.008333, "MIN_BBXMAX": 17.116667, "MAX_BBXMAX": 17.116667, "MIN_BBYMIN": -22.625, "MAX_BBYMIN": -22.625, "MIN_BBYMAX": -22.491667, "MAX_BBYMAX": -22.491667, "MEAN_BBXC": 17.064196, "MEAN_BBYC": -22.551143, "COMPARE": 0, "GN_ASCII": "Windhoek", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 21, "GN_POP": 268132, "ELEVATION": 0, "GTOPO30": 1722, "TIMEZONE": "Africa/Windhoek", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 17.138672, -22.593726 ] } }
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
"maxzoom": "1",
|
||||
"minzoom": "0",
|
||||
"name": "tests/ne_110m_populated_places/out/-z1_-M10000_--drop-smallest-as-needed.json.check.mbtiles",
|
||||
"strategies": "[{\"dropped_by_rate\":145,\"dropped_as_needed\":75,\"tile_size_desired\":32932},{\"dropped_as_needed\":204,\"tile_size_desired\":44398}]",
|
||||
"strategies": "[{\"dropped_by_rate\":145,\"dropped_as_needed\":76,\"tile_size_desired\":33283},{\"dropped_as_needed\":206,\"tile_size_desired\":44899}]",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
@@ -45,8 +45,6 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 2, "FEATURECLA": "Admin-0 capital", "NAME": "Dhaka", "DIFFASCII": 0, "NAMEASCII": "Dhaka", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Bangladesh", "SOV_A3": "BGD", "ADM0NAME": "Bangladesh", "ADM0_A3": "BGD", "ADM1NAME": "Dhaka", "ISO_A2": "BD", "LATITUDE": 23.72306, "LONGITUDE": 90.408579, "CHANGED": 5, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 12797394, "POP_MIN": 7000940, "POP_OTHER": 14995538, "RANK_MAX": 14, "RANK_MIN": 13, "GEONAMEID": 1185241, "MEGANAME": "Dhaka", "LS_NAME": "Dhaka", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 14548962, "MAX_POP20": 21394172, "MAX_POP50": 53845691, "MAX_POP300": 78549234, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 3528, "MAX_AREAKM": 49912, "MIN_AREAMI": 1362, "MAX_AREAMI": 19271, "MIN_PERKM": 1439, "MAX_PERKM": 19314, "MIN_PERMI": 894, "MAX_PERMI": 12001, "MIN_BBXMIN": 88.133791, "MAX_BBXMIN": 89.9, "MIN_BBXMAX": 90.816777, "MAX_BBXMAX": 92.908333, "MIN_BBYMIN": 22.858333, "MAX_BBYMIN": 23.482936, "MIN_BBYMAX": 24.247407, "MAX_BBYMAX": 25.583333, "MEAN_BBXC": 90.400679, "MEAN_BBYC": 24.105092, "COMPARE": 0, "GN_ASCII": "Dhaka", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 81, "GN_POP": 10356500, "ELEVATION": 0, "GTOPO30": 4, "TIMEZONE": "Asia/Dhaka", "GEONAMESNO": "GeoNames match general.", "UN_FID": 369, "UN_ADM0": "Bangladesh", "UN_LAT": 23.7, "UN_LONG": 90.4, "POP1950": 336, "POP1955": 409, "POP1960": 508, "POP1965": 821, "POP1970": 1374, "POP1975": 2221, "POP1980": 3266, "POP1985": 4660, "POP1990": 6621, "POP1995": 8332, "POP2000": 10285, "POP2005": 12576, "POP2010": 13485, "POP2015": 14796, "POP2020": 17015, "POP2025": 19422, "POP2050": 22015 }, "geometry": { "type": "Point", "coordinates": [ 90.439453, 23.725012 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital", "NAME": "Vientiane", "DIFFASCII": 0, "NAMEASCII": "Vientiane", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Laos", "SOV_A3": "LAO", "ADM0NAME": "Laos", "ADM0_A3": "LAO", "ADM1NAME": "Vientiane [prefecture]", "ISO_A2": "LA", "LATITUDE": 17.966693, "LONGITUDE": 102.59998, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 754000, "POP_MIN": 570348, "POP_OTHER": 469811, "RANK_MAX": 11, "RANK_MIN": 11, "GEONAMEID": 1651944, "LS_NAME": "Vientiane", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 471927, "MAX_POP20": 471927, "MAX_POP50": 570348, "MAX_POP300": 570348, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 166, "MAX_AREAKM": 243, "MIN_AREAMI": 64, "MAX_AREAMI": 94, "MIN_PERKM": 170, "MAX_PERKM": 283, "MIN_PERMI": 106, "MAX_PERMI": 176, "MIN_BBXMIN": 102.491667, "MAX_BBXMIN": 102.491667, "MIN_BBXMAX": 102.725, "MAX_BBXMAX": 102.816667, "MIN_BBYMIN": 17.8, "MAX_BBYMIN": 17.875, "MIN_BBYMAX": 18.083333, "MAX_BBYMAX": 18.083333, "MEAN_BBXC": 102.648054, "MEAN_BBYC": 17.967124, "COMPARE": 0, "GN_ASCII": "Vientiane", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 27, "GN_POP": 196731, "ELEVATION": 0, "GTOPO30": 174, "TIMEZONE": "Asia/Vientiane", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 102.656250, 17.978733 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 6, "NATSCALE": 30, "LABELRANK": 0, "FEATURECLA": "Admin-0 capital", "NAME": "Melekeok", "DIFFASCII": 0, "NAMEASCII": "Melekeok", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Palau", "SOV_A3": "PLW", "ADM0NAME": "Palau", "ADM0_A3": "PLW", "ISO_A2": "PW", "LATITUDE": 7.487396, "LONGITUDE": 134.626548, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Location adjusted. Changed scale rank.", "POP_MAX": 7026, "POP_MIN": 7026, "POP_OTHER": 0, "RANK_MAX": 5, "RANK_MIN": 5, "GEONAMEID": 1559804, "LS_NAME": "Melekeok", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 0, "MAX_POP20": 0, "MAX_POP50": 0, "MAX_POP300": 7026, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 6, "MAX_AREAKM": 6, "MIN_AREAMI": 2, "MAX_AREAMI": 2, "MIN_PERKM": 15, "MAX_PERKM": 15, "MIN_PERMI": 9, "MAX_PERMI": 9, "MIN_BBXMIN": 134.466667, "MAX_BBXMIN": 134.466667, "MIN_BBXMAX": 134.5, "MAX_BBXMAX": 134.5, "MIN_BBYMIN": 7.325, "MAX_BBYMIN": 7.325, "MIN_BBYMAX": 7.35, "MAX_BBYMAX": 7.35, "MEAN_BBXC": 134.481548, "MEAN_BBYC": 7.339881, "COMPARE": 0, "GN_ASCII": "Melekeok", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 0, "GN_POP": 217, "ELEVATION": 0, "GTOPO30": 1, "TIMEZONE": "Pacific/Palau", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 134.648438, 7.449624 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 6, "NATSCALE": 30, "LABELRANK": 0, "FEATURECLA": "Admin-0 capital", "NAME": "Majuro", "DIFFASCII": 0, "NAMEASCII": "Majuro", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Marshall Islands", "SOV_A3": "MHL", "ADM0NAME": "Marshall Islands", "ADM0_A3": "MHL", "ISO_A2": "MH", "LATITUDE": 7.103004, "LONGITUDE": 171.38, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 25400, "POP_MIN": 20500, "POP_OTHER": 0, "RANK_MAX": 7, "RANK_MIN": 7, "GEONAMEID": 2113779, "LS_NAME": "Majuro", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 2084, "MAX_POP20": 2084, "MAX_POP50": 2084, "MAX_POP300": 2084, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 3, "MAX_AREAKM": 3, "MIN_AREAMI": 1, "MAX_AREAMI": 1, "MIN_PERKM": 7, "MAX_PERKM": 7, "MIN_PERMI": 5, "MAX_PERMI": 5, "MIN_BBXMIN": 171.366667, "MAX_BBXMIN": 171.366667, "MIN_BBXMAX": 171.375, "MAX_BBXMAX": 171.375, "MIN_BBYMIN": 7.091667, "MAX_BBYMIN": 7.091667, "MIN_BBYMAX": 7.116667, "MAX_BBYMAX": 7.116667, "MEAN_BBXC": 171.370833, "MEAN_BBYC": 7.104167, "COMPARE": 0, "GN_ASCII": "Majuro", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 0, "GN_POP": 20500, "ELEVATION": 0, "GTOPO30": 1, "TIMEZONE": "Pacific/Majuro", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 171.386719, 7.100893 ] } }
|
||||
@@ -97,8 +95,6 @@
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 1, "NATSCALE": 300, "LABELRANK": 1, "FEATURECLA": "Admin-1 capital", "NAME": "Atlanta", "DIFFASCII": 0, "NAMEASCII": "Atlanta", "ADM0CAP": 0, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "United States", "SOV_A3": "USA", "ADM0NAME": "United States of America", "ADM0_A3": "USA", "ADM1NAME": "Georgia", "ISO_A2": "US", "LATITUDE": 33.830014, "LONGITUDE": -84.399949, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 4506000, "POP_MIN": 422908, "POP_OTHER": 2874096, "RANK_MAX": 12, "RANK_MIN": 10, "GEONAMEID": 4180439, "MEGANAME": "Atlanta", "LS_NAME": "Atlanta", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 2928128, "MAX_POP20": 3896411, "MAX_POP50": 3910939, "MAX_POP300": 3910939, "MAX_POP310": 3910939, "MAX_NATSCA": 300, "MIN_AREAKM": 2761, "MAX_AREAKM": 4086, "MIN_AREAMI": 1066, "MAX_AREAMI": 1578, "MIN_PERKM": 1494, "MAX_PERKM": 2459, "MIN_PERMI": 929, "MAX_PERMI": 1528, "MIN_BBXMIN": -84.875, "MAX_BBXMIN": -84.608333, "MIN_BBXMAX": -83.879976, "MAX_BBXMAX": -83.858333, "MIN_BBYMIN": 33.383333, "MAX_BBYMIN": 33.383333, "MIN_BBYMAX": 34.202715, "MAX_BBYMAX": 34.275, "MEAN_BBXC": -84.328739, "MEAN_BBYC": 33.851552, "COMPARE": 0, "GN_ASCII": "Atlanta", "FEATURE_CL": "P", "FEATURE_CO": "PPLA", "ADMIN1_COD": 0, "GN_POP": 422908, "ELEVATION": 320, "GTOPO30": 305, "TIMEZONE": "America/New_York", "GEONAMESNO": "GeoNames match general.", "UN_FID": 524, "UN_ADM0": "United States of America", "UN_LAT": 33.79, "UN_LONG": -84.34, "POP1950": 513, "POP1955": 631, "POP1960": 776, "POP1965": 959, "POP1970": 1182, "POP1975": 1386, "POP1980": 1625, "POP1985": 1879, "POP1990": 2184, "POP1995": 2781, "POP2000": 3542, "POP2005": 4307, "POP2010": 4506, "POP2015": 4695, "POP2020": 4888, "POP2025": 5035, "POP2050": 5151 }, "geometry": { "type": "Point", "coordinates": [ -84.418945, 33.833920 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 6, "FEATURECLA": "Admin-0 capital", "NAME": "Havana", "NAMEALT": "La Habana", "DIFFASCII": 0, "NAMEASCII": "Havana", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Cuba", "SOV_A3": "CUB", "ADM0NAME": "Cuba", "ADM0_A3": "CUB", "ADM1NAME": "Ciudad de la Habana", "ISO_A2": "CU", "LATITUDE": 23.131959, "LONGITUDE": -82.364182, "CHANGED": 5, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 2174000, "POP_MIN": 1990917, "POP_OTHER": 1930305, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 3553478, "MEGANAME": "La Habana", "LS_NAME": "Havana", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1990917, "MAX_POP20": 2051170, "MAX_POP50": 2051170, "MAX_POP300": 2051170, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 323, "MAX_AREAKM": 362, "MIN_AREAMI": 125, "MAX_AREAMI": 140, "MIN_PERKM": 240, "MAX_PERKM": 286, "MIN_PERMI": 149, "MAX_PERMI": 177, "MIN_BBXMIN": -82.533333, "MAX_BBXMIN": -82.533333, "MIN_BBXMAX": -82.208333, "MAX_BBXMAX": -82.208333, "MIN_BBYMIN": 22.916667, "MAX_BBYMIN": 22.975161, "MIN_BBYMAX": 23.183333, "MAX_BBYMAX": 23.183333, "MEAN_BBXC": -82.354344, "MEAN_BBYC": 23.076845, "COMPARE": 0, "GN_ASCII": "Havana", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 2, "GN_POP": 2163824, "ELEVATION": 0, "GTOPO30": 5, "TIMEZONE": "America/Havana", "GEONAMESNO": "GeoNames match general.", "UN_FID": 172, "UN_ADM0": "Cuba", "UN_LAT": 23.04, "UN_LONG": -82.41, "POP1950": 1116, "POP1955": 1289, "POP1960": 1436, "POP1965": 1598, "POP1970": 1779, "POP1975": 1848, "POP1980": 1913, "POP1985": 2005, "POP1990": 2108, "POP1995": 2183, "POP2000": 2187, "POP2005": 2189, "POP2010": 2174, "POP2015": 2159, "POP2020": 2151, "POP2025": 2150, "POP2050": 2150, "CITYALT": "Havana" }, "geometry": { "type": "Point", "coordinates": [ -82.353516, 23.120154 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 4, "NATSCALE": 50, "LABELRANK": 0, "FEATURECLA": "Admin-0 capital", "NAME": "Basseterre", "DIFFASCII": 0, "NAMEASCII": "Basseterre", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Saint Kitts and Nevis", "SOV_A3": "KNA", "ADM0NAME": "Saint Kitts and Nevis", "ADM0_A3": "KNA", "ISO_A2": "KN", "LATITUDE": 17.30203, "LONGITUDE": -62.717009, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 21887, "POP_MIN": 15500, "POP_OTHER": 21887, "RANK_MAX": 7, "RANK_MIN": 6, "GEONAMEID": 3575551, "LS_NAME": "Basseterre", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 21887, "MAX_POP20": 21887, "MAX_POP50": 21887, "MAX_POP300": 21887, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 7, "MAX_AREAKM": 7, "MIN_AREAMI": 3, "MAX_AREAMI": 3, "MIN_PERKM": 16, "MAX_PERKM": 16, "MIN_PERMI": 10, "MAX_PERMI": 10, "MIN_BBXMIN": -62.741667, "MAX_BBXMIN": -62.741667, "MIN_BBXMAX": -62.708333, "MAX_BBXMAX": -62.708333, "MIN_BBYMIN": 17.291667, "MAX_BBYMIN": 17.291667, "MIN_BBYMAX": 17.333333, "MAX_BBYMAX": 17.333333, "MEAN_BBXC": -62.726389, "MEAN_BBYC": 17.306019, "COMPARE": 0, "GN_ASCII": "Basseterre", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 3, "GN_POP": 12920, "ELEVATION": 0, "GTOPO30": 1, "TIMEZONE": "America/St_Kitts", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ -62.709961, 17.308688 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital", "NAME": "Reykjavík", "DIFFASCII": 1, "NAMEASCII": "Reykjavik", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Iceland", "SOV_A3": "ISL", "ADM0NAME": "Iceland", "ADM0_A3": "ISL", "ADM1NAME": "Suðurnes", "ISO_A2": "IS", "LATITUDE": 64.150024, "LONGITUDE": -21.950014, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 166212, "POP_MIN": 113906, "POP_OTHER": 160116, "RANK_MAX": 9, "RANK_MIN": 9, "GEONAMEID": 3413829, "LS_NAME": "Reykjavik", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 166212, "MAX_POP20": 166212, "MAX_POP50": 166212, "MAX_POP300": 166212, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 75, "MAX_AREAKM": 75, "MIN_AREAMI": 29, "MAX_AREAMI": 29, "MIN_PERKM": 119, "MAX_PERKM": 119, "MIN_PERMI": 74, "MAX_PERMI": 74, "MIN_BBXMIN": -22.008333, "MAX_BBXMIN": -22.008333, "MIN_BBXMAX": -21.75, "MAX_BBXMAX": -21.75, "MIN_BBYMIN": 64.05, "MAX_BBYMIN": 64.05, "MIN_BBYMAX": 64.166667, "MAX_BBYMAX": 64.166667, "MEAN_BBXC": -21.8825, "MEAN_BBYC": 64.116125, "COMPARE": 0, "GN_ASCII": "Reykjavik", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 39, "GN_POP": 113906, "ELEVATION": 0, "GTOPO30": 16, "TIMEZONE": "Atlantic/Reykjavik", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ -21.928711, 64.148952 ] } }
|
||||
@@ -202,8 +198,6 @@
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 6, "NATSCALE": 30, "LABELRANK": 0, "FEATURECLA": "Admin-0 capital", "NAME": "Majuro", "DIFFASCII": 0, "NAMEASCII": "Majuro", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Marshall Islands", "SOV_A3": "MHL", "ADM0NAME": "Marshall Islands", "ADM0_A3": "MHL", "ISO_A2": "MH", "LATITUDE": 7.103004, "LONGITUDE": 171.38, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 25400, "POP_MIN": 20500, "POP_OTHER": 0, "RANK_MAX": 7, "RANK_MIN": 7, "GEONAMEID": 2113779, "LS_NAME": "Majuro", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 2084, "MAX_POP20": 2084, "MAX_POP50": 2084, "MAX_POP300": 2084, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 3, "MAX_AREAKM": 3, "MIN_AREAMI": 1, "MAX_AREAMI": 1, "MIN_PERKM": 7, "MAX_PERKM": 7, "MIN_PERMI": 5, "MAX_PERMI": 5, "MIN_BBXMIN": 171.366667, "MAX_BBXMIN": 171.366667, "MIN_BBXMAX": 171.375, "MAX_BBXMAX": 171.375, "MIN_BBYMIN": 7.091667, "MAX_BBYMIN": 7.091667, "MIN_BBYMAX": 7.116667, "MAX_BBYMAX": 7.116667, "MEAN_BBXC": 171.370833, "MEAN_BBYC": 7.104167, "COMPARE": 0, "GN_ASCII": "Majuro", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 0, "GN_POP": 20500, "ELEVATION": 0, "GTOPO30": 1, "TIMEZONE": "Pacific/Majuro", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_LAT": 0, "UN_LONG": 0, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 0, "POP2010": 0, "POP2015": 0, "POP2020": 0, "POP2025": 0, "POP2050": 0 }, "geometry": { "type": "Point", "coordinates": [ 171.386719, 7.100893 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 4, "NATSCALE": 50, "LABELRANK": 0, "FEATURECLA": "Admin-0 capital", "NAME": "Kigali", "DIFFASCII": 0, "NAMEASCII": "Kigali", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Rwanda", "SOV_A3": "RWA", "ADM0NAME": "Rwanda", "ADM0_A3": "RWA", "ADM1NAME": "Kigali City", "ISO_A2": "RW", "LATITUDE": -1.95359, "LONGITUDE": 30.060532, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 860000, "POP_MIN": 745261, "POP_OTHER": 1152904, "RANK_MAX": 11, "RANK_MIN": 11, "GEONAMEID": 202061, "MEGANAME": "Kigali", "LS_NAME": "Kigali", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1046787, "MAX_POP20": 2263899, "MAX_POP50": 5065653, "MAX_POP300": 7102391, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 601, "MAX_AREAKM": 8753, "MIN_AREAMI": 232, "MAX_AREAMI": 3380, "MIN_PERKM": 735, "MAX_PERKM": 9184, "MIN_PERMI": 457, "MAX_PERMI": 5707, "MIN_BBXMIN": 29.166667, "MAX_BBXMIN": 29.833333, "MIN_BBXMAX": 30.233333, "MAX_BBXMAX": 30.475, "MIN_BBYMIN": -2.991667, "MAX_BBYMIN": -2.075, "MIN_BBYMAX": -1.76663, "MAX_BBYMAX": -1.075, "MEAN_BBXC": 29.913775, "MEAN_BBYC": -2.034427, "COMPARE": 0, "GN_ASCII": "Kigali", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 9, "GN_POP": 745261, "ELEVATION": 0, "GTOPO30": 1568, "TIMEZONE": "Africa/Kigali", "GEONAMESNO": "GeoNames match general.", "UN_FID": 439, "UN_ADM0": "Rwanda", "UN_LAT": -1.95, "UN_LONG": 30.05, "POP1950": 18, "POP1955": 25, "POP1960": 34, "POP1965": 45, "POP1970": 59, "POP1975": 90, "POP1980": 128, "POP1985": 168, "POP1990": 219, "POP1995": 289, "POP2000": 497, "POP2005": 775, "POP2010": 860, "POP2015": 947, "POP2020": 1152, "POP2025": 1413, "POP2050": 1715 }, "geometry": { "type": "Point", "coordinates": [ 30.058594, -1.933227 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 0, "NATSCALE": 600, "LABELRANK": 5, "FEATURECLA": "Admin-0 capital", "NAME": "Nairobi", "DIFFASCII": 0, "NAMEASCII": "Nairobi", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "Kenya", "SOV_A3": "KEN", "ADM0NAME": "Kenya", "ADM0_A3": "KEN", "ADM1NAME": "Nairobi", "ISO_A2": "KE", "LATITUDE": -1.283347, "LONGITUDE": 36.816657, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 3010000, "POP_MIN": 2750547, "POP_OTHER": 3400962, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 184745, "MEGANAME": "Nairobi", "LS_NAME": "Nairobi", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 3401842, "MAX_POP20": 3401842, "MAX_POP50": 3418532, "MAX_POP300": 3418532, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 698, "MAX_AREAKM": 719, "MIN_AREAMI": 269, "MAX_AREAMI": 277, "MIN_PERKM": 554, "MAX_PERKM": 571, "MIN_PERMI": 344, "MAX_PERMI": 355, "MIN_BBXMIN": 36.608333, "MAX_BBXMIN": 36.608333, "MIN_BBXMAX": 37.066667, "MAX_BBXMAX": 37.066667, "MIN_BBYMIN": -1.433333, "MAX_BBYMIN": -1.433333, "MIN_BBYMAX": -1.083333, "MAX_BBYMAX": -1.083333, "MEAN_BBXC": 36.804283, "MEAN_BBYC": -1.249679, "COMPARE": 0, "GN_ASCII": "Nairobi", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 5, "GN_POP": 2750547, "ELEVATION": 0, "GTOPO30": 1724, "TIMEZONE": "Africa/Nairobi", "GEONAMESNO": "GeoNames match general.", "UN_FID": 324, "UN_ADM0": "Kenya", "UN_LAT": -1.26, "UN_LONG": 36.8, "POP1950": 137, "POP1955": 201, "POP1960": 293, "POP1965": 404, "POP1970": 531, "POP1975": 677, "POP1980": 862, "POP1985": 1090, "POP1990": 1380, "POP1995": 1755, "POP2000": 2233, "POP2005": 2787, "POP2010": 3010, "POP2015": 3363, "POP2020": 4052, "POP2025": 4881, "POP2050": 5871 }, "geometry": { "type": "Point", "coordinates": [ 36.826172, -1.274309 ] } }
|
||||
] }
|
||||
] }
|
||||
] }
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
"minzoom": "0",
|
||||
"name": "tests/ne_110m_populated_places/out/-z3_-K20_-r1_-yNAME_-k2.json.check.mbtiles",
|
||||
"strategies": "[{\"coalesced_as_needed\":207},{\"coalesced_as_needed\":174},{\"coalesced_as_needed\":108},{}]",
|
||||
"tippecanoe_decisions": "{\"basezoom\":3,\"droprate\":1,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"maxzoom": "3",
|
||||
"minzoom": "0",
|
||||
"name": "tests/ne_110m_populated_places/out/-z3_-r1_--limit-tile-feature-count_3.json.check.mbtiles",
|
||||
"tippecanoe_decisions": "{\"basezoom\":3,\"droprate\":1,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
+1
@@ -9,6 +9,7 @@
|
||||
"maxzoom": "3",
|
||||
"minzoom": "0",
|
||||
"name": "tests/ne_110m_populated_places/out/-z3_-r1_--limit-tile-feature-count_3_--limit-tile-feature-count-at-maximum-zoom_10.json.check.mbtiles",
|
||||
"tippecanoe_decisions": "{\"basezoom\":3,\"droprate\":1,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
"minzoom": "0",
|
||||
"name": "tests/ne_110m_populated_places/out/-zg_-K20_-r1_-yNAME.json.check.mbtiles",
|
||||
"strategies": "[{\"coalesced_as_needed\":207},{\"coalesced_as_needed\":174},{\"coalesced_as_needed\":108},{\"coalesced_as_needed\":51}]",
|
||||
"tippecanoe_decisions": "{\"basezoom\":3,\"droprate\":1,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
"minzoom": "0",
|
||||
"name": "tests/ne_110m_populated_places/out/-zg_-K20_-r1_-yNAME_-kg.json.check.mbtiles",
|
||||
"strategies": "[{\"coalesced_as_needed\":207},{\"coalesced_as_needed\":174},{\"coalesced_as_needed\":108},{}]",
|
||||
"tippecanoe_decisions": "{\"basezoom\":3,\"droprate\":1,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
{ "type": "FeatureCollection", "properties": { "zoom": 0, "x": 0, "y": 0 }, "features": [
|
||||
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 4, "NAME": "Castries" }, "geometry": { "type": "Point", "coordinates": [ -60.996094, 14.008696 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NAME": "Niamey" }, "geometry": { "type": "Point", "coordinates": [ 2.109375, 13.496473 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NAME": "Wellington" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 174.814453, -41.310824 ], [ -185.273438, -41.310824 ] ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NAME": "Sucre" }, "geometry": { "type": "Point", "coordinates": [ -65.214844, -19.062118 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 3, "NAME": "Hargeysa" }, "geometry": { "type": "Point", "coordinates": [ 44.121094, 9.535749 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 1, "NAME": "Chengdu" }, "geometry": { "type": "Point", "coordinates": [ 104.062500, 30.675715 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 1, "NAME": "Vancouver" }, "geometry": { "type": "Point", "coordinates": [ -123.134766, 49.267805 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 1, "NAME": "Vienna" }, "geometry": { "type": "Point", "coordinates": [ 16.347656, 48.166085 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 0, "NAME": "Cape Town" }, "geometry": { "type": "Point", "coordinates": [ 18.457031, -33.943360 ] } }
|
||||
] }
|
||||
] }
|
||||
@@ -0,0 +1,19 @@
|
||||
{ "type": "FeatureCollection", "properties": { "zoom": 0, "x": 0, "y": 0 }, "features": [
|
||||
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 0, "NAME": "Los Angeles" }, "geometry": { "type": "Point", "coordinates": [ -118.125000, 33.943360 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 0, "NAME": "London" }, "geometry": { "type": "Point", "coordinates": [ -0.087891, 51.508742 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 0, "NAME": "Santiago" }, "geometry": { "type": "Point", "coordinates": [ -70.664062, -33.431441 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 0, "NAME": "Rome" }, "geometry": { "type": "Point", "coordinates": [ 12.480469, 41.902277 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 0, "NAME": "Lagos" }, "geometry": { "type": "Point", "coordinates": [ 3.427734, 6.402648 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 0, "NAME": "Riyadh" }, "geometry": { "type": "Point", "coordinates": [ 46.757812, 24.607069 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 0, "NAME": "Singapore" }, "geometry": { "type": "Point", "coordinates": [ 103.886719, 1.230374 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "SCALERANK": 0, "NAME": "Cape Town" }, "geometry": { "type": "Point", "coordinates": [ 18.457031, -33.943360 ] } }
|
||||
] }
|
||||
] }
|
||||
@@ -0,0 +1,21 @@
|
||||
{ "type": "FeatureCollection", "properties": { "zoom": 0, "x": 0, "y": 0 }, "features": [
|
||||
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
|
||||
{ "type": "Feature", "properties": { "NAME": "Vancouver,San Francisco,Los Angeles,Denver,Monterrey,Houston,Mexico City,Guatemala,Chicago,Toronto,Ottawa,Atlanta,Havana,Miami,Washington, D.C.,New York,Nassau,Belmopan,Tegucigalpa,San Salvador,Managua,San Jose,Panama City,Kingston,Port-au-Prince,Santo Domingo,Bogota,Basseterre,Saint John's,Roseau" }, "geometry": { "type": "Point", "coordinates": [ -123.134766, 49.267805 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Castries,Kingstown,Saint George's,Bridgetown,Caracas,Port-of-Spain,Georgetown,Paramaribo,Reykjavík,Dublin,London,Praia,Laayoune,Lisbon,Casablanca,Rabat,Madrid,Bir Lehlou,Dakar,Nouakchott,Banjul,Bissau,Conakry,Freetown,Bamako,Ouagadougou,Monrovia,Yamoussoukro,Abidjan,Accra" }, "geometry": { "type": "Point", "coordinates": [ -60.996094, 14.008696 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Nukualofa,Apia,Quito,Lima,La Paz,Valparaiso,Santiago,Sucre,Brasilia,Asuncion,Buenos Aires,Sao Paulo,Montevideo,Rio de Janeiro,Oslo,Stockholm,The Hague,Amsterdam,Brussels,Luxembourg,Paris,Andorra,Geneva,Bern,Vaduz,Monaco,København,Berlin,Prague,Warsaw" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ -175.166016, -21.125498 ], [ 184.833984, -21.125498 ] ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Vienna,Ljubljana,Zagreb,San Marino,Vatican City,Rome,Bratislava,Budapest,Sarajevo,Podgorica,Belgrade,Tirana,Pristina,Skopje,Helsinki,Tallinn,Riga,Vilnius,Minsk,Kiev,Sofia,Bucharest,Chisinau,Istanbul,Moscow,Tbilisi,Algiers,Tunis,Tripoli,Valletta" }, "geometry": { "type": "Point", "coordinates": [ 16.347656, 48.166085 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Niamey,Lome,Cotonou,Porto-Novo,Lagos,Abuja,Sao Tome,Malabo,Libreville,Ndjamena,Yaounde,Bangui,Athens,Ankara,Nicosia,Cairo,Tel Aviv-Yafo,Beirut,Damascus,Yerevan,Baghdad,Jerusalem,Amman,Khartoum,Juba,Kampala,Asmara,Sanaa,Djibouti,Addis Ababa" }, "geometry": { "type": "Point", "coordinates": [ 2.109375, 13.496473 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Hargeysa,Astana,Tashkent,Bishkek,Urumqi,Baku,Tehran,Kuwait,Riyadh,Manama,Doha,Dubai,Abu Dhabi,Ashgabat,Muscat,Mogadishu,Dushanbe,Kabul,Islamabad,New Delhi,Kathmandu,Thimphu,Kolkata,Mumbai,Bangalore,Male,Colombo,Sri Jawewardenepura Kotte,Ulaanbaatar,Dhaka" }, "geometry": { "type": "Point", "coordinates": [ 44.121094, 9.535749 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Chengdu,Naypyidaw,Rangoon,Bangkok,Vientiane,Hanoi,Phnom Penh,Kuala Lumpur,Putrajaya,Singapore,Beijing,Hong Kong,Shanghai,Taipei,Pyongyang,Seoul,Baguio City,Manila,Bandar Seri Begawan,Melekeok,Osaka,Kyoto,Tokyo,Palikir,Majuro,Tarawa,Brazzaville,Kinshasa,Luanda,Windhoek" }, "geometry": { "type": "Point", "coordinates": [ 104.062500, 30.675715 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Cape Town,Kigali,Bujumbura,Lusaka,Harare,Nairobi,Dodoma,Dar es Salaam,Lilongwe,Moroni,Gaborone,Johannesburg,Bloemfontein,Maseru,Pretoria,Mbabane,Lobamba,Maputo,Victoria,Antananarivo,Port Louis,Jakarta,Dili,Port Moresby,Melbourne,Sydney,Canberra,Honiara,Port Vila,Funafuti" }, "geometry": { "type": "Point", "coordinates": [ 18.457031, -33.943360 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Suva,Auckland,Wellington" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 178.505859, -18.145852 ], [ -181.582031, -18.145852 ] ] } }
|
||||
] }
|
||||
] }
|
||||
@@ -0,0 +1,57 @@
|
||||
{ "type": "FeatureCollection", "properties": { "zoom": 0, "x": 0, "y": 0 }, "features": [
|
||||
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
|
||||
{ "type": "Feature", "properties": { "NAME": "Los Angeles" }, "geometry": { "type": "Point", "coordinates": [ -118.125000, 33.943360 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Mexico City" }, "geometry": { "type": "Point", "coordinates": [ -99.140625, 19.394068 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Washington, D.C." }, "geometry": { "type": "Point", "coordinates": [ -76.992188, 38.891033 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "New York" }, "geometry": { "type": "Point", "coordinates": [ -74.003906, 40.713956 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Bogota" }, "geometry": { "type": "Point", "coordinates": [ -74.091797, 4.565474 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "London" }, "geometry": { "type": "Point", "coordinates": [ -0.087891, 51.508742 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Santiago" }, "geometry": { "type": "Point", "coordinates": [ -70.664062, -33.431441 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Sao Paulo" }, "geometry": { "type": "Point", "coordinates": [ -46.582031, -23.563987 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Rio de Janeiro" }, "geometry": { "type": "Point", "coordinates": [ -43.242188, -22.917923 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Paris" }, "geometry": { "type": "Point", "coordinates": [ 2.373047, 48.864715 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Rome" }, "geometry": { "type": "Point", "coordinates": [ 12.480469, 41.902277 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Istanbul" }, "geometry": { "type": "Point", "coordinates": [ 29.003906, 41.112469 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Moscow" }, "geometry": { "type": "Point", "coordinates": [ 37.617188, 55.727110 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Lagos" }, "geometry": { "type": "Point", "coordinates": [ 3.427734, 6.402648 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Cairo" }, "geometry": { "type": "Point", "coordinates": [ 31.289062, 30.069094 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Riyadh" }, "geometry": { "type": "Point", "coordinates": [ 46.757812, 24.607069 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Kolkata" }, "geometry": { "type": "Point", "coordinates": [ 88.330078, 22.512557 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Mumbai" }, "geometry": { "type": "Point", "coordinates": [ 72.861328, 18.979026 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Singapore" }, "geometry": { "type": "Point", "coordinates": [ 103.886719, 1.230374 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Beijing" }, "geometry": { "type": "Point", "coordinates": [ 116.367188, 39.909736 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Hong Kong" }, "geometry": { "type": "Point", "coordinates": [ 114.169922, 22.268764 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Shanghai" }, "geometry": { "type": "Point", "coordinates": [ 121.464844, 31.203405 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Tokyo" }, "geometry": { "type": "Point", "coordinates": [ 139.746094, 35.675147 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Cape Town" }, "geometry": { "type": "Point", "coordinates": [ 18.457031, -33.943360 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Nairobi" }, "geometry": { "type": "Point", "coordinates": [ 36.826172, -1.318243 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Jakarta" }, "geometry": { "type": "Point", "coordinates": [ 106.875000, -6.227934 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Sydney" }, "geometry": { "type": "Point", "coordinates": [ 151.171875, -33.943360 ] } }
|
||||
] }
|
||||
] }
|
||||
@@ -0,0 +1,21 @@
|
||||
{ "type": "FeatureCollection", "properties": { "zoom": 0, "x": 0, "y": 0 }, "features": [
|
||||
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
|
||||
{ "type": "Feature", "properties": { "NAME": "Vancouver" }, "geometry": { "type": "Point", "coordinates": [ -123.134766, 49.267805 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Castries" }, "geometry": { "type": "Point", "coordinates": [ -60.996094, 14.008696 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Nukualofa" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ -175.166016, -21.125498 ], [ 184.833984, -21.125498 ] ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Vienna" }, "geometry": { "type": "Point", "coordinates": [ 16.347656, 48.166085 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Niamey" }, "geometry": { "type": "Point", "coordinates": [ 2.109375, 13.496473 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Hargeysa" }, "geometry": { "type": "Point", "coordinates": [ 44.121094, 9.535749 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Chengdu" }, "geometry": { "type": "Point", "coordinates": [ 104.062500, 30.675715 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Cape Town" }, "geometry": { "type": "Point", "coordinates": [ 18.457031, -33.943360 ] } }
|
||||
,
|
||||
{ "type": "Feature", "properties": { "NAME": "Suva" }, "geometry": { "type": "MultiPoint", "coordinates": [ [ 178.505859, -18.145852 ], [ -181.582031, -18.145852 ] ] } }
|
||||
] }
|
||||
] }
|
||||
Binary file not shown.
@@ -9,6 +9,7 @@
|
||||
"maxzoom": "14",
|
||||
"minzoom": "0",
|
||||
"name": "tests/pmtiles/hackspots.pmtiles",
|
||||
"tippecanoe_decisions": "{\"basezoom\":14,\"droprate\":1,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"maxzoom": "14",
|
||||
"minzoom": "0",
|
||||
"name": "tests/raw-tiles/raw-tiles",
|
||||
"tippecanoe_decisions": "{\"basezoom\":14,\"droprate\":1,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"maxzoom": "14",
|
||||
"minzoom": "0",
|
||||
"name": "tests/raw-tiles/raw-tiles",
|
||||
"tippecanoe_decisions": "{\"basezoom\":14,\"droprate\":1,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"maxzoom": "3",
|
||||
"minzoom": "0",
|
||||
"name": "tests/stable/out/-z3_-B0.json.check.mbtiles",
|
||||
"tippecanoe_decisions": "{\"basezoom\":0,\"droprate\":2.5,\"retain_points_multiplier\":1}",
|
||||
"type": "overlay",
|
||||
"version": "2"
|
||||
}, "features": [
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
#include "text.hpp"
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <vector>
|
||||
#include "text.hpp"
|
||||
#include "milo/dtoa_milo.h"
|
||||
#include "milo/milo.h"
|
||||
#include "errors.hpp"
|
||||
@@ -184,3 +186,142 @@ char *dtoa_milo(double val) {
|
||||
}
|
||||
return dup;
|
||||
}
|
||||
|
||||
// to work with data from https://github.com/kmike/text-unidecode
|
||||
std::vector<std::string> read_unidecode(const char *fname) {
|
||||
std::string data;
|
||||
|
||||
FILE *f = fopen(fname, "rb");
|
||||
if (f == NULL) {
|
||||
perror(fname);
|
||||
exit(EXIT_OPEN);
|
||||
}
|
||||
|
||||
std::string buf;
|
||||
buf.resize(2000);
|
||||
|
||||
while (true) {
|
||||
size_t nread = fread((void *) buf.c_str(), sizeof(char), buf.size(), f);
|
||||
if (nread == 0) {
|
||||
break;
|
||||
}
|
||||
data.append(buf.c_str(), nread);
|
||||
}
|
||||
|
||||
fclose(f);
|
||||
|
||||
std::vector<std::string> out;
|
||||
out.emplace_back(); // because the data file is 1-indexed
|
||||
out.emplace_back(); // ascii 001
|
||||
|
||||
for (size_t i = 0; i < data.size(); i++) {
|
||||
if (data[i] == '\0') {
|
||||
out.emplace_back();
|
||||
} else {
|
||||
if (data[i] >= '\0' && data[i] <= '~') {
|
||||
data[i] = tolower(data[i]);
|
||||
}
|
||||
out.back().push_back(data[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
std::string unidecode_smash(std::vector<std::string> const &unidecode_data, const char *s) {
|
||||
if (unidecode_data.size() == 0) {
|
||||
return s;
|
||||
}
|
||||
|
||||
std::string out;
|
||||
out.reserve(strlen(s));
|
||||
|
||||
long c;
|
||||
while (true) {
|
||||
const char *os = s;
|
||||
s = utf8_next(s, &c);
|
||||
if (s == NULL) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (c >= 0 && c < (long) unidecode_data.size()) {
|
||||
out.append(unidecode_data[c]);
|
||||
} else {
|
||||
// pass through anything that is out of unidecode range literally
|
||||
for (; os != s; os++) {
|
||||
out.push_back(*os);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
unsigned long long fnv1a(std::string const &s) {
|
||||
// Store tiles by a hash of their contents (fnv1a 64-bit)
|
||||
// http://www.isthe.com/chongo/tech/comp/fnv/
|
||||
const unsigned long long fnv_offset_basis = 14695981039346656037u;
|
||||
const unsigned long long fnv_prime = 1099511628211u;
|
||||
unsigned long long h = fnv_offset_basis;
|
||||
for (size_t i = 0; i < s.size(); i++) {
|
||||
h ^= (unsigned char) s[i];
|
||||
h *= fnv_prime;
|
||||
}
|
||||
return h;
|
||||
}
|
||||
|
||||
// The "additional" is to make it easier to hash a serial_val attribute value and type together
|
||||
unsigned long long fnv1a(const char *s, char additional) {
|
||||
// http://www.isthe.com/chongo/tech/comp/fnv/
|
||||
const unsigned long long fnv_offset_basis = 14695981039346656037u;
|
||||
const unsigned long long fnv_prime = 1099511628211u;
|
||||
unsigned long long h = fnv_offset_basis;
|
||||
for (size_t i = 0; s[i] != '\0'; i++) {
|
||||
h ^= (unsigned char) s[i];
|
||||
h *= fnv_prime;
|
||||
}
|
||||
h ^= (unsigned char) additional;
|
||||
h *= fnv_prime;
|
||||
return h;
|
||||
}
|
||||
|
||||
unsigned long long fnv1a(size_t size, void *p) {
|
||||
// http://www.isthe.com/chongo/tech/comp/fnv/
|
||||
unsigned char *s = (unsigned char *) p;
|
||||
const unsigned long long fnv_offset_basis = 14695981039346656037u;
|
||||
const unsigned long long fnv_prime = 1099511628211u;
|
||||
unsigned long long h = fnv_offset_basis;
|
||||
for (size_t i = 0; i < size; i++) {
|
||||
h ^= (unsigned char) s[i];
|
||||
h *= fnv_prime;
|
||||
}
|
||||
return h;
|
||||
}
|
||||
|
||||
// This function reverses the order of the bits in a 64-bit word.
|
||||
// Instead of shifting individual bits in a loop, it shifts them
|
||||
// in blocks, starting with swapping the halfwords, and working downward
|
||||
// until it is swapping individual pairs of adjacent bits.
|
||||
//
|
||||
// The purpose is to permute the order in which features are visited:
|
||||
// instead of working in an orderly fashion from the top left to the
|
||||
// bottom right of the tile, instead jump around to minimize adjacency,
|
||||
// like a hash function, but taking advantage of the knowledge that we
|
||||
// are operating on a fixed-size input that can be directly inverted.
|
||||
// https://en.wikipedia.org/wiki/Bit-reversal_permutation
|
||||
//
|
||||
// This allows calculating an appropriate set of features to appear
|
||||
// at a fractional zoom level: at what is effectively z4.25, for example,
|
||||
// we can bring in a quarter of the features that will be added in the
|
||||
// transition from z4 to z5, and have them be spatially distributed
|
||||
// across the tile rather than clumped together.
|
||||
|
||||
unsigned long long bit_reverse(unsigned long long v) {
|
||||
v = ((v & 0x00000000FFFFFFFF) << 32) | ((v & 0xFFFFFFFF00000000) >> 32);
|
||||
v = ((v & 0x0000FFFF0000FFFF) << 16) | ((v & 0xFFFF0000FFFF0000) >> 16);
|
||||
v = ((v & 0x00FF00FF00FF00FF) << 8) | ((v & 0xFF00FF00FF00FF00) >> 8);
|
||||
v = ((v & 0x0F0F0F0F0F0F0F0F) << 4) | ((v & 0xF0F0F0F0F0F0F0F0) >> 4);
|
||||
v = ((v & 0x3333333333333333) << 2) | ((v & 0xCCCCCCCCCCCCCCCC) >> 2);
|
||||
v = ((v & 0x5555555555555555) << 1) | ((v & 0xAAAAAAAAAAAAAAAA) >> 1);
|
||||
return v;
|
||||
}
|
||||
|
||||
@@ -8,5 +8,11 @@ const char *utf8_next(const char *s, long *c);
|
||||
std::string truncate16(std::string const &s, size_t runes);
|
||||
int integer_zoom(std::string where, std::string text);
|
||||
std::string format_commandline(int argc, char **argv);
|
||||
std::vector<std::string> read_unidecode(const char *fname);
|
||||
std::string unidecode_smash(std::vector<std::string> const &unidecode_data, const char *s);
|
||||
unsigned long long fnv1a(std::string const &s);
|
||||
unsigned long long fnv1a(const char *s, char additional);
|
||||
unsigned long long fnv1a(size_t size, void *p);
|
||||
unsigned long long bit_reverse(unsigned long long v);
|
||||
|
||||
#endif
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user