- 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)
433 lines
26 KiB
Markdown
433 lines
26 KiB
Markdown
# 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 — see `libs/geodata/README.md`
|
||
> for 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.rs` generalizes to this.
|
||
- **C. Live point/vector overlays** (existing `overlay.rs` machinery 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 `.index` sidecar with byte
|
||
offsets per param → one HTTP range request pulls a global 10u/10v field (~870 KB).
|
||
Better European skill than GFS. `data.ecmwf.int` verified 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 in `harmonie_arome_cy43_p3` (GRIB1 tars).
|
||
- **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.
|
||
(Replaces `Actuele10mindataKNMIstations`, 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 `.om` chunk 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):
|
||
1. Init road vertices at DEM height (Mapterhorn/AHN, above).
|
||
2. 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.)
|
||
3. Bake per-vertex Δz-above-DEM into our tiles; the renderer lifts decks and sinks
|
||
tunnels from the same terrain drape.
|
||
4. 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 at
|
||
`data.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):
|
||
|
||
1. **Energy-aware graph**: at `nav-build` time, sample AHN (NL) / GLO-30 (Europe)
|
||
along every edge → per-edge climb/descent meters packed next to length/speed in
|
||
`region.graph`. Cost function becomes physics: rolling + aero (speed²) + mass ×
|
||
climb − regen × descent. Flat NL barely notices; the first Ardennen/Alpen trip does.
|
||
2. **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.
|
||
3. **Charger-aware planning**: NDW OCPI + OCM chargers as graph POIs; multi-stop
|
||
route planning picks charging stops by detour cost + connector/power filtering.
|
||
4. **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
|
||
|
||
1. **Building age (path A)** — `start_date` is 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.
|
||
2. **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).
|
||
3. **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.
|
||
4. **Elevation into the graph (path D)** — EV/bike energy-aware routing + range
|
||
polygon; quiet infrastructure, big payoff once routes leave the polder.
|
||
5. **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).
|