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
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
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)