Source code for ideuy.vector

import json
import logging
import os
import tempfile
from functools import partial

import fiona
import pkg_resources
import pyproj
from shapely.geometry import box, mapping, shape
from shapely.ops import transform, unary_union

from ideuy.download import download_grid

_logger = logging.getLogger(__name__)

DATA_DIR = pkg_resources.resource_filename('ideuy', 'data')
URBAN_GRID_PATH = os.path.join(DATA_DIR, 'urban_grid.geojson')
NATIONAL_GRID_PATH = os.path.join(DATA_DIR, 'national_grid.geojson')

GRIDS_BY_TYPE = {'urban': URBAN_GRID_PATH, 'national': NATIONAL_GRID_PATH}


[docs]def get_vector_bounds_and_crs(vector): with fiona.open(vector) as src: return box(*src.bounds), src.crs['init']
[docs]def reproject_shape(shp, from_crs, to_crs): project = partial(pyproj.transform, pyproj.Proj(from_crs), pyproj.Proj(to_crs)) return transform(project, shp)
[docs]def flip(x, y): """Flips the x and y coordinate values""" return y, x
[docs]def filter_by_aoi(aoi_vector, *, output, type_id, grid_vector): """ Filter a grid vector using polygons from the AOI vector, and create a filtered grid GeoJSON as output. """ if not grid_vector: grid_vector = GRIDS_BY_TYPE[type_id] # Open aoi_vector, union all polygons into a single AOI polygon with fiona.open(aoi_vector) as src: aoi_polys = [shape(f['geometry']) for f in src] aoi_polys = [shp for shp in aoi_polys if shp.is_valid] aoi_crs = src.crs # Union over all AOI shapes to form a single AOI multipolygon, # in case there are many. aoi_poly = unary_union(aoi_polys) # For each feature in grid vector, filter those polygons that # intersect with AOI with fiona.open(grid_vector) as src: if aoi_crs != src.crs: raise RuntimeError("AOI vector has different CRS than grid. " "Please make sure it is EPSG:5381.") with fiona.open(output, 'w', driver='GeoJSON', crs=src.crs, schema=src.schema) as dst: for feat in src: shp = shape(feat['geometry']) if shp.intersects(aoi_poly): dst.write(feat)