The data dictionary, published in full.
You should be able to see the shape of a delivery before you talk to anyone about buying one. Every field below is on every feature we hand over, read from the pipeline that writes the layers rather than from a brochure. The sample layer itself, one asset class from the Brighton and Hove pass of 14 August 2026, is sent on request.
Schema roadside-products-v4 · one layer per asset class · GeoJSON
One asset class, the dictionary, and the pass it came from.
One asset class
A single product line from the Brighton and Hove pass as GeoJSON, with every field below populated on every feature. One layer, so you can load it beside your own and see whether the two agree, without signing anything first.
Every field, defined
The tables on this page, and the same content alongside the layer. Nothing in the delivery is undocumented, and the provenance statement travels inside the file rather than in a covering email that gets separated from it.
What the pass was
One drive on one day: 2,008 frames and 4,146 positioned features. Legible-value precision of 98.0%, 245 of 250 on a seeded stratified sample, with a 95% confidence interval of 95.4% to 99.1%.
Every feature carries every field.
There are no optional properties and no sparse ones. Where a value could not be read or a position could not be established, the field says that in as many words rather than being dropped, because a missing key and a known negative are different facts and a GIS reads them the same way.
Identity and provenance
| Field | Type | Meaning |
|---|---|---|
| object_id | string | Stable identifier for this feature. It survives a re-run of the pass, so a later survey lines up against this one. |
| category | string | The asset class, from the published taxonomy: street_light, crossing, drainage and so on. |
| category_label | string | The same class in human words, as the viewer and the legend show it. |
| subtype | string or null | The finer class where one was read. Null where the detection did not support one. |
| street | string or null | The street the observing frame was map-matched to. Null where no match was made; never guessed from proximity. |
| drive | string | Which pass this feature came from. One pass, one identifier. |
| captured | date | The date the imagery behind this feature was driven. Not the date the file was written. |
What was read
| Field | Type | Meaning |
|---|---|---|
| value | string or null | The text read off the asset, exactly as posted. Null where nothing legible was read. |
| legible | boolean | Whether a value was read at all. An illegible detection carries no value rather than a plausible one, and this flag is how you filter for the difference. |
| detail | object or null | The class-specific extras, where the class has any. |
| conf_max_pct | integer | The highest per-read confidence across every observation of this feature. |
| conf_mean_pct | integer | The mean per-read confidence across the same observations. Read it beside conf_max_pct: one confident read among nine poor ones is a different thing from ten consistent ones. |
How it was placed
| Field | Type | Meaning |
|---|---|---|
| pos_method | enum | How this feature was placed. Never dropped, never defaulted: the method is on every feature, and a feature that could not be placed says so. |
| bearing_deg_true | number or null | True bearing from the camera, for a feature seen once and therefore carrying a direction but no range. |
| surface_feature | boolean | Whether the feature sits on the road plane. Surface features project exactly onto it; everything else is biased long, and this flag is how you separate the two. |
| observations | integer | How many raw reads were consolidated into this one feature. |
| obs_positioned | integer | How many of those reads contributed a position. |
| obs_bearing_only | integer | How many contributed only a direction. |
| frame_first | integer or null | The first capture frame this feature was seen in, so every value can be taken back to the photograph behind it. |
| frame_last | integer or null | The last such frame. |
| provenance | string | The delivery's own statement of where the data came from, written into every feature and every layer file rather than into a covering email. |
The values pos_method takes
| Method | What it means |
|---|---|
| triangulated | Seen from two or more camera positions, and placed where the bearings cross. |
| ground_cluster | Projected onto the road plane and clustered across frames. |
| linear_run | Fitted along a run of repeated assets, such as a line of bollards or a railing. |
| merged | Two nearby detections resolved as one feature. |
| value_merged | Merged because they carried the same read value, not only because they were close. |
| single_finding | One observation only, positioned from that single read. |
| unlocated | Not placed. It has a direction and no range, and the layer says so rather than putting it somewhere plausible. |
What the numbers on a feature do not tell you.
Confidence is not accuracy. conf_max_pct and conf_mean_pct describe how sure the read was, not how right it was. The precision figure on the pass, measured on a seeded sample, is the statement about how right the reads were.
Precision is not recall. 98.0% measures whether values we claimed to read were read correctly, and nothing else. It says nothing about what the pass did not see, and we publish no recall figure because we have not measured one.
Positional accuracy is not measured. pos_method tells you how each feature was placed, and the methods differ in how tightly they place things, but no positional-accuracy figure has been measured against survey-grade ground truth and none is published. Treat positions as method-labelled estimates.
Coverage is what was driven. The pass describes the streets it went down on the day it went down them. There is no claim to national coverage and no claim that an asset class is complete within the area, and a re-survey is delivered as a fresh dated pass rather than an automated difference.
These are leads good enough to plan a programme against and to check your own register with. They are not a legal record, and nothing in a layer should be treated as one.
Ask for the layer.
Tell us which asset class is the one you would actually check, and we will send that layer from the Brighton pass with this dictionary beside it. We ask for an email so we know where to send it, and so we can tell you if the pass is superseded.