Skip to content

50,000 free calls a month, card-free. Get an API key →

Roadside sample pack

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

What you get

One asset class, the dictionary, and the pass it came from.

The layer

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.

The dictionary

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.

The context

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%.

The dictionary

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

FieldTypeMeaning
object_idstringStable identifier for this feature. It survives a re-run of the pass, so a later survey lines up against this one.
categorystringThe asset class, from the published taxonomy: street_light, crossing, drainage and so on.
category_labelstringThe same class in human words, as the viewer and the legend show it.
subtypestring or nullThe finer class where one was read. Null where the detection did not support one.
streetstring or nullThe street the observing frame was map-matched to. Null where no match was made; never guessed from proximity.
drivestringWhich pass this feature came from. One pass, one identifier.
captureddateThe date the imagery behind this feature was driven. Not the date the file was written.

What was read

FieldTypeMeaning
valuestring or nullThe text read off the asset, exactly as posted. Null where nothing legible was read.
legiblebooleanWhether 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.
detailobject or nullThe class-specific extras, where the class has any.
conf_max_pctintegerThe highest per-read confidence across every observation of this feature.
conf_mean_pctintegerThe 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

FieldTypeMeaning
pos_methodenumHow 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_truenumber or nullTrue bearing from the camera, for a feature seen once and therefore carrying a direction but no range.
surface_featurebooleanWhether 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.
observationsintegerHow many raw reads were consolidated into this one feature.
obs_positionedintegerHow many of those reads contributed a position.
obs_bearing_onlyintegerHow many contributed only a direction.
frame_firstinteger or nullThe first capture frame this feature was seen in, so every value can be taken back to the photograph behind it.
frame_lastinteger or nullThe last such frame.
provenancestringThe 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

MethodWhat it means
triangulatedSeen from two or more camera positions, and placed where the bearings cross.
ground_clusterProjected onto the road plane and clustered across frames.
linear_runFitted along a run of repeated assets, such as a line of bollards or a railing.
mergedTwo nearby detections resolved as one feature.
value_mergedMerged because they carried the same read value, not only because they were close.
single_findingOne observation only, positioned from that single read.
unlocatedNot placed. It has a direction and no range, and the layer says so rather than putting it somewhere plausible.
Before you load it

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.