The problem. RTS runs 971 stops across Gainesville. On a typical weekday its buses make 39,703 visits to those stops, 44 percent of them between 11 am and 5 pm, the hottest part of the day. About half of those visits (49 percent) are at stops that OpenStreetMap lists as having no shelter, and another 28 percent are at stops where shelter status is unknown. Only 23 percent are at stops listed as sheltered.
What we built. ShadeMap ranks every RTS stop by how much a shelter or shade structure would matter there, and puts the answer in an interactive map anyone can open on a phone. Each stop gets a score from four things: how hot its surroundings are (NASA Landsat 8 and 9 land surface temperature, a per-pixel median of 37 cloud-masked summer 2026 scenes), how many buses stop there (RTS GTFS schedule), whether it has a shelter (OpenStreetMap), and how many nearby households have no car (US Census ACS). The formula is one sentence: a stop ranks higher when it is hotter than most stops, gets more bus visits, has no known shelter, and sits in a tract with more car-free households. We did not tune the weights to make the list look better.
Who it helps. The map is built for residents, riders and city staff. Every stop panel links to a prefilled report if our shelter information is wrong, and stops with no sheltered stop within a five minute walk on their route show how to ask for one through the City of Gainesville request portal (myGNV) and the RTS customer service line. A Shade planner lets staff pick how many stops could get a shelter and see the weekday bus visits that reaches, on a map and as a downloadable list. It is a what-if tool. It does not estimate cost or say what the city will do. Riders can also send a photo of a stop, which is reviewed by a person before it appears on the map. The two top 10 lists together carry 6 percent of weekday bus visits.
Two lists, on purpose. The main ranking multiplies by bus visits, so busy campus stops lead. A second list, "needs shade most," ignores bus volume so quiet stops in hot, car-free or senior neighborhoods still count. Only 4 stops appear on both top 20 lists, and the map shows the second list as black dots. Because campus stops dominate a citywide ranking, the map shows two top 10 lists instead: stops within a mile of the UF campus and stops beyond that mile. Stops far from campus carry 36 percent of weekday bus visits, and their top 10 (Oaks Mall and apartment stops on routes 75, 52 and 15 in northwest Gainesville) ranks 51st to 76th citywide, so a single top 20 would never have shown them.
How we checked it. We recomputed every stop's score with separately written code and got identical results (no rank changed). Census numbers are estimates, and the campus tract with the most top-20 stops has only 164 households, so we redrew each tract's value within its margin of error 1,000 times. The top 10 stops stay in the top 20 at least 90 percent of the time, and ranks 15 to 20 are close calls. We also checked NASA ECOSTRESS afternoon data: on the clearest afternoon (August 14, 2026, 2:52 PM) the median surface was 44.3 C, against 33.2 C for our morning Landsat composite, so the ranking understates afternoon heat. We use it only to say so.
Limitations, plainly. OpenStreetMap shelter coverage is partial (106 stops sheltered, 495 none, 370 unknown), so "none" means OpenStreetMap says none, not that we confirmed it. Bus visits are a stand-in for how many people wait, not a rider count. The schedule is RTS's Spring 2026 feed, using one representative Wednesday. 42 stops have no temperature data because of a known gap in the Landsat surface temperature product, and they are shown as "no data," not scored as cool. Census data is tract level. Shade itself is not measured. The list describes where the data says heat exposure is highest and does not recommend what any agency should build.
Built With
- esa-sentinel-2
- geopandas
- github
- leaflet.js
- micorsoft-planetary-computer
- nasa-ecostress
- nasa/ugs-landsat-8-and-9
- overpass-openstreetmap
- pandas
- python
- rts-gtfs
- supabase
- us-census-acs
Log in or sign up for Devpost to join the conversation.