Land Area Vectors for Geographic Combatant Commands

Update: New versions of All GCCs and USCENTCOM available as of 20 Aug 2015, previous versions did not include Kyrgyzstan.

I have created GeoJSON files for the six Geographic Commands of the Unified Combatant Commands. Files available here:

How It's Made

I needed the land areas for the Geographic Combatant Commands (GCCs) for a work project, but the data was not openly available through the traditional means (Google, So I decided to make my own.

I started with the 10m resolution Admin 0 - Countries data provided as part of Natural Earth's Culutral Data Collection. I imported this layer (which comes as a Shapefile) into QGIS and began to segment the countries into these groups.

GCCs are complex regions that are segmented based on both geographic and cultural aspects of the region. Looking at USAFRICOM in particular, it includes pretty much the entire African continent, including six island nations, and exclusing Egypt, which is aligned with USCENTCOM because of cultural considerations. Similarly, Israel, which is at the very heart of USCENTCOM, is actually aligned with USEUCOM, again because of cultural reasons. I began by manually chunking out (i.e. saving to dedicated layers) the country polygons into their respective GCCs, referencing this map on Wikipedia as I went.

There was still a good bit of complexity in the Natural Earth data to deal with after chunking out the countries. First, some countries — namely France, England, and the United States — control territories in multiple GCCs, and the polygons associated with those nations, which include the territories, must be edited to remove the polygons that do not belong. Second, the Natural Earth data uses the Prime Meridian as its central longitude and splits the data at the International Date Line (IDL). To address these issues I used a combination of GDAL and QGIS to: (1) remove the incorrect polygons by spliting the multi-part polygons into singlepart features, removing them, and merging the single-part features back together using the ADMIN field; and (2) shift the features to the correct sides of the IDL using ogr2ogr clipping, SpatiaLite shifting, and merging (see this entry on GIS Stack Exchange).

Finally, I simplified the vector layers using the built-in QGIS tool (set to a tolerance of 0.1), and exported the layers as GeoJSON. So, while these aren't supremely accurate, they get the job done for small-scale maps (zoom level 0-8 for those familiar with Leaflet, OSM, or Google Maps).

Doing What I Should Have Done

One of the smarter pieces of advice I received in grad school was to write one blog post every week about a paper related to my research interests. Didn't need to be long, just needed to be a post about the core concept of the paper and how it relates to your interests.I should have acted on this advice long ago, but I didn't.

Luckily, tihngs change. Beginning today, every Monday morning around 10:00 Eastern I will be posting a brief writeup to my research blog about research that I'm interested in. Each post will contain the objective of the research, a summary of the paper, and my thoughts on how this research could be used or expanded.

This week I begin with a new paper by my advisor, Alan MacEachren, who is trying to create a framework for assessing the effectiveness of visual analtyics tools in supporting reasoning under uncertainty.

Delicious Things That May Kill You: Jalapeño Poppers

I learned this recipe from Liz Shaw (Sydney's mom) back in high school. They're delicious and I love them, but they're not exactly that healthy. Luckily they're expensive enough that I don;t make them too often.


  • Cost per batch: ~$20
  • Prep Time: 25 minutes
  • Cook Time: 30 minutes


  • 10-20 Jalapeños
  • 8oz Cream Cheese (the block, not the tub)
  • 8oz Cheddar or Colby Jack (Shredded)
    • Optional: 4oz Cheddar, 4oz Pepper Jack for spicy version
  • 2-3 oz Bacon Bits (even better, make your own, but don't ever use immitation)
  • Bread Crumbs (Plain or Italian)
  • Garlic Salt (to taste)
  • Cayenne Pepper (to taste)


  1. Allow the cream cheese to warm up on your counter until it's just barely squishy to the touch (around 50°F)
  2. Preheat your oven to 350°F
  3. Clean and halve the jalapeños, removing all seeds and ribs
    • Optional: You could save the seeds and be a terribly mean person later.
  4. In a large mixing bowl, combine cheeses, bacon bits, garlic salt, and cayenne pepper. Mix together with hands, wooden spoon, or some other stiff, rubberized utensil.
    • Optional: If you're into the hot stuff, this is where you add the jalapeno seeds to the filling.
  5. Pour bread crumbs onto a standard dinner plate
  6. Build your assembly line. Order goes from peppers to filling to bread crumbs to large cookie sheet.
  7. Stuff the peppers. Take a pepper half, fill it with cheesy goodness, press into the bread crumbs, array on large cookie sheet.
  8. Bake for 30 minutes at 350°F
  9. Let cool and enjoy
    • Optional: Have some left over cheesy goodness? Turn that into a cheese ball (make a ball, cover in breadc crumbs) or queso (30 second bursts in the mircowave) and break our the tortilla chips.

Hammer.js for Angular.js

We've been doing a lot at work recently with touch-based interaction on the desktop. Our front-end products are all web apps built on Angular.js, and use Hammer.js to register touch-event handlers. We also noticed that using a non-Angularized library in an Angular context is a complete shit show.

We looked around for a lirary to wrap Hammer up for us and found angular-hammer from Monospaced. It worked okay for a while, but didn't update when Hammer.js v2 came out, which is a big improvement and something we wanted to incorporate.

So, I forked the original and made a few changes. It uses the same principle, providing a bunch of directives that map the directive values to handlers, but extends it to support both Angular Expressions and regular old scope-accessible functions. I also added support to define custom gesture recognizers using a JSON string. Check it out on GitHub...

...or you can install it using Bower.

$ bower install ryanmullins-angular-hammer