In [10]:
from __future__ import absolute_import, division, print_function
from builtins import (
    ascii, bytes, chr, dict, filter, hex, input, int, map,
    next, oct, open, pow, range, round, str, super, zip)

import os
from itertools import cycle
from functools import partial
import random
from math import pi
import json

# Imports for working with shapefiles
import pyproj
from shapely.geometry import shape, MultiPolygon, mapping
from shapely.ops import transform
from descartes import PolygonPatch
import fiona
from fiona.crs import from_epsg

# matplotlib imports
import matplotlib.pyplot as plt
import matplotlib.pylab as plb
from matplotlib.colors import to_rgb
from matplotlib import cm
from matplotlib.patches import Polygon
%matplotlib inline

In [3]:
cong_shp_file = 'data/districts/congressional/Wisconsin_Congressional_Districts.shp'

In [ ]:
project = partial(
    pyproj.transform,
    pyproj.Proj(init='epsg:4326'), 
    pyproj.Proj(init='epsg:3695')
)

with fiona.open(cong_shp_file) as f:
    districts = [
        {
            'shape': transform(project, shape(polygon['geometry'])), 
            'id': polygon['properties']['District_N']
        }
        for polygon in f
    ]
    
    json_dists = [
        {
            'geometry': mapping(shape(polygon['geometry']).simplify(4e-3)), 
            'id': polygon['properties']['District_N']
        }
        for polygon in f
    ]
    
    crs = " ".join("+{}={}".format(key,value) for key, value in f.crs.items())

In [14]:
for district in districts:
    district['area'] = district['shape'].area/(1000)**2
    district['perimeter'] = district['shape'].length/1000
    district['cmpctness'] = (
        4*pi*district['area']/district['perimeter']**2)
    print(district['cmpctness'])

for district in json_dists:
    district['area'] = shape(district['geometry']).area/(1000)**2
    district['perimeter'] = shape(district['geometry']).length/1000
    district['cmpctness'] = (
        4*pi*district['area']/district['perimeter']**2)
    print(district['cmpctness'])


0.156130911456
0.10856558407
0.153552056163
0.309567822477
0.237939579218
0.431576716393
0.166935192093
0.126339970508
0.176858956277
0.140552605874
0.181139319181
0.346360754617
0.281844845802
0.435390723153
0.174712699061
0.169178181675

In [7]:
congressional_patches = [
    PolygonPatch(dis['shape'])
    for dis in districts
]

hex_colors = [
    '#e41a1c', '#377eb8', '#4daf4a', '#984ea3',
    '#ff7f00', '#ffff33', '#a65628', '#f781bf'
]
colors = [to_rgb(color) for color in hex_colors]
for patch, color in zip(congressional_patches, cycle(colors)):
    patch.set_facecolor(color)
    patch.set_alpha(0.85)
    patch.set_linewidth(1.5)

fig, ax = plt.subplots()

fig.patch.set_alpha(0.0)

for patch in congressional_patches:
    ax.add_patch(patch)
    
ax.relim()
ax.autoscale_view()
ax.axis('off')
ymin, ymax = ax.get_ylim()
xmin, xmax = ax.get_xlim()
aspect_ratio = (ymax - ymin)/(xmax - xmin)
x_size = 20
fig.set_size_inches((x_size, x_size*aspect_ratio))



In [8]:
fig.savefig('images/congressional_districts.png', bbox_inches='tight')

In [7]:
congressional_patches = [
    PolygonPatch(dis['shape'])
    for dis in districts
]

ref_aspect = 1.5
reference = 4*pi*(ref_aspect)/(2*(1+ref_aspect))**2
scale = cm.Reds_r
colors = [
    scale(dis['compactness']/reference)
    for dis in districts
]
for patch, color in zip(congressional_patches, cycle(colors)):
    patch.set_facecolor(color)
    patch.set_linewidth(1.5)

fig, ax = plt.subplots(figsize=(20,20))

for patch in congressional_patches:
    ax.add_patch(patch)
    
ax.relim()
ax.autoscale_view()
ax.axis('off')
ymin, ymax = ax.get_ylim()
xmin, xmax = ax.get_xlim()
aspect_ratio = (ymax - ymin)/(xmax - xmin)
x_size = 20
fig.set_size_inches((x_size, x_size*aspect_ratio))



In [8]:
fig.savefig('images/congressional_compactness.png', bbox_inches='tight')

In [15]:
my_layer = {
    "type": "FeatureCollection",
    "features": json_dists,
    "crs": {
        "type": "link", 
        "properties": {"href": "current_districts.crs", "type": "proj4"}
    }
}

with open("src/static/geojson/current_districts.json", "w") as f:
    f.write(unicode(json.dumps(my_layer)))
with open("src/static/geojson/current_districts.crs", "w") as f:
    f.write(unicode(crs))

In [ ]: