First commit

This commit is contained in:
2025-10-03 22:48:16 +01:00
commit fcba00eb3e
43 changed files with 12439 additions and 0 deletions

4
.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
/www/data/world.pmtiles
/nominatim-db/
/nominatim-pbf/
*.csv

10
LICENSE Normal file
View File

@@ -0,0 +1,10 @@
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means.
In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all copyright interest in the software to the public domain. We make this dedication for the benefit of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of relinquishment in perpetuity of all present and future rights to this software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
For more information, please refer to <http://unlicense.org/>

5
README.md Normal file
View File

@@ -0,0 +1,5 @@
PupMaps by BoopLabs.
Project folder for pups.boop.no
Requires europe-latest.osm.pbf which can be downloaded from https://download.geofabrik.de/europe.html
world.pmtiles from https://maps.protomaps.com/builds/

30
docker-compose.yml Normal file
View File

@@ -0,0 +1,30 @@
version: "3.8"
services:
# Frontend map server
mapserver:
image: nginx:alpine
container_name: pupmap-server
volumes:
- /mnt/storage/docker-data/pupmap/www:/usr/share/nginx/html:ro
# Make sure data folder is inside www/, e.g., www/data/
ports:
- "8084:80" # Map frontend available on 8084
restart: unless-stopped
# Nominatim search API
nominatim:
image: mediagis/nominatim:4.4
container_name: pupmap-nominatim
environment:
- PBF_PATH=/nominatim-pbf/europe-latest.osm.pbf
- NOMINATIM_IMPORT=1
- POSTGRES_SHARED_BUFFERS=2GB
- POSTGRES_AUTOVACUUM=on
ports:
- "7070:8080" # Nominatim API
volumes:
- /mnt/storage/docker-data/pupmap/nominatim-pbf:/nominatim-pbf:ro # PBF folder (read-only)
- /mnt/storage/docker-data/pupmap/nominatim-db:/var/lib/postgresql/14/main # DB folder (empty, host-owned)
restart: unless-stopped

5
scripts/README.md Normal file
View File

@@ -0,0 +1,5 @@
Some files are removed due to personal info.
These files just contain comma separated info, like name,latitude,longitude
members.csv
places.csv

View File

@@ -0,0 +1,141 @@
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
10.42,
59.21
]
},
"properties": {
"names": [
"BoltJW"
],
"count": 1,
"popup": "BoltJW"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
5.32,
60.39
]
},
"properties": {
"names": [
"Markos"
],
"count": 1,
"popup": "Markos"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
5.8,
58.870000000000005
]
},
"properties": {
"names": [
"PupFenling"
],
"count": 1,
"popup": "PupFenling"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
6.97,
51.45
]
},
"properties": {
"names": [
"PianoVanBarkhoven"
],
"count": 1,
"popup": "PianoVanBarkhoven"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
20.98,
70.04
]
},
"properties": {
"names": [
"NordicSub"
],
"count": 1,
"popup": "NordicSub"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
11.26,
60.33
]
},
"properties": {
"names": [
"PupCatalyst"
],
"count": 1,
"popup": "PupCatalyst"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
5.75,
58.86
]
},
"properties": {
"names": [
"PupSebbi"
],
"count": 1,
"popup": "PupSebbi"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
10.200000000000001,
59.74
]
},
"properties": {
"names": [
"PupTiff"
],
"count": 1,
"popup": "PupTiff"
}
}
]
}

View File

