The Location Impact Explorer is a geospatial decision-support demonstrator for clean-cooking programmes: a build-time pipeline turns open population rasters into H3 hexagons over Senegal, Mali and Cambodia, tiered on UN DEGURBA-aligned thresholds; the browser computes map, dashboard and registry from that bundle. All of it synthetic, and labelled as such on every screen.

Clean-cooking programmes choose where stove installations go, and those choices are usually made against population numbers buried in scientific rasters (GHSL, Kontur, WorldPop) built for researchers. The gap between the data existing and the data deciding is where budgets misfire.
The Explorer’s premise: give programme officers population numbers they can act on. A build-time Python pipeline cuts the rasters into H3 Res-8 hexagons of roughly 0.74 km², tiers each cell on UN DEGURBA-aligned thresholds, and ships the result as a static bundle. The browser computes everything from that bundle on load: map, dashboard, statistics and registry, with no server anywhere in the path.
Every record on screen is generated: 100 synthetic households per country, 300 across Senegal, Mali and Cambodia. Every surface carries a “Synthetic demonstration data” badge.
Deep navy, amber accents and a badge pinned to the corner: the Explorer looks like an operations console because it is built like one. Every layer traces back to a named open dataset. A tour of what a user actually sees.

The Senegal view layers 100 GPS-located records over admin regions, with markercluster keeping dense areas legible and a legend separating Urban, Peri-Urban and Rural. Region, town and classification filters narrow the view; layer toggles switch admin regions, districts and population density; neighbouring-country switches keep context without clutter.

Active stoves, revenue, CO₂ saved and customer counts lead into a classification donut, regional deployment bars and a fleet-status breakdown. The dashboard's own subtitle says how it works: every figure is computed from the loaded demonstration dataset, so the charts cannot disagree with the map. Nothing is pre-aggregated or hardcoded.

Senegal is the pilot country; Mali and Cambodia run the same three-source classification cascade, scoped to the admin areas of each country (regions, cercles or provinces). Each map opens directly, with no signup or setup, and the shared badge sits above all three. What varies between cards is the data alone.

Tracked locations, households, people covered, average household size and urban share lead a statistics page where every figure comes straight from the pilot dataset. The settlement split — Urban, Peri-Urban, Rural — comes straight from the classification cascade, and coverage growth plots cumulative locations per quarter from recorded dates.

The demonstrator is plain HTML, CSS and JavaScript, so responsiveness is a layout job: the sidebar collapses, map controls stay reachable and the synthetic-data badge stays visible. A phone loads exactly the static files a laptop loads; there is no second build to drift out of step.

A registry table lists each synthetic household (name, town, GPS coordinates, settlement context, stove model, dates, usage hours and CO₂ saved) with search, JSON export and import, showing how a real programme's records would read. Every row is generated, and the badge in the sidebar says so before the first row loads.
What sits beneath every figure: one cell size for every comparison, sources you can name, and thresholds the user can read.
Population is analysed per H3 Res-8 hexagon of roughly 0.74 km², so “where” has a fixed unit and every comparison across regions and countries is like with like.
GHSL SMOD leads the classification, Kontur Population covers its gaps and WorldPop cross-checks the result. Sources are tried in order, never averaged, so every figure has one traceable origin.
A “Synthetic demonstration data” badge renders on every surface: landing, map, dashboard, statistics and registry. No screenshot of the product can pass for operational data.
Every count, chart and percentage is derived in the browser from the static dataset. Change the data and every figure follows; there is no second place for numbers to live.
The product is vanilla HTML, CSS and JavaScript with CDN-pinned Leaflet, Chart.js and Font Awesome. No bundler, no framework, nothing to rebuild: deploying means copying files.
The three-tier classification follows the UN DEGURBA methodology’s logic, with thresholds stated in the product: above 1,000 people per hexagon is Urban, 300 to 1,000 Peri-Urban, below 300 Rural.
A build-time Python pipeline does the heavy lifting so the deployed product can stay static: sources resolved in priority order, cells classified on stated thresholds, households generated, bundle shipped. Nothing at runtime needs more than a browser.
# pipeline/classify.py - UN DEGURBA-aligned tiers, applied per H3 Res-8 hexagon
def classify(pop):
if pop > 1000:
return "Urban" # dense settlement
if pop >= 300:
return "Peri-Urban" # the transitional band
return "Rural" # sparse
# population sources are tried in priority order:
# 1. GHSL SMOD (primary) 2. Kontur (fallback) 3. WorldPop (validation)A geospatial stack: open rasters in, a static bundle out, and a browser does the rest.
The Location Impact Explorer shows what open population data becomes when it is treated as an engineering problem: a fixed unit of analysis, a documented cascade and interfaces that say what they are. If your programme sits on data that deserves the same treatment, that conversation starts here.
The Location Impact Explorer turns public rasters into a siting tool with an operations dashboard. If your programme needs the same engineering applied to its data, let's talk it through.