A researcher emailed with a simple question about two of my numbers. Answering it took me back into my own project, where I found that most of my map was in the wrong place and most of the real rescues were missing. This is the story of fixing it, adding two more cities, and finding out that every mountain town has its own rescue season.

The project at a glance

What it is
A map and dashboard of every mountain, technical and water rescue call that three fire departments publish, counted by year, month, hour and trailhead.
Where
Phoenix (2019–2025), Scottsdale (Dec 2022 to now) and Boulder (2015 to now), plus every national park (2013–2021).
How much
2,428 mountain and technical rescues on the city maps, about 1,900 flood and water calls, and 20,058 national park search-and-rescue incidents.
How it runs
GitHub Actions rebuild the cities and the heat analysis every Monday and refresh the national parks data every month.
Go look
brooksgroves.com/ridgeline · code and data on GitHub

The email

Ridgeline started as a Phoenix project. Phoenix is built right up against its mountains: Camelback, Piestewa Peak and South Mountain are all inside city limits, and the trailheads are basically neighborhood parking lots. The fire department publishes every call it gets, so I pulled seven years of them, picked out the rescues, and mapped them.

The page had a nice headline. The biggest category of calls at the wildland edge wasn't mountain rescue at all. It was behavioral-health crisis calls, 1,120 of them, clustered along the preserve edges. It was surprising and a little sad, and it made a good story.

Then a researcher studying Phoenix's trail heat closures wrote to me. She'd noticed that the raw data has 1,619 mountain rescues, but my site showed only 480. What filter explained the difference?

I didn't have a good answer, which is a bad feeling when someone is about to build their research on your numbers. So I went and looked.

Bug one: the roads named after mountains

When a call's address couldn't be matched, my code had a fallback. If the address mentioned a preserve, like "Camelback" or "McDowell," it pinned the call to that preserve. That sounds reasonable until you remember what Phoenix names its roads after.

Camelback Road runs across the whole city. So does McDowell Road. South Mountain Avenue runs along the bottom of town. Every call on those streets matched a preserve name. A crisis call at an apartment on McDowell Road in central Phoenix got drawn in the McDowell Sonoran Preserve, 20 miles northeast.

When I counted, about 1,560 of my 2,263 map points were sitting on just four spots, the representative points I'd picked for four preserves. The crisis-care cluster "along the preserve edges" wasn't a pattern in the world. It was a pattern in my code. The wildland-fire cluster came from the same bug.

The fix is to match places, not words. "Echo Canyon," "Piestewa Peak" and "McDowell Sonoran" mean the preserve. "McDowell Rd" means a road. The fallback also runs only after the real geocoder has had its chance.

Bug two: the addresses nobody could read

That explained the bad points. It didn't explain the missing ones. Why did only 480 of 1,619 rescues make the map?

Phoenix blurs its published addresses for privacy. You get 49XX E MCDONALD DR, not a house number, and intersections come through as N 7TH ST/E DUNLAP AV. The county geocoder had no idea what to do with "49XX" or a slash, so it quietly gave up on most of them. Nothing crashed and no error showed up in the logs. The rescues just weren't there.

The fixes, in order:

Then, a day later, I found a nastier variant. A Scottsdale call at East Indian School Road had been matched, with a high score, to West Indian School Road, 15 miles away. Same street name, opposite side of the valley. So now a match on the right street with the wrong direction is thrown out, however confident the geocoder is. Seven of about 1,300 matches failed that check.

The result: mapped Phoenix mountain rescues went from 474 to 1,197 of 1,619. A second geocoder later took that to 1,489, or 92% (more on that below). The crisis cluster collapsed from 1,120 to 5, and those five are at real preserve addresses. Every dot now records how precise it is, and you can click any dot to see.

What the fixed data says

Once the map was honest, it told a better story than the one I'd had.

It's mostly one trailhead. Echo Canyon on Camelback, 49XX E MCDONALD DR in dispatch-speak, accounts for 310 of Phoenix's 1,489 located mountain rescues. That's about one in five. Add Piestewa Peak, the Cholla trailhead and Pima Canyon on South Mountain, and you have most of the city.

Rescues are down about a fifth. Counting every call, mapped or not, there were 255 in 2019 and about 203 a year from 2023 to 2025. Over the same stretch, Phoenix began closing its busiest trails on extreme-heat days. That's exactly the question the researcher is studying, so I went and tested it. More on that below.

