European (major) capitals

Data acquisition

Download nodes from capital cities in a given bounding box (west, south, east, north)

from cartes.osm import Overpass

capitals = Overpass.request(
    bounds=(-30, 33, 35, 70),
    node={"capital": "yes"}
)

Data preprocessing

None

Data visualisation

import altair as alt
from vega_datasets import data

# Capital cities information
base = alt.Chart(capitals).encode(
    alt.Tooltip(["name:N", "population:Q"]),
    alt.Text("name:en:N"),
)

# Data generators for the background
sphere = alt.sphere()
graticule = alt.graticule()

# Source of land data
source = alt.topo_feature(data.world_110m.url, "countries")


alt.layer(
    # First the graticule for the projection
    alt.Chart(alt.graticule()).mark_geoshape(stroke="lightgray"),
    # The map
    alt.Chart(source).mark_geoshape(fill="lightgray", stroke="black"),
    # The points for locating the cities
    base.mark_geoshape().encode(alt.Color("population:Q")),
    # City names if population is above 300k
    base.mark_text(font="Ubuntu", fontSize=12, dy=10, align="center")
    .encode(alt.Latitude("latitude:Q"), alt.Longitude("longitude:Q"))
    .transform_filter("datum.population > 300000"),
).properties(
    width=500, height=400, title="European (major) Capitals"
).configure_title(
    font="Fira Sans", fontSize=16, anchor="start"
).project(
    # The projection (coming soon as crs)
    "conicConformal",
    rotate=[-15, -52, 0],
    parallels=[35, 65],
    scale=400,
)