← All workGeospatial data equitycompleted2026

Mapping equity: the flood crossings an open map cannot see

On this page
  1. In short
  2. The question
  3. What it measures, and what it refuses to
  4. Design decisions
  5. What it has found so far
  6. Stack
  7. Links

In short

  • WhatWhere open map data serves some communities worse than others.
  • HowOfficial Texas low-water crossings checked against Overture roads.
  • Result8,454 crossings, none marked as flooding; 216 areas cut off.

The question

Zindi’s Bias Bounty Mapping Equity Challenge asks where open map data serves some communities worse than others. The challenge scorecard compares highway lengths between open and official road data. My question was what that comparison cannot see.

What it measures, and what it refuses to

Part 2, the discovery. In the challenge’s Texas region there are 8,454 official low-water crossings: places where a road goes under water when it floods. Overture has the road at 93.1 percent of them and marks none as a crossing that floods, because its road schema has no value that could say so. A scorecard built on highway length cannot see that gap at all.

When I close the crossings in Overture’s own road network, 22,469 buildings (about 26,300 residents) in 216 areas are left with no mapped road out, and TIGER agrees. NOAA flood reports tie 20 deaths since 1996 to 16 named crossings. Two readings of a random sample on aerial imagery put 5,067 to 14,426 of those buildings behind no dry way out at all.

Map of south-central Texas showing 8,454 official low-water crossings as small dots and 216 areas left with no mapped road out as orange circles, with the eight counties holding the most such buildings shaded and labelled.
Official low-water crossings in south-central Texas, and the 216 areas left with no mapped road out when they close. The data credit is part of the figure.Figure: bias-bounty-coverage-gap, Peter Tinashe Mundowa

Part 1, the method. One script rebuilds the challenge’s coverage gap score exactly, from the organisers’ own data.

Technical detail

Part 1, the method. One script builds the coverage gap score for all 9,379 scored tracts from the organisers’ data, reproduces every count the data README publishes, and writes the scored file byte for byte. It scores a public error of 0.00000301 with the standard pyproj wheel, and exactly 0 with PROJ built for fused multiply-add. I then measured how far each of 29 alternative conventions and weightings moves the values and the scorecard’s ratios.

Design decisions

The build is pinned, deterministic, and stops rather than writing a wrong file.

Technical detail
  • Inputs are pinned. Every challenge layer, the extra Overture road classes and the 90 NOAA files are checked against a sha256 manifest. When the organisers removed four layers from the bucket on 25 September 2026, both parts were rerun from local copies and came out byte for byte as before.
  • No randomness in the scored column. No model, seed or manual step. The discovery’s random steps use fixed seeds, and the imagery audit’s two readings ship as files.
  • It stops rather than writes a wrong file. Missing or changed inputs halt the run with the command that fixes it.

What it has found so far

The discovery above, the reproducible scored column, and the sensitivity tables, all in the repository with their licences.

Stack

Technical detail

Python 3.11 with geopandas, shapely, pyproj, pyarrow, pandas and DuckDB; OpenStreetMap, Overture Maps, TIGER/Line, NOAA Storm Events and Texas Water Development Board inventories.

Want to talk about this work? Email me or download my CV.