Inspiration

Tire wear is the single largest source of microplastic pollution in oceans. Its bigger than plastic bags, bottles, and clothing combined, accounting for 28% of all ocean microplastics. Yet while plastic straws and bags became cultural flashpoints, tire particles continue flowing into waterways with zero public visibility. The Merrimack River, running through my team's own backyard, is one of the most polluted rivers in New England. We realized no tool existed to answer a simple question: which roads are poisoning our river, and what can we do about it today?

We built TireTrace to make the invisible visible, and to turn awareness into action.

What it does

TireTrace maps tire particle runoff from every major road directly to the waterway it pollutes. Users see their commute's real environmental cost in milligrams of tire particles and micrograms of 6PPD-quinone (the chemical compound linked to mass coho salmon deaths nationwide).

A user can plan a route and see two options side by side: the standard path and an eco-optimized alternative with 40% less pollution impact. City officials can open the hotspot map and immediately identify which three roads contribute the most toxic runoff to their local river. Citizens can generate a data-backed petition addressed to their city council, complete with their local road and waterway names, then copy and send it in under two minutes.

TireTrace serves three audiences with one platform: individuals change their driving behavior, engineers target remediation funding, and citizens demand policy change - all grounded in the same Massachusetts DOT traffic data, USGS watershed maps, and NOAA rainfall records.

How we built it

We built TireTrace as a two-layer system. The frontend is a Flutter mobile app with a live map layer, route planner, tire guide, and petition generator. The backend is a Python pipeline running on geospatial data.

The Python pipeline loads MassDOT road shapefiles with AADT (Average Annual Daily Traffic) values, then clips them to the Merrimack River watershed bounding box. It loads USGS NHD flowline data for waterways and calculates the distance from every road segment's centroid to its nearest waterway using Shapely's nearest_points function. A NOAA API fetch provides average monthly rain days for runoff calculations.

The runoff model uses a physics-informed exponential decay function: runoff fraction = e^(-distance/200), meaning roads within 200 meters of a waterway lose over 60% of their particles to runoff. The emission factor is 0.1 grams of tire particles per vehicle per kilometer, drawn from Pierson et al. 2020. Roads with steeper slopes get a multiplier based on MassDOT road type codes - interstates score 1.15, local roads 0.95. The final pollution score normalizes monthly runoff milligrams to a 0-100 scale for the Flutter map.

The Flutter app loads the exported GeoJSON, parses each road segment, and renders a color-coded overlay. The route planner fetches the pollution score for each candidate road and sums the total per trip. The petition generator injects the user's entered city, road, and waterway into a template and copies to clipboard.

Challenges we ran into

Cleaning three separate government datasets never designed to work together took the most time. MassDOT roads use one coordinate system and one set of field names. USGS NHD flowlines use another. NOAA rainfall data needed alignment to daily aggregation. Each dataset assumes it's the only one you'll ever need. We wrote multiple reconciliation layers just to get roads and waterways talking to each other.

The distance calculation between 24,806 road segments and 4,558 waterway segments was computationally expensive. A naive nested loop would have taken hours. We projected both layers to a meter-based coordinate system (EPSG:26986), unioned all waterways into a single geometry, then computed nearest distances in batch. That cut runtime from hours to minutes.

On the mobile side, rendering 24,806 GeoJSON segments with smooth map interactions required aggressive optimization. We moved to a clustered rendering approach and limited the visible viewport to avoid frame drops.

The biggest conceptual challenge was making the pollution model defensible but simple enough to explain. We chose a transparent physics-based model over a black-box ML model so users and judges can see exactly why a road scores what it scores: distance to waterway + traffic volume + rainfall + slope.

Accomplishments we're proud of

Getting the road-to-waterway tracer working with real Massachusetts data was the breakthrough. Initially we thought we would need to approximate or simulate drainage paths. But by using actual USGS flowlines and calculating true geometric distances, every road segment now connects to a real, named waterway - Merrimack River, Concord River, Shawsheen River, and dozens of smaller streams.

The pollution score normalization works. A road within 15 meters of a waterway carrying 17,820 cars daily scores 100. A rural road half a kilometer from any stream scores near zero. The distribution matches what local watershed reports identify as problem areas.

The petition generator has already been used in testing by residents of Lowell, Lawrence, and Haverhill. Each letter includes city-specific road names and waterway names pulled from the user's input, plus the 6PPD-quinone citation and four concrete policy requests. It turns a vague "I want cleaner water" into a specific, sendable document in two minutes.

We also proved the concept can scale. The entire pipeline runs start to finish in under ten minutes on a laptop, and the resulting GeoJSON loads and performs on a physical Android device perfectly.

What we learned

Government data is messy but usable. MassDOT publishes AADT counts that are surprisingly recent and complete. USGS NHD flowlines are precise enough to catch small streams feeding major rivers. The data exists, its just that no one has connected the dots.

Distance to waterway dominates pollution risk more than traffic volume. A moderately busy road directly next to a river can outscore a highway half a kilometer away. This flips intuition: highways look bad, but the worst pollution is often on city streets running parallel to rivers.

We also learned that behavioral tools need to sit next to policy tools. A route planner alone does not fix the problem, as it simply shifts individual behavior. The petition generator exists because cities need to retrofit stormwater infrastructure, and that requires political pressure. Individual and collective action have to ship in the same app.

What's next for TireTrace

First, pilot with one Massachusetts city's stormwater department. The hotspot map already identifies which three roads in each city contribute the most runoff. The next step is showing a city engineer exactly where to place bioretention filters or vegetated swales, and estimating the pollution reduction per dollar spent.

Second, expand to the EPA Clean Water Act permit framework. Municipal stormwater permits already require pollution reduction plans. TireTrace can become the compliance tool that tells cities exactly where to intervene.

Longer term, we want to cover every major watershed in the United States. The pipeline is data-agnostic: swap MassDOT for any state DOT road file, swap USGS NHD for any regional waterway layer, and the same code produces a local pollution map. We built it to expand.

Built With

Share this project:

Updates