NBI Hydrolocation Considerations

Goals:

Outcomes:

  • A better understanding of the data and processing algorithm applied in the creation of a national database
  • A file useful for hydrofabric network creation and OSM/NBI ID conflation workflows

Presentation Navigation Tips

Slide layout : This deck has one axis, use any key to advance.

: This deck is narrative-oriented


Items linked/bordered in green are cited in the tooltip on hover.

Items linked/bordered in blue are hyperlinked to relevant resources.


Photos are Allowed | Questions are Encouraged

: ~5 minutes | Last updated:07/17/2026 04:21:58

! PLEASE !

Interrupt me and ask questions or clarifications.

I’m here to talk with you now, not to these slides.

Control tips

My preferred (FOSS) flavor of slidedecks, revealjs, has intuitive but none the less unconventional PowerPoint presentation controls:

  • Slides dynamically resize to use the entirety of the browser window, but you can still fullscreen with F.
    • This slide has a red border indicating the content extent.
  • Slide navigation is mode dependent. If there are vertical slides, press space, N, or the down arrow key, not the right arrow to advance slides
  • Press M to open to the menu, Press O for the slide deck overview, Press B to black out the presentation screen, Press S for a speaker view.
  • You can use the chalkboard to freemouse/touchpad draw.
  • Slides should render as designed1 but you can press Alt/Opt + click on the slide to zoom in. Increase text size with Alt/Opt + +, Alt/Opt + - to decrease, and Alt/Opt + 0 reset to the default scale.
  • Press C to declare victory and head home.2

What is NBI

The National Bridge Inventory (NBI) is our nations way of accounting for and coarsely administering the nations critical bridges. This inventory is used by state and federal partners and provides “the Recording and Coding Guide for the Structure Inventory and Appraisal of the Nation’s Bridges…” as administered by the US Federal Highway Administration (FHWA). This data can be accessed (in ASCII form) from here.


NBI field descriptions

To isolate the specific structures we care about (highway bridges over water), we have to decode the NBI’s specific alphanumeric tagging system.

Field Name Description Our Filter Criteria
LAT_016 / LONG_017 Coordinates Formatted as DDMMSSss; requires parsing.
CULVERT_COND_062 Culvert Status Keep 'N' (Not a culvert - we want bridges).
SERVICE_UND_042B What is under it? Keep 5, 6, 7, 8, 9 (Ensures a waterway is beneath).
SERVICE_ON_042A What is on it? Drop 2, 3, 9 (Removes Rail, Pedestrian, Unknown).

Refresher: Hydrolocations


  • Hydrolocations store the source, identifier, and index of a critical location
  • Points of Interest (POIs) aggregate co-located hydrolocations to singular network locations

Conflation method

How do we match a federal point database (NBI) to a crowdsourced line database (OSM)?

  1. Spatial Proximity Filtering (The Net) Create a search radius (buffer) around the NBI coordinate to capture all intersecting OSM candidate lines tagged with bridge=yes.
  2. Attribute & Topological Scoring (The Filter) Evaluate candidates based on geometric orientation (does it cross the stream?), hierarchy (does the NBI highway class match the OSM road type?), and intersecting water layers.
  3. Network Snapping (The Anchor) Once the correct OSM segment is confidently identified, snap the conflated POI to the highest-resolution hydrofabric routing line.

Reprocessing:

  • Noted misalignment/errors with previous process
    • Some bridges appear misaligned with basemap ever so slightly.
    • Large areas missing geographic coverage.
    • Inconsistent processing methodology applied to scale.
  • Traced to bridge line data

Concluding recommendations

Pre-clip is good! - But, brittle tools and tool wiring are bad

Suggestion:

  • Input staging following an operational versioning schema
  • Utilitarian versioning - metadata changes
  • Operational versioning - major version reconstruction
  • Archival versioning - data overload!
  • An R based pathway:
# Read data out of the OSM database
bridges_data <- osmextract::oe_read(
        path_to_roadlines,
        layer = "lines", 
        boundary = sf::st_bbox(vpus[vpus$huc2==vpu_unit, ]), 
        boundary_type = "spat",
        extra_tags = c("bridge", "highway"), 
        quiet = !is_verbose          
    )

# Pull out all lines tagged as "Bridge"
bridges_sf <- bridges_data[grepl("yes|viaduct|aqueduct|footbridge|suspension_bridge|movable_bridge|railway_bridge", 
                           bridges_data$bridge, 
                           ignore.case = TRUE) & 
                           !is.na(bridges_data$bridge), ]
    
# Filter to valid bridge codes
nbi_sf <- nbi_sf[(nbi_sf$CULVERT_COND_062 == 'N' & 
                  nbi_sf$SERVICE_UND_042B %in% c('5','6', '7', '8', '9') & 
                  !(nbi_sf$SERVICE_ON_042A %in% c('2', '3', '9'))), ]

What’s next?

Outcomes and Takeaways:

Next Steps:

Specifications for the National Bridge Inventory w/ Errata#1 03/24 (2024)

See notes (s) and frames for image sources.

Specifications for the National Bridge Inventory w/ Errata#1 03/24. 2024. Office of Bridges and Structures.