I Mapped Every Road I've Been On in Seattle
After living in Seattle for more than a couple of years, I ended up going to the Arboretum on a random Thursday. I had driven by it several dozen times, seen it on maps, and probably mentioned it in conversations, but I had not really been there. When I finally went, it made me wonder: how much of Seattle had I actually seen?
Not whether I had done the standard Seattle things, or how many restaurants I had tried. I mean more literally: which streets had I actually been on? Cities can trick you this way because you know your grocery store, the fastest way home, and the annoying intersection to avoid, but your life in a city is not evenly distributed.
I am, unfortunately, a sucker for nostalgia. So despite the obvious privacy horror of it all, I have Google Location History turned on. It is invasive and occasionally unsettling, but it is also a strangely vivid way to revisit the past and the Timeline data is perfectly suited to reconstruct my exploration of Seattle over time.
The result is heavily biased toward places I drove, because that is when GPS was most consistently active.
As you scroll below, the city slowly fills in as part map and part personal diary.
Scroll to begin ↓
How I made this
Google Timeline logs your location pretty frequently and for me that's something like 1.8 million GPS pings across several years.
Plotting them raw is unreadable; what you want is each ping snapped to an actual road. So I pulled the road network of every drivable street from OpenStreetMap (~80,000+ edges), and Washington's highways for the state view (~20,000+ edges). I mapped each GPS ping to its nearest road to get the edges I directly drove on (40%[1]The rest is dominated by tiny edges of tertiary roads of the map).
The interesting trick is filling in the gaps. GPS sampling is irregular: sometimes my phone drops a ping every minute, sometimes every fifteen. On a long highway drive, that can leave miles of dark road between two lit points even though I obviously drove it. So for every pair of consecutive pings, I lit up the shortest route between consecutive if they happened within a few minutes of each other.
For the animation, I tag every visited edge with the date I first drove it, sort the whole thing chronologically, and chop it into equal-count buckets rather than equal slices of time. The scrubber walks through "the next slice of map that lit up" rather than equal slices of time or else the whole thing would be dominated by my commute to work.