Inspired by Tufts' gerrymandering school, I decided to take a stab at some of the math on my own. It turned out to be largely programming instead, but that ended up being interesting on its own.

hgis is a GIS tool written in haskell. It's meant to compute display congressional district information, including perimeters, areas, and maps. As it stands, it's a work in progress, but it can do one very important thing already, namely: measuring compactness.

hgis is a command-line tool so you'll need to have some familiarity to use it.

The installation instructions are available here.

The data we'll be using comes from this page. You'll want to download the shapefile and the geodatabase, and you should put them in the same directory. The past eight congresses are online, so you can look at the evolution of districts over time, which is of course useful if you're trying to prove gerrymandering.

On to the fun part: we can start by making maps just to ensure that everything we're doing is sensible. Type:

$ hgis map -o map.png tl_2016_us_cd115.shp

hgis currently can write .png and .svg files, and will detect which you want by filename extension. You're probably going to also want to set the projection; we'll go with the Winkel III projection:

$ hgis map -o map.png -p winkel3 tl_2016_us_cd115.shp

If you get stuck on something, type hgis --help or hgis map --help.

With any luck, at this point you'll have a map:

map of us congressional
districts

Since everything looks sane, we can proceed.

At the moment, hgis has three computations: perimeter, area, and (relative) compactness. You can try

hgis compute perimeter tl_2016_us_cd115.shp ("CongressionalDistrict(atLarge)",18094.74527952693) ("CongressionalDistrict(atLarge)",419.81594015021847) ("CongressionalDistrict(atLarge)",3152.631826127492) ("CongressionalDistrict(atLarge)",2109.8202335994906) ...

and it will print out perimeters in km, alongside a label for each district. Unfortunately, the USGS didn't label the state alongside the district number. Thus, if you want these data on the map:

hgis maplabel -p winkel3 --label perimeter -o labelled.png perimeter tl_2016_us_cd115.shp

will make a map with each district labeled with its perimeter.

There's also the

hgis map -p winkel3 -o all/ tl_2016_us_cd115.shp

command, which allows you to make a separate image from each district, e.g. to look at Maryland's third congressional district in detail.

map of Maryland's third congressional
district

As of yet that's all the command-line tool can do. I hope to work on it more if I have time, but in the meanwhile, if you're interested in doing more with GIS/gerrymandering or more with Haskell you can find the package on hackage here. The library so far is pretty good for hacking, so it shouldn't be too hard to edit for your needs.

For the interested, here is the gerrymandering school, and here is Maryland's third congressional district in its full glory.