@@ -0,0 +1,42 @@
import csv
import json
from collections import defaultdict
csv_file = "members.csv"
geojson_file = "data/pois.geojson"
GROUP_TOLERANCE = 0.01 # cluster distance in degrees
def round_coord(coord):
return round(coord / GROUP_TOLERANCE) * GROUP_TOLERANCE
clusters = defaultdict(list)
with open(csv_file, newline='', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
lat = float(row['latitude'])
lon = float(row['longitude'])
name = row['name']
key = (round_coord(lat), round_coord(lon))
clusters[key].append(name)
features = []
for (lat, lon), names in clusters.items():
features.append({
"type": "Feature",
"geometry": { "type": "Point", "coordinates": [lon, lat] },
"properties": {
"names": names,
"count": len(names),
"popup": ", ".join(names)
}
})
geojson = { "type": "FeatureCollection", "features": features }
with open(geojson_file, "w", encoding='utf-8') as f:
json.dump(geojson, f, indent=2)
print(f"Generated {geojson_file} with {len(features)} clustered POIs.")

View File

@@ -0,0 +1,45 @@
#!/usr/bin/env python3
"""
convert_cities.py
BoopLabs Pupmap Europe/Nordics Cities GeoJSON
Version: 2025-10-03
"""
import geopandas as gpd
# ---------- User paths ----------
cities_shp = "ne_10m_populated_places.shp"
output_dir = "/mnt/storage/docker-data/pupmap/www/data/"
# ---------- Europe + Nordics ISO3 ----------
europe_nordics = [
'ALB','AND','AUT','BEL','BIH','BGR','HRV','CYP','CZE','DNK','EST','FIN','FRA','DEU',
'GRC','HUN','ISL','IRL','ITA','LVA','LTU','LUX','MLT','MDA','MCO','MNE','NLD','NOR',
'POL','PRT','ROU','RUS','SMR','SRB','SVK','SVN','ESP','SWE','CHE','UKR','GBR','VAT'
]
# ---------- Load cities shapefile ----------
print("Processing cities...")
cities = gpd.read_file(cities_shp)
# Filter Europe/Nordics
if 'ADM0_A3' in cities.columns:
cities_filtered = cities[cities['ADM0_A3'].isin(europe_nordics)].copy()
else:
cities_filtered = cities.copy() # fallback: include all
# Rename columns to match map expectations
cities_filtered = cities_filtered.rename(columns={
'NAME': 'name',
'ADM0NAME': 'country',
'POP_MAX': 'population'
})
# Keep only required columns
cities_filtered = cities_filtered[['name','country','population','geometry']]
# Save to GeoJSON
cities_geojson_path = output_dir + "world_cities_europe.geojson"
cities_filtered.to_file(cities_geojson_path, driver='GeoJSON')
print(f"Saved {cities_geojson_path} ({len(cities_filtered)} features)")

Binary file not shown.

View File

@@ -0,0 +1,31 @@
import geopandas as gpd
# --- Input shapefile ---
shapefile_path = "ne_10m_populated_places.shp"
output_geojson = "world_cities_europe_clean.geojson"
# --- Load cities shapefile ---
cities = gpd.read_file(shapefile_path)
# --- Filter Europe + Nordics ---
europe_iso3 = [
'AUT','BEL','CHE','DEU','DNK','ESP','FIN','FRA',
'GBR','ITA','NOR','NLD','SWE','ISL','IRL','LUX'
]
cities = cities[cities['ADM0_A3'].isin(europe_iso3)]
# --- Ensure columns ---
if 'POP_MAX' not in cities.columns:
cities['POP_MAX'] = 0
else:
cities['POP_MAX'] = cities['POP_MAX'].fillna(0).astype(int)
cities = cities[['NAME','POP_MAX','geometry']]
# --- Remove empty geometries ---
cities = cities[~cities['geometry'].is_empty]
# --- Save to GeoJSON ---
cities.to_file(output_geojson, driver="GeoJSON")
print(f"[+] Saved {len(cities)} cities to {output_geojson}")

View File

@@ -0,0 +1,72 @@
import geopandas as gpd
import os
# -----------------------------
# Settings
# -----------------------------
output_dir = "/mnt/storage/docker-data/pupmap/www/data/sources/"
os.makedirs(output_dir, exist_ok=True)
# Europe + Nordics country codes (for cities)
europe_nordics = [
'AL','AD','AT','BE','BA','BG','HR','CY','CZ','DK','EE','FI','FR','DE',
'GR','HU','IS','IE','IT','LV','LI','LT','LU','MT','MD','MC','ME','NL',
'MK','NO','PL','PT','RO','RU','SM','RS','SK','SI','ES','SE','CH','UA','GB'
]
# -----------------------------
# Process Cities
# -----------------------------
print("Processing cities...")
cities = gpd.read_file("ne_10m_populated_places/ne_10m_populated_places.shp")
cities_filtered = cities[cities['ADM0_A3'].isin(europe_nordics)].copy()
# Extract coordinates from geometry
cities_filtered['lon'] = cities_filtered.geometry.x
cities_filtered['lat'] = cities_filtered.geometry.y
# Keep needed columns + geometry
cities_filtered = cities_filtered[['NAME','ADM0NAME','lat','lon','POP_MAX','geometry']]
cities_filtered = cities_filtered.rename(columns={
'NAME':'name',
'ADM0NAME':'country',
'POP_MAX':'population'
})
# Drop any duplicate columns
cities_filtered = cities_filtered.loc[:, ~cities_filtered.columns.duplicated()]
cities_geojson_path = os.path.join(output_dir, "world_cities_europe.geojson")
cities_filtered.to_file(cities_geojson_path, driver='GeoJSON')
print(f"Saved {cities_geojson_path}")
# -----------------------------
# Process Roads
# -----------------------------
print("Processing roads...")
roads = gpd.read_file("ne_10m_roads/ne_10m_roads.shp")
# Filter by Europe/Nordics bounding box
minx, miny, maxx, maxy = -25.0, 34.0, 40.0, 72.0
roads_filtered = roads.cx[minx:maxx, miny:maxy].copy()
# Remove duplicate columns
roads_filtered = roads_filtered.loc[:, ~roads_filtered.columns.duplicated()]
# Pick columns: use FULLNAME/FCLASS if they exist
if 'FULLNAME' in roads_filtered.columns and 'FCLASS' in roads_filtered.columns:
roads_filtered = roads_filtered[['FULLNAME','FCLASS','geometry']]
roads_filtered = roads_filtered.rename(columns={'FULLNAME':'name','FCLASS':'type'})
else:
# fallback: take first two non-geometry columns
geom_col = 'geometry'
other_cols = [c for c in roads_filtered.columns if c != geom_col]
roads_filtered = roads_filtered[other_cols[:2] + [geom_col]]
roads_filtered = roads_filtered.rename(columns={other_cols[0]:'name', other_cols[1]:'type'})
roads_geojson_path = os.path.join(output_dir, "roads_europe.geojson")
roads_filtered.to_file(roads_geojson_path, driver='GeoJSON')
print(f"Saved {roads_geojson_path}")
print("✅ All GeoJSON files are ready for MapLibre!")

View File

@@ -0,0 +1,71 @@
#!/usr/bin/env python3
"""
geopandasconvert_fixed.py
BoopLabs Pupmap Europe/Nordics GeoJSON generator
Version: 2025-10-03
"""
import geopandas as gpd
# ---------- User paths ----------
cities_shp = "ne_10m_populated_places.shp"
roads_shp = "ne_10m_roads.shp"
output_dir = "/mnt/storage/docker-data/pupmap/www/data/sources/"
# ---------- Europe + Nordics filter ----------
europe_nordics = [
'ALB','AND','AUT','BEL','BIH','BGR','HRV','CYP','CZE','DNK','EST','FIN','FRA','DEU',
'GRC','HUN','ISL','IRL','ITA','LVA','LTU','LUX','MLT','MDA','MCO','MNE','NLD','NOR',
'POL','PRT','ROU','RUS','SMR','SRB','SVK','SVN','ESP','SWE','CHE','UKR','GBR','VAT'
]
# ---------- Convert cities ----------
print("Processing cities...")
cities = gpd.read_file(cities_shp)
# Keep only Europe/Nordics
cities_filtered = cities[cities['ADM0_A3'].isin(europe_nordics)].copy()
# Ensure expected properties exist
cities_filtered = cities_filtered.rename(columns={
'NAME': 'name',
'ADM0NAME': 'country',
'POP_MAX': 'population'
})
# Keep only required columns
cities_filtered = cities_filtered[['name','country','population','geometry']]
# Save to GeoJSON
cities_geojson_path = output_dir + "world_cities_europe.geojson"
cities_filtered.to_file(cities_geojson_path, driver='GeoJSON')
print(f"Saved {cities_geojson_path} ({len(cities_filtered)} features)")
# ---------- Convert roads ----------
print("Processing roads...")
roads = gpd.read_file(roads_shp)
# Keep only Europe/Nordics
roads_filtered = roads[roads['ADM0_A3'].isin(europe_nordics)].copy()
# Rename the main type column to 'type' (if needed)
if 'TYPE' in roads_filtered.columns:
roads_filtered = roads_filtered.rename(columns={'TYPE': 'type'})
elif 'fclass' in roads_filtered.columns:
roads_filtered = roads_filtered.rename(columns={'fclass': 'type'})
else:
roads_filtered['type'] = 'road' # fallback
# Keep only necessary columns
roads_filtered = roads_filtered[['type','geometry']]
# Remove duplicate column names (sometimes shapefiles have duplicates)
roads_filtered = roads_filtered.loc[:, ~roads_filtered.columns.duplicated()]
# Save to GeoJSON
roads_geojson_path = output_dir + "roads_europe.geojson"
roads_filtered.to_file(roads_geojson_path, driver='GeoJSON')
print(f"Saved {roads_geojson_path} ({len(roads_filtered)} features)")

View File

@@ -0,0 +1,47 @@
import geopandas as gpd
# --- 1. Clean Cities ---
cities_path = "world_cities_europe.geojson"
cities_clean_path = "world_cities_europe_clean.geojson"
cities = gpd.read_file(cities_path)
# Ensure POP_MAX exists and numeric
if 'POP_MAX' not in cities.columns:
cities['POP_MAX'] = 0
else:
cities['POP_MAX'] = cities['POP_MAX'].fillna(0)
cities['POP_MAX'] = cities['POP_MAX'].astype(int)
# Remove empty geometries
cities = cities[~cities['geometry'].is_empty]
cities.to_file(cities_clean_path, driver="GeoJSON")
print(f"[+] Cleaned cities saved to {cities_clean_path}")
# --- 2. Clean Roads ---
roads_path = "roads_europe.geojson"
roads_clean_path = "roads_europe_clean.geojson"
roads = gpd.read_file(roads_path)
# Remove empty geometries
roads = roads[~roads['geometry'].is_empty]
# Add 'type' property based on 'fclass'
def classify_road(fclass):
if str(fclass).lower() in ['motorway', 'primary']:
return 'major'
else:
return 'minor'
if 'fclass' in roads.columns:
roads['type'] = roads['fclass'].apply(classify_road)
else:
# If no fclass, mark everything as minor
roads['type'] = 'minor'
roads.to_file(roads_clean_path, driver="GeoJSON")
print(f"[+] Cleaned roads saved to {roads_clean_path}")

Binary file not shown.

View File

@@ -0,0 +1,518 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head profile="http://gmpg.org/xfn/11">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Natural Earth &raquo; Blog Archive &raquo; Populated Places - Free vector and raster map data at 1:10m, 1:50m, and 1:110m scales </title>
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
<link rel="alternate" type="application/rss+xml" title="Natural Earth RSS Feed" href="https://www.naturalearthdata.com/feed/" />
<link rel="pingback" href="http://www.naturalearthdata.com/xmlrpc.php" />
<script type="text/javascript" src="http://www.naturalearthdata.com/wp-content/themes/NEV/includes/js/suckerfish.js"></script>
<!--[if lt IE 7]>
<script src="http://ie7-js.googlecode.com/svn/version/2.0(beta3)/IE7.js" type="text/javascript"></script>
<script defer="defer" type="text/javascript" src="http://www.naturalearthdata.com/wp-content/themes/NEV/includes/js/pngfix.js"></script>
<![endif]-->
<link rel="stylesheet" href="http://www.naturalearthdata.com/wp-content/themes/NEV/style.css" type="text/css" media="screen" />
<link rel='dns-prefetch' href='//s.w.org' />
<script type="text/javascript">
window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/13.0.0\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/13.0.0\/svg\/","svgExt":".svg","source":{"concatemoji":"http:\/\/www.naturalearthdata.com\/wp-includes\/js\/wp-emoji-release.min.js?ver=5.5.9"}};
!function(e,a,t){var n,r,o,i=a.createElement("canvas"),p=i.getContext&&i.getContext("2d");function s(e,t){var a=String.fromCharCode;p.clearRect(0,0,i.width,i.height),p.fillText(a.apply(this,e),0,0);e=i.toDataURL();return p.clearRect(0,0,i.width,i.height),p.fillText(a.apply(this,t),0,0),e===i.toDataURL()}function c(e){var t=a.createElement("script");t.src=e,t.defer=t.type="text/javascript",a.getElementsByTagName("head")[0].appendChild(t)}for(o=Array("flag","emoji"),t.supports={everything:!0,everythingExceptFlag:!0},r=0;r<o.length;r++)t.supports[o[r]]=function(e){if(!p||!p.fillText)return!1;switch(p.textBaseline="top",p.font="600 32px Arial",e){case"flag":return s([127987,65039,8205,9895,65039],[127987,65039,8203,9895,65039])?!1:!s([55356,56826,55356,56819],[55356,56826,8203,55356,56819])&&!s([55356,57332,56128,56423,56128,56418,56128,56421,56128,56430,56128,56423,56128,56447],[55356,57332,8203,56128,56423,8203,56128,56418,8203,56128,56421,8203,56128,56430,8203,56128,56423,8203,56128,56447]);case"emoji":return!s([55357,56424,8205,55356,57212],[55357,56424,8203,55356,57212])}return!1}(o[r]),t.supports.everything=t.supports.everything&&t.supports[o[r]],"flag"!==o[r]&&(t.supports.everythingExceptFlag=t.supports.everythingExceptFlag&&t.supports[o[r]]);t.supports.everythingExceptFlag=t.supports.everythingExceptFlag&&!t.supports.flag,t.DOMReady=!1,t.readyCallback=function(){t.DOMReady=!0},t.supports.everything||(n=function(){t.readyCallback()},a.addEventListener?(a.addEventListener("DOMContentLoaded",n,!1),e.addEventListener("load",n,!1)):(e.attachEvent("onload",n),a.attachEvent("onreadystatechange",function(){"complete"===a.readyState&&t.readyCallback()})),(n=t.source||{}).concatemoji?c(n.concatemoji):n.wpemoji&&n.twemoji&&(c(n.twemoji),c(n.wpemoji)))}(window,document,window._wpemojiSettings);
</script>
<style type="text/css">
img.wp-smiley,
img.emoji {
display: inline !important;
border: none !important;
box-shadow: none !important;
height: 1em !important;
width: 1em !important;
margin: 0 .07em !important;
vertical-align: -0.1em !important;
background: none !important;
padding: 0 !important;
}
</style>
<link rel='stylesheet' id='wp-block-library-css' href='http://www.naturalearthdata.com/wp-includes/css/dist/block-library/style.min.css?ver=5.5.9' type='text/css' media='all' />
<link rel='stylesheet' id='bbp-child-bbpress-css' href='http://www.naturalearthdata.com/wp-content/themes/NEV/css/bbpress.css?ver=2.6.6' type='text/css' media='screen' />
<link rel="https://api.w.org/" href="https://www.naturalearthdata.com/wp-json/" /><link rel="alternate" type="application/json" href="https://www.naturalearthdata.com/wp-json/wp/v2/posts/472" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://www.naturalearthdata.com/xmlrpc.php?rsd" />
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://www.naturalearthdata.com/wp-includes/wlwmanifest.xml" />
<link rel='prev' title='Antarctic Ice Shelves' href='https://www.naturalearthdata.com/downloads/10m-physical-vectors/10m-antarctic-ice-shelves/' />
<link rel='next' title='Admin 2 &#8211; Counties' href='https://www.naturalearthdata.com/downloads/10m-cultural-vectors/10m-admin-2-counties/' />
<meta name="generator" content="WordPress 5.5.9" />
<link rel="canonical" href="https://www.naturalearthdata.com/downloads/10m-cultural-vectors/10m-populated-places/" />
<link rel='shortlink' href='https://www.naturalearthdata.com/?p=472' />
<link rel="alternate" type="application/json+oembed" href="https://www.naturalearthdata.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F10m-cultural-vectors%2F10m-populated-places%2F" />
<link rel="alternate" type="text/xml+oembed" href="https://www.naturalearthdata.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F10m-cultural-vectors%2F10m-populated-places%2F&#038;format=xml" />
<script type="text/javascript">
/* <![CDATA[ */
var ajaxurl = 'https://www.naturalearthdata.com/wp-admin/admin-ajax.php';
/* ]]> */
</script>
<!-- begin gallery scripts -->
<link rel="stylesheet" href="http://www.naturalearthdata.com/wp-content/plugins/featured-content-gallery/css/jd.gallery.css.php" type="text/css" media="screen" charset="utf-8"/>
<link rel="stylesheet" href="http://www.naturalearthdata.com/wp-content/plugins/featured-content-gallery/css/jd.gallery.css" type="text/css" media="screen" charset="utf-8"/>
<script type="text/javascript" src="http://www.naturalearthdata.com/wp-content/plugins/featured-content-gallery/scripts/mootools.v1.11.js"></script>
<script type="text/javascript" src="http://www.naturalearthdata.com/wp-content/plugins/featured-content-gallery/scripts/jd.gallery.js.php"></script>
<script type="text/javascript" src="http://www.naturalearthdata.com/wp-content/plugins/featured-content-gallery/scripts/jd.gallery.transitions.js"></script>
<!-- end gallery scripts -->
<link href="http://www.naturalearthdata.com/wp-content/themes/NEV/css/default.css" rel="stylesheet" type="text/css" />
<style type="text/css">.recentcomments a{display:inline !important;padding:0 !important;margin:0 !important;}</style><!--[if lte IE 7]>
<link rel="stylesheet" type="text/css" href="http://www.naturalearthdata.com/wp-content/themes/NEV/ie.css" />
<![endif]-->
<script src="http://www.naturalearthdata.com/wp-content/themes/NEV/js/jquery-1.2.6.min.js" type="text/javascript" charset="utf-8"></script>
<script>
jQuery.noConflict();
</script>
<script type="text/javascript" charset="utf-8">
$(function(){
var tabContainers = $('div#maintabdiv > div');
tabContainers.hide().filter('#comments').show();
$('div#maintabdiv ul#tabnav a').click(function () {
tabContainers.hide();
tabContainers.filter(this.hash).show();
$('div#maintabdiv ul#tabnav a').removeClass('current');
$(this).addClass('current');
return false;
}).filter('#comments').click();
});
</script>
<script type="text/javascript" language="javascript" src="http://www.naturalearthdata.com/dataTables/media/js/jquery.dataTables.js"></script>
<script type="text/javascript" charset="utf-8">
$(document).ready(function() {
$('#ne_table').dataTable();
} );
</script>
</head>
<body>
<div id="page">
<div id="header">
<div id="headerimg">
<h1><a href="https://www.naturalearthdata.com/"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/nev_logo.png" alt="Natural Earth title="Natural Earth" /></a></h1>
<div class="description">Free vector and raster map data at 1:10m, 1:50m, and 1:110m scales</div>
<div class="header_search"><form method="get" id="searchform" action="https://www.naturalearthdata.com/">
<label class="hidden" for="s">Search for:</label>
<div><input type="text" value="" name="s" id="s" />
<input type="submit" id="searchsubmit" value="Search" />
</div>
</form>
</div>
<!--<div class="translate_panel" style="align:top; margin-left:650px; top:50px;">
<div id="google_translate_element" style="float:left;"></div>
<script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'en'
}, 'google_translate_element');
}
</script>
<script src="http://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>
</div>-->
</div>
</div>
<div id="pagemenu" style="align:bottom;">
<ul id="page-list" class="clearfix"><li class="page_item page-item-4"><a href="https://www.naturalearthdata.com/">Home</a></li>
<li class="page_item page-item-10"><a href="https://www.naturalearthdata.com/features/">Features</a></li>
<li class="page_item page-item-12 page_item_has_children"><a href="https://www.naturalearthdata.com/downloads/">Downloads</a></li>
<li class="page_item page-item-6 current_page_parent"><a href="https://www.naturalearthdata.com/blog/">Blog</a></li>
<li class="page_item page-item-5044"><a href="https://www.naturalearthdata.com/issues/">Issues</a></li>
<li class="page_item page-item-366"><a href="https://www.naturalearthdata.com/corrections/">Corrections</a></li>
<li class="page_item page-item-16 page_item_has_children"><a href="https://www.naturalearthdata.com/about/">About</a></li>
</ul>
</div>
<hr /><div id="main">
<div id="content" class="narrowcolumn">
<div class="post" id="post-472">
<h2>Populated Places</h2>
<div class="entry">
<div class="downloadPromoBlock" style="float: left;">
<div style="float: left; width: 170px;"><img loading="lazy" class="alignnone size-full wp-image-1918" title="pop_thumb" src="https://www.naturalearthdata.com/wp-content/uploads/2009/09/pop_thumb.png" alt="pop_thumb" width="150" height="97" /></div>
<div style="float: left; width: 410px;"><em>City and town points, from Tokyo to Wasilla, Cairo to Kandahar</em><br />
<div class="download-link-div">
<a class="download-link" rel="nofollow" title="Downloaded 285695 times (Shapefile, geoDB, or TIFF format)" onclick="if (window.urchinTracker) urchinTracker ('https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places.zip');" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places.zip">Download populated places</a> <span class="download-link-span">(2.68 MB) version 5.1.2</span>
</div> <div class="download-link-div">
<a class="download-link" rel="nofollow" title="Downloaded 88271 times (Shapefile, geoDB, or TIFF format)" onclick="if (window.urchinTracker) urchinTracker ('https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places_simple.zip');" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places_simple.zip">Download simple (less columns)</a> <span class="download-link-span">(636.84 KB) version 5.1.2</span>
</div><br />
<span id="more-472"></span></div>
</div>
<div class="downloadMainBlock" style="float: left;">
<p><strong>About</strong></p>
<p>Point symbols with name attributes. Includes all admin-0 and many admin-1 capitals, major cities and towns, plus a sampling of smaller towns in sparsely inhabited regions. We favor regional significance over population census in determining our selection of places. Use the scale rankings to filter the number of towns that appear on your map.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1920" title="pop_banner" src="https://www.naturalearthdata.com/wp-content/uploads/2009/09/pop_banner.png" alt="pop_banner" width="580" height="150" srcset="https://www.naturalearthdata.com/wp-content/uploads/2009/09/pop_banner.png 580w, https://www.naturalearthdata.com/wp-content/uploads/2009/09/pop_banner-300x77.png 300w" sizes="(max-width: 580px) 100vw, 580px" /></p>
<p><a href="http://www.ornl.gov/sci/landscan/">LandScan</a> derived population estimates are provided for 90% of our cities. Those lacking population estimates are often in sparsely inhabited areas. We provide a range of population values that account for the total &#8220;metropolitan&#8221; population rather than it&#8217;s administrative boundary population. Use the PopMax column to size your town labels. Starting in version 1.1, popMax has been throttled down to the UN estimated metro population for the ~500 largest urban areas in the world. This affects towns in China, India, and parts of Africa where our Landscan counting method usually over estimated.</p>
<p>Population estimates were derived from the LANDSCAN dataset maintained and distributed by the Oak Ridge National Laboratory. These data were converted from raster to vector and pixels with fewer than 200 persons per square kilometer were removed from the dataset as they were classified as rural. Once urban pixels were selected, these pixels were aggregated into contiguous units. Concurrently Thiessen polygons were created based on the selected city points. The Thiessen polygons were used to intersect the contiguous city boundaries to produce bounded areas for the cities. As a result, our estimates capture a metropolitan and micropolitan populations per city regardless of administrative units.</p>
<p>Once intersected, the contiguous polygons were recalculated, using aerial interpolation assuming uniform population distribution within each pixel, to determine the population total. This process was conducted multiple times, for each scale level, to produce population estimates for each city at nested scales of 1:300 million, 1:110 million, 1:50 million, 1:20 million, and 1:10 million. </p>
<div class="download-link-div">
<a class="download-link" rel="nofollow" title="Downloaded 6887 times (Shapefile, geoDB, or TIFF format)" onclick="if (window.urchinTracker) urchinTracker ('https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_urban_areas_landscan.zip');" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_urban_areas_landscan.zip">Download landscan urban areas</a> <span class="download-link-span">(13.01 MB) version 4.0.0</span>
</div>
<p><strong>Population ranks</strong></p>
<p>Are calculated as rank_max and rank_min using this general VB formula that can be pasted into ArcMap Field Calculator advanced area (set your output to x):</p>
<blockquote><p>
a = [pop_max]</p>
<p>if( a > 10000000 ) then<br />
x = 14<br />
elseif( a > 5000000 ) then<br />
x = 13<br />
elseif( a > 1000000 ) then<br />
x = 12<br />
elseif( a > 500000 ) then<br />
x = 11<br />
elseif( a > 200000 ) then<br />
x = 10<br />
elseif( a > 100000 ) then<br />
x = 9<br />
elseif( a > 50000 ) then<br />
x = 8<br />
elseif( a > 20000 ) then<br />
x = 7<br />
elseif( a > 10000 ) then<br />
x = 6<br />
elseif( a > 5000 ) then<br />
x = 5<br />
elseif( a > 2000 ) then<br />
x = 4<br />
elseif( a > 1000 ) then<br />
x = 3<br />
elseif( a > 200 ) then<br />
x = 2<br />
elseif( a > 0 ) then<br />
x = 1<br />
else<br />
x = 0<br />
end if</p></blockquote>
<p><strong>Issues</strong></p>
<p>While we don&#8217;t want to show every admin-1 capital, for those countries where we show most admin-1 capitals, we should have a complete set. If you find we are missing one, please log it in the Cx tool at right.</p>
<p><strong>Version History</strong></p>
<ul>
<li>
<a rel="nofollow" title="Download version 5.1.2 of ne_10m_populated_places.zip" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places.zip">5.1.2</a>
</li>
<li>
<a rel="nofollow" title="Download version 5.1.0 of ne_10m_populated_places.zip" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places.zip?version=5.1.0">5.1.0</a>
</li>
<li>
<a rel="nofollow" title="Download version 5.0.1 of ne_10m_populated_places.zip" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places.zip?version=5.0.1">5.0.1</a>
</li>
<li>
<a rel="nofollow" title="Download version 5.0.0 of ne_10m_populated_places.zip" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places.zip?version=5.0.0">5.0.0</a>
</li>
<li>
<a rel="nofollow" title="Download version 4.1.0 of ne_10m_populated_places.zip" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places.zip?version=4.1.0">4.1.0</a>
</li>
<li>
<a rel="nofollow" title="Download version 4.0.0 of ne_10m_populated_places.zip" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places.zip?version=4.0.0">4.0.0</a>
</li>
<li>
<a rel="nofollow" title="Download version 3.3.1 of ne_10m_populated_places.zip" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places.zip?version=3.3.1">3.3.1</a>
</li>
<li>
<a rel="nofollow" title="Download version 3.0.0 of ne_10m_populated_places.zip" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places.zip?version=3.0.0">3.0.0</a>
</li>
<li>
2.0.0
</li>
<li>
1.4.0
</li>
</ul>
<p><a href="https://github.com/nvkelso/natural-earth-vector/blob/master/CHANGELOG">The master changelog is available on Github »</a>
</div>
<p class="postmetadata2">
<small>
This entry was posted
on Monday, September 14th, 2009 at 2:00 am and is filed under <a href="https://www.naturalearthdata.com/download/downloads/10m-cultural-vectors/" rel="category tag">10m-cultural-vectors</a>.
You can follow any responses to this entry through the <a href="https://www.naturalearthdata.com/downloads/10m-cultural-vectors/10m-populated-places/feed/">RSS 2.0</a> feed.
Both comments and pings are currently closed.
</small>
</p>
</div>
</div>
<!-- You can start editing here. -->
<!-- If comments are closed. -->
<p class="nocomments">Comments are closed.</p>
</div>
<div id="sidebar">
<ul>
<li id="rssfeeds">Subscribe: <a href="https://www.naturalearthdata.com/feed/">Entries</a> | <a href="https://www.naturalearthdata.com/comments/feed/">Comments</a></li>
<li id="search-3" class="widget widget_search"><h2 class="widgettitle">Search</h2>
<form method="get" id="searchform" action="https://www.naturalearthdata.com/">
<label class="hidden" for="s">Search for:</label>
<div><input type="text" value="" name="s" id="s" />
<input type="submit" id="searchsubmit" value="Search" />
</div>
</form>
</li>
<li id="linkcat-2" class="widget widget_links"><h2 class="widgettitle">Links</h2>
<ul class='xoxo blogroll'>
<li><a href="http://www.nacis.org">NACIS</a></li>
</ul>
</li>
<li id="tag_cloud-3" class="widget widget_tag_cloud"><h2 class="widgettitle">Tags</h2>
<div class="tagcloud"><a href="https://www.naturalearthdata.com/tag/10m/" class="tag-cloud-link tag-link-65 tag-link-position-1" style="font-size: 16.4pt;" aria-label="10m (2 items)">10m</a>
<a href="https://www.naturalearthdata.com/tag/50m/" class="tag-cloud-link tag-link-64 tag-link-position-2" style="font-size: 8pt;" aria-label="50m (1 item)">50m</a>
<a href="https://www.naturalearthdata.com/tag/90/" class="tag-cloud-link tag-link-61 tag-link-position-3" style="font-size: 8pt;" aria-label="90 (1 item)">90</a>
<a href="https://www.naturalearthdata.com/tag/180/" class="tag-cloud-link tag-link-60 tag-link-position-4" style="font-size: 8pt;" aria-label="180 (1 item)">180</a>
<a href="https://www.naturalearthdata.com/tag/admin-0/" class="tag-cloud-link tag-link-40 tag-link-position-5" style="font-size: 8pt;" aria-label="admin-0 (1 item)">admin-0</a>
<a href="https://www.naturalearthdata.com/tag/bjorn/" class="tag-cloud-link tag-link-46 tag-link-position-6" style="font-size: 8pt;" aria-label="bjorn (1 item)">bjorn</a>
<a href="https://www.naturalearthdata.com/tag/bounding-box/" class="tag-cloud-link tag-link-68 tag-link-position-7" style="font-size: 8pt;" aria-label="bounding box (1 item)">bounding box</a>
<a href="https://www.naturalearthdata.com/tag/browser/" class="tag-cloud-link tag-link-47 tag-link-position-8" style="font-size: 8pt;" aria-label="browser (1 item)">browser</a>
<a href="https://www.naturalearthdata.com/tag/change-log/" class="tag-cloud-link tag-link-74 tag-link-position-9" style="font-size: 8pt;" aria-label="change log (1 item)">change log</a>
<a href="https://www.naturalearthdata.com/tag/corrections/" class="tag-cloud-link tag-link-34 tag-link-position-10" style="font-size: 8pt;" aria-label="corrections (1 item)">corrections</a>
<a href="https://www.naturalearthdata.com/tag/countries/" class="tag-cloud-link tag-link-41 tag-link-position-11" style="font-size: 8pt;" aria-label="countries (1 item)">countries</a>
<a href="https://www.naturalearthdata.com/tag/downloads/" class="tag-cloud-link tag-link-432 tag-link-position-12" style="font-size: 8pt;" aria-label="Downloads (1 item)">Downloads</a>
<a href="https://www.naturalearthdata.com/tag/error/" class="tag-cloud-link tag-link-67 tag-link-position-13" style="font-size: 8pt;" aria-label="error (1 item)">error</a>
<a href="https://www.naturalearthdata.com/tag/extent/" class="tag-cloud-link tag-link-69 tag-link-position-14" style="font-size: 8pt;" aria-label="extent (1 item)">extent</a>
<a href="https://www.naturalearthdata.com/tag/ext-js/" class="tag-cloud-link tag-link-56 tag-link-position-15" style="font-size: 8pt;" aria-label="ext js (1 item)">ext js</a>
<a href="https://www.naturalearthdata.com/tag/forums/" class="tag-cloud-link tag-link-35 tag-link-position-16" style="font-size: 8pt;" aria-label="forums (1 item)">forums</a>
<a href="https://www.naturalearthdata.com/tag/geoext/" class="tag-cloud-link tag-link-57 tag-link-position-17" style="font-size: 8pt;" aria-label="geoext (1 item)">geoext</a>
<a href="https://www.naturalearthdata.com/tag/hans/" class="tag-cloud-link tag-link-63 tag-link-position-18" style="font-size: 8pt;" aria-label="hans (1 item)">hans</a>
<a href="https://www.naturalearthdata.com/tag/imagery/" class="tag-cloud-link tag-link-59 tag-link-position-19" style="font-size: 8pt;" aria-label="imagery (1 item)">imagery</a>
<a href="https://www.naturalearthdata.com/tag/import/" class="tag-cloud-link tag-link-66 tag-link-position-20" style="font-size: 8pt;" aria-label="import (1 item)">import</a>
<a href="https://www.naturalearthdata.com/tag/mapnik/" class="tag-cloud-link tag-link-53 tag-link-position-21" style="font-size: 8pt;" aria-label="mapnik (1 item)">mapnik</a>
<a href="https://www.naturalearthdata.com/tag/maptiler/" class="tag-cloud-link tag-link-51 tag-link-position-22" style="font-size: 8pt;" aria-label="maptiler (1 item)">maptiler</a>
<a href="https://www.naturalearthdata.com/tag/map-tiles/" class="tag-cloud-link tag-link-49 tag-link-position-23" style="font-size: 8pt;" aria-label="map tiles (1 item)">map tiles</a>
<a href="https://www.naturalearthdata.com/tag/marine-boundary/" class="tag-cloud-link tag-link-76 tag-link-position-24" style="font-size: 8pt;" aria-label="marine boundary (1 item)">marine boundary</a>
<a href="https://www.naturalearthdata.com/tag/national-parks/" class="tag-cloud-link tag-link-75 tag-link-position-25" style="font-size: 8pt;" aria-label="national parks (1 item)">national parks</a>
<a href="https://www.naturalearthdata.com/tag/new-data/" class="tag-cloud-link tag-link-36 tag-link-position-26" style="font-size: 8pt;" aria-label="new data (1 item)">new data</a>
<a href="https://www.naturalearthdata.com/tag/nsd/" class="tag-cloud-link tag-link-72 tag-link-position-27" style="font-size: 8pt;" aria-label="nsd (1 item)">nsd</a>
<a href="https://www.naturalearthdata.com/tag/openlayers/" class="tag-cloud-link tag-link-55 tag-link-position-28" style="font-size: 8pt;" aria-label="openlayers (1 item)">openlayers</a>
<a href="https://www.naturalearthdata.com/tag/physical-labels/" class="tag-cloud-link tag-link-38 tag-link-position-29" style="font-size: 8pt;" aria-label="physical labels (1 item)">physical labels</a>
<a href="https://www.naturalearthdata.com/tag/pngng/" class="tag-cloud-link tag-link-52 tag-link-position-30" style="font-size: 8pt;" aria-label="pngng (1 item)">pngng</a>
<a href="https://www.naturalearthdata.com/tag/populated-places/" class="tag-cloud-link tag-link-39 tag-link-position-31" style="font-size: 8pt;" aria-label="populated places (1 item)">populated places</a>
<a href="https://www.naturalearthdata.com/tag/raster/" class="tag-cloud-link tag-link-58 tag-link-position-32" style="font-size: 16.4pt;" aria-label="raster (2 items)">raster</a>
<a href="https://www.naturalearthdata.com/tag/terrestrial-hypsography/" class="tag-cloud-link tag-link-45 tag-link-position-33" style="font-size: 8pt;" aria-label="terrestrial hypsography (1 item)">terrestrial hypsography</a>
<a href="https://www.naturalearthdata.com/tag/tfw/" class="tag-cloud-link tag-link-62 tag-link-position-34" style="font-size: 8pt;" aria-label="tfw (1 item)">tfw</a>
<a href="https://www.naturalearthdata.com/tag/thematic-mapping/" class="tag-cloud-link tag-link-48 tag-link-position-35" style="font-size: 8pt;" aria-label="thematic mapping (1 item)">thematic mapping</a>
<a href="https://www.naturalearthdata.com/tag/themese/" class="tag-cloud-link tag-link-37 tag-link-position-36" style="font-size: 8pt;" aria-label="themese (1 item)">themese</a>
<a href="https://www.naturalearthdata.com/tag/tif/" class="tag-cloud-link tag-link-71 tag-link-position-37" style="font-size: 8pt;" aria-label="tif (1 item)">tif</a>
<a href="https://www.naturalearthdata.com/tag/tilecache/" class="tag-cloud-link tag-link-54 tag-link-position-38" style="font-size: 8pt;" aria-label="tilecache (1 item)">tilecache</a>
<a href="https://www.naturalearthdata.com/tag/tiles/" class="tag-cloud-link tag-link-50 tag-link-position-39" style="font-size: 8pt;" aria-label="tiles (1 item)">tiles</a>
<a href="https://www.naturalearthdata.com/tag/time-zones/" class="tag-cloud-link tag-link-44 tag-link-position-40" style="font-size: 8pt;" aria-label="time zones (1 item)">time zones</a>
<a href="https://www.naturalearthdata.com/tag/towns/" class="tag-cloud-link tag-link-42 tag-link-position-41" style="font-size: 8pt;" aria-label="towns (1 item)">towns</a>
<a href="https://www.naturalearthdata.com/tag/transportation/" class="tag-cloud-link tag-link-43 tag-link-position-42" style="font-size: 8pt;" aria-label="transportation (1 item)">transportation</a>
<a href="https://www.naturalearthdata.com/tag/update/" class="tag-cloud-link tag-link-33 tag-link-position-43" style="font-size: 22pt;" aria-label="update (3 items)">update</a>
<a href="https://www.naturalearthdata.com/tag/visitors/" class="tag-cloud-link tag-link-73 tag-link-position-44" style="font-size: 8pt;" aria-label="visitors (1 item)">visitors</a>
<a href="https://www.naturalearthdata.com/tag/world-file/" class="tag-cloud-link tag-link-70 tag-link-position-45" style="font-size: 8pt;" aria-label="world file (1 item)">world file</a></div>
</li>
<li id="recent-comments-3" class="widget widget_recent_comments"><h2 class="widgettitle">Recent Comments</h2>
<ul id="recentcomments"><li class="recentcomments"><span class="comment-author-link"><a href='http://www.bbscode.top/index.php/2022/03/17/aligning-natural-earth-geojson-and-raster-to-render-in-d3/' rel='external nofollow ugc' class='url'>Aligning Natural Earth Geojson and Raster to render in D3 &#8211; BBSCODE</a></span> on <a href="https://www.naturalearthdata.com/downloads/50m-raster-data/50m-shaded-relief/comment-page-1/#comment-6144">1:50m Shaded Relief</a></li><li class="recentcomments"><span class="comment-author-link"><a href='https://wp.csusm.edu/adahn/2022/03/14/qgis-a-mapping-tool/' rel='external nofollow ugc' class='url'>QGIS a Mapping Tool &#8211; April Dahn</a></span> on <a href="https://www.naturalearthdata.com/downloads/50m-raster-data/50m-shaded-relief/comment-page-1/#comment-6143">1:50m Shaded Relief</a></li><li class="recentcomments"><span class="comment-author-link"><a href='https://wp.csusm.edu/rsheehan/2022/03/13/more-mapping-with-qgis/' rel='external nofollow ugc' class='url'>More Mapping with QGIS &#8211; History 502</a></span> on <a href="https://www.naturalearthdata.com/downloads/50m-raster-data/50m-shaded-relief/comment-page-1/#comment-6142">1:50m Shaded Relief</a></li><li class="recentcomments"><span class="comment-author-link"><a href='http://ivermectin6mg.quest' rel='external nofollow ugc' class='url'>buy ivermectin 12 mg tablets</a></span> on <a href="https://www.naturalearthdata.com/forums/topic/download-urls-double-slash/comment-page-1/#comment-6141">Download URLs double slash</a></li><li class="recentcomments"><span class="comment-author-link"><a href='https://slacker.ro/2021/10/01/building-a-beautiful-and-clear-map-from-massive-complex-data/' rel='external nofollow ugc' class='url'>Building A Beautiful And Clear Map From Massive, Complex Data &#8211; Slacker News</a></span> on <a href="https://www.naturalearthdata.com/downloads/10m-raster-data/10m-shaded-relief/comment-page-1/#comment-6140">1:10m Shaded Relief</a></li></ul></li>
<li id="bbp_topics_widget-2" class="widget widget_display_topics"><h2 class="widgettitle">Recent Forum Topics</h2>
<ul class="bbp-topics-widget newness">
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/natural-earth-in-wagner-vii/">Natural Earth in Wagner VII</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/frax/" title="View Hugo Ahlenius&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://2.gravatar.com/avatar/2bd3b3347fd34f7dd734bf4b78fb353d?s=14&#038;d=retro&#038;r=g' srcset='http://2.gravatar.com/avatar/2bd3b3347fd34f7dd734bf4b78fb353d?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">Hugo Ahlenius</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/downloads-are-404ing/">Downloads are 404ing</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/nathaniel/" title="View Nathaniel&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://2.gravatar.com/avatar/e679fead4b7cb50b7b60e7c4f99bc348?s=14&#038;d=retro&#038;r=g' srcset='http://2.gravatar.com/avatar/e679fead4b7cb50b7b60e7c4f99bc348?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">Nathaniel</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/disputed-territories-type-field/">Disputed Territories: &quot;type&quot; field</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/alykat/" title="View alykat&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://2.gravatar.com/avatar/8c60e36c6b6542afb738eb950429d6ba?s=14&#038;d=retro&#038;r=g' srcset='http://2.gravatar.com/avatar/8c60e36c6b6542afb738eb950429d6ba?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">alykat</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/iso-code-confusion/">ISO code confusion</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/nth/" title="View nth&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://0.gravatar.com/avatar/f5060dc4d25dbced2933380279e0c1c5?s=14&#038;d=retro&#038;r=g' srcset='http://0.gravatar.com/avatar/f5060dc4d25dbced2933380279e0c1c5?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">nth</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/bad-adm1name-encoding-in-version-3-0-0-and-missing-diacritics-in-name/">Bad ADM1NAME, encoding in version 3.0.0 and missing diacritics in NAME</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/pfunes/" title="View pfunes&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://2.gravatar.com/avatar/eded29f5ea7062bfe350281260b0596b?s=14&#038;d=retro&#038;r=g' srcset='http://2.gravatar.com/avatar/eded29f5ea7062bfe350281260b0596b?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">pfunes</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/u-s-county-shape-file-2/">U.S. County Shape File</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/gzingsheim/" title="View gzingsheim&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://1.gravatar.com/avatar/d617957f9d5d7d062deeadbfa011d8b6?s=14&#038;d=retro&#038;r=g' srcset='http://1.gravatar.com/avatar/d617957f9d5d7d062deeadbfa011d8b6?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">gzingsheim</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/projection-proportion-compatibility/">Projection / Proportion / Compatibility?</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/liquidized/" title="View Liquidized&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://0.gravatar.com/avatar/06422086ab7aab2b767e3df7f7a67bdd?s=14&#038;d=retro&#038;r=g' srcset='http://0.gravatar.com/avatar/06422086ab7aab2b767e3df7f7a67bdd?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">Liquidized</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/download-urls-double-slash/">Download URLs double slash</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/vastur/" title="View vastur&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://2.gravatar.com/avatar/e07b4667376982e080d64cf0250acc9b?s=14&#038;d=retro&#038;r=g' srcset='http://2.gravatar.com/avatar/e07b4667376982e080d64cf0250acc9b?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">vastur</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/map-soft-writer-me/">map soft &#8211; writer: me</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/krzysztof/" title="View krzysztof&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://2.gravatar.com/avatar/be9767706435aa6e10d50185f6def05e?s=14&#038;d=retro&#038;r=g' srcset='http://2.gravatar.com/avatar/be9767706435aa6e10d50185f6def05e?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">krzysztof</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/unicode-encoding-issue-ne_10m_lakes-dbf/">Unicode encoding issue &#8211; ne_10m_lakes.dbf</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/filter-1/" title="View filter.1&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://1.gravatar.com/avatar/daae13b2efd52a3865320ada9ed3ae18?s=14&#038;d=retro&#038;r=g' srcset='http://1.gravatar.com/avatar/daae13b2efd52a3865320ada9ed3ae18?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">filter.1</span></a></span>
</li>
</ul>
</li>
</ul>
</div>
</div>
<hr />
<div id="footer">
<div id="footerarea">
<div id="footerlogos">
<p>Supported by:</p>
<div class="footer-ad-box">
<a href="http://www.nacis.org" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/nacis.png" alt="NACIS" /></a>
</div>
<div class="footer-ad-box">
<a href="http://www.cartotalk.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/cartotalk_ad.png" alt="Cartotalk" /></a>
</div>
<div class="footer-ad-box">
<img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/mapgiving.png" alt="Mapgiving" />
</div>
<div class="footer-ad-box">
<a href="http://www.geography.wisc.edu/cartography/" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/wisconsin.png" alt="University of Wisconsin Madison - Cartography Dept." /></a>
</div>
<div class="footer-ad-box">
<a href="http://www.shadedrelief.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/shaded_relief.png" alt="Shaded Relief" /></a>
</div>
<div class="footer-ad-box">
<a href="http://www.xnrproductions.com " target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/xnr.png" alt="XNR Productions" /></a>
</div>
<p style="clear:both;"></p>
<div class="footer-ad-box">
<a href="http://www.freac.fsu.edu" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/fsu.png" alt="Florida State University - FREAC" /></a>
</div>
<div class="footer-ad-box">
<a href="http://www.springercartographics.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/scllc.png" alt="Springer Cartographics LLC" /></a>
</div>
<div class="footer-ad-box">
<a href="http://www.washingtonpost.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/wpost.png" alt="Washington Post" /></a>
</div>
<div class="footer-ad-box">
<a href="http://www.redgeographics.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/redgeo.png" alt="Red Geographics" /></a>
</div>
<div class="footer-ad-box">
<a href="http://kelsocartography.com/blog " target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/kelso.png" alt="Kelso Cartography" /></a>
</div>
<p style="clear:both;"></p>
<div class="footer-ad-box">
<a href="http://www.avenza.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/avenza.png" alt="Avenza Systems Inc." /></a>
</div>
<div class="footer-ad-box">
<a href="http://www.stamen.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/stamen_ne_logo.png" alt="Stamen Design" /></a>
</div>
</div>
<p style="clear:both;"></p>
<span id="footerleft">
&copy; 2009 - 2022. Natural Earth. All rights reserved.
</span>
<span id="footerright">
<!-- Please help promote WordPress and simpleX. Do not remove -->
<div>Powered by <a href="http://wordpress.org/">WordPress</a></div>
<div><a href="http://www.naturalearthdata.com/wp-admin">Staff Login &raquo;</a></div>
</span>
</div>
</div>
<script type='text/javascript' src='http://www.naturalearthdata.com/wp-includes/js/wp-embed.min.js?ver=5.5.9' id='wp-embed-js'></script>
</body>
</html>
<!-- Dynamic page generated in 0.317 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2022-05-13 18:56:20 -->
<!-- Compression = gzip -->
<!-- super cache -->

