Methodology & Technical Details
How Horizon Mapper builds travel-time zones, population overlays, and market stats
We generate isochrones with OpenRouteService (ORS). Each request asks ORS for a single whole-minute travel duration from 5 to 60 minutes, then returns a polygon boundary that follows real road geometry.
- •Real road topology, speed limits, one-way streets, and turn restrictions
- •Elevation-aware routing for cycling and walking profiles
- •No straight-line shortcuts—every edge is a navigable segment
Isochrones are cached in-memory (and in Redis when configured) to avoid repeated calls when you pan or tweak filters.
Driving (Car)
Posted speed limits and functional road classes, full turn restrictions and one-way handling. No live traffic; uses typical speeds.
Cycling
Prefers bike lanes and paths, avoids motorways, factors elevation. Typical speeds ~12–18 km/h.
Walking
Pedestrian paths, sidewalks, and footways with ~4.5–5 km/h baseline. Elevation-aware but favors shortest walkable paths.
Population and age structure use WorldPop 2020 estimates or 2030 projections. GDP per capita comes from a separate 1990–2022 gridded GDP series and currently uses its 2020 band in app statistics. Accessibility uses a separate 2015 minutes-to-cities raster. The runtime mirrors these sources to R2 for stable access.
- •Population raster tiles use the COG-RGB path. Valid cells are values >= 1, transformed in log10, and normalized with country-relative bounds (min to p99.9).
- •Color gradients are Gaussian-smoothed in the raster bake. The alpha edge is feathered separately to avoid stair-step borders without bleeding into empty space.
- •Population tile precompute currently targets z4-z12; clients overzoom above z12 rather than requesting new higher zoom tiles.
- •Global 1 km overlays are still masked by ISO polygons so neighboring countries do not bleed.
- •Accessibility values are mean travel minutes inside each cell (lower is better) with fixed country scales.
Raster tiles are cached in memory and R2. GeoJSON grid responses are still used where required by the metric path.
How population is estimated inside a polygonPOIs are streamed client-side from Overture Places PMTiles. The map no longer relies on runtime server-side POI fetches for rendering, which keeps pan/zoom interactions fast and stable.
Demographic stats in the panel (totals, age bands, GDP, accessibility) use the same zone geometry sent to our population service; response metadata reports the source and precision used.
From z10–z13, POIs render in preview mode because detailed category metadata is sparse in this snapshot. From z14+, category filters, named places, and full icon styling are applied.
- ⚠Duration cap: 60-minute max per isochrone (ORS limit). Longer trips require self-hosted routing (Valhalla/GraphHopper).
- ⚠No live traffic: Speeds are typical, not time-of-day aware.
- ⚠Open-data coverage: Rural areas may have thinner road/POI metadata; results follow the underlying datasets.
- ⚠Simplified profiles: Personal fitness, vehicle type, and private access controls are not fully captured.
- ⚠Raster resolution: Population grids clamp to native cell size; very small polygons are highly sensitive to whether cell centers fall inside the boundary.
Overture Maps Foundation (Places)
POIs, category tags, and place metadata
OpenRouteService
Isochrones and travel times
WorldPop (2020 estimate, 2030 projection)
Population totals and age/sex bands
Kummu et al. gridded GDP (2020 app band)
GDP per capita in PPP 2017 international dollars; Zenodo record 13943886
Accessibility to Cities (2015)
Modeled minutes to the nearest city from a separately mirrored raster
MapTiler
Basemap vector tiles
MapTiler Geocoding
Autocomplete geocoding and search
For authoritative Belgian population, housing, mobility, income, business, and other local statistics, explore the companion map-first project created by Florent Chif.
Open Belgium in MapsBuilt with open-source tools and open data by Florent Chif (Octet Studio)
Start Mapping