# Sussex Bridge Atlas: QA report, phase 2

Area of interest: EPSG:27700 E 470000 to 565000, N 95000 to 140000. The whole of
Sussex, 95 km by 45 km, including the phase 1 coastal belt.

Same pipeline, same thresholds and the same 2.0 m deck offset as phase 1. Phase 1
outputs were not touched. The Network Rail struck-bridge list is used for
validation only; none of its heights appear in any output.

## Inputs processed

| Item | Phase 1 | Phase 2 |
| --- | --- | --- |
| EA LiDAR chunks fetched and cached (2 km, 3 composites) | 351 | 2,949 |
| OS Open Roads links | 20,730 | 100,970 |
| Road centreline length sampled | 2,138 km | 13,144 km |
| Samples read at 1 m spacing | 2,149,035 | 13,195,722 |
| Samples with no cached LiDAR chunk | 0.9 percent | 0.4 percent |
| Samples meeting the solid-deck condition | 21,151 | 189,021 |

## Counts

| Stage | Phase 1 | Phase 2 |
| --- | --- | --- |
| Raw candidate runs from the detector | 583 | 3,853 |
| Rejected: cover does not span the carriageway ("sidelobe") | 264 | 2,380 |
| Rejected: terrain drops away, road carried on the structure ("over") | 86 | 488 |
| Rejected: road stays elevated on its approaches ("carried") | 58 | 238 |
| Kept: structure | 164 | 720 |
| Kept: covered road or building over road | 9 | 19 |
| Kept: tunnel, from the OS road_structure flag | 2 | 8 |
| **Structures after 25 m dedupe** | **147** | **676** |

Structures by class: structure 650, covered 19, tunnel 7.

Structures by crossing: unknown 337, road 218, rail 100, water 21.

Structures by confidence tier:

| Tier | Definition | Count | Under 4.5 m |
| --- | --- | --- | --- |
| high | crossing rail or water, or matched to the Network Rail seed | 122 | 93 |
| medium | crossing another road | 217 | 92 |
| low | nothing crosses that any open dataset knows about | 337 | 163 |
| **all** | | **676** | **348** |

58 structures carry a Network Rail seed match flag.

### Display tier and suspect flags

Two derived properties were added to the phase 2 export so a page can lead with
what is defensible.

`suspect` is true where the estimated clearance is under 2.0 m and no chip review
called that structure a bridge. A public road with under 2 m of real headroom is
very rare, so an estimate that low is more likely to be a detection artefact than
a finding. `suspect_reason` records which of the two cases applies: never
reviewed, or reviewed and called something other than a bridge.

`display_tier` is **verified** for a high-tier structure that is not suspect, and
**candidate** for everything else.

| Property | Count |
| --- | --- |
| verified | **104** |
| candidate | 572 |
| verified and under 4.5 m | **75** |
| suspect (all tiers) | **91** |
| suspect, of which high tier | 18 |
| suspect, of which already chip reviewed as not-a-bridge | 10 |

The 18 high-tier suspects are the difference between the 122 high-tier structures
and the 104 verified ones. Both of the rows flagged as dangerous in the top 15
below, Redgate Mill at 0.79 m and Mount Pleasant Road at 1.82 m, are caught by
this rule and drop out of the verified set.

The suspect list is dominated by estimates between 0.3 and 1.0 m, which is
physically impossible for a trafficked road and confirms the rule is picking up
what it was meant to: centreline clipping of walls, canopies and building edges
rather than real low structures.

## Recall against the Network Rail seed

The seed holds 67 records inside the full Sussex AOI, of which 65 are Underline
Bridges, the type that carries something over a road. The other two are an
Overline Bridge and a Side of Line Bridge, neither of which this pipeline looks
for.

| Measure | At 15 m | At 30 m |
| --- | --- | --- |
| All 67 seed records | 0.866 | 0.866 |
| The 65 Underline Bridges | **0.877** | **0.877** |

