DEV Community

Roman Kotenko
Roman Kotenko

Posted on Originally published at road511.com

What a Large-Vehicle Router Cannot Know

Google Maps Platform took Large Vehicle Routing to GA last month — height, weight, length, width, axle count and hazmat class in the Routes API, US-wide. If you have ever had to explain to a dispatcher why a consumer routing API sent a 13'6" trailer under an 11'9" bridge, this is good news, and it makes truck-legal routing a commodity. Everyone will have it.

So here is the part that does not become a commodity.

A router avoids a low bridge because somebody published a height for it. That is the whole mechanism. And the layer underneath is much thinner and much messier than a rendered map suggests.

I aggregate US and Canadian DOT feeds for a living. On the morning of 15 September 2026 our store held 715,434 active bridge-clearance records from 53 state and provincial sources. Of those, 105,479 — 14.7% — carry a vertical clearance value at all.

The other 85% are not corrupt. They are federal NBI structural inventory: structure_number, deck_area_sqm, year_built, last_inspection_date, scour_critical. The registry knows the bridge exists and when it was last inspected. It was never designed to record what fits underneath.

Twenty-seven names for one measurement

Where a height does exist, it arrives under 27 different property names across those sources. There are 30 clearance-related keys in all; three of them are horizontal clearances, a different measurement that must not be pooled in.

key rows
clearance_m 92,473
clearance_ft 91,964
deck_clearance_ft / deck_clearance_m 10,908 each
vertical_clearance_m 5,307
vertical_clearance_under_ft 3,850
vertical_clearance_ft 2,516
vertical_clearance_label 2,127
lane_1_clearancelane_9_clearance 1,881 – 2,050 each
posted_height 2,038
posted_clearance_ft / posted_clearance_in 645 each
left_ / center_ / right_clearance_in 645 each
vertical_clearance_raw 509
vertical_clearance_on_ft / _over_ft / _deck_ft 30 – 243 each

Normalizing names is tedious but mechanical. This is the one that is not — a real record, unedited:

{ "clearance_m": 4.45, "clearance_ft": "14.6" }
Enter fullscreen mode Exit fullscreen mode

One measurement, one object, two JSON types. The metric value is a number; the imperial value of the same physical distance is a string. Across the store that split is total and consistent: every one of the 92,473 rows with clearance_m has it as a number, and every one of the 91,964 rows with clearance_ft has it as a string.

That is the kind of thing that passes a schema check, passes a null check, passes a range check, and then silently fails a comparison in a language where 4.45 < 4.6 and "14.6" < "4.6" are both true and mean different things. If your clearance test is one careless comparison away from that, it will be correct in staging for months.

It is not just clearances

Same shape, every layer a truck actually cares about — active rows and distinct jurisdictions, same snapshot:

layer rows jurisdictions
truck restrictions 1,477,809 63
bridge clearances 715,434 53
rail crossings 162,284 50
weight restrictions 22,498 7
weigh stations 975 46
tunnel clearances 580 45

Posted weight restrictions: seven jurisdictions. Not seven that have weight limits — seven that publish them in a feed anyone can consume, and that is our ingestion coverage rather than a census of the law. Spring load restrictions apply across most of the northern half of the continent; they are machine-readable in a handful of places.

The point

The ceiling on any large-vehicle router — Google's, HERE's, mine — is publisher coverage, not routing quality. The routing converges. The data does not, and it is the part that decides whether a legal-looking route is actually legal.

If you are building on top of one of these APIs, the useful design question is what your system does with an absence. A blank is a legitimate answer and it should reach the driver as a blank. The failure mode is interpolating one — filling a missing clearance from a neighbouring structure, or defaulting a missing weight limit to "no limit". We leave it empty. A blank is a blank.

(I build Road511, a road-data API over US and Canadian 511 systems. The counts above are our own normalized store; the underlying feeds are public agency data, and the numbers move — these were pulled on the morning of 15 September 2026.)


Originally published on road511.com.

Top comments (0)