· Jonathan Cutrer · GIS · 4 min read
Mapping the Colorado River from Bike Saddle Height
A GIS project that started as a curiosity about elevation change and turned into a month of afternoons with QGIS and too many CSV files.
The Colorado River in Texas drops about 2,400 feet from its headwaters near Lamesa to Matagorda Bay on the Gulf Coast — a fall of roughly 4.5 inches per mile on average, though that average hides a lot. It runs nearly flat through the Highland Lakes section (Buchanan, Travis, Austin, Inks, LBJ, Marble Falls), then drops steeply through the limestone Hill Country canyons before flattening again on the coastal plain.
I started mapping this because I ride roads that cross it repeatedly and I wanted to understand the terrain I was in. The project got bigger than expected.
The Starting Point: Elevation Profile
The USGS National Elevation Dataset is the starting point for anything like this. I downloaded the 1/3 arc-second DEM tiles for Central Texas (about 12 tiles covering the basin), stitched them in QGIS, and extracted an elevation profile along the river centerline.

The knickpoints — sudden steep drops in the profile — correspond exactly to what you’d see on a geology map: the Balcones Escarpment, the transition from the Edwards Plateau to the lower coastal terrain. The lakes smooth them out visually on the water surface but the underlying bedrock gradient is still there.
Road Crossing Inventory
I wanted to know which public road crossings were within a certain distance of access points. This turned into a proper GIS project: intersecting the river centerline with the Texas road network (TXDOT’s public shapefiles), filtering by road class, and joining with elevation data to calculate the river elevation at each crossing.
The result was a table of 340+ crossings with their county, road number, distance from the headwaters along the river, and elevation. Sorting by distance gave me a full picture of which crossings I’d been riding past without thinking about.
import geopandas as gpd
from shapely.ops import nearest_points
river = gpd.read_file("colorado_river_centerline.geojson")
roads = gpd.read_file("txdot_roads.shp")
# Find all road geometries that intersect the river within 50m
crossings = gpd.sjoin_nearest(
roads.to_crs(3857),
river.to_crs(3857),
how="inner",
max_distance=50,
)
crossings = crossings[crossings["FUNCCLASS"].isin(["FM", "STATE", "US", "COUNTY"])]
print(f"Found {len(crossings)} crossings")The Highland Lakes Section in Detail
The Highland Lakes chain is the most GIS-interesting part of the river. Six reservoirs in sequence, each with a dam, each with a slightly different water surface elevation. The dams were built between 1937 and 1951 — the elevation data from before the reservoir construction exists in old USGS survey records, and overlaying pre-dam and post-dam elevations shows exactly what was flooded.

The 620 bridge over Lake Travis sits at about 681 feet above sea level — the normal pool elevation for Lake Travis is 681 feet, so on a full-pool day the bridge deck is almost at the water surface level. In drought conditions the lake has dropped 40+ feet below that and the bridge towers over exposed limestone banks.
What the Data Showed
The distribution of road crossings is not uniform. The Highland Lakes section has dense crossing coverage — FM roads crossing every 5–10 miles. Below Austin to the coast, crossings become sparser as the valley widens and fewer roads cut across the floodplain.
The steepest per-mile descent is not in the Hill Country canyons but just below Longhorn Dam in Austin, where the river drops steeply through Town Lake and the lower Colorado before entering the lower gradient coastal section. The canyons above the Highland Lakes look dramatic on the ground but the gradient data shows them gentling out more than you’d expect from riding along them.
Tools Used
- QGIS 3.34 for spatial operations and visualization
- GeoPandas + Shapely in Python for the road crossing analysis
- USGS National Map for elevation data (1/3 arc-second NED)
- TXDOT public road shapefiles for the road network
- NOAA CO-OPS for historical water level data at Matagorda Bay
The whole project lives in a public GitHub repo if you want to replicate it or extend it to other Texas rivers. The DEM tiles are the biggest download (about 4GB total) — everything else is under 100MB.