View File

@@ -0,0 +1 @@
UTF-8

View File

@@ -0,0 +1 @@
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]

View File

@@ -0,0 +1,508 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head profile="http://gmpg.org/xfn/11">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Natural Earth &raquo; Blog Archive &raquo; Roads - Free vector and raster map data at 1:10m, 1:50m, and 1:110m scales </title>
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
<link rel="alternate" type="application/rss+xml" title="Natural Earth RSS Feed" href="https://www.naturalearthdata.com/feed/" />
<link rel="pingback" href="http://www.naturalearthdata.com/xmlrpc.php" />
<script type="text/javascript" src="http://www.naturalearthdata.com/wp-content/themes/NEV/includes/js/suckerfish.js"></script>
<!--[if lt IE 7]>
<script src="http://ie7-js.googlecode.com/svn/version/2.0(beta3)/IE7.js" type="text/javascript"></script>
<script defer="defer" type="text/javascript" src="http://www.naturalearthdata.com/wp-content/themes/NEV/includes/js/pngfix.js"></script>
<![endif]-->
<link rel="stylesheet" href="http://www.naturalearthdata.com/wp-content/themes/NEV/style.css" type="text/css" media="screen" />
<link rel='dns-prefetch' href='//s.w.org' />
<script type="text/javascript">
window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/13.0.0\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/13.0.0\/svg\/","svgExt":".svg","source":{"concatemoji":"http:\/\/www.naturalearthdata.com\/wp-includes\/js\/wp-emoji-release.min.js?ver=5.5.7"}};
!function(e,a,t){var n,r,o,i=a.createElement("canvas"),p=i.getContext&&i.getContext("2d");function s(e,t){var a=String.fromCharCode;p.clearRect(0,0,i.width,i.height),p.fillText(a.apply(this,e),0,0);e=i.toDataURL();return p.clearRect(0,0,i.width,i.height),p.fillText(a.apply(this,t),0,0),e===i.toDataURL()}function c(e){var t=a.createElement("script");t.src=e,t.defer=t.type="text/javascript",a.getElementsByTagName("head")[0].appendChild(t)}for(o=Array("flag","emoji"),t.supports={everything:!0,everythingExceptFlag:!0},r=0;r<o.length;r++)t.supports[o[r]]=function(e){if(!p||!p.fillText)return!1;switch(p.textBaseline="top",p.font="600 32px Arial",e){case"flag":return s([127987,65039,8205,9895,65039],[127987,65039,8203,9895,65039])?!1:!s([55356,56826,55356,56819],[55356,56826,8203,55356,56819])&&!s([55356,57332,56128,56423,56128,56418,56128,56421,56128,56430,56128,56423,56128,56447],[55356,57332,8203,56128,56423,8203,56128,56418,8203,56128,56421,8203,56128,56430,8203,56128,56423,8203,56128,56447]);case"emoji":return!s([55357,56424,8205,55356,57212],[55357,56424,8203,55356,57212])}return!1}(o[r]),t.supports.everything=t.supports.everything&&t.supports[o[r]],"flag"!==o[r]&&(t.supports.everythingExceptFlag=t.supports.everythingExceptFlag&&t.supports[o[r]]);t.supports.everythingExceptFlag=t.supports.everythingExceptFlag&&!t.supports.flag,t.DOMReady=!1,t.readyCallback=function(){t.DOMReady=!0},t.supports.everything||(n=function(){t.readyCallback()},a.addEventListener?(a.addEventListener("DOMContentLoaded",n,!1),e.addEventListener("load",n,!1)):(e.attachEvent("onload",n),a.attachEvent("onreadystatechange",function(){"complete"===a.readyState&&t.readyCallback()})),(n=t.source||{}).concatemoji?c(n.concatemoji):n.wpemoji&&n.twemoji&&(c(n.twemoji),c(n.wpemoji)))}(window,document,window._wpemojiSettings);
</script>
<style type="text/css">
img.wp-smiley,
img.emoji {
display: inline !important;
border: none !important;
box-shadow: none !important;
height: 1em !important;
width: 1em !important;
margin: 0 .07em !important;
vertical-align: -0.1em !important;
background: none !important;
padding: 0 !important;
}
</style>
<link rel='stylesheet' id='wp-block-library-css' href='http://www.naturalearthdata.com/wp-includes/css/dist/block-library/style.min.css?ver=5.5.7' type='text/css' media='all' />
<link rel='stylesheet' id='bbp-child-bbpress-css' href='http://www.naturalearthdata.com/wp-content/themes/NEV/css/bbpress.css?ver=2.6.6' type='text/css' media='screen' />
<link rel="https://api.w.org/" href="https://www.naturalearthdata.com/wp-json/" /><link rel="alternate" type="application/json" href="https://www.naturalearthdata.com/wp-json/wp/v2/posts/2718" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://www.naturalearthdata.com/xmlrpc.php?rsd" />
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://www.naturalearthdata.com/wp-includes/wlwmanifest.xml" />
<link rel='prev' title='Railroads' href='https://www.naturalearthdata.com/downloads/10m-cultural-vectors/railroads/' />
<link rel='next' title='Graticules' href='https://www.naturalearthdata.com/downloads/10m-physical-vectors/10m-graticules/' />
<meta name="generator" content="WordPress 5.5.7" />
<link rel="canonical" href="https://www.naturalearthdata.com/downloads/10m-cultural-vectors/roads/" />
<link rel='shortlink' href='https://www.naturalearthdata.com/?p=2718' />
<link rel="alternate" type="application/json+oembed" href="https://www.naturalearthdata.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F10m-cultural-vectors%2Froads%2F" />
<link rel="alternate" type="text/xml+oembed" href="https://www.naturalearthdata.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwww.naturalearthdata.com%2Fdownloads%2F10m-cultural-vectors%2Froads%2F&#038;format=xml" />
<script type="text/javascript">
/* <![CDATA[ */
var ajaxurl = 'https://www.naturalearthdata.com/wp-admin/admin-ajax.php';
/* ]]> */
</script>
<!-- begin gallery scripts -->
<link rel="stylesheet" href="http://www.naturalearthdata.com/wp-content/plugins/featured-content-gallery/css/jd.gallery.css.php" type="text/css" media="screen" charset="utf-8"/>
<link rel="stylesheet" href="http://www.naturalearthdata.com/wp-content/plugins/featured-content-gallery/css/jd.gallery.css" type="text/css" media="screen" charset="utf-8"/>
<script type="text/javascript" src="http://www.naturalearthdata.com/wp-content/plugins/featured-content-gallery/scripts/mootools.v1.11.js"></script>
<script type="text/javascript" src="http://www.naturalearthdata.com/wp-content/plugins/featured-content-gallery/scripts/jd.gallery.js.php"></script>
<script type="text/javascript" src="http://www.naturalearthdata.com/wp-content/plugins/featured-content-gallery/scripts/jd.gallery.transitions.js"></script>
<!-- end gallery scripts -->
<link href="http://www.naturalearthdata.com/wp-content/themes/NEV/css/default.css" rel="stylesheet" type="text/css" />
<style type="text/css">.recentcomments a{display:inline !important;padding:0 !important;margin:0 !important;}</style><!--[if lte IE 7]>
<link rel="stylesheet" type="text/css" href="http://www.naturalearthdata.com/wp-content/themes/NEV/ie.css" />
<![endif]-->
<script src="http://www.naturalearthdata.com/wp-content/themes/NEV/js/jquery-1.2.6.min.js" type="text/javascript" charset="utf-8"></script>
<script>
jQuery.noConflict();
</script>
<script type="text/javascript" charset="utf-8">
$(function(){
var tabContainers = $('div#maintabdiv > div');
tabContainers.hide().filter('#comments').show();
$('div#maintabdiv ul#tabnav a').click(function () {
tabContainers.hide();
tabContainers.filter(this.hash).show();
$('div#maintabdiv ul#tabnav a').removeClass('current');
$(this).addClass('current');
return false;
}).filter('#comments').click();
});
</script>
<script type="text/javascript" language="javascript" src="http://www.naturalearthdata.com/dataTables/media/js/jquery.dataTables.js"></script>
<script type="text/javascript" charset="utf-8">
$(document).ready(function() {
$('#ne_table').dataTable();
} );
</script>
</head>
<body>
<div id="page">
<div id="header">
<div id="headerimg">
<h1><a href="https://www.naturalearthdata.com/"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/nev_logo.png" alt="Natural Earth title="Natural Earth" /></a></h1>
<div class="description">Free vector and raster map data at 1:10m, 1:50m, and 1:110m scales</div>
<div class="header_search"><form method="get" id="searchform" action="https://www.naturalearthdata.com/">
<label class="hidden" for="s">Search for:</label>
<div><input type="text" value="" name="s" id="s" />
<input type="submit" id="searchsubmit" value="Search" />
</div>
</form>
</div>
<!--<div class="translate_panel" style="align:top; margin-left:650px; top:50px;">
<div id="google_translate_element" style="float:left;"></div>
<script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'en'
}, 'google_translate_element');
}
</script>
<script src="http://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>
</div>-->
</div>
</div>
<div id="pagemenu" style="align:bottom;">
<ul id="page-list" class="clearfix"><li class="page_item page-item-4"><a href="https://www.naturalearthdata.com/">Home</a></li>
<li class="page_item page-item-10"><a href="https://www.naturalearthdata.com/features/">Features</a></li>
<li class="page_item page-item-12 page_item_has_children"><a href="https://www.naturalearthdata.com/downloads/">Downloads</a></li>
<li class="page_item page-item-6 current_page_parent"><a href="https://www.naturalearthdata.com/blog/">Blog</a></li>
<li class="page_item page-item-5044"><a href="https://www.naturalearthdata.com/issues/">Issues</a></li>
<li class="page_item page-item-366"><a href="https://www.naturalearthdata.com/corrections/">Corrections</a></li>
<li class="page_item page-item-16 page_item_has_children"><a href="https://www.naturalearthdata.com/about/">About</a></li>
</ul>
</div>
<hr /><div id="main">
<div id="content" class="narrowcolumn">
<div class="post" id="post-2718">
<h2>Roads</h2>
<div class="entry">
<div class="downloadPromoBlock" style="float: left;">
<div style="float: left; width: 170px;"><img loading="lazy" class="downloadPromoImage" title="urban_area_thumb" src="https://www.naturalearthdata.com/wp-content/uploads/2010/05/na_rds_thumb.png" alt="urban_area_thumb" width="150" height="100" align="left" /></div>
<div style="float: left; width: 410px;"><em>Transportation. </em><div class="download-link-div">
<a class="download-link" rel="nofollow" title="Downloaded 88783 times (Shapefile, geoDB, or TIFF format)" onclick="if (window.urchinTracker) urchinTracker ('https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_roads.zip');" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_roads.zip">Download roads</a> <span class="download-link-span">(8.65 MB) version 5.0.0</span>
</div>
<div class="download-link-div">
<a class="download-link" rel="nofollow" title="Downloaded 18254 times (Shapefile, geoDB, or TIFF format)" onclick="if (window.urchinTracker) urchinTracker ('https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_roads_north_america.zip');" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_roads_north_america.zip">Download North America supplement</a> <span class="download-link-span">(45.57 MB) version 4.0.0</span>
</div>
<p><span id="more-2718"></span></p>
</div>
</div>
<div class="downloadMainBlock" style="float: left;">
<p><strong>About</strong></p>
<p>The &#8220;basic&#8221; roads at 10m scale are from CEC North America Environmental Atlas with no attributes and only 1 scale rank class. The &#8220;basic&#8221; is only available in North America due to the source. We&#8217;d like to expand this to world wide, do you have data to contribute?</p>
<p>The &#8220;supplementary&#8221; data in North America includes preliminary scale ranking and full list of attributes and is graciously contributed by <a href="http://www.xnrproductions.com/">XNR Productions</a>.</p>
<p><em>(below) North America.</em><em> </em></p>
<p><img loading="lazy" title="na_rds_banner" src="https://www.naturalearthdata.com/wp-content/uploads/2010/05/na_rds_banner.png" alt="na_rds_banner" width="580" height="150" /></p>
<p><strong>Database background notes</strong></p>
<p>The database is at 1:1,000,000 scale (but holds up to 1:250,000 scale), covering all of the United States and Canada, Alaska, Hawaii, Puerto Rico, Mexico, and Belize and includes the following attributes:</p>
<p>NUMBER:</p>
<ul>
<li>Route number</li>
</ul>
<p>CLASS:</p>
<ul>
<li> Interstate (Interstates and Quebec Autoroutes)</li>
<li> Federal (US Highways, Mexican Federal Highways, Trans-Canada Highways)</li>
<li> State (US State, Mexican State, and Canadian Provincial Highways)</li>
<li> Other (any other road class)</li>
<li> Closed (road is closed to public)</li>
<li> U/C (road is under construction)</li>
</ul>
<p>TYPE:</p>
<ul>
<li> Tollway</li>
<li> Freeway</li>
<li> Primary</li>
<li> Secondary</li>
<li> Other Paved</li>
<li> Unpaved</li>
<li> Winter (ice road, open winter only)</li>
<li> Trail</li>
<li> Ferry</li>
</ul>
<p>DIVIDED:</p>
<ul>
<li>Whether or not the road is divided. This field is only listed for roads of TYPE Tollway, Freeway, Primary, or Secondary.</li>
</ul>
<p>STATE:</p>
<ul>
<li>State or province the road is in.</li>
</ul>
<p><strong>Issues</strong></p>
<ul>
<li> BC ferries (AK and WA portions clip on BC boundary)</li>
<li>normalize eastern Canada minor road coverage (remove some or add to US?)</li>
</ul>
<p><strong>Related projects</strong></p>
<p><a href="http://geoservice.pbl.nl/website/flexviewer/index.html?config=cfg/PBL_GRIP.xml&#038;center=5.2,52.1333&#038;scale=5000000">Global Roads Inventory Project</a> &#8211; From the Netherlands Environmental Assessment Agency. The data in the GRIP database is presented as is. GRIP is a combination of some commercial and many publicly collected datasets and classified along the UNSDI-T datamodel. GRIP data scales vary between 1:100K to 1:1M. The GRIP density rasters and publicly collected features of GRIP are available under a BY-SA Creative Commons Licence. </p>
<p><strong>Version History</strong></p>
<ul>
<li>
<a rel="nofollow" title="Download version 5.0.0 of ne_10m_roads.zip" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_roads.zip">5.0.0</a>
</li>
<li>
<a rel="nofollow" title="Download version 4.0.0 of ne_10m_roads.zip" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_roads.zip?version=4.0.0">4.0.0</a>
</li>
<li>
<a rel="nofollow" title="Download version 3.0.0 of ne_10m_roads.zip" href="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_roads.zip?version=3.0.0">3.0.0</a>
</li>
<li>
2.0.0
</li>
<li>
1.3.0
</li>
<li>
1.2.0
</li>
</ul>
<p><a href="https://github.com/nvkelso/natural-earth-vector/blob/master/CHANGELOG">The master changelog is available on Github »</a></p>
</div>
<p class="postmetadata2">
<small>
This entry was posted
on Monday, September 14th, 2009 at 1:30 am and is filed under <a href="https://www.naturalearthdata.com/download/downloads/10m-cultural-vectors/" rel="category tag">10m-cultural-vectors</a>, <a href="https://www.naturalearthdata.com/download/downloads/featured-on-homepage/" rel="category tag">Featured on Homepage</a>.
You can follow any responses to this entry through the <a href="https://www.naturalearthdata.com/downloads/10m-cultural-vectors/roads/feed/">RSS 2.0</a> feed.
Both comments and pings are currently closed.
</small>
</p>
</div>
</div>
<!-- You can start editing here. -->
<!-- If comments are closed. -->
<p class="nocomments">Comments are closed.</p>
</div>
<div id="sidebar">
<ul>
<li id="rssfeeds">Subscribe: <a href="https://www.naturalearthdata.com/feed/">Entries</a> | <a href="https://www.naturalearthdata.com/comments/feed/">Comments</a></li>
<li id="search-3" class="widget widget_search"><h2 class="widgettitle">Search</h2>
<form method="get" id="searchform" action="https://www.naturalearthdata.com/">
<label class="hidden" for="s">Search for:</label>
<div><input type="text" value="" name="s" id="s" />
<input type="submit" id="searchsubmit" value="Search" />
</div>
</form>
</li>
<li id="linkcat-2" class="widget widget_links"><h2 class="widgettitle">Links</h2>
<ul class='xoxo blogroll'>
<li><a href="http://www.nacis.org">NACIS</a></li>
</ul>
</li>
<li id="tag_cloud-3" class="widget widget_tag_cloud"><h2 class="widgettitle">Tags</h2>
<div class="tagcloud"><a href="https://www.naturalearthdata.com/tag/10m/" class="tag-cloud-link tag-link-65 tag-link-position-1" style="font-size: 16.4pt;" aria-label="10m (2 items)">10m</a>
<a href="https://www.naturalearthdata.com/tag/50m/" class="tag-cloud-link tag-link-64 tag-link-position-2" style="font-size: 8pt;" aria-label="50m (1 item)">50m</a>
<a href="https://www.naturalearthdata.com/tag/90/" class="tag-cloud-link tag-link-61 tag-link-position-3" style="font-size: 8pt;" aria-label="90 (1 item)">90</a>
<a href="https://www.naturalearthdata.com/tag/180/" class="tag-cloud-link tag-link-60 tag-link-position-4" style="font-size: 8pt;" aria-label="180 (1 item)">180</a>
<a href="https://www.naturalearthdata.com/tag/admin-0/" class="tag-cloud-link tag-link-40 tag-link-position-5" style="font-size: 8pt;" aria-label="admin-0 (1 item)">admin-0</a>
<a href="https://www.naturalearthdata.com/tag/bjorn/" class="tag-cloud-link tag-link-46 tag-link-position-6" style="font-size: 8pt;" aria-label="bjorn (1 item)">bjorn</a>
<a href="https://www.naturalearthdata.com/tag/bounding-box/" class="tag-cloud-link tag-link-68 tag-link-position-7" style="font-size: 8pt;" aria-label="bounding box (1 item)">bounding box</a>
<a href="https://www.naturalearthdata.com/tag/browser/" class="tag-cloud-link tag-link-47 tag-link-position-8" style="font-size: 8pt;" aria-label="browser (1 item)">browser</a>
<a href="https://www.naturalearthdata.com/tag/change-log/" class="tag-cloud-link tag-link-74 tag-link-position-9" style="font-size: 8pt;" aria-label="change log (1 item)">change log</a>
<a href="https://www.naturalearthdata.com/tag/corrections/" class="tag-cloud-link tag-link-34 tag-link-position-10" style="font-size: 8pt;" aria-label="corrections (1 item)">corrections</a>
<a href="https://www.naturalearthdata.com/tag/countries/" class="tag-cloud-link tag-link-41 tag-link-position-11" style="font-size: 8pt;" aria-label="countries (1 item)">countries</a>
<a href="https://www.naturalearthdata.com/tag/downloads/" class="tag-cloud-link tag-link-432 tag-link-position-12" style="font-size: 8pt;" aria-label="Downloads (1 item)">Downloads</a>
<a href="https://www.naturalearthdata.com/tag/error/" class="tag-cloud-link tag-link-67 tag-link-position-13" style="font-size: 8pt;" aria-label="error (1 item)">error</a>
<a href="https://www.naturalearthdata.com/tag/extent/" class="tag-cloud-link tag-link-69 tag-link-position-14" style="font-size: 8pt;" aria-label="extent (1 item)">extent</a>
<a href="https://www.naturalearthdata.com/tag/ext-js/" class="tag-cloud-link tag-link-56 tag-link-position-15" style="font-size: 8pt;" aria-label="ext js (1 item)">ext js</a>
<a href="https://www.naturalearthdata.com/tag/forums/" class="tag-cloud-link tag-link-35 tag-link-position-16" style="font-size: 8pt;" aria-label="forums (1 item)">forums</a>
<a href="https://www.naturalearthdata.com/tag/geoext/" class="tag-cloud-link tag-link-57 tag-link-position-17" style="font-size: 8pt;" aria-label="geoext (1 item)">geoext</a>
<a href="https://www.naturalearthdata.com/tag/hans/" class="tag-cloud-link tag-link-63 tag-link-position-18" style="font-size: 8pt;" aria-label="hans (1 item)">hans</a>
<a href="https://www.naturalearthdata.com/tag/imagery/" class="tag-cloud-link tag-link-59 tag-link-position-19" style="font-size: 8pt;" aria-label="imagery (1 item)">imagery</a>
<a href="https://www.naturalearthdata.com/tag/import/" class="tag-cloud-link tag-link-66 tag-link-position-20" style="font-size: 8pt;" aria-label="import (1 item)">import</a>
<a href="https://www.naturalearthdata.com/tag/mapnik/" class="tag-cloud-link tag-link-53 tag-link-position-21" style="font-size: 8pt;" aria-label="mapnik (1 item)">mapnik</a>
<a href="https://www.naturalearthdata.com/tag/maptiler/" class="tag-cloud-link tag-link-51 tag-link-position-22" style="font-size: 8pt;" aria-label="maptiler (1 item)">maptiler</a>
<a href="https://www.naturalearthdata.com/tag/map-tiles/" class="tag-cloud-link tag-link-49 tag-link-position-23" style="font-size: 8pt;" aria-label="map tiles (1 item)">map tiles</a>
<a href="https://www.naturalearthdata.com/tag/marine-boundary/" class="tag-cloud-link tag-link-76 tag-link-position-24" style="font-size: 8pt;" aria-label="marine boundary (1 item)">marine boundary</a>
<a href="https://www.naturalearthdata.com/tag/national-parks/" class="tag-cloud-link tag-link-75 tag-link-position-25" style="font-size: 8pt;" aria-label="national parks (1 item)">national parks</a>
<a href="https://www.naturalearthdata.com/tag/new-data/" class="tag-cloud-link tag-link-36 tag-link-position-26" style="font-size: 8pt;" aria-label="new data (1 item)">new data</a>
<a href="https://www.naturalearthdata.com/tag/nsd/" class="tag-cloud-link tag-link-72 tag-link-position-27" style="font-size: 8pt;" aria-label="nsd (1 item)">nsd</a>
<a href="https://www.naturalearthdata.com/tag/openlayers/" class="tag-cloud-link tag-link-55 tag-link-position-28" style="font-size: 8pt;" aria-label="openlayers (1 item)">openlayers</a>
<a href="https://www.naturalearthdata.com/tag/physical-labels/" class="tag-cloud-link tag-link-38 tag-link-position-29" style="font-size: 8pt;" aria-label="physical labels (1 item)">physical labels</a>
<a href="https://www.naturalearthdata.com/tag/pngng/" class="tag-cloud-link tag-link-52 tag-link-position-30" style="font-size: 8pt;" aria-label="pngng (1 item)">pngng</a>
<a href="https://www.naturalearthdata.com/tag/populated-places/" class="tag-cloud-link tag-link-39 tag-link-position-31" style="font-size: 8pt;" aria-label="populated places (1 item)">populated places</a>
<a href="https://www.naturalearthdata.com/tag/raster/" class="tag-cloud-link tag-link-58 tag-link-position-32" style="font-size: 16.4pt;" aria-label="raster (2 items)">raster</a>
<a href="https://www.naturalearthdata.com/tag/terrestrial-hypsography/" class="tag-cloud-link tag-link-45 tag-link-position-33" style="font-size: 8pt;" aria-label="terrestrial hypsography (1 item)">terrestrial hypsography</a>
<a href="https://www.naturalearthdata.com/tag/tfw/" class="tag-cloud-link tag-link-62 tag-link-position-34" style="font-size: 8pt;" aria-label="tfw (1 item)">tfw</a>
<a href="https://www.naturalearthdata.com/tag/thematic-mapping/" class="tag-cloud-link tag-link-48 tag-link-position-35" style="font-size: 8pt;" aria-label="thematic mapping (1 item)">thematic mapping</a>
<a href="https://www.naturalearthdata.com/tag/themese/" class="tag-cloud-link tag-link-37 tag-link-position-36" style="font-size: 8pt;" aria-label="themese (1 item)">themese</a>
<a href="https://www.naturalearthdata.com/tag/tif/" class="tag-cloud-link tag-link-71 tag-link-position-37" style="font-size: 8pt;" aria-label="tif (1 item)">tif</a>
<a href="https://www.naturalearthdata.com/tag/tilecache/" class="tag-cloud-link tag-link-54 tag-link-position-38" style="font-size: 8pt;" aria-label="tilecache (1 item)">tilecache</a>
<a href="https://www.naturalearthdata.com/tag/tiles/" class="tag-cloud-link tag-link-50 tag-link-position-39" style="font-size: 8pt;" aria-label="tiles (1 item)">tiles</a>
<a href="https://www.naturalearthdata.com/tag/time-zones/" class="tag-cloud-link tag-link-44 tag-link-position-40" style="font-size: 8pt;" aria-label="time zones (1 item)">time zones</a>
<a href="https://www.naturalearthdata.com/tag/towns/" class="tag-cloud-link tag-link-42 tag-link-position-41" style="font-size: 8pt;" aria-label="towns (1 item)">towns</a>
<a href="https://www.naturalearthdata.com/tag/transportation/" class="tag-cloud-link tag-link-43 tag-link-position-42" style="font-size: 8pt;" aria-label="transportation (1 item)">transportation</a>
<a href="https://www.naturalearthdata.com/tag/update/" class="tag-cloud-link tag-link-33 tag-link-position-43" style="font-size: 22pt;" aria-label="update (3 items)">update</a>
<a href="https://www.naturalearthdata.com/tag/visitors/" class="tag-cloud-link tag-link-73 tag-link-position-44" style="font-size: 8pt;" aria-label="visitors (1 item)">visitors</a>
<a href="https://www.naturalearthdata.com/tag/world-file/" class="tag-cloud-link tag-link-70 tag-link-position-45" style="font-size: 8pt;" aria-label="world file (1 item)">world file</a></div>
</li>
<li id="recent-comments-3" class="widget widget_recent_comments"><h2 class="widgettitle">Recent Comments</h2>
<ul id="recentcomments"><li class="recentcomments"><span class="comment-author-link"><a href='http://ivermectin3-mg.com' rel='external nofollow ugc' class='url'>ivermectin 3mg tablets</a></span> on <a href="https://www.naturalearthdata.com/forums/topic/download-urls-double-slash/comment-page-1/#comment-6131">Download URLs double slash</a></li><li class="recentcomments"><span class="comment-author-link"><a href='http://ivermectin3-mg.net' rel='external nofollow ugc' class='url'>stromectol 6 mg dosage</a></span> on <a href="https://www.naturalearthdata.com/forums/topic/download-urls-double-slash/comment-page-1/#comment-6130">Download URLs double slash</a></li><li class="recentcomments"><span class="comment-author-link"><a href='https://www.avenza.com/resources/2021/11/30/day-30-reflecting-on-the-30daymapchallenge/' rel='external nofollow ugc' class='url'>Avenza Systems | Map and Cartography Tools</a></span> on <a href="https://www.naturalearthdata.com/downloads/50m-raster-data/50m-manual-shaded-relief/comment-page-1/#comment-6129">1:50m Manual Shaded Relief</a></li><li class="recentcomments"><span class="comment-author-link"><a href='http://ivermectin-6mg.net' rel='external nofollow ugc' class='url'>ivermectin 6mg tablets</a></span> on <a href="https://www.naturalearthdata.com/forums/topic/download-urls-double-slash/comment-page-1/#comment-6128">Download URLs double slash</a></li><li class="recentcomments"><span class="comment-author-link"><a href='http://stromectol2ivermectin.com' rel='external nofollow ugc' class='url'>stromectol cvs</a></span> on <a href="https://www.naturalearthdata.com/forums/topic/download-urls-double-slash/comment-page-1/#comment-6127">Download URLs double slash</a></li></ul></li>
<li id="bbp_topics_widget-2" class="widget widget_display_topics"><h2 class="widgettitle">Recent Forum Topics</h2>
<ul class="bbp-topics-widget newness">
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/natural-earth-in-wagner-vii/">Natural Earth in Wagner VII</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/frax/" title="View Hugo Ahlenius&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://2.gravatar.com/avatar/2bd3b3347fd34f7dd734bf4b78fb353d?s=14&#038;d=retro&#038;r=g' srcset='http://2.gravatar.com/avatar/2bd3b3347fd34f7dd734bf4b78fb353d?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">Hugo Ahlenius</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/downloads-are-404ing/">Downloads are 404ing</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/nathaniel/" title="View Nathaniel&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://2.gravatar.com/avatar/e679fead4b7cb50b7b60e7c4f99bc348?s=14&#038;d=retro&#038;r=g' srcset='http://2.gravatar.com/avatar/e679fead4b7cb50b7b60e7c4f99bc348?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">Nathaniel</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/disputed-territories-type-field/">Disputed Territories: &quot;type&quot; field</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/alykat/" title="View alykat&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://2.gravatar.com/avatar/8c60e36c6b6542afb738eb950429d6ba?s=14&#038;d=retro&#038;r=g' srcset='http://2.gravatar.com/avatar/8c60e36c6b6542afb738eb950429d6ba?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">alykat</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/iso-code-confusion/">ISO code confusion</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/nth/" title="View nth&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://0.gravatar.com/avatar/f5060dc4d25dbced2933380279e0c1c5?s=14&#038;d=retro&#038;r=g' srcset='http://0.gravatar.com/avatar/f5060dc4d25dbced2933380279e0c1c5?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">nth</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/bad-adm1name-encoding-in-version-3-0-0-and-missing-diacritics-in-name/">Bad ADM1NAME, encoding in version 3.0.0 and missing diacritics in NAME</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/pfunes/" title="View pfunes&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://2.gravatar.com/avatar/eded29f5ea7062bfe350281260b0596b?s=14&#038;d=retro&#038;r=g' srcset='http://2.gravatar.com/avatar/eded29f5ea7062bfe350281260b0596b?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">pfunes</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/u-s-county-shape-file-2/">U.S. County Shape File</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/gzingsheim/" title="View gzingsheim&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://1.gravatar.com/avatar/d617957f9d5d7d062deeadbfa011d8b6?s=14&#038;d=retro&#038;r=g' srcset='http://1.gravatar.com/avatar/d617957f9d5d7d062deeadbfa011d8b6?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">gzingsheim</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/projection-proportion-compatibility/">Projection / Proportion / Compatibility?</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/liquidized/" title="View Liquidized&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://0.gravatar.com/avatar/06422086ab7aab2b767e3df7f7a67bdd?s=14&#038;d=retro&#038;r=g' srcset='http://0.gravatar.com/avatar/06422086ab7aab2b767e3df7f7a67bdd?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">Liquidized</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/download-urls-double-slash/">Download URLs double slash</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/vastur/" title="View vastur&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://2.gravatar.com/avatar/e07b4667376982e080d64cf0250acc9b?s=14&#038;d=retro&#038;r=g' srcset='http://2.gravatar.com/avatar/e07b4667376982e080d64cf0250acc9b?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">vastur</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/map-soft-writer-me/">map soft &#8211; writer: me</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/krzysztof/" title="View krzysztof&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://2.gravatar.com/avatar/be9767706435aa6e10d50185f6def05e?s=14&#038;d=retro&#038;r=g' srcset='http://2.gravatar.com/avatar/be9767706435aa6e10d50185f6def05e?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">krzysztof</span></a></span>
</li>
<li>
<a class="bbp-forum-title" href="https://www.naturalearthdata.com/forums/topic/unicode-encoding-issue-ne_10m_lakes-dbf/">Unicode encoding issue &#8211; ne_10m_lakes.dbf</a>
by <span class="topic-author"><a href="https://www.naturalearthdata.com/forums/users/filter-1/" title="View filter.1&#039;s profile" class="bbp-author-link"><span class="bbp-author-avatar"><img alt='' src='http://1.gravatar.com/avatar/daae13b2efd52a3865320ada9ed3ae18?s=14&#038;d=retro&#038;r=g' srcset='http://1.gravatar.com/avatar/daae13b2efd52a3865320ada9ed3ae18?s=28&#038;d=retro&#038;r=g 2x' class='avatar avatar-14 photo' height='14' width='14' loading='lazy'/></span><span class="bbp-author-name">filter.1</span></a></span>
</li>
</ul>
</li>
</ul>
</div>
</div>
<hr />
<div id="footer">
<div id="footerarea">
<div id="footerlogos">
<p>Supported by:</p>
<div class="footer-ad-box">
<a href="http://www.nacis.org" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/nacis.png" alt="NACIS" /></a>
</div>
<div class="footer-ad-box">
<a href="http://www.cartotalk.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/cartotalk_ad.png" alt="Cartotalk" /></a>
</div>
<div class="footer-ad-box">
<img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/mapgiving.png" alt="Mapgiving" />
</div>
<div class="footer-ad-box">
<a href="http://www.geography.wisc.edu/cartography/" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/wisconsin.png" alt="University of Wisconsin Madison - Cartography Dept." /></a>
</div>
<div class="footer-ad-box">
<a href="http://www.shadedrelief.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/shaded_relief.png" alt="Shaded Relief" /></a>
</div>
<div class="footer-ad-box">
<a href="http://www.xnrproductions.com " target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/xnr.png" alt="XNR Productions" /></a>
</div>
<p style="clear:both;"></p>
<div class="footer-ad-box">
<a href="http://www.freac.fsu.edu" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/fsu.png" alt="Florida State University - FREAC" /></a>
</div>
<div class="footer-ad-box">
<a href="http://www.springercartographics.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/scllc.png" alt="Springer Cartographics LLC" /></a>
</div>
<div class="footer-ad-box">
<a href="http://www.washingtonpost.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/wpost.png" alt="Washington Post" /></a>
</div>
<div class="footer-ad-box">
<a href="http://www.redgeographics.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/redgeo.png" alt="Red Geographics" /></a>
</div>
<div class="footer-ad-box">
<a href="http://kelsocartography.com/blog " target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/kelso.png" alt="Kelso Cartography" /></a>
</div>
<p style="clear:both;"></p>
<div class="footer-ad-box">
<a href="http://www.avenza.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/avenza.png" alt="Avenza Systems Inc." /></a>
</div>
<div class="footer-ad-box">
<a href="http://www.stamen.com" target="_blank"><img src="http://www.naturalearthdata.com/wp-content/themes/NEV/images/stamen_ne_logo.png" alt="Stamen Design" /></a>
</div>
</div>
<p style="clear:both;"></p>
<span id="footerleft">
&copy; 2009 - 2021. Natural Earth. All rights reserved.
</span>
<span id="footerright">
<!-- Please help promote WordPress and simpleX. Do not remove -->
<div>Powered by <a href="http://wordpress.org/">WordPress</a></div>
<div><a href="http://www.naturalearthdata.com/wp-admin">Staff Login &raquo;</a></div>
</span>
</div>
</div>
<script type='text/javascript' src='http://www.naturalearthdata.com/wp-includes/js/wp-embed.min.js?ver=5.5.7' id='wp-embed-js'></script>
</body>
</html>
<!-- Dynamic page generated in 1.059 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2021-12-07 19:24:20 -->
<!-- Compression = gzip -->
<!-- super cache -->

