Ejemplo n.º 1
0
def create_polygon(nyc_shapefile, region):

    from shapely.geometry import Polygon
    import fiona
    import pyproj
    import shapely.ops as ops
    from functools import partial
    from shapely.ops import cascaded_union
    from shapely.prepared import prep

    place = []
    boroughs = ['Queens', 'Manhattan', 'Brooklyn', 'Bronx', 'Staten Island']

    shapefile_obj = fiona.open(nyc_shapefile)

    for regions in range(len(shapefile_obj)):
        if shapefile_obj[regions]['properties']['neighborho'] == str(region):
            place = Polygon(
                shapefile_obj[regions]['geometry']['coordinates'][0])
        elif region in boroughs:
            if shapefile_obj[regions]['properties']['borough'] == str(region):
                place.append(
                    Polygon(
                        shapefile_obj[regions]['geometry']['coordinates'][0]))

    poly = cascaded_union(place)

    poly_transform = ops.transform(
        partial(
            pyproj.transform, pyproj.Proj(init='EPSG:4326'),
            pyproj.Proj(proj='aea', lat1=poly.bounds[1], lat2=poly.bounds[3])),
        poly)

    return prep(poly), poly_transform.area
Ejemplo n.º 2
0
def get_land_geometry(country_names=None, extent=None, resolution=10):
    """Get union of all the countries or the provided ones or the points inside
    the extent. If all the countries are selected, write shp file in SYSTEM
    folder which can be directly read in following computations.

    Parameters:
        country_names (list, optional): list with ISO3 names of countries, e.g
            ['ZWE', 'GBR', 'VNM', 'UZB']
        extent (tuple, optional): (min_lon, max_lon, min_lat, max_lat)
        resolution (float, optional): 10, 50 or 110. Resolution in m. Default:
            10m, i.e. 1:10.000.000

    Returns:
        shapely.geometry.multipolygon.MultiPolygon
    """
    resolution = nat_earth_resolution(resolution)
    shp_file = shapereader.natural_earth(resolution=resolution,
                                         category='cultural',
                                         name='admin_0_countries')
    reader = shapereader.Reader(shp_file)
    file_globe = os.path.join(SYSTEM_DIR, GLOBE_LAND + "_" + resolution +
                              ".shp")
    geom = Polygon()
    if (not os.path.isfile(file_globe)) and (country_names is None) and \
    (extent is None):
        LOGGER.info("Computing earth's land geometry ...")
        geom = [cntry_geom for cntry_geom in reader.geometries()]
        geom = shapely.ops.cascaded_union(geom)

        LOGGER.info('Writing file %s', file_globe)

        shapewriter = shapefile.Writer()
        shapewriter.field("global_country_borders")
        converted_shape = shapely_to_pyshp(geom)
        shapewriter._shapes.append(converted_shape)
        shapewriter.record(["empty record"])
        shapewriter.save(file_globe)

        LOGGER.info('Written file %s', file_globe)

    elif country_names:
        countries = list(reader.records())
        geom = [country.geometry for country in countries
                if (country.attributes['ISO_A3'] in country_names) or
                (country.attributes['WB_A3'] in country_names)]
        geom = shapely.ops.cascaded_union(geom)

    elif extent:
        extent_poly = Polygon([(extent[0], extent[2]), (extent[0], extent[3]),
                               (extent[1], extent[3]), (extent[1], extent[2])])
        geom = []
        for cntry_geom in reader.geometries():
            inter_poly = cntry_geom.intersection(extent_poly)
            if not inter_poly.is_empty:
                geom.append(inter_poly)
        geom = shapely.ops.cascaded_union(geom)
    else:
        geom = list(reader.geometries())
        geom = shapely.ops.cascaded_union(geom)

    return geom
Ejemplo n.º 3
0
with open(GEOJSON_FILE) as geojson_file:
    geojson = json.load(geojson_file)
    for country_json in geojson['features']:
        country = country_json['properties']['name']
        polygons = []
        if country_json['geometry']['type'] == 'Polygon':
            polygon = []
            for point in country_json['geometry']['coordinates'][0]:
                polygon.append((point[0], point[1]))
            polygon = Polygon(polygon)
            polygons.append(polygon)
        elif country_json['geometry']['type'] == 'MultiPolygon':
            for json_polygon in country_json['geometry']['coordinates']:
                polygon = []
                for point in json_polygon[0]:
                    polygon.append((point[0], point[1]))
                polygon = Polygon(polygon)
                polygons.append(polygon)
        else:
            raise ValueError('Unknown geometry type: %s' %
                             country_json['geometry']['type'])
        country_to_polygons[country] = polygons

# create a sorted list of countries
countries = list(sorted(country_to_polygons.keys()))

# since the grid of the OMI measurements is stable over time, we can pre-compute
# the assignment from countries to geographic regions
lats = np.arange(90., -90., -0.05)
lons = np.arange(-180., 180., 0.05)