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'])
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 [ ]: