Posted: Visualizing US expansion through post offices.

This visualization shows how formal US territorial control expanded in North America from 1700 to 1900, as seen through changes in the spatial distribution of post offices:

(HD and 1080p download here. It’s much prettier!)

A few months ago, I scraped post office location information from the USPS Postmaster Finder, and then extracted lat/long coordinates  by correlating placenames to the USGS GNIS. Recently I remembered I had this data sitting around. I’ve been experimenting with Processing a lot lately as a tool for geographic visualization, and decided this would be an interesting dataset to use as a first stab at animation/dynamic mapping. I used parts of zipdecode from Ben Fry’s excellent book Visualizing Data as a foundation for my code. After some frustrations, this visualization is the result.

Of course, there are a few caveats: the USPS admits that their post office data is a constant work in progress, so there are likely many offices that aren’t shown on this map. About 10% of the placenames in the USPS data failed to find any coordinate matches in the GNIS data, so those  don’t show up either. Finally, the USPS data includes closing dates for many offices, but these aren’t represented on the map, which might give a false sense of density in some areas.

Still, I think the results are pretty interesting. I’m no historian, but here are a few interesting patterns I’ve noticed aside from  general westward expansion:

  • 1776 – Several new post offices crop up along the east coast after the Revolution.
  • 1846 – Rash of openings in Texas after statehood and the end of the Mexican-American War.
  • 1848 – First offices established on the west coast, with lots of activity afterwards, likely due to gold rushes and CA statehood.
  • 1851 – New Mexico and Utah start to see some activity as they become territories. I especially like the lines extending from Santa Fe along the Rio Grande / El Camino Real.
  • 1860s – No activity in the South during the Civil War; also an interesting sweep across the Great Plains, with Oklahoma remaining conspicuously quiet.
  • 1870s – Distinct traces along railroads in Nebraska and Kansas.
  • 1890s – Oklahoma lights up due to several land rushes.

Anyone notice anything else interesting? Let me know.

Update: Very cool parallels to this visualization of newspapers in the U.S. 1690 to 2011, from Stanford’s Rural West Initiative!



  1. Lovely work – I don’t suppose you be open to sharing the data that you managed to pull together that powers this visualization. I know it would have been a lot of work, but oh the things that we could do with it 🙂

    • Thanks Damon. I don’t mind sharing the data; I’d be interested to see what anyone comes up with!

      Here’s the csv:

      The first 4 columns are derived data, while the others come directly from the USPS website. The 1500 or so post offices for which I couldn’t automatically find lat/long values are in there, too, in case anyone wants to do a bit more digging!

      • Thanks heaps Derek 🙂

      • Whoops – Guo Xu at has brought to my attention that some of the discontinuation dates in this data are wrong! I think this is largely due to Excel being a bit loose with it’s interpretation of dates. (Another reason that I’ve been avoiding Excel more and more lately.)

        While I kept an eye on inaccuracies in the opening data as they occurred, I wasn’t using the closing dates, so it looks like some errors slipped through. I’ll look into this and try to get the corrected data posted, but until then, careful what you do with the closing dates!…

  2. Derek,

    Great map!

    Looks like we’re playing with the same data. Seen and its maps?


    • Thanks, Steve!

      I had no idea about the recent closing announcements from the USPS. Some interesting patterns on those maps, though. Looks like maybe both very dense and very rural areas take the brunt of the closures? Or maybe more related to population change? Thanks for the heads up, I’ll have to read more about this.

  3. Great visualisation!

    Regarding those 10% of places that couldn’t be found in GNIS, you might be able to reduce that number by using a service like Yahoo! Placemaker:

    Are you considering releasing the Processing code at all?

    • Ah, good suggestion! I’ve seen Placemaker before, but I didn’t think about it for this application. I may have to try that out.

      I think it would be cool to post the code somewhere like eventually, although it would take a lot of cleaning up before I’m able to do so without embarassing myself! I’ll let you know if/when I get around to it.

  4. looks like the South did not get post offices until the 1830 with any real density by comparison the northeast and new west were heavily blanketed by that time. this has some interesting historical significance for southern efforts to prevent the spread of abolitionist material and for the understanding of the cultural divide in the country pre-Civil War. very interesting…i noticed it because i work in commercial real estate.

  5. Lovely AND interesting: great combination 🙂 Thanks for sharing! Is the line that follows the timeline at the bottom graphing total volume, growth, or growth rate?

  6. Dear Derek,

    Thanks so much for your work! I shared it today on the site I edit, The Art of the Rural. This visualization also powerfully illuminates how rural America was integrated and modernized across this time span. I also discuss your work in terms of the proposed closures of rural post offices–a move that will devastate rural communities:

    Thanks again, all the best,

  7. fredinand

    howdy i am a retired letter mail person 32 years in,……. a remarkable study. have you thought of railroad, pony-express, stage, highways, large-settlements/populations over x number?

  8. Remarkable graphics. I would like to see the same, with the list of proposed closed post offices reflected in the graphic….also available at

  9. Love the sparkline and the “birth” animation, how it highlights the appearance of new offices. Great job! Glad to see a similar project to our newspaper vis, too! I would love to do broadcast licenses, too but found the FCC’s license database to be hard to get my head around. Cheers!

  10. katie

    Hi Derek –
    This map is pretty incredible. I don’t normally leave comments on blogs, but I find your video pretty inspiring. I am a housing economist and can see so many applicable uses for the technology you are using. I have been trying for a couple weeks to come up with something similar, but have run into a roadblock. I know you are hesitant to release your code, but if you could give me some pointers that would be fantastic! Essentially, I can animate a map using a time series. However it appears to be only using the first and last period values to populate the map. Do you have any thoughts or places to look?


    • Thanks Katie.

      I’d like to clean up my code and release it in the near future. In general, though, the point animation itself isn’t too complex. I just used the Calendar class to hold the current date of the loop (curDate), incremented it (depending on my desired playback speed) by incrementDays number of days with each pass using the add() method, and then compared it with the dates for each office opening (places[i].date) using the compareTo() method.

      The core functionality in possibly-inaccurate pseudocode:

      int incrementDays = 1;
      Calendar curDate = Calendar.getInstance();
      for (int i = 0; i < placeCount; i++) {
       if ( places[i].date.compareTo(curDate) <= 0 ) {
      curDate.add(Calendar.DAY_OF_YEAR, incrementDays);

      I found this introduction to the Calendar class online. placeCount and the Place class come from zipdecode out of Ben Fry’s book, which also helped with parsing my csv file into an array. I also remember looking at this code on, although I don’t think I ended up borrowing from it, since I think it only progresses through points sequentially, not based on a temporal field in the data.

      Hopefully this explanation helped a bit, or at least didn’t add to the confusion! I’m still getting the hang of this stuff myself.

      Edit: The clincher is looping through the entire dataset each time, so that any points before curDate redraw with every loop. Maybe this has something to do with your first-last problem?

  11. Gino

    Gold rushes:
    1860 Colorado
    1875 South Dakota
    1896 Seatle (Start for the Klondike route)

  12. later
    Ik vind het hier fantastisch.

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: