- Sync with latest upstream dev branch - Include all map improvements: 2D/3D toggle, shadows, labels, overlays - Include platform updates: location API, audio echo cancellation - Preserve fork-specific re-exports (gltf, csg, test)
26 KiB
Open data sources for map overlays
Survey of open datasources we can overlay on the Europe map, researched and
endpoint-verified 2026-07-27 (curl-probed where noted). Netherlands-first, Europe-wide
where possible. Companion to gps.md (interaction layer) and map.md (renderer).
Implementation:
libs/geodata(CLI:geodata) is the bulk-download + layer-database builder born from this survey — seelibs/geodata/README.mdfor the per-layer database schemas and which layers are built vs planned.
License verdicts used below:
- OPEN — CC0 / public domain / no conditions. Bundle, redistribute, ship.
- ATTR — CC-BY-style. Fine, needs an attribution screen.
- NC — non-commercial only. Fine for the hobby build, blocks a commercial app.
- RESTRICTED — permission required / unusable. Listed to warn.
How overlays plug into our stack
Five integration paths, roughly in order of how much new machinery each needs:
- A. Tile-time attribute join (import pipeline,
tools/map_tiles): join external attributes onto OSM features while building our own tiles. Zero new renderer work — the style layer just gets new tags to color by. - B. Raster overlay layer (new renderer feature): decode raster tiles (PNG/WebP/COG)
onto textures, alpha-blend above the base map, optional time dimension for animation
(radar frames). One feature, many layers: radar, hillshade, aerial, satellite, model
fields. The tile scheduling/fade machinery in
view.rsgeneralizes to this. - C. Live point/vector overlays (existing
overlay.rsmachinery from the nav work): markers, polylines, colored road segments fed by a background poller. Transit vehicles, planes, ships, chargers, traffic coloring. - D. Routing-graph enrichment (
libs/map_nav+ import): per-edge attributes (elevation profile, live travel times, bridge state) that change route costs, not pixels. - E. 3D import (box3d/xr track): real building meshes and terrain meshes.
1. Weather
OPERA / EUMETNET European rain radar — the headline find
The pan-European radar composite became genuinely open via the EU high-value-datasets
push. The EUMETNET Open Radar Data (ORD) API on MeteoGate serves OPERA composites:
max reflectivity at 1 km / 5 min and surface rain rate + 1-h accumulation at
2 km / 15 min, all of Europe, as ODIM HDF5 and cloud-optimized GeoTIFF, rolling
24 h + archive to 2012. Anonymous tier verified live
(https://api.meteogate.eu/eu-eumetnet-weather-radar/collections returns 200); free
API key raises limits; MQTT push available. ATTR (CC BY 4.0).
Integration: B — COG → reproject to mercator → colormap → animated raster frames.
KNMI Data Platform (NL detail + nowcast)
5-min NL reflectivity composite (radar_reflectivity_composites/2.0) plus
radar_forecast/1.0 — a +2 h nowcast in 5-min steps, i.e. the "rain in the next
two hours" animation comes precomputed. HARMONIE-AROME forecast grids (GRIB1) too.
REST file API + MQTT push; free key (shared anonymous key exists). ATTR (CC BY 4.0).
Format: KNMI HDF5, polar-stereographic — needs decode + reprojection (or accept the
2 km OPERA rain-rate product for NL too and skip HDF5 entirely at first).
Wind fields — the animated particle/arrow layer (verified 2026-07-28)
The windy.com / earth.nullschool effect needs a gridded 10 m u/v field (not speed/direction points): u/v becomes a small RG texture per forecast step, a shader advects fading particles through it, steps crossfade for the time animation — the same technique as Beccario's earth and Mapbox's WebGL wind demo; their grib2json/leaflet-velocity JSON is literally this grid, we just decode GRIB2/NetCDF ourselves. All sources below carry 10 m u/v (+ gusts); curl-probed 2026-07-28:
- NOAA GFS via NOMADS — global 0.25°, 4 runs/day, hourly steps to 120 h. The
filter CGI subsets by variable and bbox server-side: 10 m U+V over a NL box
returned a 939-byte GRIB2
(
filter_gfs_0p25.pl?...&var_UGRD=on&var_VGRD=on&lev_10_m_above_ground=on&subregion=&...). OPEN (US public domain — the only no-attribution source). The bootstrap source for the shader work: bytes per frame, no key, and it's what windy/nullschool themselves run on. - ECMWF open data (IFS) — global 0.25°, GRIB2, 4 runs/day, 3-h steps to 144 h
(6-h to 240 h), no registration. Each file has an
.indexsidecar with byte offsets per param → one HTTP range request pulls a global 10u/10v field (~870 KB). Better European skill than GFS.data.ecmwf.intverified fine; the AWS mirror (ecmwf-forecasts, eu-central-1) throttles hard (SlowDown after a handful of rapid hits). ATTR (CC BY 4.0). - KNMI UWC-West HARMONIE —
uwcw-ha-det-nl-s1— NL at 2 km, hourly runs, 60 h horizon, one NetCDF per parameter:wind-speed-components-hagl(u/v at 10 m- boundary-layer levels, ~57 MB/run) or speed/direction/gust-only files
(~27 MB each). Verified landing hourly. Free registered key; the shared anonymous
key is 50 req/min shared and rate-limited repeatedly while probing — register.
ATTR (CC BY 4.0). The NL-detail layer once the particle pass exists. Its
predecessors (
harmonie_arome_cy43_p1= 850 MB GRIB1 tars/run,uwcw_extra_lv_ha43_nl_2km) are deprecated; the Europe-wide 0.05° DINI domain sits inharmonie_arome_cy43_p3(GRIB1 tars).
- boundary-layer levels, ~57 MB/run) or speed/direction/gust-only files
(~27 MB each). Verified landing hourly. Free registered key; the shared anonymous
key is 50 req/min shared and rate-limited repeatedly while probing — register.
ATTR (CC BY 4.0). The NL-detail layer once the particle pass exists. Its
predecessors (
- DWD ICON-D2 / ICON-EU — D2: 2.2 km covering Germany + all of Benelux, hourly
u_10m/v_10m, regular-lat-lon variants available (~1 MB bz2 per step), plain HTTPS directory, no key (opendata.dwd.de/weather/nwp/icon-d2/grib/<run>/u_10m/). ICON-EU at 6.5 km likewise. ATTR (GeoNutzV). The middle tier between ECMWF and KNMI 2 km. - Live station wind (observed arrows): KNMI
10-minute-in-situ-meteorological-observations— ~156 KB NetCDF every 10 min, all NL automatic stations incl. wind poles, verified fresh at probe time. ATTR. Path C arrow markers + a "now" calibration for the model field. (ReplacesActuele10mindataKNMIstations, which stopped updating 2025-09-29.) - Shortcut worth knowing: Open-Meteo's AWS open-data bucket republishes
ECMWF/ICON/HARMONIE grids pre-merged in their custom
.omchunk format — convenient, but the raw GRIB2/NetCDF above is plain enough to skip the extra format dependency.
Integration: path B's raster/time machinery + one new GPU particle pass (u/v → RG texture per step, advect + fade, interpolate between steps); arrows are the cheap first render of the same field. The identical u/v grid later feeds the EV headwind term (EV thread, point 4).
Forecast field overlays (cloud, snow, precip)
- ECMWF open data — IFS/AIFS at 0.25°, GRIB2, 4 runs/day, no registration, mirrors on AWS S3. ATTR (CC BY 4.0). Cloud cover, snow depth, and the other synoptic fields (wind: see above).
- DWD ICON-EU — 6.5 km Europe grid, GRIB2, plain HTTPS directory, no signup
(
opendata.dwd.de). ATTR (GeoNutzV). Sharper than ECMWF over central Europe; ICON-D2 (2.2 km) covers eastern NL fringe. - Open-Meteo — JSON point/route forecasts; accepts coordinate lists → forecast along a route in one call (EV: wind + temperature per leg). Data is CC-BY; hosted API free for non-commercial (~10k calls/day); AGPL self-host option. ATTR data / NC hosted API.
- MET Norway api.met.no — CC-BY point forecasts, no key (mandatory User-Agent); solid backup.
Satellite cloud layer
EUMETSAT EUMETView — WMS/WMTS at view.eumetsat.int/geoserver, no registration:
Meteosat MTG imagery, full disc every 10 min, rapid-scan Europe 5 min. ATTR.
Integration: B, trivially (it's already a tile service; cache politely).
Flagged unsuitable
- RainViewer — free tier now personal/educational only, nowcast+satellite removed from the public endpoint, max zoom 7. Prototyping only. NC.
- Buienradar — imagery not georeferenced; apps require written permission. RESTRICTED (and redundant: KNMI is its upstream).
- Blitzortung lightning — network participants only, no commercial use. RESTRICTED. No open EU lightning alternative exists.
2. Buildings, elevation, imagery
Building age (the NL building-age map) — nearly free for us
Dutch OSM buildings originate from the community BAG import and already carry
ref:bag (BAG pand id) and start_date (= bouwjaar) — the construction year
is already in the Europe PBF on disk. v1 building-age coloring is therefore pure
path A: keep start_date on buildings at tile build, add an age→color ramp to the
style. For authoritative/fresh data later: BAG via PDOK — bag-light.gpkg
(7.8 GB GeoPackage, monthly, OPEN — CC0), exact join on ref:bag =
identificatie. Prior art: Waag's "All 9.8M buildings" map (2013).
Building heights + real 3D (NL)
3D BAG (TU Delft, release 2025.09, ~10.8M buildings): per-building height stats
(ground/roof percentiles, ridge) derived from LiDAR — join by the same BAG id at tile
build (path A) and extrude in the renderer; plus LoD2.2 roof-shape meshes as
3D Tiles 1.1 / CityJSON / OBJ per-tile downloads for the real-3D showcase
(path E). ATTR (CC BY 4.0). OSM's own building:levels covers only ~6% globally
and worse in NL — 3D BAG is the answer here.
Europe-wide fallback: EUBUCCO v0.2 (322M buildings, height ~43%, age ~16%,
ODbL share-alike) or JRC DBSM R2025 (harmonized EU stock, ODbL).
Elevation (the EV-routing input)
- AHN (NL LiDAR): 0.5 m DTM/DSM GeoTIFF/COG via PDOK atom/WCS, AHN4 complete, AHN5 rolling in. OPEN. Best-in-class; also validates 3D BAG heights.
- Copernicus DEM GLO-30 (30 m, Europe/global): anonymous COGs on AWS
(
s3://copernicus-dem-30m/). ATTR (credit notice). The pan-European base under AHN. (EU-DEM is discontinued; the 10 m EEA product is access-restricted — skip.) - Ready-made terrain tiles: Mapterhorn — terrarium-encoded terrain tiles for
Europe built from Copernicus + national LiDAR, distributed as a single PMTiles
file (
download.mapterhorn.com/planet.pmtiles), open data, offline-friendly — the fastest route to hillshade + 3D terrain. AWS/Mapzen terrain tiles still exist (ATTR) but carry stale EU-DEM-era data for Europe.
Uses: hillshade raster overlay (B), 3D terrain meshes (E), and per-edge climb/descent
baked into region.graph (D) — see the EV section.
Road elevation / grade separation (overpasses in the 3D car-follow view)
Researched 2026-07-29: OSM will not store road z, and there is no plan to. The
data model is 2D lat/lon; ele=* is for summits/POIs ("OSM is not an elevation
database") and no active proposal changes that. Overture's transportation schema
keeps the same design — level is relative stacking only, explicitly "not a
precise indication of elevation". What road geometry does carry (all already in
our PBF): layer=* (relative −5..5), bridge/tunnel, incline=*, maxheight
(clearance under), occasionally height on bridge ways.
The ecosystem plan-of-record is derive z at build time: DEM + OSM semantics + constraint solving. OSM2World is the reference implementation (init every road vertex at terrain height → equal-z at shared nodes → minimum vertical clearance at bridge-over-road crossings → tunnels below terrain → grade smoothing + per-class incline clamps), and its Prototype-Fund "OSM-3D-Terrain" project (roadmap June 2026) is productizing exactly this into 3D tiles with LOD and tile-boundary continuity — worth watching. No open vector-map renderer draws true grade-separated interchanges yet (MapLibre's terrain drape squashes bridges flat), so doing it properly is a differentiator.
Our recipe (tile/nav build):
- Init road vertices at DEM height (Mapterhorn/AHN, above).
- Constraint pass; never sample the DEM mid-bridge/-tunnel — interpolate between abutments. (The classic artifact — elevation profile dipping into the valley under the viaduct — would also poison the EV climb numbers in the EV thread below.)
- Bake per-vertex Δz-above-DEM into our tiles; the renderer lifts decks and sinks tunnels from the same terrain drape.
- NL upgrade — measured deck heights instead of solved ones:
- RWS DTB (PDOK, open): cm-grade surveyed x/y/z lines/points/areas covering exactly the RWS motorway network incl. interchanges; z now in the WFS too.
- AHN: DSM keeps bridge decks, DTM removes them → DSM−DTM over bridge polygons ≈ deck height; the LAZ point clouds classify structures directly.
- Kadaster 3D Basisvoorziening (open, 3dfier-generated): ready-made 3D terrain + LoD1 bridge decks, if ingesting meshes beats solving.
Aerial & satellite imagery
- PDOK Luchtfoto (NL): 25 cm nationwide 2×/year + 8 cm HR flights, WMTS + bulk GeoTIFF download via the Beeldmateriaal dataroom. ATTR (CC BY 4.0) — offline self-tiling is explicitly legal. NL "satellite view" solved.
- Sentinel-2: EOX cloudless mosaics are NC for 2018–2024 (only the 2016 layer is CC-BY) — trap. The open path is compositing our own cloudless mosaic from raw Sentinel-2 L2A COGs on the Copernicus Data Space (OPEN/ATTR, one-off batch job).
- Germany: NRW 10 cm orthophotos are license-zero (no attribution!); Belgium via geo.be WMTS (ATTR). Per-country patchwork.
- GHSL (JRC): built-up surface 10 m, building height 100 m, population rasters. ATTR. Coarse Europe-wide fallbacks and a population-density shading layer.
3. Mobility & live transport
OVapi / NDOV — all Dutch public transport, live, CC0
The backbone NL feed, verified live (sub-minute freshness): static GTFS (~223 MB,
daily) + GTFS-RT protobufs — vehiclePositions.pb (~218 KB!), tripUpdates.pb,
trainUpdates.pb, alerts.pb at gtfs.ovapi.nl / gtfs.openov.nl. No key, no
registration, OPEN (CC0). Every bus/tram/metro/train in the country as a live layer
for one small protobuf poll every ~30 s (path C: colored vehicle markers; tap for
line/delay). Volunteer-run — identify with a User-Agent, poll politely; NDOV loket
(free registration, ZeroMQ push) is the harder-core fallback. The NS API is redundant
for positions (proprietary terms; OVapi carries all rail already).
NDW — national road traffic, minute cadence, no key
https://opendata.ndw.nu/ — plain HTTPS directory of gzipped DATEX II XML refreshed
every minute, OPEN, verified live: point speeds/intensities from 24k+ sites
(trafficspeed.xml.gz), segment travel times, situation feed (jams, closures,
wrong-way drivers, live bridge openings — six bridges stood open at check time),
matrix-sign states, roadworks/events planning, temporary speed limits, emission
zones, truck parking, and a national EV-charger dataset in OCPI JSON. Effort sits
in DATEX II parsing + matching their location references onto our road segments; the
payoff is double: traffic coloring overlay (C) and live routing weights + bridge
penalties (D). Historical archive via Dexter.
Europe-wide transit
No single EU GTFS-RT exists. Practical ladder: NL = OVapi; DE = gtfs.de mirrors
(CC-BY, no login, incl. a free Germany-wide GTFS-RT feed, verified); rest via the
Transitous project (1,800+ cleaned feeds, re-published openly; hosted MOTIS API is
non-commercial fair-use — self-host MOTIS with their feed list if it pinches) and the
european-transport-feeds / Mobility Database catalogs.
Live vehicles for fun (path C, cheap to add)
- OpenSky — live aircraft state vectors, bbox REST query, OAuth2; registered free tier ≈ one NL-bbox poll/22 s. NC free tier. Feeding an ADS-B receiver doubles the quota.
- aisstream.io — free WebSocket AIS ship positions (good near NL coast/ports); thin license text — fine for hobby, clarify before commercial. Official NL inland AIS is deliberately closed — don't plan on it.
- OV-fiets GBFS —
gbfs.openov.nl/ovfiets/gbfs.json, live rental-bike availability per station, 60 s TTL, OPEN. Perfect companion to transit routing. - Autobahn API (DE) — no-key REST JSON: roadworks, closures, webcams, chargers per motorway. OPEN. Easiest German traffic entry point.
EV charging
NDW's OCPI feed for NL (open, national, refreshed ~daily) + OpenChargeMap for
the rest of Europe (CC-BY, free key, rate-limited). Neither gives live occupancy for
free. OSM's amenity=charging_station lags reality in NL — use it only as fallback.
Cycling
NL junction networks (knooppunten) are fully and actively mapped in OSM — already in our data; render as an overlay style. The official Fietsplatform database is RESTRICTED (purpose-limited license) — avoid.
Water
Rijkswaterstaat WaterWebservices (new endpoint
ddapi20-waterwebservices.rijkswaterstaat.nl — old one is being switched off in
2026): water levels every ~10 min, JSON, no registration, OPEN. Plus
vaarweginformatie.nl fairway notices for lock/bridge operating times.
4. Environment & statistics
Air quality
- Luchtmeetnet (RIVM, official NL): ~100 stations, hourly NO2/PM/O3 + LKI index +
interpolated concentrations at arbitrary lat/lon. JSON API
(
api.luchtmeetnet.nl/open_api), no auth, 100 req/5 min; bulk CSV atdata.rivm.nl/data/luchtmeetnet/. ATTR (CC BY 4.0). Primary NL live layer. - Sensor.Community: crowdsourced PM, densest network in DE/NL; bbox-filterable
JSON (
data.sensor.community), daily CSV archive. OPEN (ODbL-family, attr). Noisy per-sensor — hex-bin into a heatmap. RIVM Samen Meten (SensorThings API) offers RIVM-calibrated versions of the same citizen sensors. - EEA (Europe): the old file dumps are discontinued; current Download Service serves Parquet timeseries + modelled rasters (ATTR). Europe-wide historical/modelled; use Luchtmeetnet for NL live.
Noise
RIVM "Geluid in Nederland" is the winner: whole-NL 10 m Lden/Lnight rasters per
source (highways, municipal roads, rail, aviation, industry, wind turbines) as
CC0 GeoTIFF downloads (data.rivm.nl/data/alo/...) + WMS. Bake our own raster
tiles (path B). Official END round-4 contour polygons (also CC0) on PDOK/haleconnect
if we want crisp vectors; EEA publishes the Europe-wide equivalents (ATTR, country
completeness varies).
Land cover
CORINE CLC2018 (100 m, Europe) — still the latest until CLC2024 lands mid-2026; GeoTIFF via land.copernicus.eu (EU-Login) or a no-login EEA WMS mirror. ATTR. CLC+ Backbone 10 m (2023 edition) is the modern high-res version — gorgeous green/urban/water backdrop at z13+. Both EPSG:3035 → one ingest-time reprojection.
Protected nature
PDOK Natura 2000: direct 10.7 MB GeoPackage, CC0, verified — ship it offline as vector-tile polygons (path A). Also CC0 on PDOK: Wetlands/Ramsar (3.8 MB), Nationale Parken (3.25 MB), Natuurnetwerk Nederland. Europe: EEA Natura 2000 bundle (2.3 GB SHP/GPKG, ATTR). WDPA/Protected Planet is RESTRICTED (redistribution ban incl. offline maps) — not needed, the open sets cover Europe.
Flood risk (very Dutch, very good)
- LIWO (Rijkswaterstaat): public GeoServer, no login — max water depth per probability class, with WCS access to pull actual depth grids for offline baking. De-facto open, attribute RWS.
- Klimaateffectatlas WMS: the same national data with a clean CC BY 4.0 citation surface; three probability classes as UI granularity.
- PDOK ROR flood risk/hazard zone polygons: CC0, tiny — the cheap "am I in a flood zone?" layer.
- JRC Europe river flood hazard v3.1.1: depth GeoTIFFs per return period, ~90 m, WGS84, anonymous FTP-style download (RP100 = 323 MB), ATTR. The Europe-wide layer.
Demographics
- CBS Wijk- en Buurtkaart (2025 on PDOK): neighborhood polygons with population, age, income, density, housing — the canonical NL choropleth. GPKG ~261 MB. ATTR (cite CBS + Kadaster).
- CBS 100 m / 500 m grids (Vierkantstatistieken, direct zips from
download.cbs.nl/vierkant/): per-cell population, age/sex, housing, WOZ value, energy consumption — the best 3D-extrusion layer we could ship (100 m at high zoom, 500 m as LOD). ATTR. Cells under 5 residents are suppressed. - Eurostat GISCO Census 2021 grid V3 (May 2026): 1 km grid, 30 countries, 13 variables, GeoParquet/GPKG/GeoTIFF. ATTR. Pairs with the CBS grid inside NL.
- CBS StatLine OData: join any statistic onto wijk/buurt codes at ingest, no key.
- GHSL population/built-up rasters (see §2) as the global fallback.
Historic maps
No official open Topotijdreis WMTS exists. The clean route: RCE Bonnebladen ~1900 via RCE's geo services (ATTR, pre-1930 imagery PD by age) — a "year slider" overlay anchored on ~1900 vs today. The per-year Esri NL "tijdreis" tile services work but are legally gray (unofficial). Pan-European: Arcanum is commercial, David Rumsey is NC — skip both.
Wikipedia / Wikidata ("what's around me")
Wikipedia geosearch API (no key, radius ≤10 km, descriptive User-Agent), Wikidata SPARQL for bulk coordinates (coordinates CC0), Commons geosearch for geotagged photos. Best value-per-effort in this whole document: article-card popups on map points (path C), cacheable offline. NL Wikipedia + Rijksmonumenten together make a genuinely good heritage layer.
Fun extras (all verified, all NL unless noted)
- Rijksmonumenten (~63k national monuments): RCE WFS/WMS, nightly refresh, ATTR.
- Kadastrale kaart (BRK): PDOK serves native MVT vector tiles — drop-in cadastral parcel lines at high zoom, ATTR. (The BAG OGC API also serves native MVT with bouwjaar — an alternative to our own join for quick experiments.)
- Groningen earthquakes: KNMI FDSN event API, ATTR — bubble map.
- Trees: Amsterdam serves ~300k trees with species/year as native MVT
(
api.data.amsterdam.nl/v1/mvt/bomen); Rotterdam etc. on data.overheid.nl. - Solar potential per roof: Zonatlas-derived national dataset, Public Domain Mark, but dated — verify before building on it.
- Energy labels (EP-Online/RVO): monthly dump, free key, joins on BAG ids — no open license: usable, don't redistribute. A–G choropleth per building.
- AEDs, windmills, etc.: no open national registers — OSM/Overpass has them.
The EV thread (elevation + chargers + weather, combined)
The pieces above compose into proper EV routing (extends gps.md M3):
- Energy-aware graph: at
nav-buildtime, sample AHN (NL) / GLO-30 (Europe) along every edge → per-edge climb/descent meters packed next to length/speed inregion.graph. Cost function becomes physics: rolling + aero (speed²) + mass × climb − regen × descent. Flat NL barely notices; the first Ardennen/Alpen trip does. - Range visualization: energy-cost Dijkstra from current position + state of charge → reachable-area polygon shaded on the map ("can I make it without charging?"), recomputed as you drive.
- Charger-aware planning: NDW OCPI + OCM chargers as graph POIs; multi-stop route planning picks charging stops by detour cost + connector/power filtering.
- Weather correction: Open-Meteo along-route wind + temperature → headwind term in the aero cost and a cold-battery efficiency factor. This is what makes highway range predictions honest.
Licensing traps (one-screen summary)
| Source | Trap |
|---|---|
| RainViewer | personal/educational only now; free tier gutted |
| Buienradar | apps need written permission — use KNMI (its upstream) |
| Blitzortung | participants only, no commercial |
| EOX Sentinel-2 cloudless | 2018+ mosaics are CC-BY-NC; only 2016 is CC-BY |
| Copernicus EEA-10 DEM | access-restricted — use GLO-30 |
| EUBUCCO / DBSM | ODbL share-alike — mind derived-database obligations |
| Fietsplatform routes | purpose-limited license — OSM has the networks anyway |
| NS API | proprietary terms and redundant — OVapi is CC0 |
| Transitous hosted API | non-commercial fair-use — self-host MOTIS instead |
| OpenSky / aisstream / Open-Meteo hosted | free tiers are non-commercial |
| WDPA / Protected Planet | redistribution ban (incl. offline maps) — use Natura 2000/CDDA |
| David Rumsey / Arcanum historic maps | NC / commercial — use RCE Bonnebladen |
| EP-Online energy labels | no open license — use, don't redistribute |
| Esri NL "tijdreis" historic tiles | no stated terms — legally gray, unofficial |
| Everything NL-official (BAG, AHN, luchtfoto, NDW, OVapi, RWS, RIVM noise, PDOK nature/flood) | no traps — CC0/CC-BY, bundle away |
Suggested build order
- Building age (path A) —
start_dateis already in our PBF; a tag to keep + a color ramp. One day of work for the most beautiful quick win; the Waag map from OSM data we already have. - Raster overlay layer in the renderer (path B) — the enabling feature. First consumer: hillshade from Mapterhorn PMTiles (static, offline, no cadence pressure). Second: rain radar animation (OPERA COG → colormapped frames + the KNMI 2 h nowcast for NL) — the "amazing" one. Third: the wind particle layer (§1 wind fields) — reuses the same time-dimension machinery plus one GPU particle pass; bootstrap on GFS bbox subsets (bytes per frame, no key).
- Live transit + traffic (path C) — OVapi vehicle positions as moving markers; NDW travel-time coloring on trunk roads. Both are single-file pollers feeding the existing overlay machinery.
- Elevation into the graph (path D) — EV/bike energy-aware routing + range polygon; quiet infrastructure, big payoff once routes leave the polder.
- 3D BAG + AHN terrain (path E) — the showcase: LoD2.2 roofs + real terrain in the xr/3D track.
Once paths A–C exist, §4 provides cheap follow-on layers that reuse them: Natura 2000 polygons (10.7 MB CC0 GPKG → path A), RIVM noise + JRC flood rasters (CC0/CC-BY GeoTIFFs → path B), Wikipedia/Rijksmonumenten points (path C), and the CBS 100 m grid as the first 3D-extrusion statistics layer (path E).