Phase 1 measured 0.88 on 17 records. Phase 2 measures 0.877 on 65. **Recall holds
almost exactly across a four-fold larger validation set and a much more rural
area.** That is the single most reassuring number in this report, because the
phase 1 figure rested on seventeen bridges and could easily have been luck.

Distance from each Underline Bridge to the nearest detected structure, binned in
metres: `0-5: 52, 5-10: 4, 10-15: 1, 15-30: 0, 30-50: 0, 50-100: 0, 100-250: 2, >250: 6`.
Fifty-seven of sixty-five land within 15 m. There is nothing in the 15 to 100 m
band, so the matching is unambiguous: a bridge is either found on the right link
or not found at all.

### The eight misses, and why

Every one of the eight has an OS Open Roads link within about 2 m and has all
three LiDAR chunks cached, so **none of them is a data coverage gap**.

| Bridge | ELR | Nearest structure | What happened |
| --- | --- | --- | --- |
| New Salts Farm Road, Dukes Cattle Creep | BLI1 | 673 m | detected, rejected as sidelobe |
| Beechwood Lane | KJE1 | 1,056 m | detected, rejected as sidelobe |
| Depot Access | TBH1 | 402 m | detected, rejected as sidelobe |
| North Heath Road | TBH1 | 2,835 m | detected, rejected as sidelobe |
| Frenchman's Road | WPH1 | 153 m | detected, rejected as sidelobe |
| Finchdean (Girder) | WPH1 | 834 m | detected, rejected as sidelobe |
| Goldstone Street | BLI1 | 156 m | never detected |
| Buxted Road | SCU1 | 760 m | never detected |

Broken down that way the picture is clear:

- **The raw detector finds 63 of 65, a raw recall of 0.97.**
- **The cross-section filter then discards 6 of them**, costing 9 percentage
  points of recall.
- Only 2 bridges are genuinely invisible to the detector.

This is the phase 1 trade confirmed at scale. The cross-section test throws away
62 percent of all raw candidates and buys most of the precision the pipeline has,
and the price is narrow structures: a cattle creep, a depot access, two country
lanes. Anyone who cares more about recall than survey time should re-run
`classify` with `--cross-min 0`, which costs one command and no re-reading of
rasters.

## Estimated clearance against signed heights

Fifty-seven structures matched a seed record within 30 m, against fifteen in
phase 1. This is where phase 2 changes the picture materially.

| Statistic | 1.0 m offset | 1.2 m, published depth alone | **2.0 m, as shipped** |
| --- | --- | --- | --- |
| Bias (estimate minus signed) | +0.52 m | **+0.32 m** | **-0.48 m** |
| Mean absolute error | 0.75 m | **0.72 m** | 0.91 m |
| Median absolute error | 0.40 m | 0.49 m | 0.86 m |
| Median error (signed) | +0.30 m | +0.10 m | -0.70 m |
| Within plus or minus 1.5 m | 93 percent | 93 percent | 93 percent |
| Reported **higher** than the signed height | 37 of 57 | 30 of 57 | **9 of 57** |
| Structures under 4.5 m | 232 | 255 | 348 |

**The offset is deliberately conservative, and that is the decision taken.**

On fifteen phase 1 records the 2.0 m offset gave a bias of +0.05 m. On
fifty-seven records covering the whole county it reads **0.48 m below the plate
on average**. The offset that would centre the bias on this larger set is roughly
1.5 m, and the published 1.2 m construction depth alone would be closer to
centred at +0.32 m.

2.0 m is kept for both phases anyway, and the estimates should be described as
**deliberately conservative rather than as best estimates**. The reason is the
asymmetry of the two errors:

- At the shipped 2.0 m offset, **9 of 57** validated bridges read above the
  plate.
- At the published 1.2 m depth alone, **30 of 57** would read above the plate.
- At 1.0 m, 37 of 57.

