ChargeScape London
A spatial decision system for EV charging networks under uncertain demand.
Where should London's next rapid-charging hubs go, how large should they be, and how sure can we be? Built end to end from open data, with every assumption visible.
Marija Ercegovac, geospatial data science
github.com/m-erts/chargescape-london
Public charging demand, 2026
285 GWh
P10 to P90: 216 to 361
Rapid sites that queue at the peak
348 / 632
P(wait) above 0.5 in the peak hour
Recommended plan at £20M
51 hubs
serve 63% of unmet rapid demand
Usage model in an unseen city
R² −0.25
against 0.70 with random cross-validation
Charging is an infrastructure business that lives or dies on utilisation
Public chargers in London
31,371
DfT, 1 July 2026
Share rated 50 kW or more
8%
24% across the UK
Plug-in cars kept in London
300k
DfT vehicle licensing, Q1 2026
Occupancy of rapid chargers
34%
TfL, observed in 2025
The economics
A hub in the wrong place idles at 5% and never pays back. A hub in the right place runs above 20% and starts to queue. Industry analyses put break-even at 15 to 20% utilisation.
The analytics gap
Operators describe site selection as a demand model with dozens to hundreds of factors. Public projects usually predict where chargers already are, ignore queues and cannibalisation, and never say how they could be proven wrong.
What this system does differently
- A label on every dataset
- Observed, proxy or synthetic. 32 datasets in the catalog, and the label follows each number into every table.
- Demand checked against reality
- Modelled bottom up, then compared with DfT charger counts, TfL occupancy and open session logs.
- Uncertainty reaches the decision
- P10, P50 and P90 for every hex. One plan per demand scenario, each tested under the others.
- Queues, cannibalisation, grid
- Erlang C capacity per hub, new against captured demand for any candidate, substation headroom as a filter.
- 1Open data32 datasets
- 2H3 features2,374 hexes
- 3DemandMonte Carlo
- 4Choice and queueslogit, Erlang C
- 5SitingMILP, HiGHS
- 6Maps and test planMapLibre
32 open datasets, each labelled observed, proxy or synthetic
| Layer | Sources | Status |
|---|---|---|
| Supply | Open Charge Map (12,519 points), OpenStreetMap, National Chargepoint Registry 2021, DfT statistics for July 2026 | observed |
| Where EVs live | Census 2021 for 4,994 small areas, DfT vehicle licensing for Q1 2026, Indices of Deprivation 2025 | observed |
| Activity and traffic | 74,000 OpenStreetMap places, LAEI 2022 road flows with taxi and private hire, TfL stations | observed, proxy |
| Grid and future | UK Power Networks substation headroom for 2026, DFES 2026 pathways to 2030 | proxy |
| Behaviour elsewhere | Charging session logs from Dundee, Perth and Kinross, Palo Alto and Boulder | observed |
| Model outputs | Monte Carlo demand draws and literature-informed choice parameters, never presented as observed | synthetic |
Charging sites
13,174
after de-duplication within 50 m across three sources
Hexes
2,374
H3 resolution 8, 0.74 km² each, covering Greater London
Chargers with observed usage
204
in four cities, used to test transfer
Supply follows devices. Need follows cars without driveways.
- Inner boroughs
- About 1,400 chargers per 100,000 residents in Hammersmith and Fulham and Westminster, mostly lamp-post units of 5 to 7 kW.
- Rapid share
- 40% in Havering and 39% in Hillingdon. Under 4% in Kensington and Chelsea, Hackney and Westminster.
- Private EVs
- Clustered in outer boroughs with houses and driveways. Moran's I is 0.73.
- Drive time
- A median of 2.2 minutes to a rapid site. The constraint is capacity, not distance.
A demand surface with the uncertainty attached
Public charging demand, 2026
285 GWh
P10 to P90: 216 to 361
Taxi and private hire
152 GWh
the anchor of rapid charging in London
Demand in 2030
1,350 GWh
DFES mid pathway, 1,104 to 1,407 across pathways
EV stock x annual distance x energy per km x the share charged in public, which depends on off-street parking. 500 Monte Carlo draws per scenario.
London publishes no charger usage, so the model is checked against what is observed
Energy the network could deliver
759 GWh
28,838 slow and 2,533 rapid chargers x occupancy observed by TfL x time spent charging. The rapid side is 385 GWh.
Modelled public demand
285 GWh
P10 to P90: 216 to 361. Rapid-type demand is 207 GWh, the same order as the rapid side of supply.
Sessions per rapid charger per day
Implied by the model
13.1
Implied by TfL occupancy
13
34% occupancy with 38-minute sessions
Observed in Dundee
3
open session log of a small city
The interval is the honest statement. The two levers are the public share of drivers without a driveway and the size of the electric private-hire fleet.
Where demand lands today, and where queues form at the peak hour
Rapid sites that queue
348 / 632
P(wait) above 0.5 in the peak hour
Median utilisation
15%
over 24 hours. The average hides the peak.
Logit station choice on drive times over the OpenStreetMap network. Erlang C queues with 38-minute sessions. Ports are scaled per borough to DfT totals, median factor 1.6.
A new hub mostly takes customers from its neighbours
A hub placed in the hex with the largest unmet demand, in Hillingdon. The logit has an outside option, so new demand means sessions that would otherwise not use a rapid charger.
| Hub | Sessions per day | New | Captured | Share captured |
|---|---|---|---|---|
| 50 kW x 2 | 16 | 28 | 64% | |
| 150 kW x 4 | 28 | 66 | 70% | |
| 150 kW x 8 | 32 | 80 | 72% | |
| 300 kW x 8 | 39 | 118 | 75% |
new demandcaptured from existing sites
Share taken from existing sites
64 to 75%
of the sessions of a new hub
Larger and faster hubs capture more sessions and take a larger share from their neighbours. An investor needs this number next to expected sessions. A gap map cannot show it.
Where the next hubs go
4 x 150 kW hubs under a budget, with capacity from the queue model and a filter on substation headroom.
Recommended plan at £20M
51 hubs
serve 63% of unmet rapid demand, 1,699 of 2,686 sessions per day
Capacity of one hub
33 per day
sessions, with P(wait) of 15% or less in the peak hour
Robust core
22 of 51
hubs that every demand scenario puts in the same or an adjacent hex
Plan for pessimistic demand while capacity binds
One plan is solved for each of P10, P50 and P90 demand, then evaluated exactly under the other two. Regret is what a plan loses against the one that knew the scenario in advance.
| Budget | Best plan | Hubs | Served at P10 | at P50 | at P90 | Worst regret | Robust core |
|---|---|---|---|---|---|---|---|
| £5M | P10 | 12 | 20% | 15% | 12% | 0 | 5 of 12 |
| £10M | P10 | 25 | 41% | 31% | 25% | 0 | 12 of 25 |
| £20M | P10 | 51 | 83% | 63% | 50% | 0 | 22 of 51 |
| £40M | P90 | 96 | 86% | 86% | 85% | 1 | 71 of 96 |
£5M to £20M
Plan for P10
Capacity binds. Hubs placed where even low demand is dense fill up in every scenario. Worst regret: 0 sessions per day.
£40M
Plan for P90
Capacity no longer binds everywhere. 96 hubs serve 86% and lose at most 1 session per day.
The exact model with capacity against a greedy estimate that ignores it. The gap is demand a hub cannot absorb at an acceptable wait.
What moves when the assumptions change
The £20M plan solved again under nine changed assumptions, on the same 500 candidate hexes. Base case: travel time weight 0.25 per minute, charger power weight 0.6, choice set 20 minutes, P(wait) up to 15%, coverage radius 8 minutes.
| Assumption | Unmet per day | Served | Same hex | Same or adjacent | |
|---|---|---|---|---|---|
| Base case | 2,686 | 63% | 100% | 100% | |
| Travel time weight 0.15 per min | 2,678 | 63% | 47% | 80% | |
| Travel time weight 0.40 per min | 2,960 | 57% | 41% | 71% | |
| Charger power weight 0.3 | 2,495 | 68% | 45% | 84% | |
| Charger power weight 1.0 | 2,972 | 57% | 41% | 75% | |
| Choice set 15 min | 2,502 | 68% | 47% | 78% | |
| Choice set 30 min | 2,741 | 62% | 37% | 65% | |
| Service level P(wait) up to 30% | 2,686 | 81% | 51% | 76% | |
| Coverage radius 6 min | 2,686 | 63% | 25% | 65% | |
| Coverage radius 10 min | 2,686 | 63% | 22% | 65% |
Hubs that stay in place
75%
median across 9 changes, same or adjacent hex
Effect of the service level
63% to 81%
served when a P(wait) of 30% is accepted instead of 15%
The corridors are stable. The exact hex is a decision for a site survey. The service standard is a business choice with a larger effect than any behavioural coefficient.
Do context features explain observed usage? A negative result, on purpose
204 chargers with open session logs in four cities. LightGBM on OpenStreetMap context, population and charger power.
Random 5-fold cross-validation
R² 0.70
looks respectable
One city held out
R² −0.25
the number that matters
| City held out | Chargers | Median sessions per day | R² | Rank correlation |
|---|---|---|---|---|
| Boulder | 45 | 1.18 | −0.18 | −0.04 |
| Dundee | 90 | 1.13 | −0.16 | −0.34 |
| Palo Alto | 34 | 4.12 | −2.68 | 0.02 |
| Perth and Kinross | 35 | 1.28 | −0.36 | 0.64 |
| Feature | Share of model gain | |
|---|---|---|
| Charger power (kW) | 29% | |
| Distance to motorway or trunk road | 12% | |
| Car services within 800 m | 9% | |
| Distance to primary or secondary road | 5% | |
| Rapid charger (50 kW or more) | 5% | |
| Car parks within 300 m | 5% |
Charger power and the level of each city dominate. Rankings do not transfer either. A site-selection model has to be validated in a city it has not seen, against observed usage.
Reproducible from a clean clone
| Layer | Tools | Why |
|---|---|---|
| Spatial | H3, GeoPandas, Shapely | Equal-area hex grid and areal interpolation from census units |
| Network | OSMnx, igraph | Drive times on a graph of 131,000 nodes in seconds, no routing server |
| Statistics and ML | esda, LightGBM, scikit-learn | Moran's I, Gi*, spatial cross-validation by default |
| Optimisation | SciPy milp and linprog (HiGHS) | Sparse MILP, exact evaluation of plans, every MIP gap recorded |
| Choice and queues | NumPy | Erlang C and logit, tested against closed forms |
| Delivery | MapLibre GL JS, GitHub Pages | Maps that also work offline, and this deck |
Unit tests
23
queues, choice, MILP, grid, caches
Python versions in CI
3.11, 3.12
lint, tests and a model smoke run
Data cards with licences
32
one per dataset
Raw data needed to rerun models
0 GB
compact tables are committed
Limitations, and how this could be proven wrong
Known limitations
- Usage
- London publishes no charger-level usage. Behaviour comes from other UK cities and fleet trials.
- Supply
- Open Charge Map covers most sites but not every port. The rest is closed per borough against DfT totals.
- Choice
- Coefficients come from the literature, not from estimation. The sensitivity table shows what they move.
- Grid
- Constraints stop at the headroom of primary substations.
- Interpolation
- Area-weighted from census units. About 1.4% of residents fall in dropped edge hexes.
The test
- Data
- DfT and Zapmap publish device counts by borough every quarter. TfL publishes utilisation by charger type.
- Claim
- Hubs opened after July 2026 in hexes flagged here should reach above-median utilisation within a year.
- If not
- The model card names the priors to revisit first: private-hire fleet size, public share without home charging, choice radius.
- Loop
- Predict, deploy, measure, retrain. That loop is the product. The maps are its interface.
What an operator or investor gets, and what comes next
Today, from open data
- Ranked candidates
- Expected sessions per day with P10 to P90, the share taken from neighbours, substation headroom and drive-time catchment for every hex.
- Capacity
- Ports and power sized from the queue model against a service level, not from a template.
- A robust plan
- The hubs every demand scenario agrees on are built first. The rest are phased as utilisation data arrive.
Next, with operator data
- Choice
- Parameters estimated from real routes and the station each driver chose.
- Time
- Hour-of-day profiles for arrivals and queues.
- Uncertainty
- Intervals per hex learned from sessions, not from global priors.
- Effect
- Staggered difference-in-differences on hub openings.
Explore it
- Repository
- github.com/m-erts/chargescape-london
Code, 23 tests, data catalog, methodology, model card - Live maps
- Supply Demand Network load Hub siting
- Notebooks
- Notebooks 01 to 05 on nbviewer
Supply audit, demand, choice and queues, siting, transfer test - Reproduce
pip install -e ".[all]"make models maps slides- Author
- Marija Ercegovac, github.com/m-erts