View File

@@ -0,0 +1 @@
5.0.0

View File

@@ -0,0 +1 @@
UTF-8

Binary file not shown.

View File

@@ -0,0 +1 @@
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,53 @@
#!/usr/bin/env python3
"""
convert_roads.py
BoopLabs Pupmap Europe/Nordics Roads GeoJSON
Version: 2025-10-03
"""
import geopandas as gpd
# ---------- User paths ----------
roads_shp = "ne_10m_roads.shp"
output_dir = "/mnt/storage/docker-data/pupmap/www/data/"
# ---------- Europe + Nordics ISO3 ----------
europe_nordics = [
'ALB','AND','AUT','BEL','BIH','BGR','HRV','CYP','CZE','DNK','EST','FIN','FRA','DEU',
'GRC','HUN','ISL','IRL','ITA','LVA','LTU','LUX','MLT','MDA','MCO','MNE','NLD','NOR',
'POL','PRT','ROU','RUS','SMR','SRB','SVK','SVN','ESP','SWE','CHE','UKR','GBR','VAT'
]
# ---------- Load roads shapefile ----------
print("Processing roads...")
roads = gpd.read_file(roads_shp)
# Filter Europe/Nordics only if ADM0_A3 exists
if 'ADM0_A3' in roads.columns:
roads_filtered = roads[roads['ADM0_A3'].isin(europe_nordics)].copy()
else:
roads_filtered = roads.copy() # fallback: include all
# Determine road type column
if 'TYPE' in roads_filtered.columns:
roads_filtered = roads_filtered.rename(columns={'TYPE': 'type'})
elif 'fclass' in roads_filtered.columns:
roads_filtered = roads_filtered.rename(columns={'fclass': 'type'})
elif 'ROADCLASS' in roads_filtered.columns:
roads_filtered = roads_filtered.rename(columns={'ROADCLASS': 'type'})
else:
roads_filtered['type'] = 'road' # fallback
# Keep only necessary columns
roads_filtered = roads_filtered[['type','geometry']]
# Remove duplicates and empty geometries
roads_filtered = roads_filtered.loc[:, ~roads_filtered.columns.duplicated()]
roads_filtered = roads_filtered[roads_filtered.geometry.notnull()]
# Save to GeoJSON
roads_geojson_path = output_dir + "roads_europe.geojson"
roads_filtered.to_file(roads_geojson_path, driver='GeoJSON')
print(f"Saved {roads_geojson_path} ({len(roads_filtered)} features)")

View File

@@ -0,0 +1,23 @@
import geopandas as gpd
# Load roads shapefile
gdf = gpd.read_file("/mnt/storage/docker-data/pupmap/www/data/sources/ne_10m_roads.shp")
# Filter by Europe/Nordics bounding box
bbox = (-25.0, 34.0, 35.0, 72.0) # lon_min, lat_min, lon_max, lat_max
gdf = gdf.cx[bbox[0]:bbox[2], bbox[1]:bbox[3]]
# Ensure WGS84 CRS
gdf = gdf.to_crs(epsg=4326)
# Add 'type' property if missing
if 'type' not in gdf.columns:
gdf['type'] = 'road'
else:
gdf['type'] = gdf['type'].fillna('road')
# Save to GeoJSON
gdf.to_file("/mnt/storage/docker-data/pupmap/www/data/roads_europe.geojson", driver="GeoJSON")
print("Cleaned roads saved to roads_europe.geojson")

View File

@@ -0,0 +1,22 @@
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
10.740350000000001,
59.90970000000001
]
},
"properties": {
"names": [
"SLMOslo"
],
"count": 1,
"popup": "SLMOslo"
}
}
]
}

View File

@@ -0,0 +1,124 @@
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
10.42,
59.21
]
},
"properties": {
"names": [
"BoltJW"
],
"count": 1,
"popup": "BoltJW"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
5.32,
60.39
]
},
"properties": {
"names": [
"Markos"
],
"count": 1,
"popup": "Markos"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
5.8,
58.870000000000005
]
},
"properties": {
"names": [
"PupFenling"
],
"count": 1,
"popup": "PupFenling"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
6.97,
51.45
]
},
"properties": {
"names": [
"PianoVanBarkhoven"
],
"count": 1,
"popup": "PianoVanBarkhoven"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
20.98,
70.04
]
},
"properties": {
"names": [
"NordicSub"
],
"count": 1,
"popup": "NordicSub"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
11.26,
60.33
]
},
"properties": {
"names": [
"PupCatalyst"
],
"count": 1,
"popup": "PupCatalyst"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
5.75,
58.86
]
},
"properties": {
"names": [
"PupSebbi"
],
"count": 1,
"popup": "PupSebbi"
}
}
]
}

View File

@@ -0,0 +1,42 @@
import csv
import json
from collections import defaultdict
csv_file = "places.csv"
geojson_file = "data/places.geojson"
GROUP_TOLERANCE = 0.00001 # cluster distance in degrees
def round_coord(coord):
return round(coord / GROUP_TOLERANCE) * GROUP_TOLERANCE
clusters = defaultdict(list)
with open(csv_file, newline='', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
lat = float(row['latitude'])
lon = float(row['longitude'])
name = row['name']
key = (round_coord(lat), round_coord(lon))
clusters[key].append(name)
features = []
for (lat, lon), names in clusters.items():
features.append({
"type": "Feature",
"geometry": { "type": "Point", "coordinates": [lon, lat] },
"properties": {
"names": names,
"count": len(names),
"popup": ", ".join(names)
}
})
geojson = { "type": "FeatureCollection", "features": features }
with open(geojson_file, "w", encoding='utf-8') as f:
json.dump(geojson, f, indent=2)
print(f"Generated {geojson_file} with {len(features)} clustered POIs.")

2
www/data/README.md Normal file
View File

@@ -0,0 +1,2 @@
Placeholder file world.pmtiles (120GB, didnt want to include).
Can be downloaded from https://maps.protomaps.com/builds/

0
www/data/index.html Normal file
View File

22
www/data/places.geojson Normal file
View File

@@ -0,0 +1,22 @@
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
10.740350000000001,
59.90970000000001
]
},
"properties": {
"names": [
"SLMOslo"
],
"count": 1,
"popup": "SLMOslo"
}
}
]
}

141
www/data/pois.geojson Normal file
View File

@@ -0,0 +1,141 @@
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
10.42,
59.21
]
},
"properties": {
"names": [
"BoltJW"
],
"count": 1,
"popup": "BoltJW"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
5.32,
60.39
]
},
"properties": {
"names": [
"Markos"
],
"count": 1,
"popup": "Markos"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
5.8,
58.870000000000005
]
},
"properties": {
"names": [
"PupFenling"
],
"count": 1,
"popup": "PupFenling"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
6.97,
51.45
]
},
"properties": {
"names": [
"PianoVanBarkhoven"
],
"count": 1,
"popup": "PianoVanBarkhoven"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
20.98,
70.04
]
},
"properties": {
"names": [
"NordicSub"
],
"count": 1,
"popup": "NordicSub"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
11.26,
60.33
]
},
"properties": {
"names": [
"PupCatalyst"
],
"count": 1,
"popup": "PupCatalyst"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
5.75,
58.86
]
},
"properties": {
"names": [
"PupSebbi"
],
"count": 1,
"popup": "PupSebbi"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
10.200000000000001,
59.74
]
},
"properties": {
"names": [
"PupTiff"
],
"count": 1,
"popup": "PupTiff"
}
}
]
}

File diff suppressed because one or more lines are too long

View File

View File

