Add --generate-variable-depth-tile-pyramid option (#251)

* Track output position at the file level instead of within each tile

* Track file position where the child tile data begins

* Add option and document its intended behavior

* Changing the detail loop to account for stopping early

* I forgot I already added an option for this

* Stop early if we can make a complete tile

* Add a test of zoom truncation with limited feature count

* Forgot to commit the actual code change

* Make room for a vertex count in the header of each serialized tile

* Estimate tile complexity; don't try truncating when unlikely to work

* Be more conservative, because ever retrying a tile is a big speed hit

* If stopping early, don't simplify or clean; leave that to overzoom

* Add tiny polygon reduction / dust to overzoom

* Don't try to stop early in the children if we dropped anything by rate

* Fflush here too before pwriting

* Don't stop early if we ended up dropping any features.

Rework the can-the-next-zoom-stop-early logic to avoid going
one zoom further than needed.

* Fix warning

* Fix warnings

* Oops, checking for the wrong expected return value

* Cleanup from adding line simplification in overzoom

* Current (wrong) behavior when combining coalescing and truncating

* Keep a list of parent tiles to skip rather than truncating

* Now the coalesced tiles in z12 get children in z13

* Don't double-count feature dropping when the zoom level is retried

* Correct README description

* Remove todo about special case below basezoom, which is accounted for

* Be a little more aggressive in drop-densest determination

* Scale tile feature limit for megatiles in the same way as byte limit

* Fully deprecate -detect-shared-borders into an alias

* Track the distances found in the douglas-peucker recursion

* Serialize and deserialize the distance with the vertices

* Revert "Serialize and deserialize the distance with the vertices"

This reverts commit 753f1b7909.

* Revert "Track the distances found in the douglas-peucker recursion"

This reverts commit e5361f8c22.

* Revert "Fully deprecate -detect-shared-borders into an alias"

This reverts commit 0698aeb766.

* Better tracking of whether we failed to make a full-detail tile

* Put a bloom filter in front of the binary search for shared nodes

* Forgot to take out this printf

* Improve dispatch of tiling tasks

* Still dispatch the biggest tasks first

* Track zoom truncation in the strategies list in the tileset metadata

* Prescan for small deltas before doing proper simplification

* Revert "Prescan for small deltas before doing proper simplification"

This reverts commit d1d8238b83.

* Update version and changelog

* Rename to --generate-variable-depth-tile-pyramid
This commit is contained in:
Erica Fischer
2024-08-06 16:05:52 -07:00
committed by GitHub
parent 50deb9ce63
commit bc3ef87c3f
35 changed files with 3469 additions and 1250 deletions
+8
View File
@@ -1,3 +1,11 @@
# 2.58.0
* Add --generate-variable-depth-tile-pyramid option
* Add --line-simplification and --tiny-polygon-size options to tippecanoe-overzoom
* Adjust tile feature limit for --retain-points-multiplier
* Tune convergence rate for --coalesce-densest and --drop-densest
* Fix overreported drop and coalesce counts in strategies
# 2.57.0
* Add multi-tile input to tippecanoe-overzoom
+5
View File
@@ -355,6 +355,11 @@ overzoom-test: tippecanoe-overzoom
./tippecanoe-decode tests/pbf/12-2145-1391-filter2.pbf 12 2145 1391 > tests/pbf/12-2145-1391-filter2.pbf.json.check
cmp tests/pbf/12-2145-1391-filter2.pbf.json.check tests/pbf/12-2145-1391-filter2.pbf.json
rm tests/pbf/12-2145-1391-filter2.pbf.json.check tests/pbf/12-2145-1391-filter2.pbf
# Tiny polygon reduction
./tippecanoe-overzoom --line-simplification=5 --tiny-polygon-size=50 -o tests/pbf/countries-0-0-0.pbf.out tests/pbf/countries-0-0-0.pbf 0/0/0 0/0/0
./tippecanoe-decode tests/pbf/countries-0-0-0.pbf.out 0 0 0 > tests/pbf/countries-0-0-0.pbf.out.json.check
cmp tests/pbf/countries-0-0-0.pbf.out.json.check tests/pbf/countries-0-0-0.pbf.out.json
rm tests/pbf/countries-0-0-0.pbf.out tests/pbf/countries-0-0-0.pbf.out.json.check
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"}'
+1
View File
@@ -352,6 +352,7 @@ Parallel processing will also be automatic if the input file is in FlatGeobuf fo
specified maximum zoom and to any levels added beyond that.
* `--extend-zooms-if-still-dropping-maximum=`_count_: Increase the maxzoom if features are still being dropped at that zoom level
by up to _count_ zoom levels.
* `-at` or `--generate-variable-depth-tile-pyramid`: Don't produce child tiles for any tile that should be sufficient to be overzoomed to any higher zoom level. Such tiles will be produced with maximum detail and no simplification or polygon cleaning. Tiles with point features below the basezoom or where any features have to be dropped dynamically, or which contain too many features or bytes with full detail, will be written out with normal detail and split into child tiles. Tilesets generated with this option are suitable for use only with tile servers that will find the appropriate tile to overzoom from and will simplify and clean the geometries appropriately before serving the tile.
* `-R` _zoom_`/`_x_`/`_y_ or `--one-tile=`_zoom_`/`_x_`/`_y_: Set the minzoom and maxzoom to _zoom_ and produce only
the single specified tile at that zoom level.
+289 -5
View File
@@ -1,3 +1,4 @@
#include <stack>
#include <stdlib.h>
#include <mapbox/geometry/point.hpp>
#include <mapbox/geometry/multi_polygon.hpp>
@@ -340,7 +341,7 @@ drawvec clean_or_clip_poly(drawvec &geom, int z, int buffer, bool clip, bool try
if (k != i) {
fprintf(f, ",");
}
fprintf(f, "[%lld,%lld]", geom[k].x, geom[k].y);
fprintf(f, "[%lld,%lld]", (long long) geom[k].x, (long long) geom[k].y);
}
fprintf(f, "]");
@@ -755,10 +756,274 @@ static std::vector<std::pair<double, double>> clip_poly1(std::vector<std::pair<d
return out;
}
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) {
long long p2x = segB_x - segA_x;
long long p2y = segB_y - segA_y;
// These calculations must be made in integers instead of floating point
// to make them consistent between x86 and arm floating point implementations.
//
// Coordinates may be up to 34 bits, so their product is up to 68 bits,
// making their sum up to 69 bits. Downshift before multiplying to keep them in range.
double something = ((p2x / 4) * (p2x / 8) + (p2y / 4) * (p2y / 8)) * 32.0;
// likewise
double u = (0 == something) ? 0 : ((point_x - segA_x) / 4 * (p2x / 8) + (point_y - segA_y) / 4 * (p2y / 8)) * 32.0 / (something);
if (u >= 1) {
u = 1;
} else if (u <= 0) {
u = 0;
}
double x = segA_x + u * p2x;
double y = segA_y + u * p2y;
double dx = x - point_x;
double dy = y - point_y;
double out = std::round(sqrt(dx * dx + dy * dy) * 16.0) / 16.0;
return out;
}
// https://github.com/Project-OSRM/osrm-backend/blob/733d1384a40f/Algorithms/DouglasePeucker.cpp
void douglas_peucker(drawvec &geom, int start, int n, double e, size_t kept, size_t retain, bool prevent_simplify_shared_nodes) {
std::stack<int> recursion_stack;
if (!geom[start + 0].necessary || !geom[start + n - 1].necessary) {
fprintf(stderr, "endpoints not marked necessary\n");
exit(EXIT_IMPOSSIBLE);
}
int prev = 0;
for (int here = 1; here < n; here++) {
if (geom[start + here].necessary) {
recursion_stack.push(prev);
recursion_stack.push(here);
prev = here;
if (prevent_simplify_shared_nodes) {
if (retain > 0) {
retain--;
}
}
}
}
// These segments are put on the stack from start to end,
// independent of winding, so note that anything that uses
// "retain" to force it to keep at least N points will
// keep a different set of points when wound one way than
// when wound the other way.
while (!recursion_stack.empty()) {
// pop next element
int second = recursion_stack.top();
recursion_stack.pop();
int first = recursion_stack.top();
recursion_stack.pop();
double max_distance = -1;
int farthest_element_index;
// find index idx of element with max_distance
int i;
if (geom[start + first] < geom[start + second]) {
farthest_element_index = first;
for (i = first + 1; i < second; i++) {
double temp_dist = distance_from_line(geom[start + i].x, geom[start + i].y, geom[start + first].x, geom[start + first].y, geom[start + second].x, geom[start + second].y);
double distance = std::fabs(temp_dist);
if ((distance > e || kept < retain) && (distance > max_distance || (distance == max_distance && geom[start + i] < geom[start + farthest_element_index]))) {
farthest_element_index = i;
max_distance = distance;
}
}
} else {
farthest_element_index = second;
for (i = second - 1; i > first; i--) {
double temp_dist = distance_from_line(geom[start + i].x, geom[start + i].y, geom[start + second].x, geom[start + second].y, geom[start + first].x, geom[start + first].y);
double distance = std::fabs(temp_dist);
if ((distance > e || kept < retain) && (distance > max_distance || (distance == max_distance && geom[start + i] < geom[start + farthest_element_index]))) {
farthest_element_index = i;
max_distance = distance;
}
}
}
if (max_distance >= 0) {
// mark idx as necessary
geom[start + farthest_element_index].necessary = 1;
kept++;
if (geom[start + first] < geom[start + second]) {
if (1 < farthest_element_index - first) {
recursion_stack.push(first);
recursion_stack.push(farthest_element_index);
}
if (1 < second - farthest_element_index) {
recursion_stack.push(farthest_element_index);
recursion_stack.push(second);
}
} else {
if (1 < second - farthest_element_index) {
recursion_stack.push(farthest_element_index);
recursion_stack.push(second);
}
if (1 < farthest_element_index - first) {
recursion_stack.push(first);
recursion_stack.push(farthest_element_index);
}
}
}
}
}
// cut-down version of simplify_lines(), not dealing with shared node preservation
static drawvec simplify_lines_basic(drawvec &geom, int z, int detail, double simplification, size_t retain) {
int res = 1 << (32 - detail - z);
for (size_t i = 0; i < geom.size(); i++) {
if (geom[i].op == VT_MOVETO) {
geom[i].necessary = 1;
} else if (geom[i].op == VT_LINETO) {
geom[i].necessary = 0;
// if this is actually the endpoint, not an intermediate point,
// it will be marked as necessary below
} else {
geom[i].necessary = 1;
}
}
for (size_t i = 0; i < geom.size(); i++) {
if (geom[i].op == VT_MOVETO) {
size_t j;
for (j = i + 1; j < geom.size(); j++) {
if (geom[j].op != VT_LINETO) {
break;
}
}
geom[i].necessary = 1;
geom[j - 1].necessary = 1;
if (j - i > 1) {
douglas_peucker(geom, i, j - i, res * simplification, 2, retain, false);
}
i = j - 1;
}
}
size_t out = 0;
for (size_t i = 0; i < geom.size(); i++) {
if (geom[i].necessary) {
geom[out++] = geom[i];
}
}
geom.resize(out);
return geom;
}
drawvec reduce_tiny_poly(drawvec const &geom, int z, int detail, bool *still_needs_simplification, bool *reduced_away, double *accum_area, double tiny_polygon_size) {
drawvec out;
const double pixel = (1LL << (32 - detail - z)) * (double) tiny_polygon_size;
bool included_last_outer = false;
*still_needs_simplification = false;
*reduced_away = false;
for (size_t i = 0; i < geom.size(); i++) {
if (geom[i].op == VT_MOVETO) {
size_t j;
for (j = i + 1; j < geom.size(); j++) {
if (geom[j].op != VT_LINETO) {
break;
}
}
double area = get_area(geom, i, j);
// XXX There is an ambiguity here: If the area of a ring is 0 and it is followed by holes,
// we don't know whether the area-0 ring was a hole too or whether it was the outer ring
// that these subsequent holes are somehow being subtracted from. I hope that if a polygon
// was simplified down to nothing, its holes also became nothing.
if (area != 0) {
// These are pixel coordinates, so area > 0 for the outer ring.
// If the outer ring of a polygon was reduced to a pixel, its
// inner rings must just have their area de-accumulated rather
// than being drawn since we don't really know where they are.
// i.e., this outer ring is small enough that we are including it
// in a tiny polygon rather than letting it represent itself,
// OR it is an inner ring and we haven't output an outer ring for it to be
// cut out of, so we are just subtracting its area from the tiny polygon
// rather than trying to deal with it geometrically
if ((area > 0 && area <= pixel * pixel) || (area < 0 && !included_last_outer)) {
*accum_area += area;
*reduced_away = true;
if (area > 0 && *accum_area > pixel * pixel) {
// XXX use centroid;
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);
*accum_area -= pixel * pixel;
}
if (area > 0) {
included_last_outer = false;
}
}
// i.e., this ring is large enough that it gets to represent itself
// or it is a tiny hole out of a real polygon, which we are still treating
// as a real geometry because otherwise we can accumulate enough tiny holes
// that we will drop the next several outer rings getting back up to 0.
else {
for (size_t k = i; k < j && k < geom.size(); k++) {
out.push_back(geom[k]);
}
// which means that the overall polygon has a real geometry,
// which means that it gets to be simplified.
*still_needs_simplification = true;
if (area > 0) {
included_last_outer = true;
}
}
} else {
// area is 0: doesn't count as either having been reduced away,
// since it was probably just degenerate from having been clipped,
// or as needing simplification, since it produces no output.
}
i = j - 1;
} else {
fprintf(stderr, "how did we get here with %d in %d?\n", geom[i].op, (int) geom.size());
for (size_t n = 0; n < geom.size(); n++) {
fprintf(stderr, "%d/%lld/%lld ", geom[n].op, (long long) geom[n].x, (long long) geom[n].y);
}
fprintf(stderr, "\n");
out.push_back(geom[i]);
}
}
return out;
}
std::string overzoom(std::vector<input_tile> const &tiles, 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,
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) {
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, double simplification,
double tiny_polygon_size) {
std::vector<source_tile> decoded;
for (auto const &t : tiles) {
@@ -784,7 +1049,7 @@ std::string overzoom(std::vector<input_tile> const &tiles, int nz, int nx, int n
decoded.push_back(out);
}
return overzoom(decoded, nz, nx, ny, detail, buffer, keep, do_compress, next_overzoomed_tiles, demultiply, filter, preserve_input_order, attribute_accum, unidecode_data);
return overzoom(decoded, nz, nx, ny, detail, buffer, keep, do_compress, next_overzoomed_tiles, demultiply, filter, preserve_input_order, attribute_accum, unidecode_data, simplification, tiny_polygon_size);
}
struct tile_feature {
@@ -885,7 +1150,8 @@ static struct preservecmp {
std::string overzoom(std::vector<source_tile> const &tiles, 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,
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) {
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, double simplification,
double tiny_polygon_size) {
mvt_tile outtile;
std::shared_ptr<std::string> tile_stringpool = std::make_shared<std::string>();
@@ -916,6 +1182,7 @@ std::string overzoom(std::vector<source_tile> const &tiles, int nz, int nx, int
}
std::vector<tile_feature> pending_tile_features;
double accum_area = 0;
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";
@@ -1014,6 +1281,23 @@ std::string overzoom(std::vector<source_tile> const &tiles, int nz, int nx, int
}
}
bool still_need_simplification_after_reduction = false;
if (t == VT_POLYGON && tiny_polygon_size > 0) {
bool simplified_away_by_reduction = false;
geom = reduce_tiny_poly(geom, nz, detail, &still_need_simplification_after_reduction, &simplified_away_by_reduction, &accum_area, tiny_polygon_size);
} else {
still_need_simplification_after_reduction = true;
}
if (simplification > 0 && still_need_simplification_after_reduction) {
if (t == VT_POLYGON) {
geom = simplify_lines_basic(geom, nz, detail, simplification, 4);
} else if (t == VT_LINE) {
geom = simplify_lines_basic(geom, nz, detail, simplification, 0);
}
}
// Scale to output tile extent
to_tile_scale(geom, nz, det);
@@ -1077,7 +1361,7 @@ std::string overzoom(std::vector<source_tile> const &tiles, int nz, int nx, int
std::string child = overzoom(sts,
nz + 1, nx * 2 + x, ny * 2 + y,
detail, buffer, keep, false, NULL,
demultiply, filter, preserve_input_order, attribute_accum, unidecode_data);
demultiply, filter, preserve_input_order, attribute_accum, unidecode_data, simplification, tiny_polygon_size);
if (child.size() > 0) {
next_overzoomed_tiles->emplace_back(nx * 2 + x, ny * 2 + y);
}
+11 -226
View File
@@ -1,7 +1,6 @@
#include <iostream>
#include <fstream>
#include <string>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
@@ -159,7 +158,7 @@ void check_polygon(drawvec &geom) {
}
if (!on_edge) {
fprintf(stderr, "%lld,%lld at %lld not in outer ring (%lld to %lld)\n", geom[k].x, geom[k].y, (long long) k, (long long) outer_start, (long long) (outer_start + outer_len));
fprintf(stderr, "%lld,%lld at %lld not in outer ring (%lld to %lld)\n", (long long) geom[k].x, (long long) geom[k].y, (long long) k, (long long) outer_start, (long long) (outer_start + outer_len));
}
}
}
@@ -168,100 +167,6 @@ void check_polygon(drawvec &geom) {
}
}
drawvec reduce_tiny_poly(drawvec const &geom, int z, int detail, bool *still_needs_simplification, bool *reduced_away, double *accum_area) {
drawvec out;
const double pixel = (1LL << (32 - detail - z)) * (double) tiny_polygon_size;
bool included_last_outer = false;
*still_needs_simplification = false;
*reduced_away = false;
for (size_t i = 0; i < geom.size(); i++) {
if (geom[i].op == VT_MOVETO) {
size_t j;
for (j = i + 1; j < geom.size(); j++) {
if (geom[j].op != VT_LINETO) {
break;
}
}
double area = get_area(geom, i, j);
// XXX There is an ambiguity here: If the area of a ring is 0 and it is followed by holes,
// we don't know whether the area-0 ring was a hole too or whether it was the outer ring
// that these subsequent holes are somehow being subtracted from. I hope that if a polygon
// was simplified down to nothing, its holes also became nothing.
if (area != 0) {
// These are pixel coordinates, so area > 0 for the outer ring.
// If the outer ring of a polygon was reduced to a pixel, its
// inner rings must just have their area de-accumulated rather
// than being drawn since we don't really know where they are.
// i.e., this outer ring is small enough that we are including it
// in a tiny polygon rather than letting it represent itself,
// OR it is an inner ring and we haven't output an outer ring for it to be
// cut out of, so we are just subtracting its area from the tiny polygon
// rather than trying to deal with it geometrically
if ((area > 0 && area <= pixel * pixel) || (area < 0 && !included_last_outer)) {
*accum_area += area;
*reduced_away = true;
if (area > 0 && *accum_area > pixel * pixel) {
// XXX use centroid;
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);
*accum_area -= pixel * pixel;
}
if (area > 0) {
included_last_outer = false;
}
}
// i.e., this ring is large enough that it gets to represent itself
// or it is a tiny hole out of a real polygon, which we are still treating
// as a real geometry because otherwise we can accumulate enough tiny holes
// that we will drop the next several outer rings getting back up to 0.
else {
for (size_t k = i; k < j && k < geom.size(); k++) {
out.push_back(geom[k]);
}
// which means that the overall polygon has a real geometry,
// which means that it gets to be simplified.
*still_needs_simplification = true;
if (area > 0) {
included_last_outer = true;
}
}
} else {
// area is 0: doesn't count as either having been reduced away,
// since it was probably just degenerate from having been clipped,
// or as needing simplification, since it produces no output.
}
i = j - 1;
} else {
fprintf(stderr, "how did we get here with %d in %d?\n", geom[i].op, (int) geom.size());
for (size_t n = 0; n < geom.size(); n++) {
fprintf(stderr, "%d/%lld/%lld ", geom[n].op, geom[n].x, geom[n].y);
}
fprintf(stderr, "\n");
out.push_back(geom[i]);
}
}
return out;
}
int quick_check(const long long *bbox, int z, long long buffer) {
long long min = 0;
long long area = 1LL << (32 - z);
@@ -300,130 +205,6 @@ bool point_within_tile(long long x, long long y, int z) {
return x >= 0 && y >= 0 && x < area && y < area;
}
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) {
long long p2x = segB_x - segA_x;
long long p2y = segB_y - segA_y;
// These calculations must be made in integers instead of floating point
// to make them consistent between x86 and arm floating point implementations.
//
// Coordinates may be up to 34 bits, so their product is up to 68 bits,
// making their sum up to 69 bits. Downshift before multiplying to keep them in range.
double something = ((p2x / 4) * (p2x / 8) + (p2y / 4) * (p2y / 8)) * 32.0;
// likewise
double u = (0 == something) ? 0 : ((point_x - segA_x) / 4 * (p2x / 8) + (point_y - segA_y) / 4 * (p2y / 8)) * 32.0 / (something);
if (u >= 1) {
u = 1;
} else if (u <= 0) {
u = 0;
}
double x = segA_x + u * p2x;
double y = segA_y + u * p2y;
double dx = x - point_x;
double dy = y - point_y;
double out = std::round(sqrt(dx * dx + dy * dy) * 16.0) / 16.0;
return out;
}
// https://github.com/Project-OSRM/osrm-backend/blob/733d1384a40f/Algorithms/DouglasePeucker.cpp
static void douglas_peucker(drawvec &geom, int start, int n, double e, size_t kept, size_t retain) {
std::stack<int> recursion_stack;
if (!geom[start + 0].necessary || !geom[start + n - 1].necessary) {
fprintf(stderr, "endpoints not marked necessary\n");
exit(EXIT_IMPOSSIBLE);
}
int prev = 0;
for (int here = 1; here < n; here++) {
if (geom[start + here].necessary) {
recursion_stack.push(prev);
recursion_stack.push(here);
prev = here;
if (prevent[P_SIMPLIFY_SHARED_NODES]) {
if (retain > 0) {
retain--;
}
}
}
}
// These segments are put on the stack from start to end,
// independent of winding, so note that anything that uses
// "retain" to force it to keep at least N points will
// keep a different set of points when wound one way than
// when wound the other way.
while (!recursion_stack.empty()) {
// pop next element
int second = recursion_stack.top();
recursion_stack.pop();
int first = recursion_stack.top();
recursion_stack.pop();
double max_distance = -1;
int farthest_element_index;
// find index idx of element with max_distance
int i;
if (geom[start + first] < geom[start + second]) {
farthest_element_index = first;
for (i = first + 1; i < second; i++) {
double temp_dist = distance_from_line(geom[start + i].x, geom[start + i].y, geom[start + first].x, geom[start + first].y, geom[start + second].x, geom[start + second].y);
double distance = std::fabs(temp_dist);
if ((distance > e || kept < retain) && (distance > max_distance || (distance == max_distance && geom[start + i] < geom[start + farthest_element_index]))) {
farthest_element_index = i;
max_distance = distance;
}
}
} else {
farthest_element_index = second;
for (i = second - 1; i > first; i--) {
double temp_dist = distance_from_line(geom[start + i].x, geom[start + i].y, geom[start + second].x, geom[start + second].y, geom[start + first].x, geom[start + first].y);
double distance = std::fabs(temp_dist);
if ((distance > e || kept < retain) && (distance > max_distance || (distance == max_distance && geom[start + i] < geom[start + farthest_element_index]))) {
farthest_element_index = i;
max_distance = distance;
}
}
}
if (max_distance >= 0) {
// mark idx as necessary
geom[start + farthest_element_index].necessary = 1;
kept++;
if (geom[start + first] < geom[start + second]) {
if (1 < farthest_element_index - first) {
recursion_stack.push(first);
recursion_stack.push(farthest_element_index);
}
if (1 < second - farthest_element_index) {
recursion_stack.push(farthest_element_index);
recursion_stack.push(second);
}
} else {
if (1 < second - farthest_element_index) {
recursion_stack.push(farthest_element_index);
recursion_stack.push(second);
}
if (1 < farthest_element_index - first) {
recursion_stack.push(first);
recursion_stack.push(farthest_element_index);
}
}
}
}
}
// 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.
@@ -458,7 +239,7 @@ drawvec impose_tile_boundaries(const drawvec &geom, long long extent) {
return out;
}
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 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, std::string const &shared_nodes_bloom) {
int res = 1 << (32 - detail - z);
long long area = 1LL << (32 - z);
@@ -495,12 +276,16 @@ drawvec simplify_lines(drawvec &geom, int z, int tx, int ty, int detail, bool ma
d.y += ty * (1LL << (32 - z));
}
// to quadkey
struct node n;
n.index = encode_quadkey((unsigned) d.x, (unsigned) d.y);
n.index = encode_vertex((unsigned) d.x, (unsigned) d.y);
size_t bloom_ix = n.index % (shared_nodes_bloom.size() * 8);
unsigned char bloom_mask = 1 << (bloom_ix & 7);
bloom_ix >>= 3;
if (bsearch(&n, shared_nodes_map, nodepos / sizeof(node), sizeof(node), nodecmp) != NULL) {
geom[i].necessary = true;
if (shared_nodes_bloom[bloom_ix] & bloom_mask) {
if (bsearch(&n, shared_nodes_map, nodepos / sizeof(node), sizeof(node), nodecmp) != NULL) {
geom[i].necessary = true;
}
}
}
}
@@ -533,7 +318,7 @@ drawvec simplify_lines(drawvec &geom, int z, int tx, int ty, int detail, bool ma
if (additional[A_VISVALINGAM]) {
visvalingam(geom, i, j, scale, retain);
} else {
douglas_peucker(geom, i, j - i, res * simplification, 2, retain);
douglas_peucker(geom, i, j - i, res * simplification, 2, retain, prevent[P_SIMPLIFY_SHARED_NODES]);
}
}
i = j - 1;
+7 -4
View File
@@ -74,13 +74,14 @@ 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(const drawvec &geom, int z, int detail, bool *still_needs_simplification, bool *reduced_away, double *accum_area);
drawvec reduce_tiny_poly(const drawvec &geom, int z, int detail, bool *still_needs_simplification, bool *reduced_away, double *accum_area, double tiny_polygon_size);
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(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);
void douglas_peucker(drawvec &geom, int start, int n, double e, size_t kept, size_t retain, bool prevent_simplify_shared_nodes);
drawvec simplify_lines(drawvec &geom, int z, int tx, int ty, int detail, bool mark_tile_bounds, double simplification, size_t retain, drawvec const &shared_nodes, struct node *shared_nodes_map, size_t nodepos, std::string const &shared_nodes_bloom);
drawvec reorder_lines(const drawvec &geom);
drawvec fix_polygon(const drawvec &geom);
std::vector<drawvec> chop_polygon(std::vector<drawvec> &geoms);
@@ -119,14 +120,16 @@ std::string overzoom(std::vector<source_tile> const &tiles, int nz, int nx, int
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::vector<std::string> const &unidecode_data, double simplification,
double tiny_polygon_size);
std::string overzoom(std::vector<input_tile> const &tiles, 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,
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::vector<std::string> const &unidecode_data, double simplification,
double tiny_polygon_size);
draw center_of_mass_mp(const drawvec &dv);
+20 -2
View File
@@ -2070,7 +2070,7 @@ std::pair<int, metadata> read_input(std::vector<source> &sources, char *fname, i
#endif
struct node n;
n.index = encode_quadkey((unsigned) x, (unsigned) y);
n.index = encode_vertex((unsigned) x, (unsigned) y);
fwrite_check((char *) &n, sizeof(struct node), 1, readers[0].nodefile, &readers[0].nodepos, "vertices");
}
@@ -2084,6 +2084,9 @@ std::pair<int, metadata> read_input(std::vector<source> &sources, char *fname, i
fprintf(stderr, "Merging nodes \r");
}
std::string shared_nodes_bloom;
shared_nodes_bloom.resize(34567891); // circa 34MB, size nowhere near a power of 2
// Sort nodes that can't be simplified away; scan the list to remove duplicates
FILE *shared_nodes;
@@ -2149,6 +2152,11 @@ std::pair<int, metadata> read_input(std::vector<source> &sources, char *fname, i
fwrite_check((void *) &here, sizeof(here), 1, shared_nodes, &nodepos, "shared nodes");
written = here;
size_t bloom_ix = here.index % (shared_nodes_bloom.size() * 8);
unsigned char bloom_mask = 1 << (bloom_ix & 7);
bloom_ix >>= 3;
shared_nodes_bloom[bloom_ix] |= bloom_mask;
#if 0
unsigned wx, wy;
decode_quadkey(here.index, &wx, &wy);
@@ -2219,6 +2227,8 @@ std::pair<int, metadata> read_input(std::vector<source> &sources, char *fname, i
std::atomic<long long> geompos(0);
/* initial tile is normally 0/0/0 but can be iz/ix/iy if limited to one tile */
long long estimated_complexity = 0; // to be replaced after writing the data
fwrite_check(&estimated_complexity, sizeof(estimated_complexity), 1, geomfile, &geompos, fname);
serialize_int(geomfile, iz, &geompos, fname);
serialize_uint(geomfile, ix, &geompos, fname);
serialize_uint(geomfile, iy, &geompos, fname);
@@ -2228,6 +2238,13 @@ std::pair<int, metadata> read_input(std::vector<source> &sources, char *fname, i
/* end of tile */
serialize_ulong_long(geomfile, 0, &geompos, fname); // EOF
estimated_complexity = geompos;
fflush(geomfile);
if (pwrite(fileno(geomfile), &estimated_complexity, sizeof(estimated_complexity), 0) != sizeof(estimated_complexity)) {
perror("pwrite estimated complexity");
exit(EXIT_WRITE);
}
if (fclose(geomfile) != 0) {
perror("fclose geom");
exit(EXIT_CLOSE);
@@ -2761,7 +2778,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, basezoom, droprate, unidecode_data);
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, shared_nodes_bloom, basezoom, droprate, unidecode_data);
if (maxzoom != written) {
if (written > minzoom) {
@@ -3050,6 +3067,7 @@ int main(int argc, char **argv) {
{"smallest-maximum-zoom-guess", required_argument, 0, '~'},
{"extend-zooms-if-still-dropping", no_argument, &additional[A_EXTEND_ZOOMS], 1},
{"extend-zooms-if-still-dropping-maximum", required_argument, 0, '~'},
{"generate-variable-depth-tile-pyramid", no_argument, &additional[A_VARIABLE_DEPTH_PYRAMID], 1},
{"one-tile", required_argument, 0, 'R'},
{"Tile resolution", 0, 0, 0},
+2
View File
@@ -416,6 +416,8 @@ specified maximum zoom and to any levels added beyond that.
\fB\fC\-\-extend\-zooms\-if\-still\-dropping\-maximum=\fR\fIcount\fP: Increase the maxzoom if features are still being dropped at that zoom level
by up to \fIcount\fP zoom levels.
.IP \(bu 2
\fB\fC\-at\fR or \fB\fC\-\-generate\-variable\-depth\-tile\-pyramid\fR: Don't produce child tiles for any tile that should be sufficient to be overzoomed to any higher zoom level. Such tiles will be produced with maximum detail and no simplification or polygon cleaning. Tiles with point features below the basezoom or where any features have to be dropped dynamically, or which contain too many features or bytes with full detail, will be written out with normal detail and split into child tiles. Tilesets generated with this option are suitable for use only with tile servers that will find the appropriate tile to overzoom from and will simplify and clean the geometries appropriately before serving the tile.
.IP \(bu 2
\fB\fC\-R\fR \fIzoom\fP\fB\fC/\fR\fIx\fP\fB\fC/\fR\fIy\fP or \fB\fC\-\-one\-tile=\fR\fIzoom\fP\fB\fC/\fR\fIx\fP\fB\fC/\fR\fIy\fP: Set the minzoom and maxzoom to \fIzoom\fP and produce only
the single specified tile at that zoom level.
.RE
+8
View File
@@ -444,6 +444,14 @@ std::string stringify_strategies(std::vector<strategy> const &strategies) {
any = true;
}
if (strategies[i].truncated_zooms > 0) {
state.nospace = true;
state.json_write_string("truncated_zooms");
state.nospace = true;
state.json_write_number(strategies[i].truncated_zooms);
any = true;
}
state.nospace = true;
state.json_end_hash();
}
+1
View File
@@ -26,6 +26,7 @@
#define A_HILBERT ((int) 'h')
#define A_VISVALINGAM ((int) 'v')
#define A_GENERATE_POLYGON_LABEL_POINTS ((int) 'P')
#define A_VARIABLE_DEPTH_PYRAMID ((int) 't')
#define P_SIMPLIFY ((int) 's')
#define P_SIMPLIFY_LOW ((int) 'S')
+13 -1
View File
@@ -35,6 +35,8 @@ int main(int argc, char **argv) {
int i;
const char *outtile = NULL;
const char *outfile = NULL;
double simplification = 0;
double tiny_polygon_size = 0;
std::vector<input_tile> sources;
@@ -48,6 +50,8 @@ int main(int argc, char **argv) {
{"preserve-input-order", no_argument, 0, 'o' & 0x1F},
{"accumulate-attribute", required_argument, 0, 'E'},
{"unidecode-data", required_argument, 0, 'u' & 0x1F},
{"line-simplification", required_argument, 0, 'S'},
{"tiny-polygon-size", required_argument, 0, 's' & 0x1F},
{"source-tile", required_argument, 0, 't'},
{0, 0, 0, 0},
@@ -107,6 +111,14 @@ int main(int argc, char **argv) {
outtile = optarg;
break;
case 's' & 0x1F:
tiny_polygon_size = atof(optarg);
break;
case 'S':
simplification = atof(optarg);
break;
default:
fprintf(stderr, "Unrecognized flag -%c\n", i);
usage(argv);
@@ -196,7 +208,7 @@ int main(int argc, char **argv) {
its.push_back(std::move(t));
}
std::string out = overzoom(its, nz, nx, ny, detail, buffer, keep, true, NULL, demultiply, json_filter, preserve_input_order, attribute_accum, unidecode_data);
std::string out = overzoom(its, nz, nx, ny, detail, buffer, keep, true, NULL, demultiply, json_filter, preserve_input_order, attribute_accum, unidecode_data, simplification, tiny_polygon_size);
FILE *f = fopen(outfile, "wb");
if (f == NULL) {
+4
View File
@@ -217,3 +217,7 @@ void set_projection_or_exit(const char *optarg) {
exit(EXIT_ARGS);
}
}
unsigned long long encode_vertex(unsigned int wx, unsigned int wy) {
return (((unsigned long long) wx) << 32) | wy;
}
+2
View File
@@ -26,4 +26,6 @@ void decode_quadkey(unsigned long long index, unsigned *wx, unsigned *wy);
unsigned long long encode_hilbert(unsigned int wx, unsigned int wy);
void decode_hilbert(unsigned long long index, unsigned *wx, unsigned *wy);
unsigned long long encode_vertex(unsigned int wx, unsigned int wy);
#endif
+3 -3
View File
@@ -131,12 +131,12 @@ void deserialize_ulong_long(const char **f, unsigned long long *zigzag) {
while (1) {
if ((**f & 0x80) == 0) {
*zigzag |= ((const unsigned long long) **f) << shift;
*zigzag |= ((unsigned long long) **f) << shift;
*f += 1;
shift += 7;
break;
} else {
*zigzag |= ((const unsigned long long) (**f & 0x7F)) << shift;
*zigzag |= ((unsigned long long) (**f & 0x7F)) << shift;
*f += 1;
shift += 7;
}
@@ -407,7 +407,7 @@ static void add_scaled_node(struct reader *r, serialization_state *sst, draw g)
long long y = SHIFT_LEFT(g.y);
struct node n;
n.index = encode_quadkey((unsigned) x, (unsigned) y);
n.index = encode_vertex((unsigned) x, (unsigned) y);
fwrite_check((char *) &n, sizeof(struct node), 1, r->nodefile, &r->nodepos, sst->fname);
}
+2 -2
View File
@@ -196,7 +196,7 @@ bool find_common_edges(std::vector<serial_feature> &features, int z, int line_de
}
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);
fprintf(stderr, "Internal error: polygon edge lookup failed for %lld,%lld to %lld,%lld or %lld,%lld to %lld,%lld\n", (long long) left[0].x, (long long) left[0].y, (long long) left[1].x, (long long) left[1].y, (long long) right[0].x, (long long) right[0].y, (long long) right[1].x, (long long) right[1].y);
exit(EXIT_IMPOSSIBLE);
}
@@ -357,7 +357,7 @@ bool find_common_edges(std::vector<serial_feature> &features, int z, int line_de
}
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);
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;
}
+1 -1
View File
@@ -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\":10887},{\"dropped_by_rate\":6391,\"detail_reduced\":3,\"tile_size_desired\":10721},{}]",
"strategies": "[{},{},{},{},{},{},{},{},{},{},{},{\"dropped_by_rate\":4080,\"detail_reduced\":4,\"tile_size_desired\":10887},{\"dropped_by_rate\":2974,\"detail_reduced\":3,\"tile_size_desired\":10721},{}]",
"type": "overlay",
"version": "2"
}, "features": [
+1 -1
View File
@@ -9,7 +9,7 @@
"maxzoom": "13",
"minzoom": "11",
"name": "tests/muni/out/-Z11_-z13_-M10000_-aG.json.check.mbtiles",
"strategies": "[{},{},{},{},{},{},{},{},{},{},{},{\"dropped_by_rate\":14925,\"dropped_by_gamma\":53,\"detail_reduced\":3,\"tile_size_desired\":10887},{\"dropped_by_rate\":6391,\"dropped_by_gamma\":190,\"detail_reduced\":3,\"tile_size_desired\":10721},{}]",
"strategies": "[{},{},{},{},{},{},{},{},{},{},{},{\"dropped_by_rate\":4080,\"dropped_by_gamma\":17,\"detail_reduced\":3,\"tile_size_desired\":10887},{\"dropped_by_rate\":2974,\"dropped_by_gamma\":85,\"detail_reduced\":3,\"tile_size_desired\":10721},{}]",
"type": "overlay",
"version": "2"
}, "features": [
+1 -1
View File
@@ -9,7 +9,7 @@
"maxzoom": "13",
"minzoom": "11",
"name": "tests/muni/out/-Z11_-z13_-M10000_-pd.json.check.mbtiles",
"strategies": "[{},{},{},{},{},{},{},{},{},{},{},{\"dropped_by_rate\":7695,\"dropped_as_needed\":212,\"tile_size_desired\":10887},{\"dropped_by_rate\":4113,\"dropped_as_needed\":225,\"tile_size_desired\":10721},{}]",
"strategies": "[{},{},{},{},{},{},{},{},{},{},{},{\"dropped_by_rate\":4080,\"dropped_as_needed\":212,\"tile_size_desired\":10887},{\"dropped_by_rate\":2974,\"dropped_as_needed\":225,\"tile_size_desired\":10721},{}]",
"type": "overlay",
"version": "2"
}, "features": [
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -9,7 +9,7 @@
"maxzoom": "5",
"minzoom": "0",
"name": "tests/ne_110m_admin_0_countries/out/-ae_-zg_-M5000_--force-feature-limit.json.check.mbtiles",
"strategies": "[{\"dropped_as_needed\":324,\"tile_size_desired\":39239},{\"dropped_as_needed\":160,\"tiny_polygons\":2,\"tile_size_desired\":25163},{\"dropped_as_needed\":124,\"tiny_polygons\":2,\"tile_size_desired\":21214},{\"dropped_as_needed\":80,\"tile_size_desired\":10758},{\"dropped_as_needed\":12,\"tile_size_desired\":6601},{\"tiny_polygons\":2}]",
"strategies": "[{\"dropped_as_needed\":165,\"tile_size_desired\":39239},{\"dropped_as_needed\":160,\"tiny_polygons\":1,\"tile_size_desired\":25163},{\"dropped_as_needed\":124,\"tiny_polygons\":1,\"tile_size_desired\":21214},{\"dropped_as_needed\":80,\"tile_size_desired\":10758},{\"dropped_as_needed\":12,\"tile_size_desired\":6601},{\"tiny_polygons\":2}]",
"tippecanoe_decisions": "{\"basezoom\":0,\"droprate\":2.5,\"retain_points_multiplier\":1}",
"type": "overlay",
"version": "2"
File diff suppressed because one or more lines are too long
@@ -9,7 +9,7 @@
"maxzoom": "5",
"minzoom": "0",
"name": "tests/ne_110m_admin_0_countries/out/-z5_-M5000_--coalesce-fraction-as-needed.json.check.mbtiles",
"strategies": "[{\"coalesced_as_needed\":528,\"detail_reduced\":2,\"tiny_polygons\":2,\"tile_size_desired\":39240},{\"coalesced_as_needed\":216,\"tile_size_desired\":25160},{\"coalesced_as_needed\":213,\"tile_size_desired\":21223},{\"coalesced_as_needed\":204,\"tile_size_desired\":10749},{\"coalesced_as_needed\":126,\"tile_size_desired\":6591},{\"tiny_polygons\":1}]",
"strategies": "[{\"coalesced_as_needed\":176,\"detail_reduced\":2,\"tiny_polygons\":1,\"tile_size_desired\":39240},{\"coalesced_as_needed\":216,\"tile_size_desired\":25160},{\"coalesced_as_needed\":213,\"tile_size_desired\":21223},{\"coalesced_as_needed\":204,\"tile_size_desired\":10749},{\"coalesced_as_needed\":126,\"tile_size_desired\":6591},{\"tiny_polygons\":1}]",
"type": "overlay",
"version": "2"
}, "features": [
@@ -9,7 +9,7 @@
"maxzoom": "5",
"minzoom": "0",
"name": "tests/ne_110m_admin_0_countries/out/-z5_-M5000_--coalesce-smallest-as-needed.json.check.mbtiles",
"strategies": "[{\"coalesced_as_needed\":7519,\"tiny_polygons\":2,\"tile_size_desired\":39240},{\"coalesced_as_needed\":442,\"tile_size_desired\":25160},{\"coalesced_as_needed\":214,\"tiny_polygons\":1,\"tile_size_desired\":21223},{\"coalesced_as_needed\":179,\"tile_size_desired\":10749},{\"coalesced_as_needed\":73,\"tile_size_desired\":6591},{\"tiny_polygons\":1}]",
"strategies": "[{\"coalesced_as_needed\":175,\"tiny_polygons\":1,\"tile_size_desired\":39240},{\"coalesced_as_needed\":212,\"tile_size_desired\":25160},{\"coalesced_as_needed\":214,\"tiny_polygons\":1,\"tile_size_desired\":21223},{\"coalesced_as_needed\":179,\"tile_size_desired\":10749},{\"coalesced_as_needed\":73,\"tile_size_desired\":6591},{\"tiny_polygons\":1}]",
"type": "overlay",
"version": "2"
}, "features": [
@@ -9,7 +9,7 @@
"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\":220,\"tile_size_desired\":75535},{\"dropped_as_needed\":226,\"tile_size_desired\":44899},{\"dropped_as_needed\":179,\"tile_size_desired\":35505}]",
"strategies": "[{\"dropped_as_needed\":223,\"tile_size_desired\":75535},{\"dropped_as_needed\":230,\"tile_size_desired\":44899},{\"dropped_as_needed\":195,\"tile_size_desired\":35505}]",
"tippecanoe_decisions": "{\"basezoom\":0,\"droprate\":2.5,\"retain_points_multiplier\":1}",
"type": "overlay",
"version": "2"
@@ -18,8 +18,6 @@
{ "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": 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": 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": 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 ] } }
@@ -30,8 +28,6 @@
,
{ "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": 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.960938, 60.196156 ] } }
,
{ "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.076172, 36.738884 ] } }
,
{ "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": "Point", "coordinates": [ 23.730469, 37.996163 ] } }
@@ -59,8 +55,6 @@
{ "type": "Feature", "properties": { "SCALERANK": 0, "NATSCALE": 600, "LABELRANK": 1, "FEATURECLA": "Admin-0 capital", "NAME": "Jakarta", "DIFFASCII": 0, "NAMEASCII": "Jakarta", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "Indonesia", "SOV_A3": "IDN", "ADM0NAME": "Indonesia", "ADM0_A3": "IDN", "ADM1NAME": "Jakarta Raya", "ISO_A2": "ID", "LATITUDE": -6.174418, "LONGITUDE": 106.829438, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 9125000, "POP_MIN": 8540121, "POP_OTHER": 9129613, "RANK_MAX": 13, "RANK_MIN": 13, "GEONAMEID": 1642911, "MEGANAME": "Jakarta", "LS_NAME": "Jakarta", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 9664972, "MAX_POP20": 15074060, "MAX_POP50": 22017580, "MAX_POP300": 22031364, "MAX_POP310": 44354170, "MAX_NATSCA": 300, "MIN_AREAKM": 1303, "MAX_AREAKM": 19435, "MIN_AREAMI": 503, "MAX_AREAMI": 7504, "MIN_PERKM": 318, "MAX_PERKM": 10224, "MIN_PERMI": 197, "MAX_PERMI": 6353, "MIN_BBXMIN": 105.891667, "MAX_BBXMIN": 106.473854, "MIN_BBXMAX": 106.932506, "MAX_BBXMAX": 109.808333, "MIN_BBYMIN": -7.716667, "MAX_BBYMIN": -6.383127, "MIN_BBYMAX": -6.016667, "MAX_BBYMAX": -5.875, "MEAN_BBXC": 106.989399, "MEAN_BBYC": -6.313824, "COMPARE": 0, "GN_ASCII": "Jakarta", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 4, "GN_POP": 8540121, "ELEVATION": 0, "GTOPO30": 2, "TIMEZONE": "Asia/Jakarta", "GEONAMESNO": "GeoNames match general.", "UN_FID": 280, "UN_ADM0": "Indonesia", "UN_LAT": -6.16, "UN_LONG": 106.8, "POP1950": 1452, "POP1955": 1972, "POP1960": 2679, "POP1965": 3297, "POP1970": 3915, "POP1975": 4813, "POP1980": 5984, "POP1985": 7009, "POP1990": 8175, "POP1995": 8322, "POP2000": 8390, "POP2005": 8843, "POP2010": 9125, "POP2015": 9703, "POP2020": 10792, "POP2025": 11689, "POP2050": 12363 }, "geometry": { "type": "Point", "coordinates": [ 106.787109, -6.140555 ] } }
,
{ "type": "Feature", "properties": { "SCALERANK": 1, "NATSCALE": 300, "LABELRANK": 3, "FEATURECLA": "Admin-1 capital", "NAME": "Melbourne", "DIFFASCII": 0, "NAMEASCII": "Melbourne", "ADM0CAP": 0, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "Australia", "SOV_A3": "AUS", "ADM0NAME": "Australia", "ADM0_A3": "AUS", "ADM1NAME": "Victoria", "ISO_A2": "AU", "LATITUDE": -37.820031, "LONGITUDE": 144.975016, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Changed feature class. Changed scale rank.", "POP_MAX": 4170000, "POP_MIN": 93625, "POP_OTHER": 1805353, "RANK_MAX": 12, "RANK_MIN": 8, "GEONAMEID": 2158177, "MEGANAME": "Melbourne", "LS_NAME": "Melbourne2", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1904377, "MAX_POP20": 2545035, "MAX_POP50": 2564188, "MAX_POP300": 2564188, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 1010, "MAX_AREAKM": 1554, "MIN_AREAMI": 390, "MAX_AREAMI": 600, "MIN_PERKM": 360, "MAX_PERKM": 843, "MIN_PERMI": 224, "MAX_PERMI": 524, "MIN_BBXMIN": 144.608333, "MAX_BBXMIN": 144.728637, "MIN_BBXMAX": 145.327432, "MAX_BBXMAX": 145.4, "MIN_BBYMIN": -38.208333, "MAX_BBYMIN": -38.0105, "MIN_BBYMAX": -37.589905, "MAX_BBYMAX": -37.566667, "MEAN_BBXC": 145.053821, "MEAN_BBYC": -37.835257, "COMPARE": 0, "ADMIN1_COD": 0, "GN_POP": 3730206, "ELEVATION": 0, "GTOPO30": 0, "GEONAMESNO": "GeoNames rough area, rough name, requires further research.", "UN_FID": 274, "UN_ADM0": "Australia", "UN_LAT": -37.85, "UN_LONG": 145.07, "POP1950": 1332, "POP1955": 1574, "POP1960": 1851, "POP1965": 2068, "POP1970": 2334, "POP1975": 2561, "POP1980": 2765, "POP1985": 2935, "POP1990": 3117, "POP1995": 3257, "POP2000": 3433, "POP2005": 3641, "POP2010": 3728, "POP2015": 3851, "POP2020": 4013, "POP2025": 4137, "POP2050": 4238 }, "geometry": { "type": "Point", "coordinates": [ 144.931641, -37.788081 ] } }
,
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital", "NAME": "Honiara", "DIFFASCII": 0, "NAMEASCII": "Honiara", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Solomon Islands", "SOV_A3": "SLB", "ADM0NAME": "Solomon Islands", "ADM0_A3": "SLB", "ADM1NAME": "Guadalcanal", "ISO_A2": "SB", "LATITUDE": -9.437994, "LONGITUDE": 159.949766, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 76328, "POP_MIN": 56298, "POP_OTHER": 76328, "RANK_MAX": 8, "RANK_MIN": 8, "GEONAMEID": 2108502, "LS_NAME": "Honiara", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 76328, "MAX_POP20": 76328, "MAX_POP50": 76328, "MAX_POP300": 76328, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 18, "MAX_AREAKM": 18, "MIN_AREAMI": 7, "MAX_AREAMI": 7, "MIN_PERKM": 33, "MAX_PERKM": 33, "MIN_PERMI": 21, "MAX_PERMI": 21, "MIN_BBXMIN": 159.916667, "MAX_BBXMIN": 159.916667, "MIN_BBXMAX": 160.016667, "MAX_BBXMAX": 160.016667, "MIN_BBYMIN": -9.441667, "MAX_BBYMIN": -9.441667, "MIN_BBYMAX": -9.408333, "MAX_BBYMAX": -9.408333, "MEAN_BBXC": 159.966865, "MEAN_BBYC": -9.42996, "COMPARE": 0, "GN_ASCII": "Honiara", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 0, "GN_POP": 56298, "ELEVATION": 0, "GTOPO30": 12, "TIMEZONE": "Pacific/Guadalcanal", "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": [ 159.960938, -9.449062 ] } }
] }
] }
,
@@ -78,8 +72,6 @@
,
{ "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.758789, 41.836828 ] } }
,
{ "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": "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 ] } }
,
{ "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 ] } }
@@ -126,10 +118,6 @@
,
{ "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.766602, 59.910976 ] } }
,
{ "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": 8, "FEATURECLA": "Admin-0 capital", "NAME": "København", "NAMEPAR": "Copenhagen", "DIFFASCII": 1, "NAMEASCII": "Kobenhavn", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "Denmark", "SOV_A3": "DNK", "ADM0NAME": "Denmark", "ADM0_A3": "DNK", "ADM1NAME": "Hovedstaden", "ISO_A2": "DK", "LATITUDE": 55.678564, "LONGITUDE": 12.563486, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 1085000, "POP_MIN": 1085000, "POP_OTHER": 1038288, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 2618425, "MEGANAME": "København", "LS_NAME": "Copenhagen", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1124323, "MAX_POP20": 1230007, "MAX_POP50": 1256924, "MAX_POP300": 1256924, "MAX_POP310": 1256924, "MAX_NATSCA": 300, "MIN_AREAKM": 438, "MAX_AREAKM": 577, "MIN_AREAMI": 169, "MAX_AREAMI": 223, "MIN_PERKM": 348, "MAX_PERKM": 542, "MIN_PERMI": 216, "MAX_PERMI": 337, "MIN_BBXMIN": 12.116667, "MAX_BBXMIN": 12.316667, "MIN_BBXMAX": 12.658333, "MAX_BBXMAX": 12.658333, "MIN_BBYMIN": 55.4, "MAX_BBYMIN": 55.583333, "MIN_BBYMAX": 55.927962, "MAX_BBYMAX": 56.008333, "MEAN_BBXC": 12.437175, "MEAN_BBYC": 55.716213, "COMPARE": 0, "GN_ASCII": "Copenhagen", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 17, "GN_POP": 1153615, "ELEVATION": 0, "GTOPO30": 4, "TIMEZONE": "Europe/Copenhagen", "GEONAMESNO": "GeoNames match general.", "UN_FID": 175, "UN_ADM0": "Denmark", "UN_LAT": 55.71, "UN_LONG": 12.54, "POP1950": 1216, "POP1955": 1227, "POP1960": 1284, "POP1965": 1373, "POP1970": 1380, "POP1975": 1172, "POP1980": 1096, "POP1985": 1056, "POP1990": 1035, "POP1995": 1048, "POP2000": 1077, "POP2005": 1085, "POP2010": 1085, "POP2015": 1087, "POP2020": 1092, "POP2025": 1095, "POP2050": 1096, "CITYALT": "Copenhagen" }, "geometry": { "type": "Point", "coordinates": [ 12.568359, 55.677584 ] } }
,
{ "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.916992, 60.174306 ] } }
,
{ "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 ] } }
@@ -160,8 +148,6 @@
,
{ "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.585938, 16.425548 ] } }
,
{ "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.493196 ] } }
,
{ "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.159180, 6.926427 ] } }
@@ -173,8 +159,6 @@
{ "type": "FeatureCollection", "properties": { "zoom": 2, "x": 0, "y": 2 }, "features": [
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 0, "FEATURECLA": "Admin-0 capital", "NAME": "Nukualofa", "DIFFASCII": 0, "NAMEASCII": "Nukualofa", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Tonga", "SOV_A3": "TON", "ADM0NAME": "Tonga", "ADM0_A3": "TON", "ISO_A2": "TO", "LATITUDE": -21.138512, "LONGITUDE": -175.220564, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Location adjusted.", "POP_MAX": 42620, "POP_MIN": 23658, "POP_OTHER": 42620, "RANK_MAX": 7, "RANK_MIN": 7, "GEONAMEID": 4032402, "LS_NAME": "Nukualofa", "LS_MATCH": 1, "CHECKME": 5, "MAX_POP10": 42620, "MAX_POP20": 42620, "MAX_POP50": 42620, "MAX_POP300": 42620, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 15, "MAX_AREAKM": 15, "MIN_AREAMI": 6, "MAX_AREAMI": 6, "MIN_PERKM": 27, "MAX_PERKM": 27, "MIN_PERMI": 17, "MAX_PERMI": 17, "MIN_BBXMIN": -175.233333, "MAX_BBXMIN": -175.233333, "MIN_BBXMAX": -175.166667, "MAX_BBXMAX": -175.166667, "MIN_BBYMIN": -21.166667, "MAX_BBYMIN": -21.166667, "MIN_BBYMAX": -21.125, "MAX_BBYMAX": -21.125, "MEAN_BBXC": -175.206798, "MEAN_BBYC": -21.142325, "COMPARE": 0, "GN_ASCII": "Nuku`alofa", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 2, "GN_POP": 22400, "ELEVATION": 0, "GTOPO30": -9999, "TIMEZONE": "Pacific/Tongatapu", "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": [ -175.209961, -21.145992 ] } }
,
{ "type": "Feature", "properties": { "SCALERANK": 6, "NATSCALE": 30, "LABELRANK": 0, "FEATURECLA": "Admin-0 capital", "NAME": "Funafuti", "DIFFASCII": 0, "NAMEASCII": "Funafuti", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Tuvalu", "SOV_A3": "TUV", "ADM0NAME": "Tuvalu", "ADM0_A3": "TUV", "ISO_A2": "TV", "LATITUDE": -8.516652, "LONGITUDE": 179.216647, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Population from GeoNames. Changed scale rank.", "POP_MAX": 4749, "POP_MIN": 4749, "POP_OTHER": 0, "RANK_MAX": 4, "RANK_MIN": 4, "GEONAMEID": 2110394, "LS_NAME": "Funafuti", "LS_MATCH": 0, "CHECKME": 5, "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": 0, "GN_ASCII": "Funafuti", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 0, "GN_POP": 4749, "ELEVATION": 0, "GTOPO30": -9999, "TIMEZONE": "Pacific/Funafuti", "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": [ -180.791016, -8.515836 ] } }
] }
] }
,
@@ -184,11 +168,7 @@
,
{ "type": "Feature", "properties": { "SCALERANK": 1, "NATSCALE": 300, "LABELRANK": 1, "FEATURECLA": "Populated place", "NAME": "San Francisco", "NAMEALT": "San Francisco-Oakland", "DIFFASCII": 0, "NAMEASCII": "San Francisco", "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": 37.740008, "LONGITUDE": -122.459978, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 3450000, "POP_MIN": 732072, "POP_OTHER": 27400, "RANK_MAX": 12, "RANK_MIN": 11, "GEONAMEID": 5391959, "MEGANAME": "San Francisco-Oakland", "LS_NAME": "San Francisco1", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 988636, "MAX_POP20": 1130999, "MAX_POP50": 1371285, "MAX_POP300": 4561697, "MAX_POP310": 4561697, "MAX_NATSCA": 300, "MIN_AREAKM": 218, "MAX_AREAKM": 1748, "MIN_AREAMI": 84, "MAX_AREAMI": 675, "MIN_PERKM": 126, "MAX_PERKM": 755, "MIN_PERMI": 78, "MAX_PERMI": 469, "MIN_BBXMIN": -122.516667, "MAX_BBXMIN": -122.516667, "MIN_BBXMAX": -122.358333, "MAX_BBXMAX": -121.733333, "MIN_BBYMIN": 37.191667, "MAX_BBYMIN": 37.575, "MIN_BBYMAX": 37.816667, "MAX_BBYMAX": 38.041667, "MEAN_BBXC": -122.301354, "MEAN_BBYC": 37.622288, "COMPARE": 0, "GN_ASCII": "San Francisco", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 0, "GN_POP": 732072, "ELEVATION": 16, "GTOPO30": 60, "TIMEZONE": "America/Los_Angeles", "GEONAMESNO": "GeoNames match with ascii name + lat + long whole numbers.", "UN_FID": 570, "UN_ADM0": "United States of America", "UN_LAT": 37.79, "UN_LONG": -122.38, "POP1950": 1855, "POP1955": 2021, "POP1960": 2200, "POP1965": 2361, "POP1970": 2529, "POP1975": 2590, "POP1980": 2656, "POP1985": 2805, "POP1990": 2961, "POP1995": 3095, "POP2000": 3236, "POP2005": 3387, "POP2010": 3450, "POP2015": 3544, "POP2020": 3684, "POP2025": 3803, "POP2050": 3898, "CITYALT": "San Francisco" }, "geometry": { "type": "Point", "coordinates": [ -122.409668, 37.770715 ] } }
,
{ "type": "Feature", "properties": { "SCALERANK": 1, "NATSCALE": 300, "LABELRANK": 1, "FEATURECLA": "Admin-1 capital", "NAME": "Denver", "NAMEALT": "Denver-Aurora", "DIFFASCII": 0, "NAMEASCII": "Denver", "ADM0CAP": 0, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "United States", "SOV_A3": "USA", "ADM0NAME": "United States of America", "ADM0_A3": "USA", "ADM1NAME": "Colorado", "ISO_A2": "US", "LATITUDE": 39.739188, "LONGITUDE": -104.984016, "CHANGED": 5, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 2313000, "POP_MIN": 1548599, "POP_OTHER": 1521278, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 5419384, "MEGANAME": "Denver-Aurora", "LS_NAME": "Denver", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1548599, "MAX_POP20": 2100407, "MAX_POP50": 2174327, "MAX_POP300": 2174327, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 909, "MAX_AREAKM": 1345, "MIN_AREAMI": 351, "MAX_AREAMI": 519, "MIN_PERKM": 371, "MAX_PERKM": 606, "MIN_PERMI": 231, "MAX_PERMI": 376, "MIN_BBXMIN": -105.241667, "MAX_BBXMIN": -105.241667, "MIN_BBXMAX": -104.866667, "MAX_BBXMAX": -104.708333, "MIN_BBYMIN": 39.5, "MAX_BBYMIN": 39.5, "MIN_BBYMAX": 39.958333, "MAX_BBYMAX": 40.025, "MEAN_BBXC": -104.993967, "MEAN_BBYC": 39.72985, "COMPARE": 0, "GN_ASCII": "Denver", "ADMIN1_COD": 0, "GN_POP": 0, "ELEVATION": 0, "GTOPO30": 0, "GEONAMESNO": "GeoNames match general + researched.", "UN_FID": 537, "UN_ADM0": "United States of America", "UN_LAT": 39.57, "UN_LONG": -105.07, "POP1950": 505, "POP1955": 641, "POP1960": 809, "POP1965": 923, "POP1970": 1054, "POP1975": 1198, "POP1980": 1356, "POP1985": 1437, "POP1990": 1528, "POP1995": 1747, "POP2000": 1998, "POP2005": 2241, "POP2010": 2313, "POP2015": 2396, "POP2020": 2502, "POP2025": 2590, "POP2050": 2661, "CITYALT": "Denver" }, "geometry": { "type": "Point", "coordinates": [ -104.985352, 39.740986 ] } }
,
{ "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.327148, 25.681137 ] } }
,
{ "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": "Point", "coordinates": [ -88.769531, 17.245744 ] } }
] }
] }
,
@@ -202,8 +182,6 @@
,
{ "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": 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": "Point", "coordinates": [ -57.634277, -25.304304 ] } }
,
{ "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": 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.849875 ] } }
@@ -224,10 +202,6 @@
,
{ "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": "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": "Point", "coordinates": [ -88.769531, 17.245744 ] } }
,
{ "type": "Feature", "properties": { "SCALERANK": 0, "NATSCALE": 600, "LABELRANK": 5, "FEATURECLA": "Admin-0 capital", "NAME": "Bogota", "NAMEALT": "Bogotá", "DIFFASCII": 0, "NAMEASCII": "Bogota", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "Colombia", "SOV_A3": "COL", "ADM0NAME": "Colombia", "ADM0_A3": "COL", "ADM1NAME": "Bogota", "ISO_A2": "CO", "LATITUDE": 4.596424, "LONGITUDE": -74.083344, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 7772000, "POP_MIN": 6333661, "POP_OTHER": 5754084, "RANK_MAX": 13, "RANK_MIN": 13, "GEONAMEID": 3688689, "MEGANAME": "Bogotá", "LS_NAME": "Bogota", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 6333661, "MAX_POP20": 6333154, "MAX_POP50": 6333154, "MAX_POP300": 6333154, "MAX_POP310": 6333154, "MAX_NATSCA": 300, "MIN_AREAKM": 523, "MAX_AREAKM": 523, "MIN_AREAMI": 202, "MAX_AREAMI": 202, "MIN_PERKM": 186, "MAX_PERKM": 186, "MIN_PERMI": 116, "MAX_PERMI": 116, "MIN_BBXMIN": -74.266667, "MAX_BBXMIN": -74.266667, "MIN_BBXMAX": -74.008333, "MAX_BBXMAX": -74.008333, "MIN_BBYMIN": 4.483333, "MAX_BBYMIN": 4.483333, "MIN_BBYMAX": 4.8, "MAX_BBYMAX": 4.8, "MEAN_BBXC": -74.116517, "MEAN_BBYC": 4.643227, "COMPARE": 0, "GN_ASCII": "Bogota", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 34, "GN_POP": 7102602, "ELEVATION": 0, "GTOPO30": 2620, "TIMEZONE": "America/Bogota", "GEONAMESNO": "GeoNames match general.", "UN_FID": 161, "UN_ADM0": "Colombia", "UN_LAT": 4.63, "UN_LONG": -74.08, "POP1950": 630, "POP1955": 894, "POP1960": 1269, "POP1965": 1780, "POP1970": 2383, "POP1975": 3040, "POP1980": 3525, "POP1985": 4087, "POP1990": 4740, "POP1995": 5494, "POP2000": 6356, "POP2005": 7353, "POP2010": 7772, "POP2015": 8320, "POP2020": 8916, "POP2025": 9299, "POP2050": 9600, "CITYALT": "Bogota" }, "geometry": { "type": "Point", "coordinates": [ -74.091797, 4.609278 ] } }
,
{ "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.950684, 64.148952 ] } }
@@ -238,12 +212,8 @@
,
{ "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.205566, 27.156920 ] } }
,
{ "type": "Feature", "properties": { "SCALERANK": 2, "NATSCALE": 200, "LABELRANK": 6, "FEATURECLA": "Admin-0 capital", "NAME": "Lisbon", "NAMEPAR": "Lisboa", "DIFFASCII": 0, "NAMEASCII": "Lisbon", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "Portugal", "SOV_A3": "PRT", "ADM0NAME": "Portugal", "ADM0_A3": "PRT", "ADM1NAME": "Lisboa", "ISO_A2": "PT", "LATITUDE": 38.722723, "LONGITUDE": -9.144866, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Location adjusted. Changed scale rank.", "POP_MAX": 2812000, "POP_MIN": 517802, "POP_OTHER": 1795582, "RANK_MAX": 12, "RANK_MIN": 11, "GEONAMEID": 2267057, "MEGANAME": "Lisboa", "LS_NAME": "Lisbon", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1832316, "MAX_POP20": 1831921, "MAX_POP50": 1831921, "MAX_POP300": 1831921, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 506, "MAX_AREAKM": 508, "MIN_AREAMI": 196, "MAX_AREAMI": 196, "MIN_PERKM": 355, "MAX_PERKM": 360, "MIN_PERMI": 221, "MAX_PERMI": 224, "MIN_BBXMIN": -9.466667, "MAX_BBXMIN": -9.466667, "MIN_BBXMAX": -8.958333, "MAX_BBXMAX": -8.958333, "MIN_BBYMIN": 38.675, "MAX_BBYMIN": 38.675, "MIN_BBYMAX": 39.008333, "MAX_BBYMAX": 39.008333, "MEAN_BBXC": -9.232769, "MEAN_BBYC": 38.783256, "COMPARE": 0, "GN_ASCII": "Lisbon", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 14, "GN_POP": 517802, "ELEVATION": 0, "GTOPO30": 56, "TIMEZONE": "Europe/Lisbon", "GEONAMESNO": "GeoNames match general.", "UN_FID": 419, "UN_ADM0": "Portugal", "UN_LAT": 38.72, "UN_LONG": -9.12, "POP1950": 1304, "POP1955": 1405, "POP1960": 1514, "POP1965": 1657, "POP1970": 1817, "POP1975": 2103, "POP1980": 2449, "POP1985": 2518, "POP1990": 2537, "POP1995": 2600, "POP2000": 2672, "POP2005": 2762, "POP2010": 2812, "POP2015": 2890, "POP2020": 2996, "POP2025": 3058, "POP2050": 3086, "CITYALT": "Lisbon" }, "geometry": { "type": "Point", "coordinates": [ -9.140625, 38.719805 ] } }
,
{ "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.645996, 26.115986 ] } }
,
{ "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": 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 ] } }
] }
] }
@@ -254,8 +224,6 @@
,
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 7, "FEATURECLA": "Admin-0 capital", "NAME": "Brazzaville", "DIFFASCII": 0, "NAMEASCII": "Brazzaville", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Congo (Brazzaville)", "SOV_A3": "COG", "ADM0NAME": "Congo (Brazzaville)", "ADM0_A3": "COG", "ADM1NAME": "Pool", "ISO_A2": "CG", "LATITUDE": -4.259186, "LONGITUDE": 15.284689, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 1355000, "POP_MIN": 1163890, "POP_OTHER": 1174778, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 2260535, "MEGANAME": "Brazzaville", "LS_NAME": "Brazzaville", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1163890, "MAX_POP20": 1163890, "MAX_POP50": 1163890, "MAX_POP300": 1163890, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 148, "MAX_AREAKM": 148, "MIN_AREAMI": 57, "MAX_AREAMI": 57, "MIN_PERKM": 105, "MAX_PERKM": 105, "MIN_PERMI": 65, "MAX_PERMI": 65, "MIN_BBXMIN": 15.15, "MAX_BBXMIN": 15.15, "MIN_BBXMAX": 15.308333, "MAX_BBXMAX": 15.308333, "MIN_BBYMIN": -4.333333, "MAX_BBYMIN": -4.333333, "MIN_BBYMAX": -4.15, "MAX_BBYMAX": -4.15, "MEAN_BBXC": 15.24454, "MEAN_BBYC": -4.251293, "COMPARE": 0, "GN_ASCII": "Brazzaville", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 12, "GN_POP": 1284609, "ELEVATION": 0, "GTOPO30": 156, "TIMEZONE": "Africa/Brazzaville", "GEONAMESNO": "GeoNames match general.", "UN_FID": 166, "UN_ADM0": "Congo", "UN_LAT": -4.28, "UN_LONG": 15.28, "POP1950": 83, "POP1955": 92, "POP1960": 124, "POP1965": 172, "POP1970": 238, "POP1975": 329, "POP1980": 446, "POP1985": 596, "POP1990": 704, "POP1995": 830, "POP2000": 986, "POP2005": 1216, "POP2010": 1355, "POP2015": 1505, "POP2020": 1729, "POP2025": 1938, "POP2050": 2150 }, "geometry": { "type": "Point", "coordinates": [ 15.292969, -4.258768 ] } }
,
{ "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": 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.804199, -1.274309 ] } }
@@ -280,8 +248,6 @@
,
{ "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": 7, "FEATURECLA": "Admin-0 capital", "NAME": "Sofia", "DIFFASCII": 0, "NAMEASCII": "Sofia", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Bulgaria", "SOV_A3": "BGR", "ADM0NAME": "Bulgaria", "ADM0_A3": "BGR", "ADM1NAME": "Grad Sofiya", "ISO_A2": "BG", "LATITUDE": 42.683349, "LONGITUDE": 23.316654, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 1185000, "POP_MIN": 874827, "POP_OTHER": 871735, "RANK_MAX": 12, "RANK_MIN": 11, "GEONAMEID": 727011, "MEGANAME": "Sofia", "LS_NAME": "Sofia", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 874827, "MAX_POP20": 874827, "MAX_POP50": 874827, "MAX_POP300": 874827, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 217, "MAX_AREAKM": 217, "MIN_AREAMI": 84, "MAX_AREAMI": 84, "MIN_PERKM": 174, "MAX_PERKM": 174, "MIN_PERMI": 108, "MAX_PERMI": 108, "MIN_BBXMIN": 23.208333, "MAX_BBXMIN": 23.208333, "MIN_BBXMAX": 23.45, "MAX_BBXMAX": 23.45, "MIN_BBYMIN": 42.575, "MAX_BBYMIN": 42.575, "MIN_BBYMAX": 42.8, "MAX_BBYMAX": 42.8, "MEAN_BBXC": 23.328319, "MEAN_BBYC": 42.68234, "COMPARE": 0, "GN_ASCII": "Sofia", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 42, "GN_POP": 1152556, "ELEVATION": 0, "GTOPO30": 558, "TIMEZONE": "Europe/Sofia", "GEONAMESNO": "GeoNames match general.", "UN_FID": 0, "UN_ADM0": "Bulgaria", "UN_LAT": 42.7, "UN_LONG": 23.33, "POP1950": 522, "POP1955": 616, "POP1960": 708, "POP1965": 806, "POP1970": 888, "POP1975": 977, "POP1980": 1074, "POP1985": 1181, "POP1990": 1191, "POP1995": 1168, "POP2000": 1128, "POP2005": 1166, "POP2010": 1185, "POP2015": 1212, "POP2020": 1233, "POP2025": 1236, "POP2050": 1236 }, "geometry": { "type": "Point", "coordinates": [ 23.312988, 42.682435 ] } }
,
{ "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": 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 ] } }
@@ -290,8 +256,6 @@
,
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 6, "FEATURECLA": "Admin-0 capital", "NAME": "Niamey", "DIFFASCII": 0, "NAMEASCII": "Niamey", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Niger", "SOV_A3": "NER", "ADM0NAME": "Niger", "ADM0_A3": "NER", "ADM1NAME": "Niamey", "ISO_A2": "NE", "LATITUDE": 13.516706, "LONGITUDE": 2.116656, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 915000, "POP_MIN": 742791, "POP_OTHER": 715325, "RANK_MAX": 11, "RANK_MIN": 11, "GEONAMEID": 2440485, "MEGANAME": "Niamey", "LS_NAME": "Niamey", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 742791, "MAX_POP20": 742791, "MAX_POP50": 742791, "MAX_POP300": 742791, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 122, "MAX_AREAKM": 122, "MIN_AREAMI": 47, "MAX_AREAMI": 47, "MIN_PERKM": 102, "MAX_PERKM": 102, "MIN_PERMI": 64, "MAX_PERMI": 64, "MIN_BBXMIN": 2.033333, "MAX_BBXMIN": 2.033333, "MIN_BBXMAX": 2.216667, "MAX_BBXMAX": 2.216667, "MIN_BBYMIN": 13.466667, "MAX_BBYMIN": 13.466667, "MIN_BBYMAX": 13.6, "MAX_BBYMAX": 13.6, "MEAN_BBXC": 2.125595, "MEAN_BBYC": 13.522591, "COMPARE": 0, "GN_ASCII": "Niamey", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 8, "GN_POP": 774235, "ELEVATION": 0, "GTOPO30": 203, "TIMEZONE": "Africa/Niamey", "GEONAMESNO": "GeoNames match general.", "UN_FID": 385, "UN_ADM0": "Niger", "UN_LAT": 13.51, "UN_LONG": 2.12, "POP1950": 24, "POP1955": 37, "POP1960": 58, "POP1965": 85, "POP1970": 129, "POP1975": 198, "POP1980": 274, "POP1985": 344, "POP1990": 432, "POP1995": 542, "POP2000": 680, "POP2005": 846, "POP2010": 915, "POP2015": 1027, "POP2020": 1258, "POP2025": 1580, "POP2050": 2028 }, "geometry": { "type": "Point", "coordinates": [ 2.109375, 13.517838 ] } }
,
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 7, "FEATURECLA": "Admin-0 capital", "NAME": "Ndjamena", "NAMEALT": "N'Djaména", "DIFFASCII": 0, "NAMEASCII": "Ndjamena", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Chad", "SOV_A3": "TCD", "ADM0NAME": "Chad", "ADM0_A3": "TCD", "ADM1NAME": "Hadjer-Lamis", "ISO_A2": "TD", "LATITUDE": 12.113097, "LONGITUDE": 15.049148, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 989000, "POP_MIN": 681387, "POP_OTHER": 686347, "RANK_MAX": 11, "RANK_MIN": 11, "GEONAMEID": 2427123, "MEGANAME": "N'Djaména", "LS_NAME": "Ndjamena", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 681387, "MAX_POP20": 681387, "MAX_POP50": 681387, "MAX_POP300": 681387, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 79, "MAX_AREAKM": 79, "MIN_AREAMI": 30, "MAX_AREAMI": 30, "MIN_PERKM": 66, "MAX_PERKM": 66, "MIN_PERMI": 41, "MAX_PERMI": 41, "MIN_BBXMIN": 15.025, "MAX_BBXMIN": 15.025, "MIN_BBXMAX": 15.133333, "MAX_BBXMAX": 15.133333, "MIN_BBYMIN": 12.066667, "MAX_BBYMIN": 12.066667, "MIN_BBYMAX": 12.183333, "MAX_BBYMAX": 12.183333, "MEAN_BBXC": 15.079167, "MEAN_BBYC": 12.120479, "COMPARE": 0, "GN_ASCII": "N'Djamena", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 4, "GN_POP": 721081, "ELEVATION": 0, "GTOPO30": 290, "TIMEZONE": "Africa/Ndjamena", "GEONAMESNO": "GeoNames match general.", "UN_FID": 16, "UN_ADM0": "Chad", "UN_LAT": 12.1, "UN_LONG": 15.24, "POP1950": 22, "POP1955": 40, "POP1960": 71, "POP1965": 109, "POP1970": 155, "POP1975": 231, "POP1980": 324, "POP1985": 393, "POP1990": 477, "POP1995": 579, "POP2000": 711, "POP2005": 902, "POP2010": 989, "POP2015": 1127, "POP2020": 1405, "POP2025": 1753, "POP2050": 2172, "CITYALT": "Ndjamena" }, "geometry": { "type": "Point", "coordinates": [ 15.051270, 12.125264 ] } }
,
{ "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": "Point", "coordinates": [ 23.730469, 37.978845 ] } }
,
{ "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 ] } }
@@ -300,8 +264,6 @@
,
{ "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": 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": "Point", "coordinates": [ 69.301758, 41.310824 ] } }
,
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital", "NAME": "Baku", "DIFFASCII": 0, "NAMEASCII": "Baku", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Azerbaijan", "SOV_A3": "AZE", "ADM0NAME": "Azerbaijan", "ADM0_A3": "AZE", "ADM1NAME": "Baki", "ISO_A2": "AZ", "LATITUDE": 40.395272, "LONGITUDE": 49.862217, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 2122300, "POP_MIN": 1892000, "POP_OTHER": 1518801, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 587084, "MEGANAME": "Baku", "LS_NAME": "Baku", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 1581087, "MAX_POP20": 1581475, "MAX_POP50": 1581475, "MAX_POP300": 1581475, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 246, "MAX_AREAKM": 249, "MIN_AREAMI": 95, "MAX_AREAMI": 96, "MIN_PERKM": 174, "MAX_PERKM": 179, "MIN_PERMI": 108, "MAX_PERMI": 111, "MIN_BBXMIN": 49.7, "MAX_BBXMIN": 49.716667, "MIN_BBXMAX": 50.016667, "MAX_BBXMAX": 50.016667, "MIN_BBYMIN": 40.316667, "MAX_BBYMIN": 40.316667, "MIN_BBYMAX": 40.5, "MAX_BBYMAX": 40.5, "MEAN_BBXC": 49.881373, "MEAN_BBYC": 40.41632, "COMPARE": 0, "GN_ASCII": "Baku", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 9, "GN_POP": 1116513, "ELEVATION": 0, "GTOPO30": 30, "TIMEZONE": "Asia/Baku", "GEONAMESNO": "GeoNames match general.", "UN_FID": 200, "UN_ADM0": "Azerbaijan", "UN_LAT": 40.32, "UN_LONG": 49.81, "POP1950": 897, "POP1955": 940, "POP1960": 1005, "POP1965": 1132, "POP1970": 1274, "POP1975": 1429, "POP1980": 1574, "POP1985": 1660, "POP1990": 1733, "POP1995": 1766, "POP2000": 1806, "POP2005": 1867, "POP2010": 1892, "POP2015": 1931, "POP2020": 2006, "POP2025": 2097, "POP2050": 2187 }, "geometry": { "type": "Point", "coordinates": [ 49.855957, 40.396764 ] } }
,
{ "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 ] } }
@@ -334,8 +296,6 @@
,
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 8, "FEATURECLA": "Admin-0 capital", "NAME": "Honiara", "DIFFASCII": 0, "NAMEASCII": "Honiara", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Solomon Islands", "SOV_A3": "SLB", "ADM0NAME": "Solomon Islands", "ADM0_A3": "SLB", "ADM1NAME": "Guadalcanal", "ISO_A2": "SB", "LATITUDE": -9.437994, "LONGITUDE": 159.949766, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 76328, "POP_MIN": 56298, "POP_OTHER": 76328, "RANK_MAX": 8, "RANK_MIN": 8, "GEONAMEID": 2108502, "LS_NAME": "Honiara", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 76328, "MAX_POP20": 76328, "MAX_POP50": 76328, "MAX_POP300": 76328, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 18, "MAX_AREAKM": 18, "MIN_AREAMI": 7, "MAX_AREAMI": 7, "MIN_PERKM": 33, "MAX_PERKM": 33, "MIN_PERMI": 21, "MAX_PERMI": 21, "MIN_BBXMIN": 159.916667, "MAX_BBXMIN": 159.916667, "MIN_BBXMAX": 160.016667, "MAX_BBXMAX": 160.016667, "MIN_BBYMIN": -9.441667, "MAX_BBYMIN": -9.441667, "MIN_BBYMAX": -9.408333, "MAX_BBYMAX": -9.408333, "MEAN_BBXC": 159.966865, "MEAN_BBYC": -9.42996, "COMPARE": 0, "GN_ASCII": "Honiara", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 0, "GN_POP": 56298, "ELEVATION": 0, "GTOPO30": 12, "TIMEZONE": "Pacific/Guadalcanal", "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": [ 159.938965, -9.427387 ] } }
,
{ "type": "Feature", "properties": { "SCALERANK": 6, "NATSCALE": 30, "LABELRANK": 0, "FEATURECLA": "Admin-0 capital", "NAME": "Funafuti", "DIFFASCII": 0, "NAMEASCII": "Funafuti", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 0, "SOV0NAME": "Tuvalu", "SOV_A3": "TUV", "ADM0NAME": "Tuvalu", "ADM0_A3": "TUV", "ISO_A2": "TV", "LATITUDE": -8.516652, "LONGITUDE": 179.216647, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Population from GeoNames. Changed scale rank.", "POP_MAX": 4749, "POP_MIN": 4749, "POP_OTHER": 0, "RANK_MAX": 4, "RANK_MIN": 4, "GEONAMEID": 2110394, "LS_NAME": "Funafuti", "LS_MATCH": 0, "CHECKME": 5, "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": 0, "GN_ASCII": "Funafuti", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 0, "GN_POP": 4749, "ELEVATION": 0, "GTOPO30": -9999, "TIMEZONE": "Pacific/Funafuti", "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": [ 179.208984, -8.515836 ] } }
,
{ "type": "Feature", "properties": { "SCALERANK": 1, "NATSCALE": 300, "LABELRANK": 8, "FEATURECLA": "Admin-1 capital", "NAME": "Auckland", "DIFFASCII": 0, "NAMEASCII": "Auckland", "ADM0CAP": 0, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "New Zealand", "SOV_A3": "NZL", "ADM0NAME": "New Zealand", "ADM0_A3": "NZL", "ADM1NAME": "Auckland", "ISO_A2": "NZ", "LATITUDE": -36.850013, "LONGITUDE": 174.764981, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 1245000, "POP_MIN": 274020, "POP_OTHER": 243794, "RANK_MAX": 12, "RANK_MIN": 10, "GEONAMEID": 2193733, "MEGANAME": "Auckland", "LS_NAME": "Auckland", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 274020, "MAX_POP20": 354233, "MAX_POP50": 350364, "MAX_POP300": 638000, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 169, "MAX_AREAKM": 399, "MIN_AREAMI": 65, "MAX_AREAMI": 154, "MIN_PERKM": 105, "MAX_PERKM": 266, "MIN_PERMI": 65, "MAX_PERMI": 166, "MIN_BBXMIN": 174.583333, "MAX_BBXMIN": 174.657483, "MIN_BBXMAX": 174.883333, "MAX_BBXMAX": 174.983333, "MIN_BBYMIN": -37.091667, "MAX_BBYMIN": -36.964958, "MIN_BBYMAX": -36.825, "MAX_BBYMAX": -36.8, "MEAN_BBXC": 174.755045, "MEAN_BBYC": -36.896818, "COMPARE": 0, "GN_ASCII": "Auckland", "FEATURE_CL": "P", "FEATURE_CO": "PPL", "ADMIN1_COD": 0, "GN_POP": 417910, "ELEVATION": 0, "GTOPO30": 26, "TIMEZONE": "Pacific/Auckland", "GEONAMESNO": "Geonames ascii name + lat.d + long.d matching.", "UN_FID": 381, "UN_ADM0": "New Zealand", "UN_LAT": -36.9, "UN_LONG": 174.76, "POP1950": 319, "POP1955": 387, "POP1960": 440, "POP1965": 532, "POP1970": 635, "POP1975": 729, "POP1980": 774, "POP1985": 812, "POP1990": 870, "POP1995": 976, "POP2000": 1063, "POP2005": 1189, "POP2010": 1245, "POP2015": 1321, "POP2020": 1398, "POP2025": 1441, "POP2050": 1475 }, "geometry": { "type": "Point", "coordinates": [ 174.770508, -36.844461 ] } }
] }
] }
@@ -348,10 +308,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.417480, 23.725012 ] } }
,
{ "type": "Feature", "properties": { "SCALERANK": 1, "NATSCALE": 300, "LABELRANK": 1, "FEATURECLA": "Admin-1 capital", "NAME": "Chengdu", "DIFFASCII": 0, "NAMEASCII": "Chengdu", "ADM0CAP": 0, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "China", "SOV_A3": "CHN", "ADM0NAME": "China", "ADM0_A3": "CHN", "ADM1NAME": "Sichuan", "ISO_A2": "CN", "LATITUDE": 30.67, "LONGITUDE": 104.070019, "CHANGED": 5, "NAMEDIFF": 0, "DIFFNOTE": "Changed scale rank.", "POP_MAX": 4123000, "POP_MIN": 3950437, "POP_OTHER": 11622929, "RANK_MAX": 12, "RANK_MIN": 12, "GEONAMEID": 1815286, "MEGANAME": "Chengdu", "LS_NAME": "Chengdu", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 9954810, "MAX_POP20": 11359674, "MAX_POP50": 24374217, "MAX_POP300": 0, "MAX_POP310": 0, "MAX_NATSCA": 50, "MIN_AREAKM": 5912, "MAX_AREAKM": 24244, "MIN_AREAMI": 2283, "MAX_AREAMI": 9361, "MIN_PERKM": 2296, "MAX_PERKM": 11900, "MIN_PERMI": 1427, "MAX_PERMI": 7394, "MIN_BBXMIN": 103.125, "MAX_BBXMIN": 103.383333, "MIN_BBXMAX": 104.433333, "MAX_BBXMAX": 105.375, "MIN_BBYMIN": 28.738768, "MAX_BBYMIN": 30.065456, "MIN_BBYMAX": 31.083333, "MAX_BBYMAX": 31.341667, "MEAN_BBXC": 104.039242, "MEAN_BBYC": 30.486458, "COMPARE": 0, "GN_ASCII": "Chengdu", "FEATURE_CL": "P", "FEATURE_CO": "PPLA", "ADMIN1_COD": 32, "GN_POP": 3950437, "ELEVATION": 0, "GTOPO30": 529, "TIMEZONE": "Asia/Chongqing", "GEONAMESNO": "GeoNames match general.", "UN_FID": 31, "UN_ADM0": "China", "UN_LAT": 30.67, "UN_LONG": 104.07, "POP1950": 768, "POP1955": 922, "POP1960": 1106, "POP1965": 1327, "POP1970": 1592, "POP1975": 1911, "POP1980": 2293, "POP1985": 2639, "POP1990": 2955, "POP1995": 3403, "POP2000": 3919, "POP2005": 4065, "POP2010": 4123, "POP2015": 4266, "POP2020": 4634, "POP2025": 5014, "POP2050": 5320 }, "geometry": { "type": "Point", "coordinates": [ 104.062500, 30.675715 ] } }
,
{ "type": "Feature", "properties": { "SCALERANK": 3, "NATSCALE": 110, "LABELRANK": 5, "FEATURECLA": "Admin-0 capital", "NAME": "Naypyidaw", "NAMEALT": "Nay Pyi Taw", "DIFFASCII": 0, "NAMEASCII": "Naypyidaw", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 0, "MEGACITY": 1, "SOV0NAME": "Myanmar", "SOV_A3": "MMR", "ADM0NAME": "Myanmar", "ADM0_A3": "MMR", "ADM1NAME": "Mandalay", "ISO_A2": "MM", "LATITUDE": 19.766557, "LONGITUDE": 96.118619, "CHANGED": 4, "NAMEDIFF": 0, "DIFFNOTE": "Location adjusted.", "POP_MAX": 930000, "POP_MIN": 194824, "POP_OTHER": 0, "RANK_MAX": 11, "RANK_MIN": 9, "GEONAMEID": 6611854, "MEGANAME": "Nay Pyi Taw", "LS_NAME": "Naypyidaw", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 194824, "MAX_POP20": 194824, "MAX_POP50": 194824, "MAX_POP300": 194824, "MAX_POP310": 0, "MAX_NATSCA": 100, "MIN_AREAKM": 89, "MAX_AREAKM": 89, "MIN_AREAMI": 34, "MAX_AREAMI": 34, "MIN_PERKM": 149, "MAX_PERKM": 149, "MIN_PERMI": 93, "MAX_PERMI": 93, "MIN_BBXMIN": 96.141667, "MAX_BBXMIN": 96.141667, "MIN_BBXMAX": 96.275, "MAX_BBXMAX": 96.275, "MIN_BBYMIN": 19.633333, "MAX_BBYMIN": 19.633333, "MIN_BBYMAX": 19.783333, "MAX_BBYMAX": 19.783333, "MEAN_BBXC": 96.205833, "MEAN_BBYC": 19.720606, "COMPARE": 0, "GN_ASCII": "Nay Pyi Taw", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 8, "GN_POP": 0, "ELEVATION": 0, "GTOPO30": 108, "TIMEZONE": "Asia/Rangoon", "GEONAMESNO": "GeoNames match general.", "UN_FID": 2, "UN_ADM0": "Myanmar", "UN_LAT": 19.75, "UN_LONG": 96.1, "POP1950": 0, "POP1955": 0, "POP1960": 0, "POP1965": 0, "POP1970": 0, "POP1975": 0, "POP1980": 0, "POP1985": 0, "POP1990": 0, "POP1995": 0, "POP2000": 0, "POP2005": 57, "POP2010": 930, "POP2015": 1024, "POP2020": 1177, "POP2025": 1321, "POP2050": 1461 }, "geometry": { "type": "Point", "coordinates": [ 96.108398, 19.766704 ] } }
,
{ "type": "Feature", "properties": { "SCALERANK": 0, "NATSCALE": 600, "LABELRANK": 1, "FEATURECLA": "Admin-0 capital", "NAME": "Beijing", "DIFFASCII": 0, "NAMEASCII": "Beijing", "ADM0CAP": 1, "CAPALT": 0, "WORLDCITY": 1, "MEGACITY": 1, "SOV0NAME": "China", "SOV_A3": "CHN", "ADM0NAME": "China", "ADM0_A3": "CHN", "ADM1NAME": "Beijing", "ISO_A2": "CN", "LATITUDE": 39.928892, "LONGITUDE": 116.388286, "CHANGED": 0, "NAMEDIFF": 0, "POP_MAX": 11106000, "POP_MIN": 7480601, "POP_OTHER": 9033231, "RANK_MAX": 14, "RANK_MIN": 13, "GEONAMEID": 1816670, "MEGANAME": "Beijing", "LS_NAME": "Beijing", "LS_MATCH": 1, "CHECKME": 0, "MAX_POP10": 10190861, "MAX_POP20": 11120470, "MAX_POP50": 16510327, "MAX_POP300": 23647944, "MAX_POP310": 137121250, "MAX_NATSCA": 300, "MIN_AREAKM": 2512, "MAX_AREAKM": 118844, "MIN_AREAMI": 970, "MAX_AREAMI": 45886, "MIN_PERKM": 1837, "MAX_PERKM": 93615, "MIN_PERMI": 1141, "MAX_PERMI": 58169, "MIN_BBXMIN": 111.441667, "MAX_BBXMIN": 116.058333, "MIN_BBXMAX": 117.208333, "MAX_BBXMAX": 117.325, "MIN_BBYMIN": 31.883333, "MAX_BBYMIN": 39.658333, "MIN_BBYMAX": 40.433333, "MAX_BBYMAX": 40.466667, "MEAN_BBXC": 115.929521, "MEAN_BBYC": 38.837783, "COMPARE": 0, "GN_ASCII": "Beijing", "FEATURE_CL": "P", "FEATURE_CO": "PPLC", "ADMIN1_COD": 22, "GN_POP": 7480601, "ELEVATION": 0, "GTOPO30": 63, "TIMEZONE": "Asia/Harbin", "GEONAMESNO": "GeoNames match general.", "UN_FID": 24, "UN_ADM0": "China", "UN_LAT": 39.9, "UN_LONG": 116.38, "POP1950": 4331, "POP1955": 4628, "POP1960": 4945, "POP1965": 5284, "POP1970": 5646, "POP1975": 6034, "POP1980": 6448, "POP1985": 6890, "POP1990": 7362, "POP1995": 8486, "POP2000": 9782, "POP2005": 10717, "POP2010": 11106, "POP2015": 11741, "POP2020": 12842, "POP2025": 13807, "POP2050": 14545 }, "geometry": { "type": "Point", "coordinates": [ 116.389160, 39.926588 ] } }
,
{ "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 ] } }
@@ -365,8 +321,6 @@
{ "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.461426, 34.759666 ] } }
,
{ "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 ] } }
] }
] }
] }
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
+9 -8
View File
@@ -64,12 +64,12 @@ bool progress_time() {
}
struct stats {
int minzoom;
int maxzoom;
double midlat, midlon;
double minlat, minlon, maxlat, maxlon;
double minlat2, minlon2, maxlat2, maxlon2;
std::vector<struct strategy> strategies;
int minzoom = 0;
int maxzoom = 0;
double midlat = 0, midlon = 0;
double minlat = 0, minlon = 0, maxlat = 0, maxlon = 0;
double minlat2 = 0, minlon2 = 0, maxlat2 = 0, maxlon2 = 0;
std::vector<struct strategy> strategies{};
};
void append_tile(std::string message, int z, unsigned x, unsigned y, std::map<std::string, layermap_entry> &layermap, std::vector<std::string> &header, std::map<std::string, std::vector<std::string>> &mapping, std::set<std::string> &exclude, std::set<std::string> &include, std::set<std::string> &keep_layers, std::set<std::string> &remove_layers, int ifmatched, mvt_tile &outtile, json_object *filter) {
@@ -712,7 +712,7 @@ struct tileset_reader {
t.y = parent_tile.y;
tv.push_back(std::move(t));
std::string ret = overzoom(tv, tile.z, tile.x, tile.y, -1, buffer, std::set<std::string>(), false, &next_overzoomed_tiles, false, NULL, false, std::unordered_map<std::string, attribute_op>(), unidecode_data);
std::string ret = overzoom(tv, tile.z, tile.x, tile.y, -1, buffer, std::set<std::string>(), false, &next_overzoomed_tiles, false, NULL, false, std::unordered_map<std::string, attribute_op>(), unidecode_data, 0, 0);
return ret;
}
@@ -877,6 +877,8 @@ void handle_strategies(const unsigned char *s, std::vector<strategy> *st) {
(*st)[i].dropped_as_needed += v->value.number.number;
} else if (strcmp(k->value.string.string, "coalesced_as_needed") == 0) {
(*st)[i].coalesced_as_needed += v->value.number.number;
} else if (strcmp(k->value.string.string, "truncated_zooms") == 0) {
(*st)[i].truncated_zooms += v->value.number.number;
} else if (strcmp(k->value.string.string, "detail_reduced") == 0) {
(*st)[i].detail_reduced += v->value.number.number;
} else if (strcmp(k->value.string.string, "tiny_polygons") == 0) {
@@ -1473,7 +1475,6 @@ int main(int argc, char **argv) {
}
struct stats st;
memset(&st, 0, sizeof(st));
st.minzoom = st.minlat = st.minlon = st.minlat2 = st.minlon2 = INT_MAX;
st.maxzoom = st.maxlat = st.maxlon = st.maxlat2 = st.maxlon2 = INT_MIN;
+292 -104
View File
@@ -66,6 +66,7 @@ extern "C" {
pthread_mutex_t db_lock = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t var_lock = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t task_lock = PTHREAD_MUTEX_INITIALIZER;
// convert serial feature geometry (drawvec) to output tile geometry (mvt_geometry)
static std::vector<mvt_geometry> to_feature(drawvec const &geom) {
@@ -438,7 +439,7 @@ static std::vector<serial_feature> disassemble_multiplier_clusters(std::vector<s
}
// Write out copies of a feature into the temporary files for the next zoom level
static void rewrite(serial_feature const &osf, int z, int nextzoom, int maxzoom, unsigned tx, unsigned ty, int buffer, int within[], std::atomic<long long> *geompos, compressor *geomfile[], const char *fname, int child_shards, int max_zoom_increment, int segment, unsigned *initial_x, unsigned *initial_y) {
static void rewrite(serial_feature const &osf, int z, int nextzoom, int maxzoom, unsigned tx, unsigned ty, int buffer, std::atomic<bool> within[], std::atomic<long long> *geompos, long long start_geompos[], compressor *geomfile[], const char *fname, int child_shards, int max_zoom_increment, int segment, unsigned *initial_x, unsigned *initial_y) {
if (osf.geometry.size() > 0 && (nextzoom <= maxzoom || additional[A_EXTEND_ZOOMS] || extend_zooms_max > 0)) {
int xo, yo;
int span = 1 << (nextzoom - z);
@@ -508,11 +509,15 @@ static void rewrite(serial_feature const &osf, int z, int nextzoom, int maxzoom,
{
if (!within[j]) {
within[j] = true;
start_geompos[j] = geompos[j]; // no competition between threads
long long estimated_complexity = 0; // placeholder, to be filled in later
fwrite_check(&estimated_complexity, sizeof(estimated_complexity), 1, geomfile[j]->fp, &geompos[j], fname);
serialize_int(geomfile[j]->fp, nextzoom, &geompos[j], fname);
serialize_uint(geomfile[j]->fp, tx * span + xo, &geompos[j], fname);
serialize_uint(geomfile[j]->fp, ty * span + yo, &geompos[j], fname);
geomfile[j]->begin();
within[j] = 1;
}
serial_feature sf = osf;
@@ -532,10 +537,12 @@ struct simplification_worker_arg {
std::vector<serial_feature> *features = NULL;
int task = 0;
int tasks = 0;
bool trying_to_stop_early = false;
drawvec *shared_nodes;
node *shared_nodes_map;
size_t nodepos;
std::string const *shared_nodes_bloom;
};
// If a polygon has collapsed away to nothing during polygon cleaning,
@@ -585,7 +592,7 @@ static drawvec revive_polygon(drawvec &geom, double area, int z, int detail) {
// This simplifies the geometry of one feature. It is generally called from the feature_simplification_worker
// but is broken out here so that it can be called from earlier in write_tile if coalesced geometries build up
// too much in memory.
static double simplify_feature(serial_feature *p, drawvec const &shared_nodes, node *shared_nodes_map, size_t nodepos) {
static double simplify_feature(serial_feature *p, drawvec const &shared_nodes, node *shared_nodes_map, size_t nodepos, std::string const &shared_nodes_bloom) {
drawvec geom = p->geometry;
signed char t = p->t;
int z = p->z;
@@ -632,13 +639,13 @@ static double simplify_feature(serial_feature *p, drawvec const &shared_nodes, n
}
// continues to simplify to line_detail even if we have extra detail
drawvec ngeom = simplify_lines(geom, z, p->tx, p->ty, line_detail, !(prevent[P_CLIPPING] || prevent[P_DUPLICATION]), p->simplification, t == VT_POLYGON ? 4 : 0, shared_nodes, shared_nodes_map, nodepos);
drawvec ngeom = simplify_lines(geom, z, p->tx, p->ty, line_detail, !(prevent[P_CLIPPING] || prevent[P_DUPLICATION]), p->simplification, t == VT_POLYGON ? 4 : 0, shared_nodes, shared_nodes_map, nodepos, shared_nodes_bloom);
if (p->coalesced && prevent[P_SIMPLIFY_SHARED_NODES]) {
// do another simplification to eliminate collinearities
// that were left behind at the former corners between
// coalesced geometries
ngeom = simplify_lines(ngeom, z, p->tx, p->ty, line_detail, !(prevent[P_CLIPPING] || prevent[P_DUPLICATION]), 0.1, t == VT_POLYGON ? 4 : 0, shared_nodes, NULL, 0);
ngeom = simplify_lines(ngeom, z, p->tx, p->ty, line_detail, !(prevent[P_CLIPPING] || prevent[P_DUPLICATION]), 0.1, t == VT_POLYGON ? 4 : 0, shared_nodes, NULL, 0, "");
}
if (t != VT_POLYGON || ngeom.size() >= 3) {
@@ -664,7 +671,10 @@ static void *simplification_worker(void *v) {
std::vector<serial_feature> *features = a->features;
for (size_t i = a->task; i < (*features).size(); i += a->tasks) {
double area = simplify_feature(&((*features)[i]), *(a->shared_nodes), a->shared_nodes_map, a->nodepos);
double area = 0;
if (!a->trying_to_stop_early) {
area = simplify_feature(&((*features)[i]), *(a->shared_nodes), a->shared_nodes_map, a->nodepos, *(a->shared_nodes_bloom));
}
signed char t = (*features)[i].t;
int z = (*features)[i].z;
@@ -678,18 +688,21 @@ static void *simplification_worker(void *v) {
// Give Clipper a chance to try to fix it.
{
drawvec before = geom;
// we can try scaling up because this is now tile scale
geom = clean_or_clip_poly(geom, 0, 0, false, true);
if (additional[A_DEBUG_POLYGON]) {
check_polygon(geom);
}
if (geom.size() < 3) {
if (area > 0) {
// area is in world coordinates, calculated before scaling down
geom = revive_polygon(before, area, z, out_detail);
} else {
geom.clear();
if (!a->trying_to_stop_early) {
// we can try scaling up because this is now tile scale
geom = clean_or_clip_poly(geom, 0, 0, false, true);
if (additional[A_DEBUG_POLYGON]) {
check_polygon(geom);
}
if (geom.size() < 3) {
if (area > 0) {
// area is in world coordinates, calculated before scaling down
geom = revive_polygon(before, area, z, out_detail);
} else {
geom.clear();
}
}
}
}
@@ -821,6 +834,15 @@ static unsigned long long calculate_drop_sequence(serial_feature const &sf) {
return ~out; // lowest numbered feature gets dropped first
}
struct task {
int fileno = 0;
size_t todo;
bool operator<(const struct task &o) const {
return todo < o.todo;
}
};
// This is the block of parameters that are passed to write_tile() to read a tile
// from the serialized form, do whatever needs to be done to it, and to write the
// MVT-format output to the output tileset.
@@ -829,7 +851,8 @@ static unsigned long long calculate_drop_sequence(serial_feature const &sf) {
// by the caller to determine whether the zoom level needs to be done over with
// new thresholds.
struct write_tile_args {
struct task *tasks = NULL;
int threadno;
std::vector<task *> *tasks;
char *global_stringpool = NULL;
int min_detail = 0;
sqlite3 *outdb = NULL;
@@ -837,6 +860,7 @@ struct write_tile_args {
int buffer = 0;
const char *fname = NULL;
compressor **geomfile = NULL;
std::atomic<long long> *geompos = NULL;
double todo = 0;
std::atomic<long long> *along = NULL;
double gamma = 0;
@@ -884,6 +908,9 @@ struct write_tile_args {
bool compressed;
node *shared_nodes_map;
size_t nodepos;
std::string const *shared_nodes_bloom;
std::set<zxy> const *skip_children; // what is being skipped at this zoom
std::set<zxy> skip_children_out; // what will be skipped in the next zoom
};
// Clips a feature's geometry to the tile bounds at the specified zoom level
@@ -1000,10 +1027,36 @@ struct multiplier_state {
std::map<std::string, int> count;
};
static bool skip_next_feature(decompressor *geoms, std::atomic<long long> *geompos_in, bool compressed) {
long long len;
if (geoms->deserialize_long_long(&len, geompos_in) == 0) {
fprintf(stderr, "Unexpected physical EOF in feature stream\n");
exit(EXIT_READ);
}
if (len <= 0) {
if (compressed) {
geoms->end(geompos_in);
}
return false;
}
std::string s;
s.resize(len);
size_t n = geoms->fread((void *) s.c_str(), sizeof(char), s.size(), geompos_in);
if (n != s.size()) {
fprintf(stderr, "Short read (%zu for %zu) from geometry\n", n, s.size());
exit(EXIT_READ);
}
return true;
}
// This function is called repeatedly from write_tile() to retrieve the next feature
// from the input stream. If the stream is at an end, it returns a feature with the
// geometry type set to -2.
static serial_feature next_feature(decompressor *geoms, std::atomic<long long> *geompos_in, int z, unsigned tx, unsigned ty, unsigned *initial_x, unsigned *initial_y, long long *original_features, long long *unclipped_features, int nextzoom, int maxzoom, int minzoom, int max_zoom_increment, size_t pass, std::atomic<long long> *along, long long alongminus, int buffer, int *within, compressor **geomfile, std::atomic<long long> *geompos, std::atomic<double> *oprogress, double todo, const char *fname, int child_shards, json_object *filter, const char *global_stringpool, long long *pool_off, std::vector<std::vector<std::string>> *layer_unmaps, bool first_time, bool compressed, multiplier_state *multiplier_state, std::shared_ptr<std::string> &tile_stringpool, std::vector<std::string> const &unidecode_data, unsigned long long &previndex) {
static serial_feature next_feature(decompressor *geoms, std::atomic<long long> *geompos_in, int z, unsigned tx, unsigned ty, unsigned *initial_x, unsigned *initial_y, long long *original_features, long long *unclipped_features, int nextzoom, int maxzoom, int minzoom, int max_zoom_increment, size_t pass, std::atomic<long long> *along, long long alongminus, int buffer, std::atomic<bool> *within, compressor **geomfile, std::atomic<long long> *geompos, long long start_geompos[], std::atomic<double> *oprogress, double todo, const char *fname, int child_shards, json_object *filter, const char *global_stringpool, long long *pool_off, std::vector<std::vector<std::string>> *layer_unmaps, bool first_time, bool compressed, multiplier_state *multiplier_state, std::shared_ptr<std::string> &tile_stringpool, std::vector<std::string> const &unidecode_data, unsigned long long &previndex) {
while (1) {
serial_feature sf;
long long len;
@@ -1080,7 +1133,7 @@ static serial_feature next_feature(decompressor *geoms, std::atomic<long long> *
if (first_time && pass == 0) { /* only write out the next zoom once, even if we retry */
if (sf.tippecanoe_maxzoom == -1 || sf.tippecanoe_maxzoom >= nextzoom) {
rewrite(sf, z, nextzoom, maxzoom, tx, ty, buffer, within, geompos, geomfile, fname, child_shards, max_zoom_increment, sf.segment, initial_x, initial_y);
rewrite(sf, z, nextzoom, maxzoom, tx, ty, buffer, within, geompos, start_geompos, geomfile, fname, child_shards, max_zoom_increment, sf.segment, initial_x, initial_y);
}
}
@@ -1218,9 +1271,10 @@ struct run_prefilter_args {
std::atomic<long long> *along = 0;
long long alongminus = 0;
int buffer = 0;
int *within = NULL;
std::atomic<bool> *within = NULL;
compressor **geomfile = NULL;
std::atomic<long long> *geompos = NULL;
long long *start_geompos = NULL;
std::atomic<double> *oprogress = NULL;
double todo = 0;
const char *fname = 0;
@@ -1243,7 +1297,7 @@ void *run_prefilter(void *v) {
unsigned long long previndex = 0;
while (1) {
serial_feature sf = next_feature(rpa->geoms, rpa->geompos_in, rpa->z, rpa->tx, rpa->ty, rpa->initial_x, rpa->initial_y, rpa->original_features, rpa->unclipped_features, rpa->nextzoom, rpa->maxzoom, rpa->minzoom, rpa->max_zoom_increment, rpa->pass, rpa->along, rpa->alongminus, rpa->buffer, rpa->within, rpa->geomfile, rpa->geompos, rpa->oprogress, rpa->todo, rpa->fname, rpa->child_shards, rpa->filter, rpa->global_stringpool, rpa->pool_off, rpa->layer_unmaps, rpa->first_time, rpa->compressed, &multiplier_state, tile_stringpool, *(rpa->unidecode_data), previndex);
serial_feature sf = next_feature(rpa->geoms, rpa->geompos_in, rpa->z, rpa->tx, rpa->ty, rpa->initial_x, rpa->initial_y, rpa->original_features, rpa->unclipped_features, rpa->nextzoom, rpa->maxzoom, rpa->minzoom, rpa->max_zoom_increment, rpa->pass, rpa->along, rpa->alongminus, rpa->buffer, rpa->within, rpa->geomfile, rpa->geompos, rpa->start_geompos, rpa->oprogress, rpa->todo, rpa->fname, rpa->child_shards, rpa->filter, rpa->global_stringpool, rpa->pool_off, rpa->layer_unmaps, rpa->first_time, rpa->compressed, &multiplier_state, tile_stringpool, *(rpa->unidecode_data), previndex);
if (sf.t < 0) {
break;
}
@@ -1467,7 +1521,7 @@ struct layer_features {
size_t multiplier_cluster_size = 0; // The feature count of the current multiplier cluster
};
bool drop_feature_unless_it_can_be_added_to_a_multiplier_cluster(layer_features &layer, serial_feature &sf, std::vector<std::vector<std::string>> *layer_unmaps, size_t &multiplier_seq, atomic_strategy *strategy, bool &drop_rest, std::unordered_map<std::string, attribute_op> const *attribute_accum) {
bool drop_feature_unless_it_can_be_added_to_a_multiplier_cluster(layer_features &layer, serial_feature &sf, std::vector<std::vector<std::string>> *layer_unmaps, size_t &multiplier_seq, strategy &strategy, bool &drop_rest, std::unordered_map<std::string, attribute_op> const *attribute_accum) {
ssize_t which_serial_feature;
if (find_feature_to_accumulate_onto(layer.features, sf, which_serial_feature, layer_unmaps, LLONG_MAX, multiplier_seq)) {
@@ -1478,7 +1532,7 @@ bool drop_feature_unless_it_can_be_added_to_a_multiplier_cluster(layer_features
return false; // converted rather than dropped
} else {
preserve_attributes(attribute_accum, sf, layer.features[which_serial_feature]);
strategy->dropped_as_needed++;
strategy.dropped_as_needed++;
drop_rest = true;
return true; // dropped
}
@@ -1487,7 +1541,13 @@ bool drop_feature_unless_it_can_be_added_to_a_multiplier_cluster(layer_features
return false; // did not drop because nothing could be found to accumulate attributes onto
}
long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, char *global_stringpool, int z, const unsigned tx, const unsigned ty, const int detail, int min_detail, sqlite3 *outdb, const char *outdir, int buffer, const char *fname, compressor **geomfile, int minzoom, int maxzoom, double todo, std::atomic<long long> *along, long long alongminus, double gamma, int child_shards, long long *pool_off, unsigned *initial_x, unsigned *initial_y, std::atomic<int> *running, double simplification, std::vector<std::map<std::string, layermap_entry>> *layermaps, std::vector<std::vector<std::string>> *layer_unmaps, size_t tiling_seg, size_t pass, unsigned long long mingap, long long minextent, unsigned long long mindrop_sequence, const char *prefilter, const char *postfilter, json_object *filter, write_tile_args *arg, atomic_strategy *strategy, bool compressed_input, node *shared_nodes_map, size_t nodepos, std::vector<std::string> const &unidecode_data) {
void skip_tile(decompressor *geoms, std::atomic<long long> *geompos_in, bool compressed_input) {
while (skip_next_feature(geoms, geompos_in, compressed_input)) {
;
}
}
long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, char *global_stringpool, int z, const unsigned tx, const unsigned ty, const int detail, int min_detail, sqlite3 *outdb, const char *outdir, int buffer, const char *fname, compressor **geomfile, std::atomic<long long> *geompos, int minzoom, int maxzoom, double todo, std::atomic<long long> *along, long long alongminus, double gamma, int child_shards, long long *pool_off, unsigned *initial_x, unsigned *initial_y, std::atomic<int> *running, double simplification, std::vector<std::map<std::string, layermap_entry>> *layermaps, std::vector<std::vector<std::string>> *layer_unmaps, size_t tiling_seg, size_t pass, unsigned long long mingap, long long minextent, unsigned long long mindrop_sequence, const char *prefilter, const char *postfilter, json_object *filter, write_tile_args *arg, atomic_strategy *strategy_out, bool compressed_input, node *shared_nodes_map, size_t nodepos, std::string const &shared_nodes_bloom, std::vector<std::string> const &unidecode_data, long long estimated_complexity, std::set<zxy> &skip_children_out) {
double merge_fraction = 1;
double mingap_fraction = 1;
double minextent_fraction = 1;
@@ -1519,11 +1579,33 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
// only for -K
unsigned long long cluster_mingap = ((1LL << (32 - z)) / 256 * cluster_distance) * ((1LL << (32 - z)) / 256 * cluster_distance);
int first_detail = detail, second_detail = detail - 1;
bool trying_to_stop_early = false;
bool can_stop_early = true;
if (additional[A_VARIABLE_DEPTH_PYRAMID]) {
// If we are trying to stop early, there is an extra first pass with full+extra detail,
// and which loops if everything doesn't fit rather than trying to drop or union features.
// empirical estimate from ne_10m_admin_0_countries, CPAD units, Cal fires.
// only try to make an overzoomable final tile if it seems like it might work
long long estimated_output_tile_size = 0.6693 * estimated_complexity - 3.36e+04;
if (estimated_output_tile_size < (long long) (0.9 * max_tile_size)) {
first_detail = 30 - z;
second_detail = detail;
trying_to_stop_early = true;
}
}
size_t detail_reduced = 0;
bool first_time = true;
// This only loops if the tile data didn't fit, in which case the detail
// goes down and the progress indicator goes backward for the next try.
int line_detail;
for (line_detail = detail; line_detail >= min_detail || line_detail == detail; line_detail--, oprogress = 0) {
for (int line_detail = first_detail;
line_detail >= min_detail || line_detail == detail;
line_detail = line_detail == first_detail ? second_detail : line_detail - 1) {
oprogress = 0;
long long count = 0;
double accum_area = 0;
@@ -1558,11 +1640,11 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
size_t lead_features_count = 0; // of the tile so far
size_t other_multiplier_cluster_features_count = 0; // of the tile so far
int within[child_shards];
std::atomic<long long> geompos[child_shards];
std::atomic<bool> within[child_shards];
long long start_geompos[child_shards];
for (size_t i = 0; i < (size_t) child_shards; i++) {
geompos[i] = 0;
within[i] = 0;
within[i] = false;
start_geompos[i] = -1;
}
std::shared_ptr<std::string> tile_stringpool = std::make_shared<std::string>();
@@ -1627,6 +1709,7 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
rpa.within = within;
rpa.geomfile = geomfile;
rpa.geompos = geompos;
rpa.start_geompos = start_geompos;
rpa.oprogress = &oprogress;
rpa.todo = todo;
rpa.fname = fname;
@@ -1658,15 +1741,19 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
struct multiplier_state multiplier_state;
size_t multiplier_seq = retain_points_multiplier - 1;
bool drop_rest = false; // are we dropping the remainder of a multiplier cluster whose first point was dropped?
bool drop_rest = false; // are we dropping the remainder of a multiplier cluster whose first point was dropped?
bool dropping_by_rate = false; // are we dropping anything by rate in this tile, or keeping it only as part of a multiplier?
unsigned long long next_feature_previndex = 0;
strategy strategy;
strategy.detail_reduced = detail_reduced;
for (size_t seq = 0;; seq++) {
serial_feature sf;
ssize_t which_serial_feature = -1;
if (prefilter == NULL) {
sf = next_feature(geoms, geompos_in, z, tx, ty, initial_x, initial_y, &original_features, &unclipped_features, nextzoom, maxzoom, minzoom, max_zoom_increment, pass, along, alongminus, buffer, within, geomfile, geompos, &oprogress, todo, fname, child_shards, filter, global_stringpool, pool_off, layer_unmaps, first_time, compressed_input, &multiplier_state, tile_stringpool, unidecode_data, next_feature_previndex);
sf = next_feature(geoms, geompos_in, z, tx, ty, initial_x, initial_y, &original_features, &unclipped_features, nextzoom, maxzoom, minzoom, max_zoom_increment, pass, along, alongminus, buffer, within, geomfile, geompos, start_geompos, &oprogress, todo, fname, child_shards, filter, global_stringpool, pool_off, layer_unmaps, first_time, compressed_input, &multiplier_state, tile_stringpool, unidecode_data, next_feature_previndex);
} else {
sf = parse_feature(prefilter_jp, z, tx, ty, layermaps, tiling_seg, layer_unmaps, postfilter != NULL);
}
@@ -1701,16 +1788,26 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
drop_sequence = calculate_drop_sequence(sf);
}
if (sf.feature_minzoom > z + 1) {
// if there is a feature whose first appearance is beyond the next zoom,
// prevent stopping early at the next zoom
dropping_by_rate = true;
}
if (sf.dropped == FEATURE_KEPT) {
// this is a new multiplier cluster, so stop dropping features
// that were dropped because the previous lead feature was dropped
drop_rest = false;
} else if (sf.dropped != FEATURE_DROPPED) {
// Does the current multiplier cluster already have too many features?
// If so, we have to drop this one, even if it would potentially qualify
// as a secondary feature to be exposed by filtering
if (layer.multiplier_cluster_size >= (size_t) retain_points_multiplier) {
sf.dropped = FEATURE_DROPPED;
} else {
can_stop_early = false;
if (sf.dropped != FEATURE_DROPPED) {
// Does the current multiplier cluster already have too many features?
// If so, we have to drop this one, even if it would potentially qualify
// as a secondary feature to be exposed by filtering
if (layer.multiplier_cluster_size >= (size_t) retain_points_multiplier) {
sf.dropped = FEATURE_DROPPED;
}
}
}
@@ -1719,7 +1816,8 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
if (find_feature_to_accumulate_onto(features, sf, which_serial_feature, layer_unmaps, LLONG_MAX, multiplier_seq)) {
preserve_attributes(arg->attribute_accum, sf, features[which_serial_feature]);
strategy->dropped_by_rate++;
strategy.dropped_by_rate++;
can_stop_early = false;
continue;
}
} else {
@@ -1733,8 +1831,9 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
if (gamma > 0) {
if (manage_gap(sf.index, &previndex, scale, gamma, &gap) && find_feature_to_accumulate_onto(features, sf, which_serial_feature, layer_unmaps, LLONG_MAX, multiplier_seq)) {
preserve_attributes(arg->attribute_accum, sf, features[which_serial_feature]);
strategy->dropped_by_gamma++;
strategy.dropped_by_gamma++;
drop_rest = true;
can_stop_early = false;
continue;
}
}
@@ -1760,14 +1859,16 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
}
preserve_attributes(arg->attribute_accum, sf, features[which_serial_feature]);
strategy->coalesced_as_needed++;
strategy.coalesced_as_needed++;
drop_rest = true;
can_stop_early = false;
continue;
}
} else if (additional[A_DROP_DENSEST_AS_NEEDED]) {
add_sample_to(gaps, sf.gap, gaps_increment, seq);
if (sf.gap < mingap) {
if (drop_feature_unless_it_can_be_added_to_a_multiplier_cluster(layer, sf, layer_unmaps, multiplier_seq, strategy, drop_rest, arg->attribute_accum)) {
can_stop_early = false;
continue;
}
}
@@ -1790,7 +1891,7 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
}
preserve_attributes(arg->attribute_accum, sf, features[which_serial_feature]);
strategy->coalesced_as_needed++;
strategy.coalesced_as_needed++;
drop_rest = true;
continue;
}
@@ -1801,8 +1902,9 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
features[which_serial_feature].coalesced = true;
coalesced_area += sf.extent;
preserve_attributes(arg->attribute_accum, sf, features[which_serial_feature]);
strategy->coalesced_as_needed++;
strategy.coalesced_as_needed++;
drop_rest = true;
can_stop_early = false;
continue;
}
} else if (additional[A_DROP_SMALLEST_AS_NEEDED]) {
@@ -1811,6 +1913,7 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
// so we shouldn't expect to find anything small that we can related this feature to.
if (minextent != 0 && sf.extent + coalesced_area <= minextent) {
if (drop_feature_unless_it_can_be_added_to_a_multiplier_cluster(layer, sf, layer_unmaps, multiplier_seq, strategy, drop_rest, arg->attribute_accum)) {
can_stop_early = false;
continue;
}
}
@@ -1821,8 +1924,9 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
features[which_serial_feature].coalesced = true;
coalesced_area += sf.extent;
preserve_attributes(arg->attribute_accum, sf, features[which_serial_feature]);
strategy->coalesced_as_needed++;
strategy.coalesced_as_needed++;
drop_rest = true;
can_stop_early = false;
continue;
}
} else if (additional[A_DROP_FRACTION_AS_NEEDED] || prevent[P_DYNAMIC_DROP]) {
@@ -1831,6 +1935,7 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
// so we shouldn't expect to find anything small that we can related this feature to.
if (mindrop_sequence != 0 && drop_sequence <= mindrop_sequence) {
if (drop_feature_unless_it_can_be_added_to_a_multiplier_cluster(layer, sf, layer_unmaps, multiplier_seq, strategy, drop_rest, arg->attribute_accum)) {
can_stop_early = false;
continue;
}
}
@@ -1840,8 +1945,9 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
coalesce_geometry(features[which_serial_feature], sf);
features[which_serial_feature].coalesced = true;
preserve_attributes(arg->attribute_accum, sf, features[which_serial_feature]);
strategy->coalesced_as_needed++;
strategy.coalesced_as_needed++;
drop_rest = true;
can_stop_early = false;
continue;
}
}
@@ -1866,9 +1972,9 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
bool prevent_tiny = prevent[P_TINY_POLYGON_REDUCTION] ||
(prevent[P_TINY_POLYGON_REDUCTION_AT_MAXZOOM] && z == maxzoom);
if (!prevent_tiny && !additional[A_GRID_LOW_ZOOMS]) {
sf.geometry = reduce_tiny_poly(sf.geometry, z, line_detail, &still_need_simplification_after_reduction, &simplified_away_by_reduction, &accum_area);
sf.geometry = reduce_tiny_poly(sf.geometry, z, line_detail, &still_need_simplification_after_reduction, &simplified_away_by_reduction, &accum_area, tiny_polygon_size);
if (simplified_away_by_reduction) {
strategy->tiny_polygons++;
strategy.tiny_polygons++;
}
if (sf.geometry.size() == 0) {
continue;
@@ -1955,7 +2061,7 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
// may not be very effective for reducing memory usage.
for (; simplified_geometry_through < features.size(); simplified_geometry_through++) {
simplify_feature(&features[simplified_geometry_through], shared_nodes, shared_nodes_map, nodepos);
simplify_feature(&features[simplified_geometry_through], shared_nodes, shared_nodes_map, nodepos, shared_nodes_bloom);
if (features[simplified_geometry_through].t == VT_POLYGON) {
drawvec to_clean = features[simplified_geometry_through].geometry;
@@ -2004,9 +2110,24 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
for (int j = 0; j < child_shards; j++) {
if (within[j]) {
long long estimated_complexity_out = geompos[j] - start_geompos[j];
if (dropping_by_rate) {
// large enough to make it not try to stop early
estimated_complexity_out = 1LL << 32;
}
geomfile[j]->serialize_long_long(0, &geompos[j], fname); // EOF
geomfile[j]->end(&geompos[j], fname);
within[j] = 0;
within[j] = false;
if (additional[A_VARIABLE_DEPTH_PYRAMID]) {
fflush(geomfile[j]->fp);
if (pwrite(fileno(geomfile[j]->fp), &estimated_complexity_out, sizeof(estimated_complexity_out), start_geompos[j]) != sizeof(estimated_complexity_out)) {
perror("pwrite complexity");
exit(EXIT_WRITE);
}
}
}
}
@@ -2017,6 +2138,10 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
if (lead_features_count > 0) {
scaled_max_tile_size *= (lead_features_count + other_multiplier_cluster_features_count) / lead_features_count;
}
size_t scaled_max_tile_features = max_tile_features;
if (lead_features_count > 0) {
scaled_max_tile_features *= (lead_features_count + other_multiplier_cluster_features_count) / lead_features_count;
}
// Operations on the features within each layer:
//
@@ -2135,6 +2260,8 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
args[i].shared_nodes = &shared_nodes;
args[i].shared_nodes_map = shared_nodes_map;
args[i].nodepos = nodepos;
args[i].shared_nodes_bloom = &shared_nodes_bloom;
args[i].trying_to_stop_early = trying_to_stop_early;
if (tasks > 1) {
if (thread_create(&pthreads[i], NULL, simplification_worker, &args[i]) != 0) {
@@ -2213,7 +2340,7 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
if (!(prevent[P_SIMPLIFY] || (z == maxzoom && prevent[P_SIMPLIFY_LOW]))) {
// XXX revisit: why does this not take zoom into account?
layer_features[x].geometry = simplify_lines(layer_features[x].geometry, 32, 0, 0, 0,
!(prevent[P_CLIPPING] || prevent[P_DUPLICATION]), simplification, layer_features[x].t == VT_POLYGON ? 4 : 0, shared_nodes, NULL, 0);
!(prevent[P_CLIPPING] || prevent[P_DUPLICATION]), simplification, layer_features[x].t == VT_POLYGON ? 4 : 0, shared_nodes, NULL, 0, "");
}
}
@@ -2248,10 +2375,12 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
if (z == maxzoom && limit_tile_feature_count_at_maxzoom != 0) {
if (layer_features.size() > limit_tile_feature_count_at_maxzoom) {
can_stop_early = false;
layer_features.resize(limit_tile_feature_count_at_maxzoom);
}
} else if (limit_tile_feature_count != 0) {
if (layer_features.size() > limit_tile_feature_count) {
can_stop_early = false;
layer_features.resize(limit_tile_feature_count);
}
}
@@ -2348,14 +2477,24 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
oprogress = progress;
}
if (trying_to_stop_early && line_detail == first_detail && !can_stop_early) {
// didn't work, try a lower detail
continue;
}
if (totalsize > 0 && tile.layers.size() > 0) {
if (totalsize > max_tile_features && !prevent[P_FEATURE_LIMIT]) {
if (totalsize > scaled_max_tile_features && !prevent[P_FEATURE_LIMIT]) {
if (totalsize > arg->feature_count_out) {
arg->feature_count_out = totalsize;
}
if (!quiet) {
fprintf(stderr, "tile %d/%u/%u has %zu features, >%zu \n", z, tx, ty, totalsize, max_tile_features);
fprintf(stderr, "tile %d/%u/%u has %zu features, >%zu \n", z, tx, ty, totalsize, scaled_max_tile_features);
}
if (trying_to_stop_early && line_detail == first_detail) {
// didn't work, try a lower detail
continue;
}
if (additional[A_INCREASE_GAMMA_AS_NEEDED] && gamma < 10) {
@@ -2376,7 +2515,7 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
line_detail++; // to keep it the same when the loop decrements it
continue;
} else if (mingap < ULONG_MAX && (additional[A_DROP_DENSEST_AS_NEEDED] || additional[A_COALESCE_DENSEST_AS_NEEDED] || additional[A_CLUSTER_DENSEST_AS_NEEDED])) {
mingap_fraction = mingap_fraction * max_tile_features / totalsize * 0.90;
mingap_fraction = mingap_fraction * scaled_max_tile_features / totalsize * 0.80;
unsigned long long m = choose_mingap(gaps, mingap_fraction, mingap);
if (m != mingap) {
mingap = m;
@@ -2391,7 +2530,7 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
continue;
}
} else if (additional[A_DROP_SMALLEST_AS_NEEDED] || additional[A_COALESCE_SMALLEST_AS_NEEDED]) {
minextent_fraction = minextent_fraction * max_tile_features / totalsize * 0.75;
minextent_fraction = minextent_fraction * scaled_max_tile_features / totalsize * 0.75;
long long m = choose_minextent(extents, minextent_fraction, minextent);
if (m != minextent) {
minextent = m;
@@ -2409,7 +2548,7 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
// The 95% is a guess to avoid too many retries
// and probably actually varies based on how much duplicated metadata there is
mindrop_sequence_fraction = mindrop_sequence_fraction * max_tile_features / totalsize * 0.95;
mindrop_sequence_fraction = mindrop_sequence_fraction * scaled_max_tile_features / totalsize * 0.95;
unsigned long long m = choose_mindrop_sequence(drop_sequences, mindrop_sequence_fraction, mindrop_sequence);
if (m != mindrop_sequence) {
mindrop_sequence = m;
@@ -2442,6 +2581,10 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
compressed = pbf;
}
if (trying_to_stop_early && line_detail == first_detail) {
// printf("%lld %zu\n", estimated_complexity, compressed.size());
}
if (compressed.size() > scaled_max_tile_size && !prevent[P_KILOBYTE_LIMIT]) {
// Estimate how big it really should have been compressed
// from how many features were kept vs skipped for already being
@@ -2461,6 +2604,12 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
}
}
if (trying_to_stop_early && line_detail == first_detail) {
// didn't work, try a lower detail
detail_reduced++;
continue;
}
if (additional[A_INCREASE_GAMMA_AS_NEEDED] && gamma < 10) {
if (gamma < 1) {
gamma = 1;
@@ -2478,7 +2627,7 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
}
line_detail++; // to keep it the same when the loop decrements it
} else if (mingap < ULONG_MAX && (additional[A_DROP_DENSEST_AS_NEEDED] || additional[A_COALESCE_DENSEST_AS_NEEDED] || additional[A_CLUSTER_DENSEST_AS_NEEDED])) {
mingap_fraction = mingap_fraction * scaled_max_tile_size / (kept_adjust * compressed.size()) * 0.90;
mingap_fraction = mingap_fraction * scaled_max_tile_size / (kept_adjust * compressed.size()) * 0.80;
unsigned long long m = choose_mingap(gaps, mingap_fraction, mingap);
if (m != mingap) {
mingap = m;
@@ -2525,7 +2674,7 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
continue;
}
} else {
strategy->detail_reduced++;
detail_reduced++;
}
} else {
if (pthread_mutex_lock(&db_lock) != 0) {
@@ -2544,9 +2693,19 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
exit(EXIT_PTHREAD);
}
if (trying_to_stop_early && line_detail == first_detail) {
// We succeeded in stopping early.
// Prune the child tiles.
strategy.truncated_zooms++;
skip_children_out.insert(zxy(z, tx, ty));
}
strategy_out->add_from(strategy);
return count;
}
} else {
strategy_out->add_from(strategy);
return count;
}
}
@@ -2555,17 +2714,35 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
return -1;
}
struct task {
int fileno = 0;
struct task *next = NULL;
};
void *run_thread(void *vargs) {
write_tile_args *arg = (write_tile_args *) vargs;
struct task *task;
int *err_or_null = NULL;
for (task = arg->tasks; task != NULL; task = task->next) {
while (true) {
bool done = false;
if (pthread_mutex_lock(&task_lock) != 0) {
perror("pthread_mutex_lock");
exit(EXIT_PTHREAD);
}
struct task *task;
if (arg->tasks->size() == 0) {
done = true;
} else {
task = arg->tasks->back();
arg->tasks->pop_back();
}
if (pthread_mutex_unlock(&task_lock) != 0) {
perror("pthread_mutex_unlock");
exit(EXIT_PTHREAD);
}
if (done) {
break;
}
int j = task->fileno;
if (arg->geomfd[j] < 0) {
@@ -2604,6 +2781,10 @@ void *run_thread(void *vargs) {
// These z/x/y are uncompressed so we can seek to the start of the
// compressed feature data that immediately follows.
long long estimated_complexity;
if (dc.fread(&estimated_complexity, sizeof(estimated_complexity), 1, &geompos) != 1) {
break;
}
if (!dc.deserialize_int(&z, &geompos)) {
break;
}
@@ -2622,10 +2803,15 @@ exit(EXIT_IMPOSSIBLE);
}
arg->wrote_zoom = z;
long long len;
// fprintf(stderr, "%d/%u/%u\n", z, x, y);
long long len = write_tile(&dc, &geompos, arg->global_stringpool, z, x, y, z == arg->maxzoom ? arg->full_detail : arg->low_detail, arg->min_detail, arg->outdb, arg->outdir, arg->buffer, arg->fname, arg->geomfile, arg->minzoom, arg->maxzoom, arg->todo, arg->along, geompos, arg->gamma, arg->child_shards, arg->pool_off, arg->initial_x, arg->initial_y, arg->running, arg->simplification, arg->layermaps, arg->layer_unmaps, arg->tiling_seg, arg->pass, arg->mingap, arg->minextent, arg->mindrop_sequence, arg->prefilter, arg->postfilter, arg->filter, arg, arg->strategy, arg->compressed, arg->shared_nodes_map, arg->nodepos, (*arg->unidecode_data));
struct zxy parent(z - 1, x / 2, y / 2);
if (arg->skip_children->count(parent) > 0) {
skip_tile(&dc, &geompos, arg->compressed);
len = 1;
} else {
len = write_tile(&dc, &geompos, arg->global_stringpool, z, x, y, z == arg->maxzoom ? arg->full_detail : arg->low_detail, arg->min_detail, arg->outdb, arg->outdir, arg->buffer, arg->fname, arg->geomfile, arg->geompos, arg->minzoom, arg->maxzoom, arg->todo, arg->along, geompos, arg->gamma, arg->child_shards, arg->pool_off, arg->initial_x, arg->initial_y, arg->running, arg->simplification, arg->layermaps, arg->layer_unmaps, arg->tiling_seg, arg->pass, arg->mingap, arg->minextent, arg->mindrop_sequence, arg->prefilter, arg->postfilter, arg->filter, arg, arg->strategy, arg->compressed, arg->shared_nodes_map, arg->nodepos, *(arg->shared_nodes_bloom), (*arg->unidecode_data), estimated_complexity, arg->skip_children_out);
}
if (pthread_mutex_lock(&var_lock) != 0) {
perror("pthread_mutex_lock");
@@ -2690,7 +2876,7 @@ exit(EXIT_IMPOSSIBLE);
return err_or_null;
}
int traverse_zooms(int *geomfd, off_t *geom_size, char *global_stringpool, std::atomic<unsigned> *midx, std::atomic<unsigned> *midy, int &maxzoom, int minzoom, sqlite3 *outdb, const char *outdir, int buffer, const char *fname, const char *tmpdir, double gamma, int full_detail, int low_detail, int min_detail, long long *pool_off, unsigned *initial_x, unsigned *initial_y, double simplification, double maxzoom_simplification, std::vector<std::map<std::string, layermap_entry>> &layermaps, const char *prefilter, const char *postfilter, std::unordered_map<std::string, attribute_op> const *attribute_accum, json_object *filter, std::vector<strategy> &strategies, int iz, node *shared_nodes_map, size_t nodepos, int basezoom, double droprate, std::vector<std::string> const &unidecode_data) {
int traverse_zooms(int *geomfd, off_t *geom_size, char *global_stringpool, std::atomic<unsigned> *midx, std::atomic<unsigned> *midy, int &maxzoom, int minzoom, sqlite3 *outdb, const char *outdir, int buffer, const char *fname, const char *tmpdir, double gamma, int full_detail, int low_detail, int min_detail, long long *pool_off, unsigned *initial_x, unsigned *initial_y, double simplification, double maxzoom_simplification, std::vector<std::map<std::string, layermap_entry>> &layermaps, const char *prefilter, const char *postfilter, std::unordered_map<std::string, attribute_op> const *attribute_accum, json_object *filter, std::vector<strategy> &strategies, int iz, node *shared_nodes_map, size_t nodepos, std::string const &shared_nodes_bloom, int basezoom, double droprate, std::vector<std::string> const &unidecode_data) {
last_progress = 0;
// The existing layermaps are one table per input thread.
@@ -2714,12 +2900,15 @@ int traverse_zooms(int *geomfd, off_t *geom_size, char *global_stringpool, std::
}
}
std::set<zxy> skip_children;
int z;
for (z = iz; z <= maxzoom; z++) {
std::atomic<long long> most(0);
compressor compressors[TEMP_FILES];
compressor *sub[TEMP_FILES];
std::atomic<long long> subpos[TEMP_FILES];
int subfd[TEMP_FILES];
for (size_t j = 0; j < TEMP_FILES; j++) {
char geomname[strlen(tmpdir) + strlen("/geom.XXXXXXXX" XSTRINGIFY(INT_MAX)) + 1];
@@ -2737,6 +2926,7 @@ int traverse_zooms(int *geomfd, off_t *geom_size, char *global_stringpool, std::
}
compressors[j] = compressor(fp);
sub[j] = &compressors[j];
subpos[j] = 0;
unlink(geomname);
}
@@ -2779,24 +2969,7 @@ int traverse_zooms(int *geomfd, off_t *geom_size, char *global_stringpool, std::
std::vector<task> tasks;
tasks.resize(TEMP_FILES);
struct dispatch {
struct task *tasks = NULL;
long long todo = 0;
struct dispatch *next = NULL;
};
std::vector<dispatch> dispatches;
dispatches.resize(threads);
dispatch *dispatch_head = &dispatches[0];
for (size_t j = 0; j < threads; j++) {
dispatches[j].tasks = NULL;
dispatches[j].todo = 0;
if (j + 1 < threads) {
dispatches[j].next = &dispatches[j + 1];
} else {
dispatches[j].next = NULL;
}
}
std::vector<task *> dispatch;
for (size_t j = 0; j < TEMP_FILES; j++) {
if (geom_size[j] == 0) {
@@ -2804,24 +2977,12 @@ int traverse_zooms(int *geomfd, off_t *geom_size, char *global_stringpool, std::
}
tasks[j].fileno = j;
tasks[j].next = dispatch_head->tasks;
dispatch_head->tasks = &tasks[j];
dispatch_head->todo += geom_size[j];
dispatch *here = dispatch_head;
dispatch_head = dispatch_head->next;
dispatch **d;
for (d = &dispatch_head; *d != NULL; d = &((*d)->next)) {
if (here->todo < (*d)->todo) {
break;
}
}
here->next = *d;
*d = here;
tasks[j].todo = geom_size[j];
dispatch.push_back(&tasks[j]);
}
std::sort(dispatch.begin(), dispatch.end());
int err = INT_MAX;
double zoom_gamma = gamma;
@@ -2830,6 +2991,7 @@ int traverse_zooms(int *geomfd, off_t *geom_size, char *global_stringpool, std::
unsigned long long zoom_mindrop_sequence = 0;
size_t zoom_tile_size = 0;
size_t zoom_feature_count = 0;
std::set<zxy> skip_children_out;
for (size_t pass = 0;; pass++) {
pthread_t pthreads[threads];
@@ -2838,8 +3000,13 @@ int traverse_zooms(int *geomfd, off_t *geom_size, char *global_stringpool, std::
std::atomic<int> running(threads);
std::atomic<long long> along(0);
atomic_strategy strategy;
skip_children_out.clear();
// must be recreate with each pass, since child threads consume it
std::vector<task *> pass_dispatch = dispatch;
for (size_t thread = 0; thread < threads; thread++) {
args[thread].threadno = thread;
args[thread].global_stringpool = global_stringpool;
args[thread].min_detail = min_detail;
args[thread].outdb = outdb; // locked with db_lock
@@ -2847,6 +3014,7 @@ int traverse_zooms(int *geomfd, off_t *geom_size, char *global_stringpool, std::
args[thread].buffer = buffer;
args[thread].fname = fname;
args[thread].geomfile = sub + thread * (TEMP_FILES / threads);
args[thread].geompos = subpos + thread * (TEMP_FILES / threads);
args[thread].todo = todo;
args[thread].along = &along; // locked with var_lock
args[thread].gamma = zoom_gamma;
@@ -2890,7 +3058,7 @@ int traverse_zooms(int *geomfd, off_t *geom_size, char *global_stringpool, std::
args[thread].filter = filter;
args[thread].unidecode_data = &unidecode_data;
args[thread].tasks = dispatches[thread].tasks;
args[thread].tasks = &pass_dispatch;
args[thread].running = &running;
args[thread].pass = pass;
args[thread].wrote_zoom = -1;
@@ -2900,6 +3068,9 @@ int traverse_zooms(int *geomfd, off_t *geom_size, char *global_stringpool, std::
args[thread].compressed = (z != iz);
args[thread].shared_nodes_map = shared_nodes_map;
args[thread].nodepos = nodepos;
args[thread].shared_nodes_bloom = &shared_nodes_bloom;
args[thread].skip_children = &skip_children;
args[thread].skip_children_out.clear();
if (thread_create(&pthreads[thread], NULL, run_thread, &args[thread]) != 0) {
perror("pthread_create");
@@ -2920,6 +3091,10 @@ int traverse_zooms(int *geomfd, off_t *geom_size, char *global_stringpool, std::
err = *((int *) retval);
}
for (auto const &zxy : args[thread].skip_children_out) {
skip_children_out.insert(zxy);
}
if (args[thread].gamma_out > zoom_gamma) {
zoom_gamma = args[thread].gamma_out;
again = true;
@@ -2978,6 +3153,9 @@ int traverse_zooms(int *geomfd, off_t *geom_size, char *global_stringpool, std::
}
}
skip_children = std::move(skip_children_out);
skip_children_out.clear();
for (size_t j = 0; j < TEMP_FILES; j++) {
// Can be < 0 if there is only one source file, at z0
if (geomfd[j] >= 0) {
@@ -3021,3 +3199,13 @@ int traverse_zooms(int *geomfd, off_t *geom_size, char *global_stringpool, std::
}
return maxzoom;
}
void atomic_strategy::add_from(struct strategy const &src) {
dropped_by_rate += src.dropped_by_rate;
dropped_by_gamma += src.dropped_by_gamma;
dropped_as_needed += src.dropped_as_needed;
coalesced_as_needed += src.coalesced_as_needed;
detail_reduced += src.detail_reduced;
tiny_polygons += src.tiny_polygons;
truncated_zooms += src.truncated_zooms;
}
+10 -3
View File
@@ -18,6 +18,7 @@ struct atomic_strategy {
std::atomic<size_t> coalesced_as_needed;
std::atomic<size_t> detail_reduced;
std::atomic<size_t> tiny_polygons;
std::atomic<size_t> truncated_zooms;
atomic_strategy()
: dropped_by_rate(0),
@@ -25,8 +26,11 @@ struct atomic_strategy {
dropped_as_needed(0),
coalesced_as_needed(0),
detail_reduced(0),
tiny_polygons(0) {
tiny_polygons(0),
truncated_zooms(0) {
}
void add_from(struct strategy const &src);
};
struct strategy {
@@ -35,9 +39,11 @@ struct strategy {
size_t dropped_as_needed = 0;
size_t coalesced_as_needed = 0;
size_t detail_reduced = 0;
size_t tiny_polygons = 0;
size_t truncated_zooms = 0;
size_t tile_size = 0;
size_t feature_count = 0;
size_t tiny_polygons = 0;
strategy(const atomic_strategy &s, size_t ts, size_t fc) {
dropped_by_rate = s.dropped_by_rate;
@@ -48,6 +54,7 @@ struct strategy {
tile_size = ts;
feature_count = fc;
tiny_polygons = s.tiny_polygons;
truncated_zooms = s.truncated_zooms;
}
strategy() = default;
@@ -55,7 +62,7 @@ struct strategy {
// long long write_tile(char **geom, char *stringpool, unsigned *file_bbox, int z, unsigned x, unsigned y, int detail, int min_detail, int basezoom, sqlite3 *outdb, const char *outdir, double droprate, int buffer, const char *fname, FILE **geomfile, int file_minzoom, int file_maxzoom, double todo, char *geomstart, long long along, double gamma, int nlayers, std::atomic<strategy> *strategy);
int traverse_zooms(int *geomfd, off_t *geom_size, char *stringpool, std::atomic<unsigned> *midx, std::atomic<unsigned> *midy, int &maxzoom, int minzoom, sqlite3 *outdb, const char *outdir, int buffer, const char *fname, const char *tmpdir, double gamma, int full_detail, int low_detail, int min_detail, long long *pool_off, unsigned *initial_x, unsigned *initial_y, double simplification, double maxzoom_simplification, std::vector<std::map<std::string, layermap_entry> > &layermap, const char *prefilter, const char *postfilter, std::unordered_map<std::string, attribute_op> const *attribute_accum, struct json_object *filter, std::vector<strategy> &strategies, int iz, struct node *shared_nodes_map, size_t nodepos, int basezoom, double droprate, std::vector<std::string> const &unidecode_data);
int traverse_zooms(int *geomfd, off_t *geom_size, char *stringpool, std::atomic<unsigned> *midx, std::atomic<unsigned> *midy, int &maxzoom, int minzoom, sqlite3 *outdb, const char *outdir, int buffer, const char *fname, const char *tmpdir, double gamma, int full_detail, int low_detail, int min_detail, long long *pool_off, unsigned *initial_x, unsigned *initial_y, double simplification, double maxzoom_simplification, std::vector<std::map<std::string, layermap_entry> > &layermap, const char *prefilter, const char *postfilter, std::unordered_map<std::string, attribute_op> const *attribute_accum, struct json_object *filter, std::vector<strategy> &strategies, int iz, struct node *shared_nodes_map, size_t nodepos, std::string const &shared_nodes_bloom, int basezoom, double droprate, std::vector<std::string> const &unidecode_data);
int manage_gap(unsigned long long index, unsigned long long *previndex, double scale, double gamma, double *gap);
+1 -1
View File
@@ -1,6 +1,6 @@
#ifndef VERSION_HPP
#define VERSION_HPP
#define VERSION "v2.57.0"
#define VERSION "v2.58.0"
#endif