StreetStat
Pedestrian crash & infrastructure context for Memphis
Local coverage often frames each pedestrian death as an individual mistake. StreetStat puts every recorded pedestrian and non-motorist crash in its infrastructure context instead: what the road is like — lanes, posted speed, lighting, sidewalks, crossings — and who owns it, the City of Memphis or the Tennessee DOT. Everything here is a share, a count, or a distance computed from public records. The numbers are descriptive: they say where crashes happen and what those roads are like, never that a road caused a crash.
Findings — who owns the deadly roads, and why people die on them
All figures are the 1,337 pedestrian / non-motorist crashes inside the City of Memphis (179 fatal), 2023-01-01 to 2026-07-11. Recomputed from the data — nothing hand-entered.
Most Memphis pedestrian deaths are not random residential accidents. They cluster on wide, fast, multi-lane arterials — 63.1% on roads of four or more lanes and 60.3% on roads posted 40 mph or higher. When a road is built to move cars quickly through many lanes, a person trying to cross has little chance. This is a design problem, not a behavior problem: who builds, owns, and lights these roads — the City and TDOT — decides whether crossing them is survivable.
Who owns the road
| Category | All crashes | Deaths |
|---|---|---|
| City of Memphis (surface) | 1,035 (79.5%) | 118 (71.5%) |
| TDOT state route (surface) | 267 (20.5%) | 47 (28.5%) |
| Limited-access (TDOT) — separate | 35 | 14 |
The range. Of surface crashes, the City of Memphis owns 74.9–79.5% (about 80% by the primary method) and TDOT state routes 20.5–25.1%; among deaths, City 68.5–71.5% and TDOT 28.5–31.5%. The range's upper TDOT bound credits the 60 crashes at a city corner with a state route to the state route instead of the city cross-street. The City owns the majority of surface pedestrian crashes under either reading. Limited-access roads (interstates, ramps, Sam Cooper) are a separate 35 crashes (14 fatal).
Charts
Who owns the road — all crashes vs. deaths
Deaths by number of lanes
Crashes by year
The 25 deadliest corridors
Click a column to sort. Owner is the dominant road owner along the corridor.
| # | Street | Crashes | Serious Injury | Deaths | Owner | Speed | Lanes |
|---|
Method. Tennessee SAFETY non-motorist crash records for Shelby County, 2023-01-01 to 2026-07-11, deduplicated to one crash per report and filtered to inside the City of Memphis. Each crash is assigned to the road it happened on — City of Memphis, a TDOT state route, or a limited-access TDOT road — by matching it to the nearest road centerline (all distance math in EPSG:32136, Tennessee meters). Pedalcyclists are excluded. Every figure is recomputed from the data. Full details: Methodology.
Sources. Crashes: Tennessee SAFETY MapServer (TDOT). Roads, state routes, city boundary, street centerline: City of Memphis Public Works GIS. National ranking: Smart Growth America, Dangerous by Design 2024. Sam Cooper Blvd's low-speed western end is technically a city surface street; its tint here reflects the TDOT expressway.
Methodology
How every number on this site is produced — the public source, the exact rule applied, and the honest limits of each step. Written for a skeptical reader; script filenames are given for anyone who wants to check the code.
Five principles run through the whole pipeline. Computed, never hardcoded — every figure is derived from the data files at build time. Reconciled — each build proves the splits sum back to 1,337 crashes / 179 deaths before the page ships. Correct geometry — all distance math is done in EPSG:32136 (NAD83 / Tennessee, meters); the common Web Mercator projection is never used for measurement because it stretches distances about 22% at Memphis’s latitude. Descriptive, not causal — shares, counts, and distances only; the data cannot say a road caused a crash, so the site never does. Honest about coverage — where a dataset doesn’t cover a place, fields read “not yet analyzed,” never a fabricated number.
a. Crash data
Source: the Tennessee SAFETY MapServer — TDOT’s public crash service —
non-motorist records for Shelby County. No login, no scraping; the raw API pages are saved
untouched in data/raw/ and never hand-edited.
Rule: the service returns one row per person involved, so records are deduplicated to one row per crash, keeping the worst injury in the crash. Pedalcyclists are excluded by design (this is a pedestrian project). Crashes with missing or impossible coordinates (blank, 0°/0°, outside Shelby County) are flagged and kept in the file but excluded from headline counts, and everything is filtered to points inside the City of Memphis boundary. Result: 1,337 crashes (179 fatal), 2023-01-01 to 2026-07-11.
Limitations: the state file is a rolling window of roughly the last three years, so totals shift slowly as it advances. Official crash data is finalized with a reporting lag — the most recent months undercount, and every time-window table on this site says so. The data is only as good as the underlying police reports.
Code: scripts/01_download_crashes.py · scripts/03_spatial_join.py
b. Crash-to-road attribution
Rule: each crash point is matched to the nearest road-centerline segment, measured in EPSG:32136 meters, and inherits that segment’s ownership. The matched segment ID and the snap distance are recorded on every crash row, so each attribution is auditable. (The project’s original screening rule classed a crash as state-route when it lay within 30 m of one; the final method replaces that with nearest-classified-segment inheritance and keeps the distance as provenance.)
Code: scripts/17_classifier.py · scripts/03_spatial_join.py
c. Road ownership classification
Source: City of Memphis Public Works GIS (street centerlines, state-route layer, city boundary).
Rule: every centerline segment is tagged by an ordered rulebook; the first rule that matches wins, and which rule fired is recorded on the segment:
- Interstate mainline (road class S1100) → Limited-access (TDOT)
- Interstate ramp (S1630) → Limited-access (TDOT)
- Documented limited-access override list (e.g. Sam Cooper Blvd, which is absent from the state-route layer) → Limited-access (TDOT)
- Geometric overlap with a same-named state route (≥60% of the segment within 10 m, or ≥85% within 8 m for differently-named routes) → TDOT state route
- Completeness override: a City segment ≥20% collinear with a same-named state route (name-guarded, so it can never tag a cross street) → TDOT state route
- Otherwise → City of Memphis
Limitations: Sam Cooper’s low-speed western end is technically a city surface street, so its map tint slightly over-extends (crash counts are unaffected). Ownership here means the road’s classification in the public GIS layers, which is the best public record of design responsibility — not a legal opinion on maintenance agreements.
Code: scripts/17_classifier.py (consolidating 14–16)
d. Corridors & along-road counting
Rule: corridors group crashes by standardized street name — the same grouping the deadliest-corridor table uses, with directional prefixes kept (North Parkway ≠ South Parkway). Each corridor’s segments are merged into spatially-ordered connected lines; same-name branch stubs whose endpoints touch within 1 m are treated as one road, while gaps larger than 15 m (a rail yard, a genuine break) keep sections separate. The “±300 m” count around a point is measured as network distance along the road, never a straight-line radius, and never leaks across a real gap — the two orange bars on the map show exactly where the window ends, and if a section is shorter than the window the result says the window was clamped.
Verification: the browser’s coordinate math is checked against the reference Python implementation (they agree to under a millimeter), and every build re-proves that whole-corridor counts still sum to 1,337 and that all 25 deadliest-corridor figures match the published table.
Limitations: corridor geometry is simplified (10 m tolerance) for the page, so a snap distance can differ by a few meters from survey-grade. Points on roads with no recorded pedestrian crashes snap to the nearest road that has them — the result card always names the road it counted and the snap distance.
Code: scripts/24_build_search.py
e. Intersection index
Rule: junctions come from true geometric intersection of the named through-road centerlines (not from segment endpoints, which miss crossings that don’t share an endpoint). Interstates and ramps are excluded as through-roads so grade-separated overpasses don’t create false at-grade “intersections.” Where a cross street meets a divided arterial it crosses each carriageway separately; those paired points are merged into one junction using a cluster radius set from the measured carriageway-gap distribution (25–30 m, with same-street-pair merges up to 120 m for wide medians). That yields 25,533 junctions citywide, all searchable. A junction is “signalized” when a deduplicated TDOT pedestrian crossing lies within 30 m; crashes attach to their nearest junction within 30 m.
Limitations: signal status is only known along corridors the TDOT inventory covers — elsewhere it reads “not yet analyzed,” because absence of inventory is not “no signal.” A junction with no recorded crashes honestly reports “0 incidents reported here.”
Code: scripts/25_rebuild_junctions.py (superseding 21)
f. Sidewalk presence
Source: the City of Memphis sidewalk inventory (46,875 line features), reprojected to EPSG:32136.
Rule: a stretch of road is marked “sidewalk present in city inventory” when an inventory line runs within 20 m of the road centerline. Why 20: measured against the data, sidewalks sit about 7 m (median) to 12 m (90th percentile) off the centerline, so 20 m catches near- and far-side sidewalks while staying well under the ~60 m spacing of parallel streets — a neighboring street’s sidewalk can’t register as this road’s.
Code: scripts/24_build_search.py (flags built at index time)
g. Safe-crossing distance (Union Avenue proof of concept)
Sources: TDOT’s “ADA Asset Data” pedestrian-signal inventory (signal heads and push buttons deduplicated at 30 m into 1,008 signalized-crossing points, one per intersection) and OpenStreetMap marked crosswalks (node/way duplicates merged at 8 m).
Rule: on Union Avenue, a “safe crossing” is a TDOT signal or an OSM marked crosswalk within 30 m of the centerline, deduplicated so a signalized intersection that also has a marked crosswalk counts once. Each crossing-relevant crash’s distance to the nearest safe crossing is measured along the corridor (linear referencing), not as the crow flies; crashes recorded away from the roadway are reported separately, not folded in. On Union Avenue this finds 24 safe crossings (17 signalized + 7 marked-only), a median spacing of 804 ft, 21% of crossing-relevant crashes more than 250 ft from the nearest safe crossing, and a longest gap of 2,921 ft — roughly 9.7× the FHWA ~300 ft best-practice crossing spacing.
Limitations: this analysis is deliberately Union-only so far. OpenStreetMap crosswalk
completeness varies block to block — it was evaluated against the TDOT inventory before use
(scripts/22_osm_crossings_eval.py), and extending the analysis citywide waits on that
ground-truthing. Elsewhere the “nearest safe crossing” field reads “not yet
analyzed.”
Code: scripts/23_union_poc.py · scripts/19–22
Reproducibility
The pipeline is a sequence of numbered scripts (01–25) run in order
(download → classify → analyze → build) — see the
repository
README for the exact commands. Raw API downloads are never edited; every derived file is written
as a new file; and each build prints its own reconciliation against the fixed totals before the
page is published. Code is MIT-licensed; source data remains under its providers’ terms
(crashes: TDOT; roads & sidewalks: City of Memphis; crosswalks: © OpenStreetMap
contributors, ODbL; geocoding: US Census Bureau).