Reading a bridge as taller than its signed height is the error that costs a
vehicle roof; reading it as shorter costs a survey visit. A pipeline whose whole
purpose is to stop bridge strikes should spend the cheap error to avoid the
expensive one, so the estimate is tuned low on purpose and should be presented
that way.

What this is not: it is not the best-fitting value, and nobody should describe it
as one. The honest sentence is "estimated clearance, deliberately biased low,
reading about half a metre under the signed height on average where a signed
height exists". `deck_h_m` remains the raw measured height in both phases, so a
different offset is one constant and one re-export away.

### Outliers

Three of 57 are wrong by more than 3 m at the shipped offset:

| Bridge | Error | Direction |
| --- | --- | --- |
| South Road | +5.3 m | reported much higher than signed |
| Withdean Farm / Deneway | +3.3 m | reported much higher than signed |
| Redgate Mill | -3.6 m | reported much lower than signed |

Excluding all three: n=54, bias -0.60 m, mean absolute error 0.74 m, median
absolute error 0.79 m. The two positive outliers are the embankment failure mode
described in the phase 1 report, where the last return is the top of the
embankment rather than the soffit of the arch. Redgate Mill is the mirror image
and is worth noting because it **ranks 14th in the high-tier scan list at an
estimated 0.79 m**: a gross underestimate that will send a survey vehicle to a
bridge with roughly 4.4 m of headroom. Both directions of gross error exist and
neither is rare enough to ignore.

## Precision from visual chip review

Forty-five structures were sampled, fifteen from each tier, and every chip was
looked at individually and given a verdict. Chips are 200 m squares: last-return
hillshade on the left, last return minus DTM on the right, road links in white,
the structure's run in red. Verdicts are in `chip_verdicts_phase2.csv` and the
images in `chips_phase2_tiers/`.

A chip counts as **true** if a road really does pass under a structure there.
It counts as **false** if the elevated return is vegetation, a building or
embankment merely beside the road, or the road itself carried on a structure.

| Tier | Sampled | True | **Phase 2 precision** | Phase 1 precision |
| --- | --- | --- | --- | --- |
| high | 15 | 12 | **0.80** | 0.86 |
| medium | 15 | 2 | **0.13** | 0.35 |
| low | 15 | 2 | **0.13** | 0.22 |
| all | 45 | 16 | **0.36** | 0.42 |

Verdict mix:

| Tier | bridge | covered | vegetation | over | noise |
| --- | --- | --- | --- | --- | --- |
| high | 12 | 0 | 0 | 1 | 2 |
| medium | 2 | 0 | 3 | 1 | 9 |
| low | 0 | 2 | 6 | 0 | 7 |

**The high tier holds. The other two collapse.** That is the headline difference
from phase 1, and it is a real effect of going inland, not sampling noise:

- **Vegetation goes from a nuisance to a main failure mode.** Nine of the thirty
  medium and low chips are trees or hedges, against four of forty in the phase 1
  held-out sample. Rural Sussex is full of mature hedgerows and treed lanes whose
  first and last returns agree within a metre, which is precisely the signature
  the detector keys on. The coastal belt simply has fewer of them.
- **The "road" crossing evidence is much weaker inland.** In phase 1 a road
  crossing another road at a clear angle was usually a real grade separation. In
  rural Sussex it is usually two lanes meeting at a hedge line, so the medium tier
  drops from 0.35 to 0.13 and is now no better than the low tier. **The medium
  tier no longer earns its name in phase 2 and should not be presented as a
  middle confidence band.** On this evidence medium and low are one thing.
- **Farm and industrial buildings replace terraced housing** as the source of edge
  noise, but the mechanism is identical: the Open Roads centreline sits a few
  metres off the real carriageway and clips a wall or a roof.

Note also that phase 2 is a strictly harder test than the phase 1 number it is
being compared with: this sample is stratified, so a third of it is drawn from
the low tier, whereas the phase 1 held-out sample was drawn in proportion. A
proportionally drawn phase 2 sample would land near 0.30, since the low tier is
half of all structures.