@@ -0,0 +1,487 @@
{
"type": "FeatureCollection",
"name": "world_cities_europe_clean",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{ "type": "Feature", "properties": { "NAME": "Delémont", "POP_MAX": 11315 }, "geometry": { "type": "Point", "coordinates": [ 7.3449995, 47.3699971 ] } },
{ "type": "Feature", "properties": { "NAME": "Neuchâtel", "POP_MAX": 31270 }, "geometry": { "type": "Point", "coordinates": [ 6.9229986, 46.9989991 ] } },
{ "type": "Feature", "properties": { "NAME": "Aarau", "POP_MAX": 15501 }, "geometry": { "type": "Point", "coordinates": [ 8.0340036, 47.3900041 ] } },
{ "type": "Feature", "properties": { "NAME": "Stans", "POP_MAX": 7475 }, "geometry": { "type": "Point", "coordinates": [ 8.3833025, 46.9500031 ] } },
{ "type": "Feature", "properties": { "NAME": "Sion", "POP_MAX": 28045 }, "geometry": { "type": "Point", "coordinates": [ 7.3539995, 46.239003 ] } },
{ "type": "Feature", "properties": { "NAME": "Herisau", "POP_MAX": 15438 }, "geometry": { "type": "Point", "coordinates": [ 9.2833025, 47.383299 ] } },
{ "type": "Feature", "properties": { "NAME": "Saint Gallen", "POP_MAX": 70572 }, "geometry": { "type": "Point", "coordinates": [ 9.3619986, 47.4229981 ] } },
{ "type": "Feature", "properties": { "NAME": "Bellinzona", "POP_MAX": 16572 }, "geometry": { "type": "Point", "coordinates": [ 9.0199986, 46.1970001 ] } },
{ "type": "Feature", "properties": { "NAME": "Glarus", "POP_MAX": 5681 }, "geometry": { "type": "Point", "coordinates": [ 9.0666996, 47.050002 ] } },
{ "type": "Feature", "properties": { "NAME": "Schaffhausen", "POP_MAX": 33863 }, "geometry": { "type": "Point", "coordinates": [ 8.6329985, 47.7060031 ] } },
{ "type": "Feature", "properties": { "NAME": "Schwyz", "POP_MAX": 14177 }, "geometry": { "type": "Point", "coordinates": [ 8.6480016, 47.019996 ] } },
{ "type": "Feature", "properties": { "NAME": "Frauenfeld", "POP_MAX": 21979 }, "geometry": { "type": "Point", "coordinates": [ 8.904888469310368, 47.552619422656129 ] } },
{ "type": "Feature", "properties": { "NAME": "Altdorf", "POP_MAX": 8678 }, "geometry": { "type": "Point", "coordinates": [ 8.6380026, 46.8790021 ] } },
{ "type": "Feature", "properties": { "NAME": "Zug", "POP_MAX": 23435 }, "geometry": { "type": "Point", "coordinates": [ 8.4870006, 47.178999 ] } },
{ "type": "Feature", "properties": { "NAME": "Falun", "POP_MAX": 36477 }, "geometry": { "type": "Point", "coordinates": [ 15.6470046, 60.613002 ] } },
{ "type": "Feature", "properties": { "NAME": "Nyköping", "POP_MAX": 27582 }, "geometry": { "type": "Point", "coordinates": [ 16.996082309454142, 58.751989933602339 ] } },
{ "type": "Feature", "properties": { "NAME": "Härnösand", "POP_MAX": 17016 }, "geometry": { "type": "Point", "coordinates": [ 17.9340036, 62.633997 ] } },
{ "type": "Feature", "properties": { "NAME": "Karlskrona", "POP_MAX": 35212 }, "geometry": { "type": "Point", "coordinates": [ 15.590754198529854, 56.162780641493903 ] } },
{ "type": "Feature", "properties": { "NAME": "Mérida", "POP_MAX": 52423 }, "geometry": { "type": "Point", "coordinates": [ -6.3379975, 38.912004 ] } },
{ "type": "Feature", "properties": { "NAME": "Assen", "POP_MAX": 62237 }, "geometry": { "type": "Point", "coordinates": [ 6.5500026, 53.0000011 ] } },
{ "type": "Feature", "properties": { "NAME": "Arnhem", "POP_MAX": 141674 }, "geometry": { "type": "Point", "coordinates": [ 5.9229996, 51.987996 ] } },
{ "type": "Feature", "properties": { "NAME": "Maastricht", "POP_MAX": 122378 }, "geometry": { "type": "Point", "coordinates": [ 5.6770025, 50.8529971 ] } },
{ "type": "Feature", "properties": { "NAME": "Zwolle", "POP_MAX": 111805 }, "geometry": { "type": "Point", "coordinates": [ 6.0969965, 52.5240001 ] } },
{ "type": "Feature", "properties": { "NAME": "Middelburg", "POP_MAX": 46485 }, "geometry": { "type": "Point", "coordinates": [ 3.6099995, 51.5019962 ] } },
{ "type": "Feature", "properties": { "NAME": "'s-Hertogenbosch", "POP_MAX": 134520 }, "geometry": { "type": "Point", "coordinates": [ 5.3166605, 51.6833371 ] } },
{ "type": "Feature", "properties": { "NAME": "Arendal", "POP_MAX": 30916 }, "geometry": { "type": "Point", "coordinates": [ 8.7660006, 58.4647561 ] } },
{ "type": "Feature", "properties": { "NAME": "Vossavangen", "POP_MAX": 5571 }, "geometry": { "type": "Point", "coordinates": [ 6.4410035, 60.6300032 ] } },
{ "type": "Feature", "properties": { "NAME": "Leikanger", "POP_MAX": 1965 }, "geometry": { "type": "Point", "coordinates": [ 6.8499995, 61.1832961 ] } },
{ "type": "Feature", "properties": { "NAME": "Bærum", "POP_MAX": 113659 }, "geometry": { "type": "Point", "coordinates": [ 11.3472365, 59.9134861 ] } },
{ "type": "Feature", "properties": { "NAME": "Hamar", "POP_MAX": 29479 }, "geometry": { "type": "Point", "coordinates": [ 11.0690016, 60.8200021 ] } },
{ "type": "Feature", "properties": { "NAME": "Tønsberg", "POP_MAX": 38914 }, "geometry": { "type": "Point", "coordinates": [ 10.4210015, 59.2640011 ] } },
{ "type": "Feature", "properties": { "NAME": "Fribourg", "POP_MAX": 32827 }, "geometry": { "type": "Point", "coordinates": [ 7.1499965, 46.8000001 ] } },
{ "type": "Feature", "properties": { "NAME": "Liestal", "POP_MAX": 12832 }, "geometry": { "type": "Point", "coordinates": [ 7.7370035, 47.4830011 ] } },
{ "type": "Feature", "properties": { "NAME": "Solothurn", "POP_MAX": 14853 }, "geometry": { "type": "Point", "coordinates": [ 7.5369966, 47.2120021 ] } },
{ "type": "Feature", "properties": { "NAME": "Sarnen", "POP_MAX": 9410 }, "geometry": { "type": "Point", "coordinates": [ 8.2430015, 46.899 ] } },
{ "type": "Feature", "properties": { "NAME": "Mariestad", "POP_MAX": 14891 }, "geometry": { "type": "Point", "coordinates": [ 13.8279966, 58.7050021 ] } },
{ "type": "Feature", "properties": { "NAME": "Vannersborg", "POP_MAX": 21835 }, "geometry": { "type": "Point", "coordinates": [ 12.3300006, 58.3630021 ] } },
{ "type": "Feature", "properties": { "NAME": "Appenzell", "POP_MAX": 5649 }, "geometry": { "type": "Point", "coordinates": [ 9.4167005, 47.3333041 ] } },
{ "type": "Feature", "properties": { "NAME": "Ros Comain", "POP_MAX": 4860 }, "geometry": { "type": "Point", "coordinates": [ -8.1833333, 53.6333333 ] } },
{ "type": "Feature", "properties": { "NAME": "Potenza", "POP_MAX": 69060 }, "geometry": { "type": "Point", "coordinates": [ 15.7989965, 40.6420021 ] } },
{ "type": "Feature", "properties": { "NAME": "Campobasso", "POP_MAX": 50762 }, "geometry": { "type": "Point", "coordinates": [ 14.6559966, 41.5629991 ] } },
{ "type": "Feature", "properties": { "NAME": "Aosta", "POP_MAX": 34062 }, "geometry": { "type": "Point", "coordinates": [ 7.3150026, 45.7370011 ] } },
{ "type": "Feature", "properties": { "NAME": "Diekirch", "POP_MAX": 6242 }, "geometry": { "type": "Point", "coordinates": [ 6.1667016, 49.8833011 ] } },
{ "type": "Feature", "properties": { "NAME": "Grevenmacher", "POP_MAX": 3958 }, "geometry": { "type": "Point", "coordinates": [ 6.425599376387133, 49.67975296258291 ] } },
{ "type": "Feature", "properties": { "NAME": "Hämeenlinna", "POP_MAX": 47261 }, "geometry": { "type": "Point", "coordinates": [ 24.4719995, 60.9969961 ] } },
{ "type": "Feature", "properties": { "NAME": "Kouvola", "POP_MAX": 31133 }, "geometry": { "type": "Point", "coordinates": [ 26.7090035, 60.8760001 ] } },
{ "type": "Feature", "properties": { "NAME": "Mikkeli", "POP_MAX": 46550 }, "geometry": { "type": "Point", "coordinates": [ 27.2850035, 61.6899962 ] } },
{ "type": "Feature", "properties": { "NAME": "Muineachan", "POP_MAX": 5937 }, "geometry": { "type": "Point", "coordinates": [ -6.9666667, 54.25 ] } },
{ "type": "Feature", "properties": { "NAME": "Vejle", "POP_MAX": 51177 }, "geometry": { "type": "Point", "coordinates": [ 9.5349965, 55.709001 ] } },
{ "type": "Feature", "properties": { "NAME": "Hillerød", "POP_MAX": 28313 }, "geometry": { "type": "Point", "coordinates": [ 12.3166985, 55.9332991 ] } },
{ "type": "Feature", "properties": { "NAME": "Sorø", "POP_MAX": 7167 }, "geometry": { "type": "Point", "coordinates": [ 11.5667016, 55.4329981 ] } },
{ "type": "Feature", "properties": { "NAME": "Mons", "POP_MAX": 91277 }, "geometry": { "type": "Point", "coordinates": [ 3.9390036, 50.4459991 ] } },
{ "type": "Feature", "properties": { "NAME": "Hasselt", "POP_MAX": 69222 }, "geometry": { "type": "Point", "coordinates": [ 5.338536386219118, 50.928838164664029 ] } },
{ "type": "Feature", "properties": { "NAME": "Arlon", "POP_MAX": 26179 }, "geometry": { "type": "Point", "coordinates": [ 5.8167005, 49.6833031 ] } },
{ "type": "Feature", "properties": { "NAME": "Bregenz", "POP_MAX": 26928 }, "geometry": { "type": "Point", "coordinates": [ 9.7667016, 47.5166971 ] } },
{ "type": "Feature", "properties": { "NAME": "Eisenstadt", "POP_MAX": 13165 }, "geometry": { "type": "Point", "coordinates": [ 16.5332975, 47.8332991 ] } },
{ "type": "Feature", "properties": { "NAME": "Borgarnes", "POP_MAX": 1783 }, "geometry": { "type": "Point", "coordinates": [ -21.8623222, 64.5695028 ] } },
{ "type": "Feature", "properties": { "NAME": "Mainz", "POP_MAX": 184997 }, "geometry": { "type": "Point", "coordinates": [ 8.2732192, 49.9824725 ] } },
{ "type": "Feature", "properties": { "NAME": "Schwerin", "POP_MAX": 96641 }, "geometry": { "type": "Point", "coordinates": [ 11.4166986, 53.6333041 ] } },
{ "type": "Feature", "properties": { "NAME": "Marbella", "POP_MAX": 186131 }, "geometry": { "type": "Point", "coordinates": [ -4.8833301, 36.5166199 ] } },
{ "type": "Feature", "properties": { "NAME": "Linares", "POP_MAX": 59761 }, "geometry": { "type": "Point", "coordinates": [ -3.6333547, 38.0833201 ] } },
{ "type": "Feature", "properties": { "NAME": "Algeciras", "POP_MAX": 111027 }, "geometry": { "type": "Point", "coordinates": [ -5.452659839737986, 36.131881591291716 ] } },
{ "type": "Feature", "properties": { "NAME": "León", "POP_MAX": 136227 }, "geometry": { "type": "Point", "coordinates": [ -5.5700066, 42.5799707 ] } },
{ "type": "Feature", "properties": { "NAME": "Mataró", "POP_MAX": 183293 }, "geometry": { "type": "Point", "coordinates": [ 2.4500207, 41.5399567 ] } },
{ "type": "Feature", "properties": { "NAME": "Chur", "POP_MAX": 38293 }, "geometry": { "type": "Point", "coordinates": [ 9.5000297, 46.8500202 ] } },
{ "type": "Feature", "properties": { "NAME": "Borlänge", "POP_MAX": 39422 }, "geometry": { "type": "Point", "coordinates": [ 15.4166711, 60.4833224 ] } },
{ "type": "Feature", "properties": { "NAME": "Västerås", "POP_MAX": 107194 }, "geometry": { "type": "Point", "coordinates": [ 16.5576798129634, 59.609083757164619 ] } },
{ "type": "Feature", "properties": { "NAME": "Gijón", "POP_MAX": 335972 }, "geometry": { "type": "Point", "coordinates": [ -5.6700004, 43.5300161 ] } },
{ "type": "Feature", "properties": { "NAME": "Vitoria", "POP_MAX": 224578 }, "geometry": { "type": "Point", "coordinates": [ -2.6699768, 42.8499801 ] } },
{ "type": "Feature", "properties": { "NAME": "Greenock", "POP_MAX": 74635 }, "geometry": { "type": "Point", "coordinates": [ -4.7500308, 55.93329 ] } },
{ "type": "Feature", "properties": { "NAME": "Sunderland", "POP_MAX": 452934 }, "geometry": { "type": "Point", "coordinates": [ -1.379881564518565, 54.903407084625925 ] } },
{ "type": "Feature", "properties": { "NAME": "Southampton", "POP_MAX": 384417 }, "geometry": { "type": "Point", "coordinates": [ -1.3999768, 50.9000314 ] } },
{ "type": "Feature", "properties": { "NAME": "Bristol", "POP_MAX": 553528 }, "geometry": { "type": "Point", "coordinates": [ -2.5833155, 51.4499978 ] } },
{ "type": "Feature", "properties": { "NAME": "Bournemouth", "POP_MAX": 426945 }, "geometry": { "type": "Point", "coordinates": [ -1.9000497, 50.7299901 ] } },
{ "type": "Feature", "properties": { "NAME": "Omagh", "POP_MAX": 21056 }, "geometry": { "type": "Point", "coordinates": [ -7.3000043, 54.6000122 ] } },
{ "type": "Feature", "properties": { "NAME": "Chester", "POP_MAX": 89531 }, "geometry": { "type": "Point", "coordinates": [ -2.902964575974897, 53.186325091374322 ] } },
{ "type": "Feature", "properties": { "NAME": "Swansea", "POP_MAX": 294339 }, "geometry": { "type": "Point", "coordinates": [ -3.9500021, 51.6299868 ] } },
{ "type": "Feature", "properties": { "NAME": "Carlisle", "POP_MAX": 72633 }, "geometry": { "type": "Point", "coordinates": [ -2.9299868, 54.8799951 ] } },
{ "type": "Feature", "properties": { "NAME": "Southend-on-Sea", "POP_MAX": 618386 }, "geometry": { "type": "Point", "coordinates": [ 0.7199971, 51.5500175 ] } },
{ "type": "Feature", "properties": { "NAME": "Reading", "POP_MAX": 369804 }, "geometry": { "type": "Point", "coordinates": [ -0.9800283, 51.4699707 ] } },
{ "type": "Feature", "properties": { "NAME": "Leicester", "POP_MAX": 457983 }, "geometry": { "type": "Point", "coordinates": [ -1.1332489, 52.6299774 ] } },
{ "type": "Feature", "properties": { "NAME": "Bradford", "POP_MAX": 501700 }, "geometry": { "type": "Point", "coordinates": [ -1.754464650200906, 53.79167546080204 ] } },
{ "type": "Feature", "properties": { "NAME": "Sheffield", "POP_MAX": 1292900 }, "geometry": { "type": "Point", "coordinates": [ -1.4999966, 53.3666767 ] } },
{ "type": "Feature", "properties": { "NAME": "Biel", "POP_MAX": 78708 }, "geometry": { "type": "Point", "coordinates": [ 7.2500378, 47.16659 ] } },
{ "type": "Feature", "properties": { "NAME": "Finnsnes", "POP_MAX": 3907 }, "geometry": { "type": "Point", "coordinates": [ 18.0086059, 69.2406173 ] } },
{ "type": "Feature", "properties": { "NAME": "Eindhoven", "POP_MAX": 398053 }, "geometry": { "type": "Point", "coordinates": [ 5.5000154, 51.4299732 ] } },
{ "type": "Feature", "properties": { "NAME": "Gjøvik", "POP_MAX": 22719 }, "geometry": { "type": "Point", "coordinates": [ 10.7000081, 60.8000214 ] } },
{ "type": "Feature", "properties": { "NAME": "Rørvik", "POP_MAX": 2615 }, "geometry": { "type": "Point", "coordinates": [ 11.2053003, 64.868016 ] } },
{ "type": "Feature", "properties": { "NAME": "Shannon", "POP_MAX": 8781 }, "geometry": { "type": "Point", "coordinates": [ -8.8641466, 52.7038489 ] } },
{ "type": "Feature", "properties": { "NAME": "Waterford", "POP_MAX": 49275 }, "geometry": { "type": "Point", "coordinates": [ -7.1119279, 52.2582947 ] } },
{ "type": "Feature", "properties": { "NAME": "Tralee", "POP_MAX": 26384 }, "geometry": { "type": "Point", "coordinates": [ -9.7166527, 52.2666921 ] } },
{ "type": "Feature", "properties": { "NAME": "Donegal", "POP_MAX": 2513 }, "geometry": { "type": "Point", "coordinates": [ -8.1166728, 54.6500092 ] } },
{ "type": "Feature", "properties": { "NAME": "Modena", "POP_MAX": 175502 }, "geometry": { "type": "Point", "coordinates": [ 10.9199947, 44.6500252 ] } },
{ "type": "Feature", "properties": { "NAME": "Crotone", "POP_MAX": 60010 }, "geometry": { "type": "Point", "coordinates": [ 17.123337, 39.0833366 ] } },
{ "type": "Feature", "properties": { "NAME": "Vibo Valentia", "POP_MAX": 33957 }, "geometry": { "type": "Point", "coordinates": [ 16.1000402, 38.666592 ] } },
{ "type": "Feature", "properties": { "NAME": "Reggio di Calabria", "POP_MAX": 180353 }, "geometry": { "type": "Point", "coordinates": [ 15.6413602, 38.1149978 ] } },
{ "type": "Feature", "properties": { "NAME": "Caserta", "POP_MAX": 250000 }, "geometry": { "type": "Point", "coordinates": [ 14.3373571, 41.0599601 ] } },
{ "type": "Feature", "properties": { "NAME": "Barletta", "POP_MAX": 107830 }, "geometry": { "type": "Point", "coordinates": [ 16.270004, 41.319996 ] } },
{ "type": "Feature", "properties": { "NAME": "Ragusa", "POP_MAX": 68956 }, "geometry": { "type": "Point", "coordinates": [ 14.7299947, 36.9300314 ] } },
{ "type": "Feature", "properties": { "NAME": "Asti", "POP_MAX": 71276 }, "geometry": { "type": "Point", "coordinates": [ 8.2099792, 44.9299823 ] } },
{ "type": "Feature", "properties": { "NAME": "Novara", "POP_MAX": 100910 }, "geometry": { "type": "Point", "coordinates": [ 8.61998, 45.4500023 ] } },
{ "type": "Feature", "properties": { "NAME": "Como", "POP_MAX": 250000 }, "geometry": { "type": "Point", "coordinates": [ 9.0800036, 45.8100061 ] } },
{ "type": "Feature", "properties": { "NAME": "Udine", "POP_MAX": 119009 }, "geometry": { "type": "Point", "coordinates": [ 13.2400081, 46.0700161 ] } },
{ "type": "Feature", "properties": { "NAME": "Treviso", "POP_MAX": 177309 }, "geometry": { "type": "Point", "coordinates": [ 12.2400175, 45.6700147 ] } },
{ "type": "Feature", "properties": { "NAME": "Annecy", "POP_MAX": 105749 }, "geometry": { "type": "Point", "coordinates": [ 6.1166703, 45.8999748 ] } },
{ "type": "Feature", "properties": { "NAME": "Roanne", "POP_MAX": 73315 }, "geometry": { "type": "Point", "coordinates": [ 4.0666662, 46.0333258 ] } },
{ "type": "Feature", "properties": { "NAME": "Bielefeld", "POP_MAX": 331906 }, "geometry": { "type": "Point", "coordinates": [ 8.5300114, 52.0299882 ] } },
{ "type": "Feature", "properties": { "NAME": "Dortmund", "POP_MAX": 588462 }, "geometry": { "type": "Point", "coordinates": [ 7.4500256, 51.5299671 ] } },
{ "type": "Feature", "properties": { "NAME": "Duisburg", "POP_MAX": 1276757 }, "geometry": { "type": "Point", "coordinates": [ 6.7500166, 51.4299732 ] } },
{ "type": "Feature", "properties": { "NAME": "Wuppertal", "POP_MAX": 776525 }, "geometry": { "type": "Point", "coordinates": [ 7.169991, 51.25001 ] } },
{ "type": "Feature", "properties": { "NAME": "Essen", "POP_MAX": 1742135 }, "geometry": { "type": "Point", "coordinates": [ 7.0166154, 51.4499978 ] } },
{ "type": "Feature", "properties": { "NAME": "Karlsruhe", "POP_MAX": 377487 }, "geometry": { "type": "Point", "coordinates": [ 8.3999934, 48.9999923 ] } },
{ "type": "Feature", "properties": { "NAME": "Heidelberg", "POP_MAX": 426590 }, "geometry": { "type": "Point", "coordinates": [ 8.6999751, 49.4199925 ] } },
{ "type": "Feature", "properties": { "NAME": "Kassel", "POP_MAX": 289924 }, "geometry": { "type": "Point", "coordinates": [ 9.5000297, 51.3000069 ] } },
{ "type": "Feature", "properties": { "NAME": "Oldenburg", "POP_MAX": 167458 }, "geometry": { "type": "Point", "coordinates": [ 8.2200044, 53.1299986 ] } },
{ "type": "Feature", "properties": { "NAME": "Emden", "POP_MAX": 51526 }, "geometry": { "type": "Point", "coordinates": [ 7.2166548, 53.3666767 ] } },
{ "type": "Feature", "properties": { "NAME": "Braunschweig", "POP_MAX": 244715 }, "geometry": { "type": "Point", "coordinates": [ 10.5000203, 52.2499748 ] } },
{ "type": "Feature", "properties": { "NAME": "Erfurt", "POP_MAX": 203254 }, "geometry": { "type": "Point", "coordinates": [ 11.0299621, 50.9700529 ] } },
{ "type": "Feature", "properties": { "NAME": "Coburg", "POP_MAX": 61054 }, "geometry": { "type": "Point", "coordinates": [ 10.9666068, 50.2666075 ] } },
{ "type": "Feature", "properties": { "NAME": "Augsburg", "POP_MAX": 358989 }, "geometry": { "type": "Point", "coordinates": [ 10.8999959, 48.3500061 ] } },
{ "type": "Feature", "properties": { "NAME": "Fürth", "POP_MAX": 237844 }, "geometry": { "type": "Point", "coordinates": [ 10.9999898, 49.4700153 ] } },
{ "type": "Feature", "properties": { "NAME": "Chemnitz", "POP_MAX": 302643 }, "geometry": { "type": "Point", "coordinates": [ 12.919976, 50.8299839 ] } },
{ "type": "Feature", "properties": { "NAME": "Roura", "POP_MAX": 2229 }, "geometry": { "type": "Point", "coordinates": [ -52.3300206, 4.7299813 ] } },
{ "type": "Feature", "properties": { "NAME": "Sinnamary", "POP_MAX": 3180 }, "geometry": { "type": "Point", "coordinates": [ -52.9599821, 5.3800191 ] } },
{ "type": "Feature", "properties": { "NAME": "St.-Brieuc", "POP_MAX": 53223 }, "geometry": { "type": "Point", "coordinates": [ -2.7833033, 48.5166626 ] } },
{ "type": "Feature", "properties": { "NAME": "Poitier", "POP_MAX": 85960 }, "geometry": { "type": "Point", "coordinates": [ 0.3332765, 46.5832923 ] } },
{ "type": "Feature", "properties": { "NAME": "Angers", "POP_MAX": 188380 }, "geometry": { "type": "Point", "coordinates": [ -0.5300299, 47.4800075 ] } },
{ "type": "Feature", "properties": { "NAME": "Biarritz", "POP_MAX": 145348 }, "geometry": { "type": "Point", "coordinates": [ -1.5615949, 43.4732754 ] } },
{ "type": "Feature", "properties": { "NAME": "Aix-en-Provence", "POP_MAX": 146821 }, "geometry": { "type": "Point", "coordinates": [ 5.4499926, 43.5199909 ] } },
{ "type": "Feature", "properties": { "NAME": "Perpignan", "POP_MAX": 146620 }, "geometry": { "type": "Point", "coordinates": [ 2.8999674, 42.6999892 ] } },
{ "type": "Feature", "properties": { "NAME": "Tarbes", "POP_MAX": 54854 }, "geometry": { "type": "Point", "coordinates": [ 0.0833435, 43.23329 ] } },
{ "type": "Feature", "properties": { "NAME": "Clermont-Ferrand", "POP_MAX": 233050 }, "geometry": { "type": "Point", "coordinates": [ 3.0800081, 45.7799821 ] } },
{ "type": "Feature", "properties": { "NAME": "Melun", "POP_MAX": 249432 }, "geometry": { "type": "Point", "coordinates": [ 2.6666483, 48.5333024 ] } },
{ "type": "Feature", "properties": { "NAME": "Arras", "POP_MAX": 64165 }, "geometry": { "type": "Point", "coordinates": [ 2.7833337, 50.2833248 ] } },
{ "type": "Feature", "properties": { "NAME": "Besançon", "POP_MAX": 128426 }, "geometry": { "type": "Point", "coordinates": [ 6.0300089, 47.229997 ] } },
{ "type": "Feature", "properties": { "NAME": "Savonlinna", "POP_MAX": 27353 }, "geometry": { "type": "Point", "coordinates": [ 28.8833427, 61.8666229 ] } },
{ "type": "Feature", "properties": { "NAME": "Pori", "POP_MAX": 76772 }, "geometry": { "type": "Point", "coordinates": [ 21.7749393, 61.4788947 ] } },
{ "type": "Feature", "properties": { "NAME": "Viborg", "POP_MAX": 34831 }, "geometry": { "type": "Point", "coordinates": [ 9.3999841, 56.433337 ] } },
{ "type": "Feature", "properties": { "NAME": "Roskilde", "POP_MAX": 44285 }, "geometry": { "type": "Point", "coordinates": [ 12.0833345, 55.649974 ] } },
{ "type": "Feature", "properties": { "NAME": "Gent", "POP_MAX": 444336 }, "geometry": { "type": "Point", "coordinates": [ 3.7000219, 51.0299976 ] } },
{ "type": "Feature", "properties": { "NAME": "Wiener Neustadt", "POP_MAX": 82762 }, "geometry": { "type": "Point", "coordinates": [ 16.2499536, 47.8159819 ] } },
{ "type": "Feature", "properties": { "NAME": "Liège", "POP_MAX": 749110 }, "geometry": { "type": "Point", "coordinates": [ 5.5800105, 50.6299962 ] } },
{ "type": "Feature", "properties": { "NAME": "Fort William", "POP_MAX": 9652 }, "geometry": { "type": "Point", "coordinates": [ -5.1120758, 56.8164779 ] } },
{ "type": "Feature", "properties": { "NAME": "Almería", "POP_MAX": 179405 }, "geometry": { "type": "Point", "coordinates": [ -2.4299915, 36.8303475 ] } },
{ "type": "Feature", "properties": { "NAME": "Málaga", "POP_MAX": 550058 }, "geometry": { "type": "Point", "coordinates": [ -4.4199992, 36.7204059 ] } },
{ "type": "Feature", "properties": { "NAME": "Jaén", "POP_MAX": 116400 }, "geometry": { "type": "Point", "coordinates": [ -3.7999854, 37.7703935 ] } },
{ "type": "Feature", "properties": { "NAME": "Huelva", "POP_MAX": 144174 }, "geometry": { "type": "Point", "coordinates": [ -6.9299494, 37.2503736 ] } },
{ "type": "Feature", "properties": { "NAME": "Albacete", "POP_MAX": 158094 }, "geometry": { "type": "Point", "coordinates": [ -1.8699998, 39.0003443 ] } },
{ "type": "Feature", "properties": { "NAME": "Toledo", "POP_MAX": 74632 }, "geometry": { "type": "Point", "coordinates": [ -4.0167164, 39.8670355 ] } },
{ "type": "Feature", "properties": { "NAME": "Guadalajara", "POP_MAX": 72850 }, "geometry": { "type": "Point", "coordinates": [ -3.1665874, 40.6337071 ] } },
{ "type": "Feature", "properties": { "NAME": "Santander", "POP_MAX": 208763 }, "geometry": { "type": "Point", "coordinates": [ -3.7999854, 43.3804645 ] } },
{ "type": "Feature", "properties": { "NAME": "Salamanca", "POP_MAX": 162353 }, "geometry": { "type": "Point", "coordinates": [ -5.6700004, 40.9704049 ] } },
{ "type": "Feature", "properties": { "NAME": "Burgos", "POP_MAX": 170183 }, "geometry": { "type": "Point", "coordinates": [ -3.6799669, 42.3503982 ] } },
{ "type": "Feature", "properties": { "NAME": "Tarragona", "POP_MAX": 126291 }, "geometry": { "type": "Point", "coordinates": [ 1.2499906, 41.1203699 ] } },
{ "type": "Feature", "properties": { "NAME": "Luzern", "POP_MAX": 250000 }, "geometry": { "type": "Point", "coordinates": [ 8.2800008, 47.0504214 ] } },
{ "type": "Feature", "properties": { "NAME": "Lugano", "POP_MAX": 105388 }, "geometry": { "type": "Point", "coordinates": [ 8.9666772, 46.0003821 ] } },
{ "type": "Feature", "properties": { "NAME": "Bollnäs", "POP_MAX": 13398 }, "geometry": { "type": "Point", "coordinates": [ 16.3665873, 61.3520032 ] } },
{ "type": "Feature", "properties": { "NAME": "Gävle", "POP_MAX": 68635 }, "geometry": { "type": "Point", "coordinates": [ 17.1666418, 60.6669804 ] } },
{ "type": "Feature", "properties": { "NAME": "Kalmar", "POP_MAX": 35024 }, "geometry": { "type": "Point", "coordinates": [ 16.3665873, 56.6670178 ] } },
{ "type": "Feature", "properties": { "NAME": "Växjö", "POP_MAX": 59600 }, "geometry": { "type": "Point", "coordinates": [ 14.8167077, 56.8836971 ] } },
{ "type": "Feature", "properties": { "NAME": "Örebro", "POP_MAX": 98573 }, "geometry": { "type": "Point", "coordinates": [ 15.2199906, 59.2803467 ] } },
{ "type": "Feature", "properties": { "NAME": "Norrköping", "POP_MAX": 88639 }, "geometry": { "type": "Point", "coordinates": [ 16.1786918, 58.5954273 ] } },
{ "type": "Feature", "properties": { "NAME": "Halmstad", "POP_MAX": 55657 }, "geometry": { "type": "Point", "coordinates": [ 12.8555871, 56.6717721 ] } },
{ "type": "Feature", "properties": { "NAME": "Karlstad", "POP_MAX": 74141 }, "geometry": { "type": "Point", "coordinates": [ 13.4999406, 59.3671373 ] } },
{ "type": "Feature", "properties": { "NAME": "Skellefteå", "POP_MAX": 31311 }, "geometry": { "type": "Point", "coordinates": [ 20.9500284, 64.7720787 ] } },
{ "type": "Feature", "properties": { "NAME": "Visby", "POP_MAX": 22593 }, "geometry": { "type": "Point", "coordinates": [ 18.3000093, 57.6336513 ] } },
{ "type": "Feature", "properties": { "NAME": "Egilsstaðir", "POP_MAX": 2265 }, "geometry": { "type": "Point", "coordinates": [ -14.3949976, 65.2674231 ] } },
{ "type": "Feature", "properties": { "NAME": "Sauðárkrókur", "POP_MAX": 2682 }, "geometry": { "type": "Point", "coordinates": [ -19.6389928, 65.746412 ] } },
{ "type": "Feature", "properties": { "NAME": "Selfoss", "POP_MAX": 6275 }, "geometry": { "type": "Point", "coordinates": [ -20.996946, 63.9334219 ] } },
{ "type": "Feature", "properties": { "NAME": "Lorca", "POP_MAX": 86119 }, "geometry": { "type": "Point", "coordinates": [ -1.6985116, 37.6885639 ] } },
{ "type": "Feature", "properties": { "NAME": "Cartagena", "POP_MAX": 201274 }, "geometry": { "type": "Point", "coordinates": [ -0.9800283, 37.6004297 ] } },
{ "type": "Feature", "properties": { "NAME": "Oviedo", "POP_MAX": 235651 }, "geometry": { "type": "Point", "coordinates": [ -5.8299907, 43.3504922 ] } },
{ "type": "Feature", "properties": { "NAME": "Santiago de Compostela", "POP_MAX": 92430 }, "geometry": { "type": "Point", "coordinates": [ -8.5410914, 42.882898 ] } },
{ "type": "Feature", "properties": { "NAME": "Badajoz", "POP_MAX": 140133 }, "geometry": { "type": "Point", "coordinates": [ -6.9699728, 38.8804291 ] } },
{ "type": "Feature", "properties": { "NAME": "Logroño", "POP_MAX": 143698 }, "geometry": { "type": "Point", "coordinates": [ -2.4299915, 42.470365 ] } },
{ "type": "Feature", "properties": { "NAME": "San Sebastián", "POP_MAX": 357468 }, "geometry": { "type": "Point", "coordinates": [ -1.9799931, 43.3203906 ] } },
{ "type": "Feature", "properties": { "NAME": "Ayr", "POP_MAX": 69042 }, "geometry": { "type": "Point", "coordinates": [ -4.6166797, 55.4503996 ] } },
{ "type": "Feature", "properties": { "NAME": "Aberdeen", "POP_MAX": 189364 }, "geometry": { "type": "Point", "coordinates": [ -2.105049991692299, 57.145133499698055 ] } },
{ "type": "Feature", "properties": { "NAME": "Perth", "POP_MAX": 39654 }, "geometry": { "type": "Point", "coordinates": [ -3.43637522000611, 56.392608950345803 ] } },
{ "type": "Feature", "properties": { "NAME": "Dundee", "POP_MAX": 151592 }, "geometry": { "type": "Point", "coordinates": [ -3.0000084, 56.470389 ] } },
{ "type": "Feature", "properties": { "NAME": "Middlesbrough", "POP_MAX": 416042 }, "geometry": { "type": "Point", "coordinates": [ -1.2300131, 54.5803752 ] } },
{ "type": "Feature", "properties": { "NAME": "Coventry", "POP_MAX": 388271 }, "geometry": { "type": "Point", "coordinates": [ -1.502674527924457, 52.40074087605872 ] } },
{ "type": "Feature", "properties": { "NAME": "Bath", "POP_MAX": 93238 }, "geometry": { "type": "Point", "coordinates": [ -2.3500222, 51.3837486 ] } },
{ "type": "Feature", "properties": { "NAME": "Exeter", "POP_MAX": 113118 }, "geometry": { "type": "Point", "coordinates": [ -3.5299502, 50.7004053 ] } },
{ "type": "Feature", "properties": { "NAME": "Cambridge", "POP_MAX": 128488 }, "geometry": { "type": "Point", "coordinates": [ 0.1166231, 52.2003913 ] } },
{ "type": "Feature", "properties": { "NAME": "Kingston upon Hull", "POP_MAX": 302296 }, "geometry": { "type": "Point", "coordinates": [ -0.3299905, 53.7504258 ] } },
{ "type": "Feature", "properties": { "NAME": "Londonderry/Derry", "POP_MAX": 83652 }, "geometry": { "type": "Point", "coordinates": [ -7.3332839, 55.0003754 ] } },
{ "type": "Feature", "properties": { "NAME": "Lisburn", "POP_MAX": 12899 }, "geometry": { "type": "Point", "coordinates": [ -6.047722990732365, 54.510340081278031 ] } },
{ "type": "Feature", "properties": { "NAME": "Penzance", "POP_MAX": 20812 }, "geometry": { "type": "Point", "coordinates": [ -5.5500336, 50.1337215 ] } },
{ "type": "Feature", "properties": { "NAME": "York", "POP_MAX": 158947 }, "geometry": { "type": "Point", "coordinates": [ -1.072104058604134, 53.951168062269403 ] } },
{ "type": "Feature", "properties": { "NAME": "Blackpool", "POP_MAX": 272792 }, "geometry": { "type": "Point", "coordinates": [ -3.0500053, 53.8303951 ] } },
{ "type": "Feature", "properties": { "NAME": "Dumfries", "POP_MAX": 31044 }, "geometry": { "type": "Point", "coordinates": [ -3.5500007, 55.0670897 ] } },
{ "type": "Feature", "properties": { "NAME": "Scarborough", "POP_MAX": 70571 }, "geometry": { "type": "Point", "coordinates": [ -0.4299844, 54.2803935 ] } },
{ "type": "Feature", "properties": { "NAME": "Plymouth", "POP_MAX": 247297 }, "geometry": { "type": "Point", "coordinates": [ -4.1599893, 50.3853858 ] } },
{ "type": "Feature", "properties": { "NAME": "Ipswich", "POP_MAX": 143767 }, "geometry": { "type": "Point", "coordinates": [ 1.1699955, 52.0703475 ] } },
{ "type": "Feature", "properties": { "NAME": "Norwich", "POP_MAX": 190756 }, "geometry": { "type": "Point", "coordinates": [ 1.3000134, 52.630365 ] } },
{ "type": "Feature", "properties": { "NAME": "Brighton", "POP_MAX": 503008 }, "geometry": { "type": "Point", "coordinates": [ -0.1699744, 50.8303457 ] } },
{ "type": "Feature", "properties": { "NAME": "Kirkwall", "POP_MAX": 8500 }, "geometry": { "type": "Point", "coordinates": [ -2.9500114, 58.9669808 ] } },
{ "type": "Feature", "properties": { "NAME": "Inverness", "POP_MAX": 45158 }, "geometry": { "type": "Point", "coordinates": [ -4.2332664, 57.467124 ] } },
{ "type": "Feature", "properties": { "NAME": "Oxford", "POP_MAX": 192796 }, "geometry": { "type": "Point", "coordinates": [ -1.248076337369831, 51.751827978066444 ] } },
{ "type": "Feature", "properties": { "NAME": "Luton", "POP_MAX": 235958 }, "geometry": { "type": "Point", "coordinates": [ -0.4200108, 51.8803591 ] } },
{ "type": "Feature", "properties": { "NAME": "Portsmouth", "POP_MAX": 442252 }, "geometry": { "type": "Point", "coordinates": [ -1.0800222, 50.8003475 ] } },
{ "type": "Feature", "properties": { "NAME": "Peterborough", "POP_MAX": 140141 }, "geometry": { "type": "Point", "coordinates": [ -0.248404030339169, 52.567187150649296 ] } },
{ "type": "Feature", "properties": { "NAME": "Nottingham", "POP_MAX": 825600 }, "geometry": { "type": "Point", "coordinates": [ -1.165706334543335, 52.941084202003999 ] } },
{ "type": "Feature", "properties": { "NAME": "Stoke", "POP_MAX": 390801 }, "geometry": { "type": "Point", "coordinates": [ -2.1800068, 53.0003683 ] } },
{ "type": "Feature", "properties": { "NAME": "Dover", "POP_MAX": 36384 }, "geometry": { "type": "Point", "coordinates": [ 1.3000134, 51.1337122 ] } },
{ "type": "Feature", "properties": { "NAME": "Lausanne", "POP_MAX": 265702 }, "geometry": { "type": "Point", "coordinates": [ 6.6500227, 46.5304273 ] } },
{ "type": "Feature", "properties": { "NAME": "Basel", "POP_MAX": 830000 }, "geometry": { "type": "Point", "coordinates": [ 7.590017, 47.580389 ] } },
{ "type": "Feature", "properties": { "NAME": "Trollhättan", "POP_MAX": 44543 }, "geometry": { "type": "Point", "coordinates": [ 12.2999621, 58.2671011 ] } },
{ "type": "Feature", "properties": { "NAME": "Borås", "POP_MAX": 65008 }, "geometry": { "type": "Point", "coordinates": [ 12.939247443030592, 57.717756121714984 ] } },
{ "type": "Feature", "properties": { "NAME": "Kristianstad", "POP_MAX": 32188 }, "geometry": { "type": "Point", "coordinates": [ 14.1332869, 56.0336715 ] } },
{ "type": "Feature", "properties": { "NAME": "Helsingborg", "POP_MAX": 91304 }, "geometry": { "type": "Point", "coordinates": [ 12.723269742553532, 56.041291180968074 ] } },
{ "type": "Feature", "properties": { "NAME": "Alicante", "POP_MAX": 315863 }, "geometry": { "type": "Point", "coordinates": [ -0.4836407, 38.3512199 ] } },
{ "type": "Feature", "properties": { "NAME": "Castello", "POP_MAX": 180610 }, "geometry": { "type": "Point", "coordinates": [ -0.0500076, 39.9704142 ] } },
{ "type": "Feature", "properties": { "NAME": "Leeuwarden", "POP_MAX": 125778 }, "geometry": { "type": "Point", "coordinates": [ 5.7833573, 53.2503788 ] } },
{ "type": "Feature", "properties": { "NAME": "Groningen", "POP_MAX": 216688 }, "geometry": { "type": "Point", "coordinates": [ 6.5800012, 53.2204065 ] } },
{ "type": "Feature", "properties": { "NAME": "Harstad", "POP_MAX": 19433 }, "geometry": { "type": "Point", "coordinates": [ 16.5155704, 68.7879059 ] } },
{ "type": "Feature", "properties": { "NAME": "Utrecht", "POP_MAX": 640000 }, "geometry": { "type": "Point", "coordinates": [ 5.1200386, 52.1003457 ] } },
{ "type": "Feature", "properties": { "NAME": "Ålesund", "POP_MAX": 47772 }, "geometry": { "type": "Point", "coordinates": [ 6.263280014851641, 62.459799139398143 ] } },
{ "type": "Feature", "properties": { "NAME": "Sandnes", "POP_MAX": 46911 }, "geometry": { "type": "Point", "coordinates": [ 5.6900297, 58.845412 ] } },
{ "type": "Feature", "properties": { "NAME": "Drammen", "POP_MAX": 90722 }, "geometry": { "type": "Point", "coordinates": [ 10.199231839963424, 59.738481129257444 ] } },
{ "type": "Feature", "properties": { "NAME": "Moss", "POP_MAX": 36901 }, "geometry": { "type": "Point", "coordinates": [ 10.6691573, 59.436978 ] } },
{ "type": "Feature", "properties": { "NAME": "Steinkjer", "POP_MAX": 11274 }, "geometry": { "type": "Point", "coordinates": [ 11.5000109, 64.0170602 ] } },
{ "type": "Feature", "properties": { "NAME": "Haarlem", "POP_MAX": 349957 }, "geometry": { "type": "Point", "coordinates": [ 4.629991, 52.3804319 ] } },
{ "type": "Feature", "properties": { "NAME": "Saint-Georges", "POP_MAX": 2742 }, "geometry": { "type": "Point", "coordinates": [ -51.8100007, 3.9104706 ] } },
{ "type": "Feature", "properties": { "NAME": "Drogheda", "POP_MAX": 36533 }, "geometry": { "type": "Point", "coordinates": [ -6.350462402562247, 53.708886789164069 ] } },
{ "type": "Feature", "properties": { "NAME": "Dundalk", "POP_MAX": 38884 }, "geometry": { "type": "Point", "coordinates": [ -6.395592071318646, 53.999796075155913 ] } },
{ "type": "Feature", "properties": { "NAME": "Galway", "POP_MAX": 75594 }, "geometry": { "type": "Point", "coordinates": [ -9.0488123, 53.272393 ] } },
{ "type": "Feature", "properties": { "NAME": "Kilkenny", "POP_MAX": 21589 }, "geometry": { "type": "Point", "coordinates": [ -7.2522553, 52.6545496 ] } },
{ "type": "Feature", "properties": { "NAME": "Killarney", "POP_MAX": 11902 }, "geometry": { "type": "Point", "coordinates": [ -9.5166649, 52.0504004 ] } },
{ "type": "Feature", "properties": { "NAME": "Sligo", "POP_MAX": 20228 }, "geometry": { "type": "Point", "coordinates": [ -8.4833171, 54.267061 ] } },
{ "type": "Feature", "properties": { "NAME": "Parma", "POP_MAX": 166011 }, "geometry": { "type": "Point", "coordinates": [ 10.3200313, 44.8104289 ] } },
{ "type": "Feature", "properties": { "NAME": "Ravenna", "POP_MAX": 134631 }, "geometry": { "type": "Point", "coordinates": [ 12.2200187, 44.4203752 ] } },
{ "type": "Feature", "properties": { "NAME": "Ferrara", "POP_MAX": 130992 }, "geometry": { "type": "Point", "coordinates": [ 11.6099267, 44.8504265 ] } },
{ "type": "Feature", "properties": { "NAME": "Bologna", "POP_MAX": 488172 }, "geometry": { "type": "Point", "coordinates": [ 11.3400207, 44.500422 ] } },
{ "type": "Feature", "properties": { "NAME": "Olbia", "POP_MAX": 45366 }, "geometry": { "type": "Point", "coordinates": [ 9.5150719, 40.9142849 ] } },
{ "type": "Feature", "properties": { "NAME": "Cagliari", "POP_MAX": 291511 }, "geometry": { "type": "Point", "coordinates": [ 9.1039815, 39.2223979 ] } },
{ "type": "Feature", "properties": { "NAME": "Pisa", "POP_MAX": 203336 }, "geometry": { "type": "Point", "coordinates": [ 10.4000264, 43.7204696 ] } },
{ "type": "Feature", "properties": { "NAME": "Livorno", "POP_MAX": 156274 }, "geometry": { "type": "Point", "coordinates": [ 10.3022747, 43.5511337 ] } },
{ "type": "Feature", "properties": { "NAME": "Siena", "POP_MAX": 52625 }, "geometry": { "type": "Point", "coordinates": [ 11.3499943, 43.3170317 ] } },
{ "type": "Feature", "properties": { "NAME": "Arezzo", "POP_MAX": 91589 }, "geometry": { "type": "Point", "coordinates": [ 11.8749751, 43.4617257 ] } },
{ "type": "Feature", "properties": { "NAME": "Catanzaro", "POP_MAX": 95251 }, "geometry": { "type": "Point", "coordinates": [ 16.6000097, 38.9003762 ] } },
{ "type": "Feature", "properties": { "NAME": "Salerno", "POP_MAX": 954265 }, "geometry": { "type": "Point", "coordinates": [ 14.7699406, 40.6803967 ] } },
{ "type": "Feature", "properties": { "NAME": "Benevento", "POP_MAX": 61791 }, "geometry": { "type": "Point", "coordinates": [ 14.7499934, 41.1337024 ] } },
{ "type": "Feature", "properties": { "NAME": "Bari", "POP_MAX": 500577 }, "geometry": { "type": "Point", "coordinates": [ 16.8727579, 41.1142204 ] } },
{ "type": "Feature", "properties": { "NAME": "Foggia", "POP_MAX": 155203 }, "geometry": { "type": "Point", "coordinates": [ 15.5599698, 41.4604783 ] } },
{ "type": "Feature", "properties": { "NAME": "Lecce", "POP_MAX": 162582 }, "geometry": { "type": "Point", "coordinates": [ 18.1499926, 40.3603904 ] } },
{ "type": "Feature", "properties": { "NAME": "Brindisi", "POP_MAX": 104437 }, "geometry": { "type": "Point", "coordinates": [ 17.9300061, 40.6403475 ] } },
{ "type": "Feature", "properties": { "NAME": "Taranto", "POP_MAX": 202033 }, "geometry": { "type": "Point", "coordinates": [ 17.2299971, 40.5083917 ] } },
{ "type": "Feature", "properties": { "NAME": "Messina", "POP_MAX": 252026 }, "geometry": { "type": "Point", "coordinates": [ 15.5499963, 38.2004706 ] } },
{ "type": "Feature", "properties": { "NAME": "Marsala", "POP_MAX": 77784 }, "geometry": { "type": "Point", "coordinates": [ 12.4386617, 37.8054043 ] } },
{ "type": "Feature", "properties": { "NAME": "Siracusa", "POP_MAX": 123657 }, "geometry": { "type": "Point", "coordinates": [ 15.2899605, 37.0703587 ] } },
{ "type": "Feature", "properties": { "NAME": "Pescara", "POP_MAX": 314789 }, "geometry": { "type": "Point", "coordinates": [ 14.2186564, 42.4554305 ] } },
{ "type": "Feature", "properties": { "NAME": "L'Aquila", "POP_MAX": 68503 }, "geometry": { "type": "Point", "coordinates": [ 13.3900248, 42.3503982 ] } },
{ "type": "Feature", "properties": { "NAME": "Civitavecchia", "POP_MAX": 61316 }, "geometry": { "type": "Point", "coordinates": [ 11.7999926, 42.1004134 ] } },
{ "type": "Feature", "properties": { "NAME": "Ancona", "POP_MAX": 100507 }, "geometry": { "type": "Point", "coordinates": [ 13.4999406, 43.6003736 ] } },
{ "type": "Feature", "properties": { "NAME": "Perugia", "POP_MAX": 149125 }, "geometry": { "type": "Point", "coordinates": [ 12.3899825, 43.1103776 ] } },
{ "type": "Feature", "properties": { "NAME": "Bergamo", "POP_MAX": 200000 }, "geometry": { "type": "Point", "coordinates": [ 9.6699934, 45.7004004 ] } },
{ "type": "Feature", "properties": { "NAME": "Trieste", "POP_MAX": 216035 }, "geometry": { "type": "Point", "coordinates": [ 13.8000256, 45.6503776 ] } },
{ "type": "Feature", "properties": { "NAME": "Bolzano", "POP_MAX": 95895 }, "geometry": { "type": "Point", "coordinates": [ 11.3600195, 46.5004291 ] } },
{ "type": "Feature", "properties": { "NAME": "Trento", "POP_MAX": 107808 }, "geometry": { "type": "Point", "coordinates": [ 11.1199825, 46.0804289 ] } },
{ "type": "Feature", "properties": { "NAME": "Verona", "POP_MAX": 347459 }, "geometry": { "type": "Point", "coordinates": [ 10.9900162, 45.4403904 ] } },
{ "type": "Feature", "properties": { "NAME": "Saint-Étienne", "POP_MAX": 265684 }, "geometry": { "type": "Point", "coordinates": [ 4.3800321, 45.4303911 ] } },
{ "type": "Feature", "properties": { "NAME": "Grenoble", "POP_MAX": 388574 }, "geometry": { "type": "Point", "coordinates": [ 5.720002, 45.1803805 ] } },
{ "type": "Feature", "properties": { "NAME": "Fort-de-France", "POP_MAX": 253995 }, "geometry": { "type": "Point", "coordinates": [ -61.0800291, 14.6104118 ] } },
{ "type": "Feature", "properties": { "NAME": "Bonn", "POP_MAX": 680543 }, "geometry": { "type": "Point", "coordinates": [ 7.0800223, 50.7204557 ] } },
{ "type": "Feature", "properties": { "NAME": "Münster", "POP_MAX": 270184 }, "geometry": { "type": "Point", "coordinates": [ 7.6200411, 51.9704053 ] } },
{ "type": "Feature", "properties": { "NAME": "Düsseldorf", "POP_MAX": 1220000 }, "geometry": { "type": "Point", "coordinates": [ 6.779989, 51.2203736 ] } },
{ "type": "Feature", "properties": { "NAME": "Ulm", "POP_MAX": 172955 }, "geometry": { "type": "Point", "coordinates": [ 9.9999991, 48.4003906 ] } },
{ "type": "Feature", "properties": { "NAME": "Mannheim", "POP_MAX": 2362000 }, "geometry": { "type": "Point", "coordinates": [ 8.470015, 49.5003752 ] } },
{ "type": "Feature", "properties": { "NAME": "Freiburg", "POP_MAX": 254889 }, "geometry": { "type": "Point", "coordinates": [ 7.8699483, 48.0004151 ] } },
{ "type": "Feature", "properties": { "NAME": "Gießen", "POP_MAX": 82358 }, "geometry": { "type": "Point", "coordinates": [ 8.650004, 50.5837199 ] } },
{ "type": "Feature", "properties": { "NAME": "Wiesbaden", "POP_MAX": 617126 }, "geometry": { "type": "Point", "coordinates": [ 8.2500284, 50.0803915 ] } },
{ "type": "Feature", "properties": { "NAME": "Bremerhaven", "POP_MAX": 137751 }, "geometry": { "type": "Point", "coordinates": [ 8.5799825, 53.550438 ] } },
{ "type": "Feature", "properties": { "NAME": "Osnabrück", "POP_MAX": 231268 }, "geometry": { "type": "Point", "coordinates": [ 8.049989, 52.280438 ] } },
{ "type": "Feature", "properties": { "NAME": "Hanover", "POP_MAX": 722490 }, "geometry": { "type": "Point", "coordinates": [ 9.7166573, 52.3669702 ] } },
{ "type": "Feature", "properties": { "NAME": "Göttingen", "POP_MAX": 139419 }, "geometry": { "type": "Point", "coordinates": [ 9.920004, 51.5204328 ] } },
{ "type": "Feature", "properties": { "NAME": "Gera", "POP_MAX": 104659 }, "geometry": { "type": "Point", "coordinates": [ 12.070002, 50.8703691 ] } },
{ "type": "Feature", "properties": { "NAME": "Jena", "POP_MAX": 104712 }, "geometry": { "type": "Point", "coordinates": [ 11.5800061, 50.9304429 ] } },
{ "type": "Feature", "properties": { "NAME": "Flensburg", "POP_MAX": 97930 }, "geometry": { "type": "Point", "coordinates": [ 9.4333154, 54.7837478 ] } },
{ "type": "Feature", "properties": { "NAME": "Lübeck", "POP_MAX": 235390 }, "geometry": { "type": "Point", "coordinates": [ 10.6699841, 53.8703927 ] } },
{ "type": "Feature", "properties": { "NAME": "Kiel", "POP_MAX": 269427 }, "geometry": { "type": "Point", "coordinates": [ 10.130017, 54.3303904 ] } },
{ "type": "Feature", "properties": { "NAME": "Koblenz", "POP_MAX": 312633 }, "geometry": { "type": "Point", "coordinates": [ 7.5999906, 50.3504783 ] } },
{ "type": "Feature", "properties": { "NAME": "Saarbrücken", "POP_MAX": 770001 }, "geometry": { "type": "Point", "coordinates": [ 6.9700032, 49.2503904 ] } },
{ "type": "Feature", "properties": { "NAME": "Regensburg", "POP_MAX": 164359 }, "geometry": { "type": "Point", "coordinates": [ 12.1200248, 49.0204045 ] } },
{ "type": "Feature", "properties": { "NAME": "Rosenheim", "POP_MAX": 92809 }, "geometry": { "type": "Point", "coordinates": [ 12.1333056, 47.8503467 ] } },
{ "type": "Feature", "properties": { "NAME": "Hof", "POP_MAX": 56153 }, "geometry": { "type": "Point", "coordinates": [ 11.916678, 50.3170437 ] } },
{ "type": "Feature", "properties": { "NAME": "Würzburg", "POP_MAX": 168561 }, "geometry": { "type": "Point", "coordinates": [ 9.950028, 49.8004344 ] } },
{ "type": "Feature", "properties": { "NAME": "Ingolstadt", "POP_MAX": 163325 }, "geometry": { "type": "Point", "coordinates": [ 11.4499882, 48.7704197 ] } },
{ "type": "Feature", "properties": { "NAME": "Cottbus", "POP_MAX": 105067 }, "geometry": { "type": "Point", "coordinates": [ 14.3299674, 51.7704175 ] } },
{ "type": "Feature", "properties": { "NAME": "Potsdam", "POP_MAX": 218095 }, "geometry": { "type": "Point", "coordinates": [ 13.0699926, 52.4004049 ] } },
{ "type": "Feature", "properties": { "NAME": "Magdeburg", "POP_MAX": 229826 }, "geometry": { "type": "Point", "coordinates": [ 11.6200036, 52.1304214 ] } },
{ "type": "Feature", "properties": { "NAME": "Leipzig", "POP_MAX": 542529 }, "geometry": { "type": "Point", "coordinates": [ 12.4099812, 51.3354053 ] } },
{ "type": "Feature", "properties": { "NAME": "Saint-Laurent-du-Maroni", "POP_MAX": 24287 }, "geometry": { "type": "Point", "coordinates": [ -54.0325346, 5.4976241 ] } },
{ "type": "Feature", "properties": { "NAME": "Iracoubo", "POP_MAX": 1536 }, "geometry": { "type": "Point", "coordinates": [ -53.2199921, 5.4804265 ] } },
{ "type": "Feature", "properties": { "NAME": "Cherbourg", "POP_MAX": 60991 }, "geometry": { "type": "Point", "coordinates": [ -1.6499874, 49.6503919 ] } },
{ "type": "Feature", "properties": { "NAME": "Caen", "POP_MAX": 190099 }, "geometry": { "type": "Point", "coordinates": [ -0.3499893, 49.1837537 ] } },
{ "type": "Feature", "properties": { "NAME": "Lorient", "POP_MAX": 84952 }, "geometry": { "type": "Point", "coordinates": [ -3.3665752, 47.7504045 ] } },
{ "type": "Feature", "properties": { "NAME": "Brest", "POP_MAX": 144899 }, "geometry": { "type": "Point", "coordinates": [ -4.4950076, 48.3904429 ] } },
{ "type": "Feature", "properties": { "NAME": "Le Mans", "POP_MAX": 144515 }, "geometry": { "type": "Point", "coordinates": [ 0.202581510662092, 48.004390876355409 ] } },
{ "type": "Feature", "properties": { "NAME": "Nantes", "POP_MAX": 438537 }, "geometry": { "type": "Point", "coordinates": [ -1.5900169, 47.2103858 ] } },
{ "type": "Feature", "properties": { "NAME": "Agen", "POP_MAX": 58223 }, "geometry": { "type": "Point", "coordinates": [ 0.6333357, 44.2004144 ] } },
{ "type": "Feature", "properties": { "NAME": "Ajaccio", "POP_MAX": 54364 }, "geometry": { "type": "Point", "coordinates": [ 8.7282938, 41.9270648 ] } },
{ "type": "Feature", "properties": { "NAME": "Bastia", "POP_MAX": 41001 }, "geometry": { "type": "Point", "coordinates": [ 9.4500069, 42.7031673 ] } },
{ "type": "Feature", "properties": { "NAME": "Toulon", "POP_MAX": 357693 }, "geometry": { "type": "Point", "coordinates": [ 5.9188216, 43.1341865 ] } },
{ "type": "Feature", "properties": { "NAME": "Béziers", "POP_MAX": 81438 }, "geometry": { "type": "Point", "coordinates": [ 3.2099743, 43.3504922 ] } },
{ "type": "Feature", "properties": { "NAME": "Montpellier", "POP_MAX": 327254 }, "geometry": { "type": "Point", "coordinates": [ 3.8699857, 43.6103988 ] } },
{ "type": "Feature", "properties": { "NAME": "Nîmes", "POP_MAX": 169547 }, "geometry": { "type": "Point", "coordinates": [ 4.3500081, 43.8303854 ] } },
{ "type": "Feature", "properties": { "NAME": "Vichy", "POP_MAX": 43158 }, "geometry": { "type": "Point", "coordinates": [ 3.4166801, 46.117145 ] } },
{ "type": "Feature", "properties": { "NAME": "Nevers", "POP_MAX": 45929 }, "geometry": { "type": "Point", "coordinates": [ 3.1666695, 46.9837329 ] } },
{ "type": "Feature", "properties": { "NAME": "Auxerre", "POP_MAX": 41516 }, "geometry": { "type": "Point", "coordinates": [ 3.5665934, 47.8004273 ] } },
{ "type": "Feature", "properties": { "NAME": "Dijon", "POP_MAX": 169946 }, "geometry": { "type": "Point", "coordinates": [ 5.0300183, 47.3304043 ] } },
{ "type": "Feature", "properties": { "NAME": "Bourges", "POP_MAX": 72340 }, "geometry": { "type": "Point", "coordinates": [ 2.3999979, 47.0837268 ] } },
{ "type": "Feature", "properties": { "NAME": "Tours", "POP_MAX": 236096 }, "geometry": { "type": "Point", "coordinates": [ 0.6999467, 47.3803754 ] } },
{ "type": "Feature", "properties": { "NAME": "Orléans", "POP_MAX": 217301 }, "geometry": { "type": "Point", "coordinates": [ 1.9000284, 47.9004212 ] } },
{ "type": "Feature", "properties": { "NAME": "Dieppe", "POP_MAX": 42461 }, "geometry": { "type": "Point", "coordinates": [ 1.0833341, 49.9337337 ] } },
{ "type": "Feature", "properties": { "NAME": "Rouen", "POP_MAX": 532559 }, "geometry": { "type": "Point", "coordinates": [ 1.0799751, 49.4304053 ] } },
{ "type": "Feature", "properties": { "NAME": "Versailles", "POP_MAX": 85416 }, "geometry": { "type": "Point", "coordinates": [ 2.1333475, 48.8004696 ] } },
{ "type": "Feature", "properties": { "NAME": "Brive", "POP_MAX": 55448 }, "geometry": { "type": "Point", "coordinates": [ 1.5333325, 45.1504081 ] } },
{ "type": "Feature", "properties": { "NAME": "Troyes", "POP_MAX": 61703 }, "geometry": { "type": "Point", "coordinates": [ 4.0833577, 48.3403943 ] } },
{ "type": "Feature", "properties": { "NAME": "Reims", "POP_MAX": 196565 }, "geometry": { "type": "Point", "coordinates": [ 4.029976, 49.2503904 ] } },
{ "type": "Feature", "properties": { "NAME": "Calais", "POP_MAX": 92201 }, "geometry": { "type": "Point", "coordinates": [ 1.8333142, 50.9504159 ] } },
{ "type": "Feature", "properties": { "NAME": "Amiens", "POP_MAX": 143086 }, "geometry": { "type": "Point", "coordinates": [ 2.300004, 49.9003766 ] } },
{ "type": "Feature", "properties": { "NAME": "Mulhouse", "POP_MAX": 215454 }, "geometry": { "type": "Point", "coordinates": [ 7.34998, 47.7504045 ] } },
{ "type": "Feature", "properties": { "NAME": "Nancy", "POP_MAX": 268976 }, "geometry": { "type": "Point", "coordinates": [ 6.2000244, 48.6836808 ] } },
{ "type": "Feature", "properties": { "NAME": "Metz", "POP_MAX": 409186 }, "geometry": { "type": "Point", "coordinates": [ 6.1800256, 49.1203467 ] } },
{ "type": "Feature", "properties": { "NAME": "Stralsund", "POP_MAX": 61368 }, "geometry": { "type": "Point", "coordinates": [ 13.1000166, 54.3004181 ] } },
{ "type": "Feature", "properties": { "NAME": "Rostock", "POP_MAX": 203080 }, "geometry": { "type": "Point", "coordinates": [ 12.1499971, 54.0703805 ] } },
{ "type": "Feature", "properties": { "NAME": "Sodankylä", "POP_MAX": 8942 }, "geometry": { "type": "Point", "coordinates": [ 26.6000195, 67.4170593 ] } },
{ "type": "Feature", "properties": { "NAME": "Jyväskylä", "POP_MAX": 98136 }, "geometry": { "type": "Point", "coordinates": [ 25.7499939, 62.2603457 ] } },
{ "type": "Feature", "properties": { "NAME": "Kuopio", "POP_MAX": 91900 }, "geometry": { "type": "Point", "coordinates": [ 27.6949397, 62.8942863 ] } },
{ "type": "Feature", "properties": { "NAME": "Lappeenranta", "POP_MAX": 59276 }, "geometry": { "type": "Point", "coordinates": [ 28.1833337, 61.0670593 ] } },
{ "type": "Feature", "properties": { "NAME": "Porvoo", "POP_MAX": 12242 }, "geometry": { "type": "Point", "coordinates": [ 25.6660197, 60.4003559 ] } },
{ "type": "Feature", "properties": { "NAME": "Svendborg", "POP_MAX": 29180 }, "geometry": { "type": "Point", "coordinates": [ 10.616654, 55.0704228 ] } },
{ "type": "Feature", "properties": { "NAME": "Odense", "POP_MAX": 158222 }, "geometry": { "type": "Point", "coordinates": [ 10.3833349, 55.4003768 ] } },
{ "type": "Feature", "properties": { "NAME": "Esbjerg", "POP_MAX": 72205 }, "geometry": { "type": "Point", "coordinates": [ 8.4500162, 55.4670394 ] } },
{ "type": "Feature", "properties": { "NAME": "Frederikshavn", "POP_MAX": 24103 }, "geometry": { "type": "Point", "coordinates": [ 10.5332999, 57.4336894 ] } },
{ "type": "Feature", "properties": { "NAME": "Aalborg", "POP_MAX": 122219 }, "geometry": { "type": "Point", "coordinates": [ 9.9165934, 57.0337138 ] } },
{ "type": "Feature", "properties": { "NAME": "Pointe-à-Pitre", "POP_MAX": 145511 }, "geometry": { "type": "Point", "coordinates": [ -61.5329989, 16.241475 ] } },
{ "type": "Feature", "properties": { "NAME": "Basse-terre", "POP_MAX": 307 }, "geometry": { "type": "Point", "coordinates": [ -61.7054837, 16.0104101 ] } },
{ "type": "Feature", "properties": { "NAME": "St.-Benoit", "POP_MAX": 35310 }, "geometry": { "type": "Point", "coordinates": [ 55.7128161, -21.0335107 ] } },
{ "type": "Feature", "properties": { "NAME": "Brugge", "POP_MAX": 146469 }, "geometry": { "type": "Point", "coordinates": [ 3.2300248, 51.2203736 ] } },
{ "type": "Feature", "properties": { "NAME": "Namur", "POP_MAX": 106284 }, "geometry": { "type": "Point", "coordinates": [ 4.870028, 50.4703935 ] } },
{ "type": "Feature", "properties": { "NAME": "Charleroi", "POP_MAX": 345367 }, "geometry": { "type": "Point", "coordinates": [ 4.450002, 50.4203965 ] } },
{ "type": "Feature", "properties": { "NAME": "Graz", "POP_MAX": 263234 }, "geometry": { "type": "Point", "coordinates": [ 15.4100048, 47.0777582 ] } },
{ "type": "Feature", "properties": { "NAME": "Klagenfurt", "POP_MAX": 90610 }, "geometry": { "type": "Point", "coordinates": [ 14.3100203, 46.6203443 ] } },
{ "type": "Feature", "properties": { "NAME": "Linz", "POP_MAX": 349161 }, "geometry": { "type": "Point", "coordinates": [ 14.2887813, 48.3192328 ] } },
{ "type": "Feature", "properties": { "NAME": "Passau", "POP_MAX": 50560 }, "geometry": { "type": "Point", "coordinates": [ 13.4411788, 48.5754623 ] } },
{ "type": "Feature", "properties": { "NAME": "Salzburg", "POP_MAX": 206279 }, "geometry": { "type": "Point", "coordinates": [ 13.0400203, 47.8104783 ] } },
{ "type": "Feature", "properties": { "NAME": "Innsbruck", "POP_MAX": 155214 }, "geometry": { "type": "Point", "coordinates": [ 11.4099906, 47.2804073 ] } },
{ "type": "Feature", "properties": { "NAME": "Arrecife", "POP_MAX": 52944 }, "geometry": { "type": "Point", "coordinates": [ -13.5378328, 28.9690492 ] } },
{ "type": "Feature", "properties": { "NAME": "Dzaoudzi", "POP_MAX": 32057 }, "geometry": { "type": "Point", "coordinates": [ 45.2750036, -12.787089 ] } },
{ "type": "Feature", "properties": { "NAME": "Cádiz", "POP_MAX": 283157 }, "geometry": { "type": "Point", "coordinates": [ -6.2861410092129, 36.52482926254671 ] } },
{ "type": "Feature", "properties": { "NAME": "Granada", "POP_MAX": 388290 }, "geometry": { "type": "Point", "coordinates": [ -3.5850114, 37.1649783 ] } },
{ "type": "Feature", "properties": { "NAME": "Jönköping", "POP_MAX": 89780 }, "geometry": { "type": "Point", "coordinates": [ 14.1650162, 57.7713432 ] } },
{ "type": "Feature", "properties": { "NAME": "Örnsköldsvik", "POP_MAX": 27749 }, "geometry": { "type": "Point", "coordinates": [ 18.7166764, 63.3180072 ] } },
{ "type": "Feature", "properties": { "NAME": "Höfn", "POP_MAX": 1695 }, "geometry": { "type": "Point", "coordinates": [ -15.2138595, 64.2723151 ] } },
{ "type": "Feature", "properties": { "NAME": "Murcia", "POP_MAX": 406807 }, "geometry": { "type": "Point", "coordinates": [ -1.1299675, 37.9799931 ] } },
{ "type": "Feature", "properties": { "NAME": "Ceuta", "POP_MAX": 78674 }, "geometry": { "type": "Point", "coordinates": [ -5.3069994, 35.8889838 ] } },
{ "type": "Feature", "properties": { "NAME": "La Coruña", "POP_MAX": 370610 }, "geometry": { "type": "Point", "coordinates": [ -8.4199876, 43.3299766 ] } },
{ "type": "Feature", "properties": { "NAME": "Ourense", "POP_MAX": 118107 }, "geometry": { "type": "Point", "coordinates": [ -7.8699954, 42.3299601 ] } },
{ "type": "Feature", "properties": { "NAME": "Edinburgh", "POP_MAX": 504966 }, "geometry": { "type": "Point", "coordinates": [ -3.2190906, 55.9483279 ] } },
{ "type": "Feature", "properties": { "NAME": "Newcastle", "POP_MAX": 882000 }, "geometry": { "type": "Point", "coordinates": [ -1.61162548933458, 54.989742053169572 ] } },
{ "type": "Feature", "properties": { "NAME": "Liverpool", "POP_MAX": 811000 }, "geometry": { "type": "Point", "coordinates": [ -2.961934009816594, 53.405068298036525 ] } },
{ "type": "Feature", "properties": { "NAME": "Cardiff", "POP_MAX": 861400 }, "geometry": { "type": "Point", "coordinates": [ -3.167598195527729, 51.482619049130911 ] } },
{ "type": "Feature", "properties": { "NAME": "Wick", "POP_MAX": 7147 }, "geometry": { "type": "Point", "coordinates": [ -3.0833625, 58.4332925 ] } },
{ "type": "Feature", "properties": { "NAME": "Leeds", "POP_MAX": 1529000 }, "geometry": { "type": "Point", "coordinates": [ -1.551347711412841, 53.790016637752316 ] } },
{ "type": "Feature", "properties": { "NAME": "Pamplona", "POP_MAX": 274545 }, "geometry": { "type": "Point", "coordinates": [ -1.6499874, 42.8200078 ] } },
{ "type": "Feature", "properties": { "NAME": "Svolvær", "POP_MAX": 4197 }, "geometry": { "type": "Point", "coordinates": [ 14.5666971, 68.2332886 ] } },
{ "type": "Feature", "properties": { "NAME": "Mo i Rana", "POP_MAX": 20409 }, "geometry": { "type": "Point", "coordinates": [ 14.1666699, 66.3166097 ] } },
{ "type": "Feature", "properties": { "NAME": "Narvik", "POP_MAX": 20000 }, "geometry": { "type": "Point", "coordinates": [ 17.2899934, 68.3831502 ] } },
{ "type": "Feature", "properties": { "NAME": "Bodø", "POP_MAX": 34073 }, "geometry": { "type": "Point", "coordinates": [ 14.4292849, 67.2764346 ] } },
{ "type": "Feature", "properties": { "NAME": "Rotterdam", "POP_MAX": 1005000 }, "geometry": { "type": "Point", "coordinates": [ 4.4780285, 51.921915 ] } },
{ "type": "Feature", "properties": { "NAME": "Luxembourg", "POP_MAX": 107260 }, "geometry": { "type": "Point", "coordinates": [ 6.1300028, 49.6116604 ] } },
{ "type": "Feature", "properties": { "NAME": "Haugesund", "POP_MAX": 40321 }, "geometry": { "type": "Point", "coordinates": [ 5.2774967, 59.4119149 ] } },
{ "type": "Feature", "properties": { "NAME": "Stavanger", "POP_MAX": 173132 }, "geometry": { "type": "Point", "coordinates": [ 5.6800044, 58.9700039 ] } },
{ "type": "Feature", "properties": { "NAME": "Skien", "POP_MAX": 73330 }, "geometry": { "type": "Point", "coordinates": [ 9.6000236, 59.1999898 ] } },
{ "type": "Feature", "properties": { "NAME": "Namsos", "POP_MAX": 9035 }, "geometry": { "type": "Point", "coordinates": [ 11.5000109, 64.4833108 ] } },
{ "type": "Feature", "properties": { "NAME": "Alta", "POP_MAX": 12077 }, "geometry": { "type": "Point", "coordinates": [ 23.2416715, 69.9666453 ] } },
{ "type": "Feature", "properties": { "NAME": "Vadsø", "POP_MAX": 5139 }, "geometry": { "type": "Point", "coordinates": [ 29.7657493, 70.0965968 ] } },
{ "type": "Feature", "properties": { "NAME": "Cork", "POP_MAX": 188907 }, "geometry": { "type": "Point", "coordinates": [ -8.465109738576434, 51.892837601620471 ] } },
{ "type": "Feature", "properties": { "NAME": "Sassari", "POP_MAX": 120729 }, "geometry": { "type": "Point", "coordinates": [ 8.5700089, 40.7300061 ] } },
{ "type": "Feature", "properties": { "NAME": "Turin", "POP_MAX": 1652000 }, "geometry": { "type": "Point", "coordinates": [ 7.6680146, 45.072333 ] } },
{ "type": "Feature", "properties": { "NAME": "Stuttgart", "POP_MAX": 2944700 }, "geometry": { "type": "Point", "coordinates": [ 9.1999963, 48.7799799 ] } },
{ "type": "Feature", "properties": { "NAME": "Bremen", "POP_MAX": 724909 }, "geometry": { "type": "Point", "coordinates": [ 8.8000207, 53.0800016 ] } },
{ "type": "Feature", "properties": { "NAME": "Nürnberg", "POP_MAX": 737304 }, "geometry": { "type": "Point", "coordinates": [ 11.0799849, 49.4499907 ] } },
{ "type": "Feature", "properties": { "NAME": "Rennes", "POP_MAX": 209375 }, "geometry": { "type": "Point", "coordinates": [ -1.670012, 48.1000214 ] } },
{ "type": "Feature", "properties": { "NAME": "Nice", "POP_MAX": 927000 }, "geometry": { "type": "Point", "coordinates": [ 7.2630781, 43.7169636 ] } },
{ "type": "Feature", "properties": { "NAME": "Toulouse", "POP_MAX": 847000 }, "geometry": { "type": "Point", "coordinates": [ 1.4479809, 43.6219048 ] } },
{ "type": "Feature", "properties": { "NAME": "Limoges", "POP_MAX": 152199 }, "geometry": { "type": "Point", "coordinates": [ 1.2499906, 45.8299791 ] } },
{ "type": "Feature", "properties": { "NAME": "Lille", "POP_MAX": 1044000 }, "geometry": { "type": "Point", "coordinates": [ 3.0780622, 50.651915 ] } },
{ "type": "Feature", "properties": { "NAME": "Strasbourg", "POP_MAX": 439972 }, "geometry": { "type": "Point", "coordinates": [ 7.7500073, 48.5799662 ] } },
{ "type": "Feature", "properties": { "NAME": "Kemijärvi", "POP_MAX": 8883 }, "geometry": { "type": "Point", "coordinates": [ 27.4166621, 66.6666659 ] } },
{ "type": "Feature", "properties": { "NAME": "Kokkola", "POP_MAX": 46714 }, "geometry": { "type": "Point", "coordinates": [ 23.1166662, 63.8332988 ] } },
{ "type": "Feature", "properties": { "NAME": "Lahti", "POP_MAX": 98826 }, "geometry": { "type": "Point", "coordinates": [ 25.6649344, 60.9938597 ] } },
{ "type": "Feature", "properties": { "NAME": "Joensuu", "POP_MAX": 53388 }, "geometry": { "type": "Point", "coordinates": [ 29.7666479, 62.599989 ] } },
{ "type": "Feature", "properties": { "NAME": "Turku", "POP_MAX": 175945 }, "geometry": { "type": "Point", "coordinates": [ 22.2549617, 60.4538668 ] } },
{ "type": "Feature", "properties": { "NAME": "Ísafjörður", "POP_MAX": 2534 }, "geometry": { "type": "Point", "coordinates": [ -23.1499671, 66.0833165 ] } },
{ "type": "Feature", "properties": { "NAME": "Akureyri", "POP_MAX": 16563 }, "geometry": { "type": "Point", "coordinates": [ -18.1000169, 65.6665719 ] } },
{ "type": "Feature", "properties": { "NAME": "Keflavík", "POP_MAX": 7930 }, "geometry": { "type": "Point", "coordinates": [ -22.5665918, 64.0166467 ] } },
{ "type": "Feature", "properties": { "NAME": "Antwerpen", "POP_MAX": 920000 }, "geometry": { "type": "Point", "coordinates": [ 4.4130712, 51.2223194 ] } },
{ "type": "Feature", "properties": { "NAME": "Lerwick", "POP_MAX": 6594 }, "geometry": { "type": "Point", "coordinates": [ -1.1499921, 60.1500352 ] } },
{ "type": "Feature", "properties": { "NAME": "Valladolid", "POP_MAX": 322304 }, "geometry": { "type": "Point", "coordinates": [ -4.7500308, 41.6500016 ] } },
{ "type": "Feature", "properties": { "NAME": "Linköping", "POP_MAX": 96732 }, "geometry": { "type": "Point", "coordinates": [ 15.6299397, 58.4100122 ] } },
{ "type": "Feature", "properties": { "NAME": "Östersund", "POP_MAX": 46178 }, "geometry": { "type": "Point", "coordinates": [ 14.6499996, 63.1833126 ] } },
{ "type": "Feature", "properties": { "NAME": "Kiruna", "POP_MAX": 18154 }, "geometry": { "type": "Point", "coordinates": [ 20.2166365, 67.8500045 ] } },
{ "type": "Feature", "properties": { "NAME": "Umeå", "POP_MAX": 78197 }, "geometry": { "type": "Point", "coordinates": [ 20.2399943, 63.8299915 ] } },
{ "type": "Feature", "properties": { "NAME": "Uppsala", "POP_MAX": 133117 }, "geometry": { "type": "Point", "coordinates": [ 17.6399979, 59.8600529 ] } },
{ "type": "Feature", "properties": { "NAME": "Melilla", "POP_MAX": 141308 }, "geometry": { "type": "Point", "coordinates": [ -2.9500114, 35.3000016 ] } },
{ "type": "Feature", "properties": { "NAME": "Palma", "POP_MAX": 375773 }, "geometry": { "type": "Point", "coordinates": [ 2.654246, 39.5742627 ] } },
{ "type": "Feature", "properties": { "NAME": "Molde", "POP_MAX": 18594 }, "geometry": { "type": "Point", "coordinates": [ 7.1833235, 62.7483004 ] } },
{ "type": "Feature", "properties": { "NAME": "Lillehammer", "POP_MAX": 19542 }, "geometry": { "type": "Point", "coordinates": [ 10.5000203, 61.1332827 ] } },
{ "type": "Feature", "properties": { "NAME": "Kirkenes", "POP_MAX": 3282 }, "geometry": { "type": "Point", "coordinates": [ 30.0516434, 69.7250063 ] } },
{ "type": "Feature", "properties": { "NAME": "Zaragoza", "POP_MAX": 649404 }, "geometry": { "type": "Point", "coordinates": [ -0.8899821, 41.6500016 ] } },
{ "type": "Feature", "properties": { "NAME": "Göteborg", "POP_MAX": 537797 }, "geometry": { "type": "Point", "coordinates": [ 11.978630208072927, 57.709146768849784 ] } },
{ "type": "Feature", "properties": { "NAME": "Limerick", "POP_MAX": 90054 }, "geometry": { "type": "Point", "coordinates": [ -8.6230502, 52.664704 ] } },
{ "type": "Feature", "properties": { "NAME": "Genoa", "POP_MAX": 647497 }, "geometry": { "type": "Point", "coordinates": [ 8.9300386, 44.4099882 ] } },
{ "type": "Feature", "properties": { "NAME": "Cologne", "POP_MAX": 1004000 }, "geometry": { "type": "Point", "coordinates": [ 6.9480586, 50.9319495 ] } },
{ "type": "Feature", "properties": { "NAME": "Kourou", "POP_MAX": 24029 }, "geometry": { "type": "Point", "coordinates": [ -52.6499494, 5.1599809 ] } },
{ "type": "Feature", "properties": { "NAME": "La Rochelle", "POP_MAX": 76997 }, "geometry": { "type": "Point", "coordinates": [ -1.1499921, 46.166651 ] } },
{ "type": "Feature", "properties": { "NAME": "Kemi", "POP_MAX": 22641 }, "geometry": { "type": "Point", "coordinates": [ 24.5816931, 65.733312 ] } },
{ "type": "Feature", "properties": { "NAME": "Oulu", "POP_MAX": 136752 }, "geometry": { "type": "Point", "coordinates": [ 25.4700109, 64.9999976 ] } },
{ "type": "Feature", "properties": { "NAME": "Århus", "POP_MAX": 237551 }, "geometry": { "type": "Point", "coordinates": [ 10.210684, 56.157204 ] } },
{ "type": "Feature", "properties": { "NAME": "Santa Cruz de Tenerife", "POP_MAX": 336061 }, "geometry": { "type": "Point", "coordinates": [ -16.2500007, 28.4699793 ] } },
{ "type": "Feature", "properties": { "NAME": "Manchester", "POP_MAX": 2230000 }, "geometry": { "type": "Point", "coordinates": [ -2.248684667159885, 53.475319924724531 ] } },
{ "type": "Feature", "properties": { "NAME": "Birmingham", "POP_MAX": 2285000 }, "geometry": { "type": "Point", "coordinates": [ -1.9219426, 52.4769198 ] } },
{ "type": "Feature", "properties": { "NAME": "Belfast", "POP_MAX": 450406 }, "geometry": { "type": "Point", "coordinates": [ -5.928177644913072, 54.594245156841886 ] } },
{ "type": "Feature", "properties": { "NAME": "Córdoba", "POP_MAX": 321376 }, "geometry": { "type": "Point", "coordinates": [ -4.7700037, 37.8799992 ] } },
{ "type": "Feature", "properties": { "NAME": "Luleå", "POP_MAX": 48638 }, "geometry": { "type": "Point", "coordinates": [ 22.1583783, 65.5966348 ] } },
{ "type": "Feature", "properties": { "NAME": "Sundsvall", "POP_MAX": 73389 }, "geometry": { "type": "Point", "coordinates": [ 17.3166585, 62.4000529 ] } },
{ "type": "Feature", "properties": { "NAME": "Vigo", "POP_MAX": 378952 }, "geometry": { "type": "Point", "coordinates": [ -8.7299945, 42.2200185 ] } },
{ "type": "Feature", "properties": { "NAME": "Bilbao", "POP_MAX": 875552 }, "geometry": { "type": "Point", "coordinates": [ -2.9299868, 43.2499815 ] } },
{ "type": "Feature", "properties": { "NAME": "The Hague", "POP_MAX": 1406000 }, "geometry": { "type": "Point", "coordinates": [ 4.2699613, 52.0800368 ] } },
{ "type": "Feature", "properties": { "NAME": "Kristiansand", "POP_MAX": 63814 }, "geometry": { "type": "Point", "coordinates": [ 7.97498387982654, 58.145619609019022 ] } },
{ "type": "Feature", "properties": { "NAME": "Hammerfest", "POP_MAX": 10000 }, "geometry": { "type": "Point", "coordinates": [ 23.6880009, 70.6612799 ] } },
{ "type": "Feature", "properties": { "NAME": "Bern", "POP_MAX": 275329 }, "geometry": { "type": "Point", "coordinates": [ 7.4669755, 46.9166828 ] } },
{ "type": "Feature", "properties": { "NAME": "Malmö", "POP_MAX": 269349 }, "geometry": { "type": "Point", "coordinates": [ 13.023059685006762, 55.599423954165587 ] } },
{ "type": "Feature", "properties": { "NAME": "Florence", "POP_MAX": 1500000 }, "geometry": { "type": "Point", "coordinates": [ 11.2500004, 43.7800008 ] } },
{ "type": "Feature", "properties": { "NAME": "Catania", "POP_MAX": 674542 }, "geometry": { "type": "Point", "coordinates": [ 15.0799991, 37.4999707 ] } },
{ "type": "Feature", "properties": { "NAME": "Dresden", "POP_MAX": 617515 }, "geometry": { "type": "Point", "coordinates": [ 13.7500028, 51.0499705 ] } },
{ "type": "Feature", "properties": { "NAME": "Bordeaux", "POP_MAX": 803000 }, "geometry": { "type": "Point", "coordinates": [ -0.5969589, 44.8519589 ] } },
{ "type": "Feature", "properties": { "NAME": "Marseille", "POP_MAX": 1400000 }, "geometry": { "type": "Point", "coordinates": [ 5.3730643, 43.2919249 ] } },
{ "type": "Feature", "properties": { "NAME": "Le Havre", "POP_MAX": 242124 }, "geometry": { "type": "Point", "coordinates": [ 0.1049701, 49.5049744 ] } },
{ "type": "Feature", "properties": { "NAME": "Rovaniemi", "POP_MAX": 34781 }, "geometry": { "type": "Point", "coordinates": [ 25.7159391, 66.5000352 ] } },
{ "type": "Feature", "properties": { "NAME": "Vaasa", "POP_MAX": 57014 }, "geometry": { "type": "Point", "coordinates": [ 21.6000146, 63.0999844 ] } },
{ "type": "Feature", "properties": { "NAME": "Tampere", "POP_MAX": 259279 }, "geometry": { "type": "Point", "coordinates": [ 23.7500126, 61.5000045 ] } },
{ "type": "Feature", "properties": { "NAME": "St.-Denis", "POP_MAX": 190047 }, "geometry": { "type": "Point", "coordinates": [ 55.4480778, -20.8788948 ] } },
{ "type": "Feature", "properties": { "NAME": "Venice", "POP_MAX": 270816 }, "geometry": { "type": "Point", "coordinates": [ 12.3349987, 45.4386593 ] } },
{ "type": "Feature", "properties": { "NAME": "Las Palmas", "POP_MAX": 378495 }, "geometry": { "type": "Point", "coordinates": [ -15.429999, 28.099976 ] } },
{ "type": "Feature", "properties": { "NAME": "Reykjavík", "POP_MAX": 166212 }, "geometry": { "type": "Point", "coordinates": [ -21.936546009025054, 64.143459463170331 ] } },
{ "type": "Feature", "properties": { "NAME": "Glasgow", "POP_MAX": 1160000 }, "geometry": { "type": "Point", "coordinates": [ -4.239100528802634, 55.862269757992621 ] } },
{ "type": "Feature", "properties": { "NAME": "Seville", "POP_MAX": 1212045 }, "geometry": { "type": "Point", "coordinates": [ -5.9800074, 37.4050153 ] } },
{ "type": "Feature", "properties": { "NAME": "Tromsø", "POP_MAX": 52436 }, "geometry": { "type": "Point", "coordinates": [ 18.9920252, 69.6350762 ] } },
{ "type": "Feature", "properties": { "NAME": "Trondheim", "POP_MAX": 147139 }, "geometry": { "type": "Point", "coordinates": [ 10.4166662, 63.4166575 ] } },
{ "type": "Feature", "properties": { "NAME": "Bergen", "POP_MAX": 213585 }, "geometry": { "type": "Point", "coordinates": [ 5.3245223, 60.3910024 ] } },
{ "type": "Feature", "properties": { "NAME": "Valencia", "POP_MAX": 808000 }, "geometry": { "type": "Point", "coordinates": [ -0.4019579, 39.4869634 ] } },
{ "type": "Feature", "properties": { "NAME": "Palermo", "POP_MAX": 863000 }, "geometry": { "type": "Point", "coordinates": [ 13.3480814, 38.1269689 ] } },
{ "type": "Feature", "properties": { "NAME": "Lyon", "POP_MAX": 1423000 }, "geometry": { "type": "Point", "coordinates": [ 4.8280846, 45.7719544 ] } },
{ "type": "Feature", "properties": { "NAME": "Cayenne", "POP_MAX": 61550 }, "geometry": { "type": "Point", "coordinates": [ -52.3300206, 4.9329922 ] } },
{ "type": "Feature", "properties": { "NAME": "Barcelona", "POP_MAX": 4920000 }, "geometry": { "type": "Point", "coordinates": [ 2.1814245, 41.3852454 ] } },
{ "type": "Feature", "properties": { "NAME": "Zürich", "POP_MAX": 1108000 }, "geometry": { "type": "Point", "coordinates": [ 8.5480643, 47.3819337 ] } },
{ "type": "Feature", "properties": { "NAME": "Oslo", "POP_MAX": 835000 }, "geometry": { "type": "Point", "coordinates": [ 10.7480333, 59.9186361 ] } },
{ "type": "Feature", "properties": { "NAME": "Dublin", "POP_MAX": 1059000 }, "geometry": { "type": "Point", "coordinates": [ -6.256979517281132, 53.34673124898314 ] } },
{ "type": "Feature", "properties": { "NAME": "Naples", "POP_MAX": 2250000 }, "geometry": { "type": "Point", "coordinates": [ 14.2430655, 40.8419711 ] } },
{ "type": "Feature", "properties": { "NAME": "Milan", "POP_MAX": 2945000 }, "geometry": { "type": "Point", "coordinates": [ 9.2030631, 45.4719211 ] } },
{ "type": "Feature", "properties": { "NAME": "Frankfurt", "POP_MAX": 2895000 }, "geometry": { "type": "Point", "coordinates": [ 8.6750154, 50.0999768 ] } },
{ "type": "Feature", "properties": { "NAME": "Hamburg", "POP_MAX": 1757000 }, "geometry": { "type": "Point", "coordinates": [ 9.9980533, 53.5519705 ] } },
{ "type": "Feature", "properties": { "NAME": "Munich", "POP_MAX": 1275000 }, "geometry": { "type": "Point", "coordinates": [ 11.5730476, 48.1318879 ] } },
{ "type": "Feature", "properties": { "NAME": "Helsinki", "POP_MAX": 1115000 }, "geometry": { "type": "Point", "coordinates": [ 24.932456915043964, 60.163803849485681 ] } },
{ "type": "Feature", "properties": { "NAME": "København", "POP_MAX": 1085000 }, "geometry": { "type": "Point", "coordinates": [ 12.5615399, 55.68051 ] } },
{ "type": "Feature", "properties": { "NAME": "Brussels", "POP_MAX": 1743000 }, "geometry": { "type": "Point", "coordinates": [ 4.3313707, 50.8352629 ] } },
{ "type": "Feature", "properties": { "NAME": "Madrid", "POP_MAX": 5567000 }, "geometry": { "type": "Point", "coordinates": [ -3.6852975, 40.4019721 ] } },
{ "type": "Feature", "properties": { "NAME": "Geneva", "POP_MAX": 1240000 }, "geometry": { "type": "Point", "coordinates": [ 6.140028, 46.2100075 ] } },
{ "type": "Feature", "properties": { "NAME": "Stockholm", "POP_MAX": 1264000 }, "geometry": { "type": "Point", "coordinates": [ 18.066300168534497, 59.324127204007475 ] } },
{ "type": "Feature", "properties": { "NAME": "Amsterdam", "POP_MAX": 1031000 }, "geometry": { "type": "Point", "coordinates": [ 4.9146943, 52.3519145 ] } },
{ "type": "Feature", "properties": { "NAME": "Berlin", "POP_MAX": 3406000 }, "geometry": { "type": "Point", "coordinates": [ 13.3996028, 52.5237645 ] } },
{ "type": "Feature", "properties": { "NAME": "Vienna", "POP_MAX": 2400000 }, "geometry": { "type": "Point", "coordinates": [ 16.3646931, 48.2019611 ] } },
{ "type": "Feature", "properties": { "NAME": "London", "POP_MAX": 8567000 }, "geometry": { "type": "Point", "coordinates": [ -0.1186677, 51.5019406 ] } },
{ "type": "Feature", "properties": { "NAME": "Rome", "POP_MAX": 3339000 }, "geometry": { "type": "Point", "coordinates": [ 12.4813126, 41.8979015 ] } },
{ "type": "Feature", "properties": { "NAME": "Paris", "POP_MAX": 9904000 }, "geometry": { "type": "Point", "coordinates": [ 2.352992461539213, 48.858092316269108 ] } }
]
}

