Where we started, where we are
Every gain below was made on free data alone. No labels bought, no third parties waited on. All figures MEASURED this run.
The classifier's ceiling
The starting point, before the real-label retrain in section 08: how separable were the legacy synthetic model's 14 textbook classes under its own best case, and where it broke. Production has since moved to 5 classes trained on real labels.
Separate vs hybrid reflectance
Measured on 184 real roofs. Physics (NTB) is material-independent; the lookup table (LUT) inherits every classification error.
The resolution wall
On real UK building geometry: how many roofs yield a clean pixel at each ground sample distance, and which sensors carry the SWIR albedo needs.
Geometry breaks the wall
The resolution wall is a wall for colour. Roof shape is a second, independent signal, and it is free: Environment Agency 1m LiDAR, pulled live per area, gives pitch, orientation, height and form for every roof.
Geometry corrects the spectral guess
Roof shape physically constrains material: slate and tile are pitched coverings, membranes and GRP are flat-deck systems. A geometry plausibility prior multiplied into the spectral class probabilities re-ranks implausible guesses. On a held-out UK tile it corrected 4% of materials and removed more than half the impossible combinations, GRP on a 30° gable, rooflights on a steep hip, both fixed.
We also tried geometry as a learned feature: on an in-distribution split it looked like a lift (+8 points accuracy, +14 macro-F1 on n=88), but it did not hold out of distribution, only 16% of roofs carry LiDAR at train time, so the feature model imputed medians for the rest and collapsed (84% glass) under a leave-one-city-out test. So geometry ships as the post-hoc constraint above, not a feature. The weak material signal is now lifted instead by authoritative OS NGD data (section 08); pitch and orientation remain the solar-exposure axis the cooling story needs.
A drop-in superset of the Google Solar API
The roof record now mirrors the Google Maps Solar API schema, per-segment pitchDegrees, azimuthDegrees, planeHeightAtCenterMeters and area, and adds an emissiv block: solar reflectance, SRI, modelled surface temperature, material, roof form, cooling candidate. Google owns geometry-for-solar in the UK; material, reflectance and thermal/MRV are the white space nobody else holds. We match their fields and extend them.
{
"pitchDegrees": 3.0,
"azimuthDegrees": 174.0,
"planeHeightAtCenterMeters": 12.4,
"stats": { "areaMeters2": 540 }
}
{
"pitchDegrees": 3.0,
"azimuthDegrees": 174.0,
"planeHeightAtCenterMeters": 12.4,
"stats": { "areaMeters2": 540 },
"emissiv": {
"solarReflectance": 0.14,
"sri": 12,
"surfaceTempC": 71, // modelled (E1980)
"material": "flat_membrane", // OS NGD
"roofForm": "flat",
"coolingCandidate": true,
"epcBand": "D",
"floorAreaM2": 1840, // EPC certificate
"co2PerM2Yr": 24,
"energyPerM2Yr": 252,
"buildingUse": "commercial"
}
}
Same four geometry fields, identical names. The emissiv block is the white space nobody else holds: solar reflectance, SRI and modelled surface temperature (the cooling metrics), authoritative material, and the building context that qualifies a target. A team already integrated against Google Solar reads our record with zero schema change.
Production upgrades: real labels, enrichment, and the coating number
The spectral model trains on real OpenStreetMap roof-material labels (5 validated classes: slate, tile, concrete, metal, glass) rather than synthetic spectra, and the served material now comes from OS NGD authoritative roof data wherever it exists (section 08), with the spectral model as the fallback, the single biggest data-quality lift. Each roof is enriched with free, no-key datasets joined by location: planning.data.gov.uk (listed building, conservation area, flood zone, the coating-eligibility flags), PVGIS solar yield, EA LiDAR geometry UK-wide (England, Wales, Scotland), and the National Grid live carbon intensity. From albedo, roof area and a 95%-reflective coating we compute the prize per roof: the solar heat rejected and the peak surface-temperature cut are physics, every roof; the cooling cost (£) and CO2 follow a three-tier ladder that mirrors the material ladder (authoritative → published benchmark → unknown). Tier A (measured): the building’s own EPC cooling demand (the SBEM kWh/m² cooling and cooling efficiency), the best path. Tier B (estimated): only ~38% of roofs carry an EPC, so where there is no EPC cooling but the OS NGD building use implies cooling (office, retail, commercial, health and the like) we apply a published UK cooling-intensity benchmark for that use class (BEES 2014-15, the BEIS Building Energy Efficiency Survey) through the same sol-air formula and cap, badged on the card as estimated from building type, a distinct lower-confidence tier, never shown as certificate-backed. Tier C (physics only): no cooling signal, so we report only the heat rejected and the peak-temperature cut. The cooling cut counts both coating levers via the ASTM sol-air balance: reflecting sunlight and radiating heat to the sky through the coating’s measured 95% emittance, which is the dominant term on low-emittance bare metal. Uncooled buildings (an EPC assessed with no air-conditioning, or a non-cooling use) correctly get no pounds.
The building behind the roof: use, age and EPC
OS NGD does not just give material, each building also carries its UPRN, its use (residential / retail / commercial / industrial), its construction year and its floors, all free in the same record. The UPRN is the join key into the GOV.UK Energy Performance of Buildings service, so we pull the full EPC certificate per building by UPRN, across the domestic and non-domestic registers: the energy rating (A-G), and from the certificate record the total floor area (m²), the CO₂ and energy intensity (per m²/yr), plus the potential band and main heating on domestic certificates. Floor area is the field that actually backs the commercial prize, who carries a real cooling load, not just "air-conditioned buildings only", and it is the one number OS NGD does not hold (OS gives the floor count, never the area), so the certificate earns its second call. Every roof still gets a use and age from OS NGD even where no certificate exists. Coverage is England and Wales (across the 12 cities ~84% of roofs resolve a UPRN, 86% carry a use, and 38% of all roofs, 1,875 of 4,954, carry an EPC certificate, every one of those with its floor area); Scotland uses a separate register we have not wired, so Glasgow's roofs carry use and age but no EPC. One framing point, to pre-empt the obvious diligence question: targeting stays reflectance-led. Roofs are ranked on measured albedo and area; these building signals (use, EPC band, climate) are a modelled overlay that sharpens the ranking, not a gate. A roof with no resolved EPC band is not dropped, it simply carries less qualification, so the 38% EPC coverage caps how much we can refine the list, not how much of it we can see.
How hot the roof actually runs
Absorbed sunlight is only half the heat story. A roof that absorbs a lot can still stay cool if it radiates that heat back to the sky, so a metal roof and a slate roof at the same reflectance run very different temperatures. The record now carries thermal emittance assigned per OS NGD material class (most roofs ~0.90, bare metal ~0.45, hedged because the finish is unrecorded), and SRI is computed from the full ASTM E1980 surface-temperature balance using reflectance and emittance rather than reflectance alone, so the card shows a modelled peak surface temperature and the absorbed solar load (MWh/yr). On the explore map a Heat view colours each roof by how much hotter it runs than its albedo predicts, so the deceptively-hot low-emittance metal roofs, the ones a reflectance-only scan walks past, light up as the heat (and cooling-coating) targets they are. Honest limit: for the existing stock, emittance is assigned by material, not measured (the finish is unrecorded). The coating’s own optics, though, are now characterised (opaque): 95% solar reflectance modelled at 0.95 and reference-paint-measured (300-1400 nm), plus 95% thermal emittance, with the full cured-film characterisation in progress, so the coated-roof temperature is grounded physics, not a guess.
LC08_…_20260525) over one UK estate: 179 roofs at a 41.4°C mean, peaking 44.8°C, far above the air around them. The heat is measured, not asserted. But the same scene shows what a thermal satellite cannot do: at 100 m per pixel the darkest third and brightest third of roofs come back within 0.1°C of each other (albedo–temperature r = 0.12), because each pixel smears dozens of roofs together, the same resolution wall as albedo. So the per-roof temperature spread is the ASTM E1980 model's job, badged modelled, precisely because the free thermal pixel is far too coarse to separate one roof from the next. We validate the heat with the satellite and resolve the roof with the physics.The sourcing cabinet
Imagery, footprints and methods, researched and cited. Recommended rows carry a blue margin.
The free frontier
Three free sources and techniques we had not used, pulled live and sampled at the same real roofs. How far can we get today, with no labels, no paid imagery and no waiting on anyone?
Closing the loop
The deepest fix, run today: harvest real roof-material labels free from OpenStreetMap, train on those instead of textbook spectra, and fuse the free radar. The first measured accuracy this project has had.
Authoritative material, free: OS NGD
The spectral guess at 10 m is structurally weak, so we benchmarked it against an authoritative source: Ordnance Survey's National Geographic Database (NGD Features API, bld-fts-building-4), which carries a per-building roofmaterial_primarymaterial derived from OS's high-resolution aerial pipeline. It is free under the OS Data Hub Premium plan, the first £1,000 of usage each month is free and our 12-city pull costs a few pounds against that allowance, so it stays at £0, with no contract lock-in and national coverage.
The benchmark was damning for our guess and decisive for the switch. OS matched 97% of our roofs, and our model agreed with it only 49% of the time. We were over-calling glass roughly tenfold (we said 7%, OS says 0.7%); of the roofs we labelled glass, OS confirmed only 4 of 249. Our metal totals were about right but landed on the wrong roofs (61 of 294 confirmed). And we under-called flat: city centres are ~47% flat commercial decks, we had said 32%.
So we now serve OS material where it exists (92% of the 4,954 roofs across all 12 cities, badged OS NGD on the card and shown without the uncertainty hedge), and fall back to the spectral model only where OS is absent or ambiguous. The served distribution snapped to reality: glass 7% → 1.6%, flat 32% → 46%, pitched 57% → 39%, metal steady at 9%. One honest cost: OS lumps tile, stone and slate into one class, so we dropped our slate-versus-tile split, which we could not support anyway (it never generalised across cities). Albedo, area and the headline physics (solar heat rejected, peak-temperature cut) are unchanged, computed from reflectance and roof area. The cooling £/CO2 is grounded per building in its EPC cooling demand and additionally credits the coating’s emittance gain over the bare roof, so a low-emittance metal roof correctly earns more, the one place roof material enters the savings.
bld-fts-building-4, OS Data Hub.Inching toward quality
The lane-separated architecture and the ordered moves that convert this prototype into a defensible product.
To Silicon-Valley tier
Beyond fixing the prototype, the moves that make this a category-defining product, not a script.
Glossary & sources
Every term, data source and model on this page in plain English, enough to explain what we do to someone new.