Caveats on these figures, unchanged in substance from phase 1:

- Fifteen chips per tier is a small sample. Each tier figure carries roughly plus
  or minus 10 percentage points of sampling error, so 0.80 against 0.86 for the
  high tier is not a meaningful difference, while 0.13 against 0.35 for the medium
  tier is.
- Verdicts come from LiDAR imagery alone. No site was visited. Two chips (idx 92
  and idx 189) were genuinely ambiguous between a road under an embankment and a
  road on one; idx 92 was called true and idx 189 false, and swapping both would
  move the overall figure by two points.
- Precision is measured on deduped structures here, and on candidate runs in the
  phase 1 held-out figure of 0.53. The 0.42 phase 1 number in the table above is
  the structure-level one, so the two columns are comparable.

## OpenStreetMap comparison

Counts for the same bounding box, from Overpass, as a comparison only. OSM is
never joined into any output.

| Query | Phase 1 | Phase 2 |
| --- | --- | --- |
| Ways tagged `highway` plus `bridge` | 356 | 4,778 |
| Elements tagged `maxheight` | 147 | 433 |

The 4,778 bridge ways are mostly the road **on** the bridge, which is the opposite
of what this pipeline maps, and one structure can be several ways. The 433
`maxheight` elements are the closer comparison: that is the crowd-sourced record
of restricted headroom across Sussex, against 676 structures here of which 348
are estimated under 4.5 m and 122 are high tier. Neither dataset is a subset of
the other and neither is complete.

## Top 15 by score, high tier only

| Road | Ref | Function | Crossing | Est. clearance | Score | Lat, lon | Seed match |
| --- | --- | --- | --- | --- | --- | --- | --- |
| Yapton Road | B2233 | B Road | rail | 2.55 m | 100 | 50.83085, -0.63743 | Barnham Road |
| Shottermill Road | B2131 | B Road | rail | 2.60 m | 100 | 51.08554, -0.74005 | Shottermill Road |
| Bayham Road | B2169 | B Road | rail | 2.62 m | 100 | 51.10590, 0.29267 | Station Bridge, Frant |
| Mill Road | A264 | A Road | rail | 2.71 m | 100 | 51.13037, 0.15177 | Mill Road (A264) |
| North Street | B2147 | B Road | rail | 2.73 m | 100 | 50.85155, -0.93781 | Emsworth Road |
| Queen Street | A281 | A Road | rail | 2.79 m | 100 | 51.06087, -0.32404 | East Street |
| B2188 | B2188 | B Road | rail | 2.79 m | 100 | 51.10888, 0.17515 | Hendals (B2188) |
| Sturt Road | A287 | A Road | rail | 2.88 m | 100 | 51.08568, -0.73598 | Sickle Mill |
| Crowborough Hill | B2100 | B Road | rail | 2.90 m | 100 | 51.04677, 0.18904 | Station Bridge |
| New Barn Road | B2139 | B Road | rail | 2.93 m | 100 | 50.89713, -0.54199 | Station Road |
| Old Shoreham Road | A283 | A Road | rail | 3.59 m | 100 | 50.83437, -0.27947 | Old Shoreham Road |
| Sackville Road | A2023 | A Road | rail | 3.66 m | 100 | 50.83603, -0.17727 | Sackville Road |
| Haslett Avenue East | A2220 | A Road | rail | 3.75 m | 100 | 51.11854, -0.16096 | Haslett Ave |
| unnamed link | - | Minor Road | rail | 0.79 m | 95 | 51.07016, 0.21297 | Redgate Mill |
| Mount Pleasant Road | A263 | A Road | rail | 1.82 m | 95 | 51.12946, 0.26307 | - |

Thirteen of the fifteen carry a seed match, which is a consequence of the scoring
rather than a coincidence: `nr_match` adds to the score. Read the top of this list
as "low A and B roads under railway bridges, and the pipeline agrees with the
railway's own list about where they are", not as new discoveries.

