Still having trouble with Fiona. So, I'm trying another package for reading shapefiles: pyshp.
Pyshp installs through pip without issue (as long as I do it as an admin). Hooray!
pyshp comes with the shapefile library, which reads a shapefile into a structure of lists and dictionaries.
What should I read? The NC Board of Elections has a shapefile that has all of the voting districts available on their FTP site.
And after downloading, we can read it like so:
import shapefile
vote = shapefile.Reader('ncsbe\\Precincts.shp') #creates an instance that has the lists of data we want.
shapes = vote.shapes() #lists of coordinates making up the shape for each voting district.
To figure out the center of the shapefile, I hope this isn't too simple:
What I should do is get the min/max for both the x and y, then average that. I'll put it all in a list.
coords = list()
for x in range(0,len(shapes)):
xmin = 10000000
xmax = -10000000
ymin = 10000000
ymax = -10000000
for y in range(0,len(shapes[x].points)):
xmin = min(xmin, shapes[x].points[y][0])
xmax = max(xmax, shapes[x].points[y][0])
ymin = min(ymin, shapes[x].points[y][1])
ymax = max(ymax, shapes[x].points[y][1])
coords.append([xmin, xmax,(xmin + xmax)/2, ymin,ymax, (ymin + ymax)/2])
If I want the metadata for each shape through the records method, this is how to do that.
recs = vote.records()
For now, I just care about the shapes and their distance relative to one another.