DynaSlum/satsense

View on GitHub
satsense/util/shapefile.py

Summary

Maintainability
A
50 mins
Test Coverage
# -*- coding: utf-8 -*-
"""Methods for loading and visualizion of shapefiles.

Created on Wed May 17 10:26:10 2017

@author: elena
"""

import fiona
from descartes.patch import PolygonPatch
from shapely.geometry import MultiPolygon, mapping, shape


# visualization
def plot_coords(ax, ob):
    x, y = ob.xy
    ax.plot(x, y, 'o', color='#999999', zorder=1)


def show_multipolygon(multipolygon, axis, show_coords, extent, color, alpha,
                      title):
    """Visualize multipolygon in plot."""
    for polygon in multipolygon:
        if show_coords:
            plot_coords(axis, polygon.exterior)
        patch = PolygonPatch(
            polygon, facecolor=color, edgecolor=color, alpha=alpha, zorder=2)
        axis.add_patch(patch)

    xmin, ymin, xmax, ymax = extent
    xrange = [xmin, xmax]
    yrange = [ymin, ymax]
    axis.set_xlim(*xrange)
    # axis.set_xticks(range(*xrange))
    axis.set_ylim(*yrange)
    # axis.set_yticks(range(*yrange))
    axis.set_aspect(1)

    axis.set_title(title)

    return axis


def load_shapefile2multipolygon(filename):
    """Load a shapefile as a MultiPolygon."""
    with fiona.open(filename) as file:
        multipolygon = MultiPolygon(shape(p['geometry']) for p in file)
        bounds = file.bounds

    return multipolygon, bounds


def save_multipolygon2shapefile(multipolygon, shapefilename):
    """Save a MultiPolygon to a shapefile."""
    # define the schema
    schema = {
        'geometry': 'Polygon',
        'properties': {
            'id': 'int'
        },
    }

    # write to a shapefile
    with fiona.open(shapefilename, 'w', 'ESRI Shapefile', schema) as file:
        for i, poly in enumerate(multipolygon, start=1):
            file.write({
                'geometry': mapping(poly),
                'properties': {
                    'id': i
                },
            })