**Two rows in that list are now flagged `suspect` and are excluded from the
verified set.** The Redgate Mill row at 0.79 m is one of the three gross outliers
above: the signed height there is about 4.4 m, so the estimate is 3.6 m too low.
Mount Pleasant Road at 1.82 m has no seed match and has not been chip reviewed.
Both fall under the rule that any estimate below 2.0 m without a chip verdict of
"bridge" is treated as a probable artefact.

The top 10 by score restricted to `display_tier = verified`, which drops both of
them, is:

| Road | Ref | Crossing | Est. clearance | Score | Lat, lon |
| --- | --- | --- | --- | --- | --- |
| Yapton Road | B2233 | rail | 2.55 m | 100 | 50.83085, -0.63743 |
| Shottermill Road | B2131 | rail | 2.60 m | 100 | 51.08554, -0.74005 |
| Bayham Road | B2169 | rail | 2.62 m | 100 | 51.10590, 0.29267 |
| Mill Road | A264 | rail | 2.71 m | 100 | 51.13037, 0.15177 |
| North Street | B2147 | rail | 2.73 m | 100 | 50.85155, -0.93781 |
| Queen Street | A281 | rail | 2.79 m | 100 | 51.06087, -0.32404 |
| B2188 | B2188 | rail | 2.79 m | 100 | 51.10888, 0.17515 |
| Sturt Road | A287 | rail | 2.88 m | 100 | 51.08568, -0.73598 |
| Crowborough Hill | B2100 | rail | 2.90 m | 100 | 51.04677, 0.18904 |
| New Barn Road | B2139 | rail | 2.93 m | 100 | 50.89713, -0.54199 |

## Caveats

- **Everything here is estimated from aerial LiDAR.** No number in these outputs is
  a signed, legal or certified height, and none should be used to route a vehicle.
- The 2.0 m deck offset is **deliberately conservative, not best fitting**. On 57
  signed heights it reads 0.48 m below the plate on average, and 9 of 57 read
  above it. That is the point: the published 1.2 m depth alone would put 30 of 57
  above the plate. See the clearance section.
- Both directions of gross error occur: two bridges are reported more than 3 m too
  high, one more than 3 m too low, out of 57 validated.
- **The medium tier does not survive the move inland** and should be treated as
  low confidence in phase 2.
- Recall is measured against 65 railway bridges. It says nothing about recall for
  road bridges, footbridges, pipe bridges, canopies or sign gantries, because no
  open reference list of those exists.
- 0.4 percent of samples had no LiDAR chunk cached. Absence from this atlas is not
  evidence that a road is clear.
- Crossing type is "unknown" for 337 of 676 structures, half the dataset.

## Correction, 8 September

A bug in the GeoJSON export paired each feature's properties with **another
feature's line geometry**. The export looked the WGS84 geometry up by index after
re-sorting the rows by score, and the sort is not stable, so any rows with equal
scores had their geometries permuted. Affected 77 of 147 features in phase 1 and
638 of 676 in phase 2, with some lines landing tens of kilometres from the
structure they were labelled as.

Only the GeoJSON line geometries were wrong. The `lat` and `lon` properties are
computed before the sort and were always correct, and `scan_list.csv` never used
the geometry at all, so anything driven by coordinates or by the CSV was
unaffected. A map drawing the GeoJSON lines was not.

Fixed by carrying the projected geometry as a column so it travels with its own
row. Both phases were re-exported and verified: maximum discrepancy between a
feature's geometry and its source record is now 0.5 m, which is the simplification
tolerance. No clearance, score, tier or count changed.

This was found by an audit that first produced a false negative: comparing the
representative point of the simplified output line against the source returned
differences of only 6 to 8 m, which read as simplification noise. It only became
visible when the comparison was changed to a Hausdorff distance against the
feature's own source record by id.