There's no summer peak. I expected July. Instead Phoenix mountain rescues run about 90 to 120 a month for eleven months of the year, and March and May are busier than midsummer. Only December is really quiet. Calls peak between 10 a.m. and noon.

Two more cities (and one I couldn't get)

I wanted comparisons. Santa Barbara was first on the list, but neither the city nor the county publishes incident-level fire calls. San Diego does, but its "RESCUE" category comes with nothing better than a ZIP code, which is too coarse to map.

Two cities worked beautifully:

Put them side by side and each city has its own calendar:

CityRescues / yrBusiestQuietestWeekend
Phoenix~213MarchDecember41.2%
Scottsdale~109FebruaryJune41.3%
Boulder~48JulyJanuary41.5%

Boulder is the classic mountain town: busy in summer, quiet in winter. Four in ten of its technical rescues start at one place, Chautauqua Park, the front door to the Flatirons. Scottsdale is the mirror image. Winter and spring are rescue season, and in summer it goes almost silent, because the smart hikers stay home. Phoenix sits in between and barely has a season at all.

One thing held in all three. About 40% of rescues happen on Saturday or Sunday, which make up 29% of the week.

The site lets you add flood and water calls to the map and charts. Do it for Phoenix and the busiest month flips from March to July, the monsoon. The hour-of-day chart changes too: rescues are a daytime problem, but flood calls come in around the clock.

Update: did the heat closures work?

Since July 2021 Phoenix has closed the Echo Canyon and Cholla trails on Camelback, and the Piestewa Peak trails, on the Weather Service's heat days. The rules kept changing: a pilot from 11 a.m. to 5 p.m. triggered by a heat watch, then warnings, then year-round from 9 a.m. in late 2023, then 8 a.m. and South Mountain in 2024. So I pulled every heat warning and watch for Central Phoenix since 2018 and the daily high at Sky Harbor for every day, lined them up with all 1,619 mountain-rescue calls, and scored each day under the rules in force that day. Counting every day a warning touched, I get 20, 18, 42 and 45 days for 2021 through 2024, exactly what the city's own program review says.

That timeline came from the same researcher who started all this. My first version assumed one rule, 9 a.m. to 5 p.m. since May 2021. She sent the real history, and I checked it against news coverage from the time. It changed the answer, which is the point of asking.

Before I got an answer, the data caught me again. Calls at the Cholla trailhead, 62XX E CHOLLA LN, dropped from 36 in 2019 to zero, just as a new address, 51XX N INVERGORDON RD, showed up and climbed to 23 a year. The two are the same trailhead: after the trail reopened in 2022, dispatch started logging it at the corner of Cholla Lane and Invergordon Road. Those 59 rescues had been missing from the map, and my first pass counted them as "other trails," which made the closed trails' decline look far bigger than it is. That same blind spot is why my earlier "down about a third" is now "down about a fifth."

With that fixed, here's what the data says:

Then I counted the hikers. Phoenix publishes daily numbers from infrared trail counters, and two of them sit right on the closure trails: Echo Canyon and the Piestewa summit trail. Dividing rescues by counter passes changed two of my conclusions.

And what about COVID? We all remember staying in, so it's the obvious suspect. It turns out Phoenix did the opposite: the city's trail counters ran about 19% busier in 2020 and 12% in 2021 than in 2019, then fell back below 2019 by 2022. The decline I'm measuring runs from 2019, before the pandemic, to 2023–25, after it, so COVID can't be what brought it down. It did leave fingerprints, though. Echo Canyon's counter reads zero in June and July 2020, so that trail was effectively shut for the summer, which is most of why 2020 looks so quiet. Leaving 2020 out of the closure comparison makes the effect slightly stronger, not weaker.

The honest summary: the closures seem to do what they're meant to on the days they're in force, but the bigger story is that hiking these mountains got safer, in winter as much as summer, and nobody has explained that yet. The heat section on the site has the timeline, the per-hiker tables, the charts and the 17 rescues that happened on closed trails during closed hours anyway.

Update: the national parks

I grew up in Groveland, on the road into Yosemite, so once the city maps worked, the obvious next question was the parks. The National Park Service has released lists of every search-and-rescue incident its rangers logged from 2013 to August 2021: 20,058 of them, across 190 parks.

There's a catch. Each record gives the park, the date and the kind of incident, but not where in the park it happened. So there are no dots on Half Dome. Instead the site draws every park's boundary on one national map, puts a circle on each park sized by its rescue count, and gives each park its own calendar. Click a park and it lights up, zoom in and the outline sharpens.

The data needed the same kind of checking as the cities. The file labelled 2019–2020 actually runs into August 2021. 420 rows have no date at all. And the early years are thin: Yosemite logged 9 incidents in 2013 and 372 in 2016. That isn't a sudden rush of reckless hikers. It's the reporting system coming into use. So every comparison uses the five complete years, 2016 to 2020.

What those years show:

A monthly GitHub Action now re-checks the Park Service's reading room, so if it posts a newer list, the map picks it up on its own.

What I learned

  1. The best bug report is a question from someone who needs the answer. My numbers had been public for months. It took one person asking "why don't these two match?" to make me look.
  2. A surprising headline deserves the hardest look. The crisis-call story was the most interesting thing on the page. It was also the thing the bug created. Interesting and wrong often go together.
  3. Silent failures are the worst kind. The geocoder never errored. It just returned nothing, and nothing looks exactly like "no data here." Now every run publishes a match report: how many were found, how, and which addresses weren't.
  4. Check where your points pile up. One quick count of how many calls share the exact same coordinates would have caught bug one on day one. Hundreds of calls on one spot is either a very famous trailhead or a mistake. Here it was both: Echo Canyon is real, and the McDowell pile wasn't.
  5. Say how precise every dot is. A dot on a map looks equally certain whether it came from a house number, a blurred block or a guess at a park. Now each one says which it is.
  6. Read the file, not the file name. A list labelled 2019–2020 ran into 2021, and a thin first few years was a reporting system warming up, not safer trails. The first thing to check in any dataset is what it actually covers.
  7. Trends need the whole count. A trend built from only the calls I could map moved whenever my mapping did. Counting every call, mapped or not, is the only fair baseline.
  8. Leave the correction up. The old numbers are gone from the charts, but the site and README both say what was wrong and how it was fixed. Anyone who saw the old version deserves to know why it changed.

What's next

The personal bit

I've hiked Camelback. Everybody who visits Phoenix does, usually by Echo Canyon, usually in the middle of the day, usually with less water than they should have. I never once thought about the fact that the parking lot I started from was the single busiest mountain-rescue address in a city of 1.6 million people.

That's what I like about this kind of project. The data is just dispatch logs: a time, a code, a blurred address. Get the addresses right and they turn into something you recognize: a trailhead, a season, a Saturday morning when somebody's day went wrong. Get them wrong and you tell a confident story about the wrong thing. I did both this month, and the second version is better.


🌲 The data belongs to the Cities of Phoenix (CC BY), Scottsdale and Boulder (CC0). Geocoding by Maricopa County GIS. The code, the geocode cache and every match report are on GitHub. The README covers the method, the limitations and the full correction.


Go deeper

🎧 Listen & watch

The Helpers: Life, Death, and Safety in Our Parks — A Sense of Place: Stories of Stewardship from the National Park Service, 19 November 2019, about 14 min. Rangers Butch Farabee (over a thousand rescues, many in Yosemite) and JD Swed on building the parks’ search-and-rescue program.

📄 Read

Heggie, T.W. & Amundson, M.E. (2009). Dead men walking: search and rescue in US National Parks. Wilderness & Environmental Medicine 20(3), 244–249.

Heggie, T.W. & Heggie, T.M. (2009). Search and rescue trends associated with recreational travel in US national parks. Journal of Travel Medicine 16(1), 23–27.

Zandbergen, P.A. (2008). A comparison of address point, parcel and street geocoding techniques. Computers, Environment and Urban Systems 32(3), 214–232.

Kounadi, O. & Leitner, M. (2014). Why does geoprivacy matter? The scientific publication of confidential data presented on maps. Journal of Empirical Research on Human Research Ethics 9(4), 34–45.

📊 Data & agencies

City of Phoenix Open Data — fire calls and trail counters. · Open Data Scottsdale — home of the MTNRES calls. · City of Boulder Open Data — public-domain fire-rescue points since 2015.

NPS FOIA reading room — the search-and-rescue incident lists behind the parks map. · NWS Phoenix — the heat warnings that trigger the closures. · Census Geocoder — the second geocoder that found the stragglers.

Ridgeline — the live map and heat analysis. · bdgroves/ridgeline — code, geocode cache and match reports.