237
www/index.html Normal file
View File

@@ -0,0 +1,237 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Pupmap by BoopLabs v2025-10-03_2300</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="style.css">
<link href="https://unpkg.com/maplibre-gl/dist/maplibre-gl.css" rel="stylesheet"/>
<script src="https://unpkg.com/maplibre-gl/dist/maplibre-gl.js"></script>
<script src="https://unpkg.com/pmtiles/dist/pmtiles.js"></script>
</head>
<body>
<input id="searchBox" placeholder="Search place..." />
<div id="map"></div>
<script>
const protocol = new pmtiles.Protocol();
maplibregl.addProtocol("pmtiles", protocol.tile);
const map = new maplibregl.Map({
container: 'map',
style: 'style.json',
center: [10, 60],
zoom: 4
});
map.on('load', () => {
// Roads
map.addSource('roads', {
type: 'geojson',
data: 'data/roads_europe_clean.geojson'
});
map.addLayer({
id: 'roads-minor',
type: 'line',
source: 'roads',
filter: ['==', ['get', 'type'], 'minor'],
paint: {
'line-color': '#cccccc',
'line-width': 1,
'line-opacity': 0.5
}
});
map.addLayer({
id: 'roads-major',
type: 'line',
source: 'roads',
filter: ['==', ['get', 'type'], 'major'],
paint: {
'line-color': '#555555',
'line-width': 2,
'line-opacity': 0.7
}
});
// Cities
map.addSource('cities', {
type: 'geojson',
data: 'data/world_cities_europe_clean.geojson'
});
map.addLayer({
id: 'city-points-small',
type: 'circle',
source: 'cities',
filter: ['<', ['get','POP_MAX'], 100000],
paint: {
'circle-radius': 3,
'circle-color': '#999999',
'circle-stroke-width': 1,
'circle-stroke-color': '#666666'
}
});
map.addLayer({
id: 'city-points-medium',
type: 'circle',
source: 'cities',
filter: ['all', ['>=', ['get','POP_MAX'], 100000], ['<', ['get','POP_MAX'], 500000]],
paint: {
'circle-radius': 5,
'circle-color': '#777777',
'circle-stroke-width': 1,
'circle-stroke-color': '#555555'
}
});
map.addLayer({
id: 'city-points-large',
type: 'circle',
source: 'cities',
filter: ['>=', ['get','POP_MAX'], 500000],
paint: {
'circle-radius': 7,
'circle-color': '#444444',
'circle-stroke-width': 1,
'circle-stroke-color': '#222222'
}
});
// City labels, zoom + population based
map.addLayer({
id: 'city-labels',
type: 'symbol',
source: 'cities',
layout: {
'text-field': ['get', 'NAME'],
'text-font': ['Open Sans Bold', 'Arial Unicode MS Bold'],
'text-size': [
'interpolate', ['linear'], ['zoom'],
4, 10,
6, 12,
10, 16
],
'text-offset': [0, 1.2],
'text-anchor': 'top'
},
paint: {
'text-color': '#222222',
'text-halo-color': '#ffffff',
'text-halo-width': 1
},
filter: [
'>',
['get','POP_MAX'],
['interpolate', ['linear'], ['zoom'],
4, 2000000, // at zoom 4, only megacities
6, 1000000, // at zoom 6, large cities
8, 500000, // at zoom 8, medium cities
10, 100000 // at zoom 10+, small cities
]
]
});
// City popups
map.on('click', ['city-points-small','city-points-medium','city-points-large'], (e) => {
const coordinates = e.features[0].geometry.coordinates.slice();
const cityName = e.features[0].properties.NAME || "Unknown City";
const population = e.features[0].properties.POP_MAX || "n/a";
new maplibregl.Popup()
.setLngLat(coordinates)
.setHTML(`<strong>${cityName}</strong><br/>Population: ${population}`)
.addTo(map);
});
// Cursor for city dots
['city-points-small','city-points-medium','city-points-large'].forEach(layer => {
map.on('mouseenter', layer, () => { map.getCanvas().style.cursor = 'pointer'; });
map.on('mouseleave', layer, () => { map.getCanvas().style.cursor = ''; });
});
// POIs
map.addSource('pois', {
type: 'geojson',
data: 'data/pois.geojson',
cluster: true,
clusterMaxZoom: 14,
clusterRadius: 50
});
map.addLayer({
id: 'clusters',
type: 'circle',
source: 'pois',
filter: ['has', 'point_count'],
paint: {
'circle-color': '#FF0000',
'circle-radius': ['step', ['get','point_count'], 15, 10, 20, 50, 25],
'circle-opacity': 0.7,
'circle-stroke-width': 1,
'circle-stroke-color': '#fff'
}
});
map.addLayer({
id: 'unclustered-point',
type: 'circle',
source: 'pois',
filter: ['!', ['has','point_count']],
paint: {
'circle-color': '#FF0000',
'circle-radius': 8,
'circle-opacity': 0.7,
'circle-stroke-width': 1,
'circle-stroke-color': '#fff'
}
});
map.on('click', 'unclustered-point', (e) => {
const coordinates = e.features[0].geometry.coordinates.slice();
const popupContent = e.features[0].properties.popup || e.features[0].properties.names.join(', ');
new maplibregl.Popup()
.setLngLat(coordinates)
.setHTML(`<strong>${popupContent}</strong>`)
.addTo(map);
});
map.on('click', 'clusters', (e) => {
const features = map.queryRenderedFeatures(e.point, { layers: ['clusters'] });
const clusterId = features[0].properties.cluster_id;
map.getSource('pois').getClusterExpansionZoom(clusterId, (err, zoom) => {
if (err) return;
map.easeTo({ center: features[0].geometry.coordinates, zoom: zoom });
});
});
['clusters', 'unclustered-point'].forEach(layer => {
map.on('mouseenter', layer, () => { map.getCanvas().style.cursor = 'pointer'; });
map.on('mouseleave', layer, () => { map.getCanvas().style.cursor = ''; });
});
});
// Nominatim search
document.getElementById('searchBox').addEventListener('keypress', async function(e){
if(e.key==='Enter'){
const query = e.target.value;
const url = `http://yourhost:7070/search?q=${encodeURIComponent(query)}&format=json`;
try{
const res = await fetch(url);
const results = await res.json();
if(results.length>0){
const loc = results[0];
map.flyTo({ center: [loc.lon, loc.lat], zoom: 12 });
}else{ alert("No results found"); }
}catch(err){ alert("Error connecting to search API"); console.error(err);}
}
});
</script>
</body>
</html>

