The 10 most dangerous intersections in San Antonio, according to crash data

Intersections remain a common place for crashes in San Antonio, but they are making up a smaller share of the overall total. Since 2022, intersection crashes as a percentage of all reported crashes have declined consistently each year from 18.7% in 2022 to 18% in 2025. As of May of this year, they stand at 17.5%.

Still, nearly one in five San Antonio crashes happened at an intersection in 2025, according to an Express-News analysis of Texas Department of Transportation crash data. That’s more than 8,400 crashes. In the first five months of 2026, there were about 3,000 crashes at intersections.

{“__type”: “devHubFreeformEmbed”,”__id”:”SearchableMap”,”__data”:{“story_settings”:[{“Market_Key”:”SanAntonio”,”Subhead”:”San Antonio’s 10 most dangerous intersections in 2025″,”Chatter”:”In one year, these ten intersections saw a total of 132 crashes resulting in 129 injuries, six of them serious. “,”Fallback_Image”:””,”Test_URL”:”https://preview-prod.w.expressnews.com/interactives-embed/1780586044723-devhub-test-proj/SearchableMap?width=600″,”Freeform_ID”:”105057″,”Freeform_Link”:”https://wcm.hearstnp.com/index.php?_wcmAction=business/item&id=105057″,”Unique_ID”:”1780586044723″,”Template”:”none”,”WCM_Embeds”:”SearchableMap”,”Subtype”:”Base”,”Slug”:”devhub”}],”map_settings_wcmprops”:[{“Market_Key”:”Automatically pulled from story_settings”,”Homepage_Embed”:”Optional: Check this box if you want to create a second freeform to use on homepage or section front. This freeform will exclude the hed, dek, notes, source, and byline. “,”Width”:”Optional: How wide you’d like your map to appear on desktop. Will default to text width, but you can make it wider (large is 928px, wide is 1200px).”,”Map_Notes”:”Optional: A line of notes that will appear under the map, above the byline and source lines.”,”Map_Byline”:”Byline for the map. Omit \”By\””,”Map_Source”:”Omit \”Source:\”. Accepts HTML for links.”,”Alt_Text”:”For accessibility: A description of the map. Here’s some tips on how to write it. “,”Style_URL”:”URL for the base map style; use https://maputnik.github.io/ to make your own. Otherwise, don’t change this. A list of som existing styles lives here.”,”View_Zoom”:”OPTIONAL: Zoom level to initiate map at; 0 is most zoomed-out, 22 is most zoomed in. If you do not have a center latitude and longitude set, this will be overriden and the zoom level will be calibrated to show all points on the map.”,”View_Latitude”:”OPTIONAL. Latitude to initialize the map at. Use the Zoom level and Center Coordinates console logs to select the values you want. Leave blank to default to show all markers on map”,”View_Longitude”:”OPTIONAL. Longitude to initialize the map out. Use the Zoom level and Center Coordinates console logs to select the values you want. Leave blank to default to show all markers on map”,”Bounding_Box”:”OPTIONAL. A specific bounding box to set the map bounds. Overrides View_Zoom, View_Latitude, and View_Longitude.”,”Symbol_Radius”:”Optional: Default size of symbols on the map. Default is 5, make it bigger or smaller.”,”Symbol_Fill_Color”:”Default color for symbols – dropdown is connected to our palette, but can be overriden with a hex code if desired.”,”Symbol_Fill_Opacity”:”Default transparency of symbol fills, enter a value 0-1.”,”Symbol_Stroke_Color”:”Default color for symbol stroke.”,”Symbol_Stroke_Opacity”:”Default transparency of symbol strokes, 0-1″,”Min_Zoom”:”OPTIONAL. Minimum level to which user can zoom out on the map (increase this value if you want the user to be able to zoom out less)”,”Max_Zoom”:”OPTIONAL. Maximum level to which user can zoom in on the map (decrease this value if you want the user to be able to zoom in less).”,”Tooltip_Zoom”:”OPTIONAL. Zoom level to zoom to when the user clicks a tooltip. If you don’t want to change the zoom for tooltips, leave this blank.”,”Geocoder_Zoom”:”OPTIONAL: How far to zoom into an address that’s been geocoded. 0 is most zoomed-out, 22 is most zoomed in.”,”Show_Geocoder”:”Check the box to show an address search tool.”,”Geocoder_Region”:”Defaults to your market’s state. Change to \”United States\” if desired.”,”Geocoder_Popup”:”Check the box if you want a popup to automatically appear after the user uses the map search function. Only works with polygons/shapes on the map (not points).”,”Show_Popups”:”Check the box if you’d like to use popup boxes.”,”Legend_HTML”:”If you want to write custom HTML for your legend, add that here. Overrides all defaults. Current code here.”,”Citynames_Top”:”Check the box if you want city and place names to be shown above the points / polygons on the map instead of behind it. “,”Layer_Top”:”If you want a specific layer to appear above all other layers, add that below.”,”External_Files”:”OPTIONAL. Use this to add the data for the points or shapes that will make up your map if you already have a geojson. If not, you can also upload spreadsheet data into the map_data sheet. \n\nAdvanced users: If you want to include points / line / polygon on your map, upload your geojson file here and paste your return URL in this cell. If you have multiple geojson files, separate them with a comma (no spaces). Links to mbtiles will work as well. Leave the map_data sheet blank if you have no data. “,”Using_Albers”:”Check this box if you are using an Albers projection to make sure the geocoder goes to the right places”},{“Market_Key”:”SanAntonio”,”Homepage_Embed”:”FALSE”,”Width”:”large”,”Map_Notes”:””,”Map_Byline”:”Wesley Ratko”,”Map_Source”:”Texas DOT”,”Alt_Text”:”A map with points representing intersections in which there were injury-causing crashes”,”Style_URL”:”https://files.sfchronicle.com/static-assets/tiles/pale-northam-plat-fonts.json”,”View_Zoom”:””,”View_Latitude”:”29.424349″,”View_Longitude”:”-98.491142″,”Bounding_Box”:””,”Symbol_Radius”:””,”Symbol_Fill_Color”:”grey”,”Symbol_Fill_Opacity”:”0.8″,”Symbol_Stroke_Color”:”white”,”Symbol_Stroke_Opacity”:”0.8″,”Min_Zoom”:””,”Max_Zoom”:””,”Tooltip_Zoom”:””,”Geocoder_Zoom”:””,”Show_Geocoder”:”FALSE”,”Geocoder_Region”:”Market’s state”,”Geocoder_Popup”:”FALSE”,”Show_Popups”:”TRUE”,”Legend_HTML”:””,”Citynames_Top”:”TRUE”,”Layer_Top”:””,”External_Files”:””,”Using_Albers”:”FALSE”}],”map_styles_wcmprops”:[{“LayerName”:”This tab is if you want to add a legend to the map for certain layers.\n\nEnter the exact file location of the geojson in used in the map_setting’s \”External_Files\” column. This may be entered in multiple rows (one per category). If you’re referencing data in map_data, type spreadsheet.”,”VariableName”:”Exact name of variable: The name should be same for each row below (the same variable will decide all colors)”,”LegendLabel”:”Optional: Name of the variable in the way you want it to show up on the legend label — this may be the same as column B.”,”Data”:”Content of variable for item — each number/entry below should be different.”,”DataLabel”:”Optional: The way you want the Data variable to appear on the legend; defaults to Data variable.”,”Color”:”Color for the legend. Colors below correspond to our palette, but you can override with a hex code.”,”ScaleType”:”Do you want your legend and styles to be continuous (numerical) or categorical for this layer?”,”LegendNotesPrefix”:”Optional: Add extra notes before a variable value in the legend — for example \”at least \” may be helpful for numeric scales.”,”LegendNotesSuffix”:”Optional: Add extra notes after a variable value in the legend — for example \” or more\”, or \” or less\” may be helpful for numeric scales.”,”Hide_Legend”:”Check this box to hide the legend for this entry”},{“LayerName”:”spreadsheet”,”VariableName”:”Total injury”,”LegendLabel”:”Injuries”,”Data”:”13″,”DataLabel”:””,”Color”:”gold”,”ScaleType”:”Continuous”,”LegendNotesPrefix”:””,”LegendNotesSuffix”:””,”Hide_Legend”:”FALSE”},{“LayerName”:”spreadsheet”,”VariableName”:”Total injury”,”LegendLabel”:””,”Data”:”16″,”DataLabel”:””,”Color”:”red”,”ScaleType”:”Continuous”,”LegendNotesPrefix”:””,”LegendNotesSuffix”:””,”Hide_Legend”:”FALSE”}],”map_tooltips_wcmprops”:[{“LayerName”:”Enter the exact file location of the geojson in used in the map_setting’s \”External_Files\” column. This may be entered in multiple rows (one per category). If you’re referencing data in map_data, type spreadsheet.”,”Custom_HTML”:”If you want custom HTML for this layer instead of the standard tooltip format, add that HTML here. Only one HTML entry accepted per layer. Ignore other columns in this sheet (apart from the LayerName column) for this entry. \n\nSee the tutorial for more details about syntax!”,”VariableName”:”Exact name of variable in data sheet”,”DataName”:”Optional: How you’d like this variable to show up in the tooltip”,”DataPrefix”:”Optional: Anything to add before the data in tooltips and legends — a dollar sign, for example. This will also show up in the legend if the variable is used there.”,”DataSuffix”:”Optional: Anything to add after the data in tooltips and legends — \”lbs\”, for example. This will also show up in the legend if the variable is used there.”,”FormatData”:”If you’d like to add a formula to format this field, you can use vanilla JS to do that here. Use variable to indicate the variable. Anything here should be able to go after a return statement in a function. Example (for adding commas to large numbers): variable.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \”,\”)”,”Header”:”If this is a title column that should appear first and doesn’t need a colon, check the box”,”Image”:”If this is an image column (if its content is an image link or WCM image ID), check the box. “,”Include_Colon”:”If you want a colon here, check the box”,”Highlight”:”Check the box to highlight this field with the color of the dot, line, or polygon it corresponds to. “,”Show_On”:”Do you want to show this layer on click or on hover? Defaults to click.\n\nThe same option should be selected for all rows in a layer.”},{“LayerName”:”spreadsheet”,”Custom_HTML”:””,”VariableName”:”Location”,”DataName”:”Intersection”,”DataPrefix”:””,”DataSuffix”:””,”FormatData”:””,”Header”:”TRUE”,”Image”:”FALSE”,”Include_Colon”:”FALSE”,”Highlight”:”FALSE”,”Show_On”:”Click”},{“LayerName”:”spreadsheet”,”Custom_HTML”:””,”VariableName”:”Crash Count”,”DataName”:”Number of 2025 crashes”,”DataPrefix”:””,”DataSuffix”:””,”FormatData”:””,”Header”:”FALSE”,”Image”:”FALSE”,”Include_Colon”:”TRUE”,”Highlight”:”FALSE”,”Show_On”:”Click”},{“LayerName”:”spreadsheet”,”Custom_HTML”:””,”VariableName”:”Serious injury”,”DataName”:”Serious injuries”,”DataPrefix”:””,”DataSuffix”:””,”FormatData”:””,”Header”:”FALSE”,”Image”:”FALSE”,”Include_Colon”:”TRUE”,”Highlight”:”FALSE”,”Show_On”:”Click”},{“LayerName”:”spreadsheet”,”Custom_HTML”:””,”VariableName”:”Total injury”,”DataName”:”Total injuries”,”DataPrefix”:””,”DataSuffix”:””,”FormatData”:””,”Header”:”FALSE”,”Image”:”FALSE”,”Include_Colon”:”TRUE”,”Highlight”:”FALSE”,”Show_On”:”Click”}],”cluster_settings_wcmprops”:[{“LayerNames”:”Enter a comma-separated list of exact file location(s) of the geojson in used in the map_setting’s \”External_Files\” column. This may be entered in multiple rows (one per category). If you’re referencing data in map_data, type spreadsheet.”,”Cluster”:”Check box if you want to cluster nearby datapoints together; only valid for point data. This will automatically set the circle-radius property based on cluster size.”}],”map_toggles_wcmprops”:[{“LayerName”:”Enter the exact file location of the geojson in used in the map_setting’s \”geojson\” column. This may be entered in multiple rows (one per category). If you’re referencing data in map_data, type spreadsheet.”,”LayerField”:”If you only want to variable shown on the map, NOT swap the actual layer, add the field you want to use here. “,”LayerLabel”:”Name of the variable in the way you want it to show up on the toggle/filter buttons — this may be the same as column A.”,”Toggle_Filter”:”Content of variable for item — each number/entry below should be different.”}],”map_data_wcmfeed”:”https://files.sfchronicle.com/wcm-feeds/2026/1lxO2LTFOLZbxTAUYMhWdPKAw2jhDKwErb7LoXCB6Oigmap_data_wcmfeed.json”}}

Crashes at the 10 most dangerous intersections on all regular streets and roads in San Antonio — excluding freeways, expressways, and ramps — accounted for 132 crashes and resulted in 129 injuries last year.

Topping the list is East Bitters Road at Heimers Road, just north of the airport and east of U.S. 281. In 2025, there were nine crashes resulting in 16 injuries — one of them serious. The primary cause of crashes at the multi-lane intersection is drivers failing to yield the right of way when turning left. Other factors included driver inattention and ignoring the light.

{ “__type”: “devHubFreeformEmbed”, “__id”: “Datawrapper”, “__fallbackImage”: “https://datawrapper.dwcdn.net/qJgRE/mobile.png”, “__data”: { “datawrapper_id”: “qJgRE” } }

Driver inattention was a top factor for crashes at many other intersections, contributing to one in four crashes. Other common factors included disregarding traffic signals or stop signs and failing to yield the right of way.

{ “__type”: “devHubFreeformEmbed”, “__id”: “Datawrapper”, “__fallbackImage”: “https://datawrapper.dwcdn.net/v2rw2/mobile.png”, “__data”: { “datawrapper_id”: “v2rw2” } }

As part of its most recent five-year safety plan, TxDOT has adopted Intersection Control Evaluation, a process meant to help transportation officials choose the safest and most effective design for an intersection or interchange. The process compares options based on safety, traffic flow, cost and community impacts, and is intended to push planners to consider alternatives beyond traditional signals and stop signs. Those options can include roundabouts, reduced-conflict U-turns and other designs meant to reduce crash risks by limiting conflict points and keeping traffic moving without requiring every vehicle to stop…

Story continues

TRENDING NOW

LATEST LOCAL NEWS