// ai summary · methodology·28 Sep 2026·7 min read

How the UXO heatmap works.

The methodology behind the indicative historical UXO layer in Frontline Atlas: which records go in, how they are weighted, what the grid is, what you can export — and what it cannot tell you.

AI summary —written by an AI agent from a brief I gave it and from the atlas's own code and methodology notes. The method is real and running in the atlas; the prose isn't hand-written.
UXO desk studyTHOR WWIIH3 gridMethodology

The atlas is opening to the public — sign-up is free.

Frontline Atlas UXO desk study: hexagonal heat grid of historical indicators over Czechia, with legend and site-check panel
The heat grid over Czechia. Every coloured cell can be traced back to the cited events that produced it.
Indicative only — not a UXO risk assessment. The layer only aggregates the sourced historical events in the atlas; absence of a score does not mean absence of ordnance. It is not a substitute for a professional UXO survey. Consult a qualified UXO specialist before any intrusive ground works.

// why it exists

A first look before the desk study.

Before anyone digs in a place that saw the Second World War, the usual first step is a desk study: what happened here, and how much of it involved explosive ordnance? Answering that means pulling together bombing records, battles, front lines and fortifications from a dozen places. Frontline Atlas already had most of those layers, cited, on one map.

So the UXO layer answers one narrow question: how much documented military activity with explosive ordnance happened near this place, according to the sources in this atlas? Every contribution to a score comes from a specific, cited event. Nothing is modelled beyond that — no soil, no clearance history, no finds reports. It is a pre-screening aid, not an answer.

// inputs

Five kinds of cited indicator.

indicatorin the current buildsource
THOR bombing records80,275 cleaned records, 2.56 Mt; 398 aggregated target positions in the gridded areasTHOR — Theater History of Operations Reports, WWII (US Air Force Research Institute / data.mil, public domain)
Cited air raids30 raids on Czech territory, 17 Apr 1943 – 25 Apr 1945 (25 USAAF, 4 RAF, 1 Soviet), 51 named aim pointsCzech Wikipedia articles, Klub přátel Pardubicka, iDNES (with VHÚ historians), vets.cz, ČT24; aim points are Wikidata items
Battles146 points: 124 Wikidata battles in the Czech lands plus the cited Normandy 1944 assault points and campaign eventsWikidata (coordinate, date) with Wikipedia links; the atlas's own cited Normandy layers
Front lines31 dated lines: US 12th Army Group, each day 4–9 May 1945 in Czechia; D-Day beachheads and 12th Army Group fronts, 13 June – 21 August 1944, in NormandyHQ 12th Army Group situation maps (Library of Congress); U.S. Army CMH maps
1936–38 fortifications5,960 pillboxes, blockhouses, observation posts and sheltersOpenStreetMap (ODbL)

THOR, cleaned. The raw export has 126,697 rows for the European and Mediterranean theatres. 42,065 rows identical in every field except the row id are treated as duplicates and dropped. 6,459 rows with missing, zero or out-of-theatre coordinates and 374 with unusable dates are flagged and not plotted. A single record claiming more than 2,000 t is treated as unknown tonnage. What's left: 80,275 records, 2,563,471 t (53,386 USAAF records, 26,865 RAF). Nothing is guessed; bad rows are flagged, not fixed.

Raid coordinates are checked automatically. Every cited aim point is a Wikidata item. The build fetches the item's coordinate and fails if the stored point is more than 1.5 km away. Raid intensity comes only from figures stated in the source — bombers, tonnage, bomb counts: heavy 1.0, medium 0.6, light 0.3, jettison 0.25.

A THOR WWII record card in the atlas: USAAF, Pilsen, 25 April 1945, airdrome, 10 × B-17, 25 t HE
One THOR record: USAAF, Pilsen, 25 April 1945, 10 × B-17, 25 t HE. The target position is as recorded — often a town centroid.

// the kernel

Weight, radius, and a Gaussian falloff.

Every input has a weight w and a radius r. It contributes to each cell centre (or site point) at distance d:

contribution = w × exp(-(d / r)²)

  evaluated up to d = 2.5 r, ignored below 0.0001
  at d = r   → 37 % of w
  at d = 2 r → under 2 % of w

cell score = sum of contributions (after caps, below)

Battles are weighted by the ordnance technology of their era, so a Hussite battlefield and a 1945 one don't look alike:

battles, by erawr (km)
Medieval0.013
Hussite Wars · Bohemian–Hungarian War0.023
Thirty Years' War0.033
Silesian & Seven Years' wars0.044
Napoleonic (1805)0.054
1866 Austro-Prussian War0.255
WW1 (no fighting on Czech territory)0–
1938–39 clashes0.052
1944–451.06
Normandy, D-Day 6 June 19441.04
Normandy campaign, June–Aug 19441.06

A handful of battles get overrides — the Moravia–Ostrava offensive (w 1.0, r 14 km, a multi-week operation), the Prague Uprising (1.0, 7 km), the 1944 air battle over the Ore Mountains (0.4, 10 km) — each with its reason written next to the number.