26
www/style.css Normal file
View File

@@ -0,0 +1,26 @@
/* Pupmap style.css */
body, html {
margin: 0;
padding: 0;
height: 100%;
}
#map {
width: 100%;
height: 100%;
}
#searchBox {
position: absolute;
top: 10px;
left: 10px;
z-index: 999;
width: 220px;
padding: 6px;
border-radius: 4px;
border: 1px solid #ccc;
background: #fff;
font-size: 14px;
}

81
www/style.json Normal file
View File

@@ -0,0 +1,81 @@
{
"version": 8,
"name": "Pupmap by BoopLabs v2025-10-03_1300",
"sources": {
"basemap": {
"type": "vector",
"url": "pmtiles://data/world.pmtiles"
}
},
"layers": [
{
"id": "background",
"type": "background",
"paint": {
"background-color": "#C6F1DC"
}
},
{
"id": "earth",
"type": "fill",
"source": "basemap",
"source-layer": "earth",
"paint": {
"fill-color": "#97E3C1"
}
},
{
"id": "land",
"type": "fill",
"source": "basemap",
"source-layer": "landcover",
"paint": {
"fill-color": "#C6F1DC"
}
},
{
"id": "landuse",
"type": "fill",
"source": "basemap",
"source-layer": "landuse",
"paint": {
"fill-color": "#97E3C1"
}
},
{
"id": "water",
"type": "fill",
"source": "basemap",
"source-layer": "water",
"paint": {
"fill-color": "#7CD5E9"
}
},
{
"id": "boundaries2",
"type": "line",
"source": "basemap",
"source-layer": "boundaries",
"paint": {
"line-color": "#F08650",
"line-width": 1
}
},
{
"id": "boundaries",
"type": "line",
"source": "basemap",
"source-layer": "boundaries",
"filter": [
"<=",
"pmap:min_admin_level",
1
],
"paint": {
"line-color": "#000000",
"line-width": 2
}
}
]
}