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, tiers every cell on UN DEGURBA-aligned thresholds, and renders map, dashboard and registry from data the browser computes on load — all of it synthetic, and labelled so 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 — formats built for researchers, not programme officers. The gap between the data existing and the data deciding is where budgets misfire.
The Explorer’s premise: make open population data decision-useful. 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 — and every surface carries a “Synthetic demonstration data” badge. The honesty is part of the interface, not a footnote.
Deep navy, amber accents and a badge that never leaves the corner: the Explorer looks like an operations console because it is built like one — every layer traceable to a named open dataset, every figure derived in the open. 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 states the contract: every figure computed from the loaded demonstration dataset — nothing pre-aggregated, nothing hardcoded, so the charts can never disagree with the map.

Senegal is the pilot country; Mali and Cambodia run the identical three-source classification cascade, scoped to regions and cercles or provinces. Each map opens directly — no signup, no setup — and the shared badge sits above all three, so what varies between cards is the data, never the tooling.

Tracked locations, households, people covered, average household size and urban share lead a statistics page where every figure is computed on load 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 layout rather than an app: the sidebar collapses, map controls stay reachable and the synthetic-data badge stays visible. The same static files a laptop loads are exactly what a phone 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.
The discipline a programme officer never notices but always benefits from: a fixed unit of analysis, traceable sources and honesty enforced in the interface rather than promised in documentation.
Population is analysed per H3 Res-8 hexagon of roughly 0.74 km², so “where” has a fixed unit and comparisons across regions and countries compare 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 — so no screenshot can pass for operational data.
Every count, chart and percentage is derived in the browser from the static dataset on load. 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, never averaged:
# 1. GHSL SMOD (primary) 2. Kontur (fallback) 3. WorldPop (validation)A geospatial stack with no server component anywhere in the runtime path: 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 — and never pretends to be more than a demonstrator. If your programme needs the same honest engineering applied to its data, let's talk it through.