other inputswr (km)
Cited air raid, per aim point1.0 × intensity × share2.5 point · 3 industrial / rail / airfield / area · 4.5 city
THOR target position1.0 × min(1, log10(1+t) / log10(1+2000))3
Front line, Czech lands, per day0.125
Front line, Normandy, per sheet0.35
1936–38 fortification, each0.0151

THOR records are grouped by target position (rounded to 0.001°) and weighted by the logarithm of cumulative tonnage t: 2,000 t at one position reaches the full weight, so heavily bombed places score higher without a single huge target swamping the map.

// caps and double counting

The same bombs are never counted twice.

  • Raids vs THOR. Cited raids and THOR records often describe the same bombs. Per cell the air component is the larger of the cited-raid sum and the THOR sum capped at 1.0. The other is dropped; they are never added.
  • Front cap. Summed front-line contributions in one cell are capped at 0.6 (scaled down proportionally), so the daily lines of one front don't pile up without limit.
  • Fortifications. Summed per cell and capped at 0.1. Most were never fought over.

// the grid

H3 hexagons, resolution 7.

The heat grid uses Uber's H3 hexagons at resolution 7: about 5.2 km² per cell, centres roughly 2.4 km apart. It covers Czechia (15,962 cells) and the Normandy campaign area (3,749 cells) — 19,711 in total. The sea is not gridded. Cells scoring below 0.015 aren't drawn; 8,192 carry a score.

classscore ≥cells
very low0.0152,380
low0.082,562
moderate0.252,046
elevated0.6915
high (historical indicators)1.2289

The highest cell scores 3.6. Classes are relative bands of documented activity — not probabilities of finding ordnance.

Europe view: the two gridded areas, Czechia and the Normandy campaign area, with THOR bombing tonnage shown across Europe
Two gridded areas — Czechia and Normandy. The THOR tonnage heat shows across Europe, and the site check works anywhere on it.

// site check and exports

Click a place, get a desk-study summary.

Click the map or search an address and pick a radius from 250 m to 5 km. The site check runs the same kernel in the browser on the cited inputs, so it isn't limited by the 2.4 km grid:

  1. It loads the THOR records within the radius plus 7.5 km, so it works anywhere in Europe (outside Czechia and Normandy only THOR is available).
  2. It scores the centre and a 13 × 13 sample grid inside the radius, and reports the centre and the maximum with their classes.
  3. It lists every input whose influence reaches the site — distance, contribution, weight, radius, rationale and source link.
Site check at Plzeň main station, radius 1 km: centre and maximum both 'high (historical indicators)', with the list of documented events and PDF, CSV and JSON export buttons
Plzeň main station, 1 km: centre score 3.32, maximum 3.52 — both in the top band. Below: the documented events reaching the site, each with its source.

The result exports three ways: a PDF desk-study summary (map, event table, method and weights, known gaps, numbered sources, and the disclaimer on every page), plus CSV and JSON for anyone who wants the raw event list.

Page 1 of the exported PDF desk-study summary for Plzeň hlavní nádraží, with disclaimer, map, scores and event table
Page 1 of the exported PDF. The disclaimer sits above the map, not in the footnotes.

// known gaps

What it doesn't know.

These are listed in the atlas UI and in every PDF, not just here.

  • RAF night raids. RAF Bomber Command night raids are under-represented in THOR — many are missing or aggregated.
  • Coordinates. THOR target positions are often a town centroid, not the aim point, and some are wrong. Missing, zero or out-of-theatre coordinates are dropped, not guessed.
  • Coverage. Only Czechia and the Normandy campaign area are gridded. Elsewhere the site check has THOR only. In Normandy the sea isn't gridded, so offshore and beach-obstacle ordnance isn't scored, and the dense 1944 minefields and artillery positions aren't individually mapped.
  • Not mapped at all. Ammunition dumps, depots and post-war disposal sites; military training areas; WW1 munition factories; Cold War sites; individual aircraft crash sites; the 1944 Ostrava and Bohumín refinery raids (not yet sourced to a citable document).
  • Battles are points. One Wikidata point per battle, not a battlefield outline; some points are representative only and flagged approximate.
  • Weights are judgement. They come from the ordnance technology of each period and are published in full, but they are not calibrated against finds statistics.

// read this before using it

Indicative only — not a UXO risk assessment. The layer only aggregates the sourced historical events in the atlas; absence of a score does not mean absence of ordnance. It is not a substitute for a professional UXO survey. Consult a qualified UXO specialist before any intrusive ground works.

Try it at atlas.davidbroza.dev/uxo — the atlas is opening to the public, and sign-up is free. The rest of the project (period maps, the battle timeline, Austerlitz hour by hour) is on the Frontline Atlas project page →

Note: this article was written by an AI from my brief and the atlas's methodology notes. The method and every number in it come from the running code — the prose isn't hand-written.