Where we started, where we are
Every gain below was made on free data alone. No labels bought, no third parties waited on. The current served artifact is SCL-masked and internally consistent: 4,744 roofs, no invalid albedo/SRI, no stale area metadata.
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
This section is the historical albedo audit that changed the serving path. Production now serves NTB physics over clear in-footprint Sentinel-2 pixels; the material lookup table is kept here only to explain why it was retired.
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 rather than synthetic spectra, but production material now comes from OS NGD authoritative roof data wherever it exists (section 08). The spectral model is the hedged fallback, not the headline product. Each roof is enriched with free, no-key datasets joined by location: planning.data.gov.uk (listed building, conservation area, flood zone), PVGIS horizontal solar yield, EA LiDAR geometry, 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. Tier A (measured): the building’s own EPC/SBEM cooling demand. Tier B (estimated): no EPC cooling, but OS NGD building use implies cooling, so we apply a published UK cooling-intensity benchmark from BEES 2014-15 through the same sol-air formula and cap. Tier C (physics only): no cooling signal, so we report heat rejected and peak-temperature cut and claim no pounds. The cooling cut counts both coating levers: reflecting sunlight and radiating heat to the sky through the coating’s measured 95% emittance.
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; in the current 12-area served artifact, 37.82% of roofs carry an EPC band and floor-area-backed certificate fields. 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 for an opaque coating: measured 95% solar reflectance 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 (91.95% of the 4,744 roofs across all 12 areas, 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 no longer inflates the product, flat commercial decks appear as flat, and pitched stock stays separate. 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. 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 EPC/SBEM or BEES-tiered cooling demand and additionally credits the coating’s emittance gain over the bare roof, so low-emittance metal 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.