Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
if countries:
kwargs.setdefault('zorder', 1.5)
return self.set_shapefile(shapefiles['world_borders'], **kwargs)
# Defaults
if not all(k in kwargs for k in ('facecolor', 'edgecolor')):
kwargs.setdefault('color', 'k')
# Reset?
if shape is None:
self._collections = []
return
# Transform
if isinstance(shape, pd.DataFrame):
shape = gis.transform_geopandas(shape, to_crs=self.grid)
else:
shape = sio.read_shapefile_to_grid(shape, grid=self.grid)
if len(shape) == 0:
return
# Different collection for each type
geomtype = shape.iloc[0].geometry.type
if 'Polygon' in geomtype:
patches = []
for g in shape.geometry:
if 'Multi' in g.type:
for gg in g:
patches.append(PolygonPatch(gg))
else:
patches.append(PolygonPatch(g))
kwargs.setdefault('facecolor', 'none')
"""Quick solution using joblib in order to not transform many times the
same shape (useful for maps).
Since grid is a complex object, joblib seems to have trouble with it.
So joblib is checking its cache according to the grid params while the job
is done with grid.
"""
shape = read_shapefile(shape_cpath, cached=True)
e = grid.extent_in_crs(crs=shape.crs)
p = np.nonzero(~((shape['min_x'].to_numpy() > e[1]) |
(shape['max_x'].to_numpy() < e[0]) |
(shape['min_y'].to_numpy() > e[3]) |
(shape['max_y'].to_numpy() < e[2])))
shape = shape.iloc[p]
shape = gis.transform_geopandas(shape, to_crs=grid, inplace=True)
return shape
# decorator below)
ogrid = self._ogrid
# Initial mask
if noerase and (self.roi is not None):
mask = self.roi
else:
mask = np.zeros((ogrid.ny, ogrid.nx), dtype=np.int16)
# Several cases
if shape is not None:
if isinstance(shape, pd.DataFrame):
gdf = shape
else:
gdf = sio.read_shapefile(shape)
gis.transform_geopandas(gdf, to_crs=ogrid.corner_grid,
inplace=True)
if rasterio is None:
raise ImportError('This feature needs rasterio')
from rasterio.features import rasterize
with rasterio.Env():
mask = rasterize(gdf.geometry, out=mask)
if geometry is not None:
geom = gis.transform_geometry(geometry, crs=crs,
to_crs=ogrid.corner_grid)
if rasterio is None:
raise ImportError('This feature needs rasterio')
from rasterio.features import rasterize
with rasterio.Env():
mask = rasterize(np.atleast_1d(geom), out=mask)
if grid is not None:
_tmp = np.ones((grid.ny, grid.nx), dtype=np.int16)
assert len(shp) == 1
area_km2 = shp.iloc[0].geometry.area * 1e-6
shp = salem.gis.transform_geopandas(shp)
shp = shp.iloc[0].geometry
sel = sel.iloc[[0]]
sel.loc[sel.index[0], 'geometry'] = shp
sel.loc[sel.index[0], 'Area'] = area_km2
elif row.name == 'Urumqi':
# ITMIX Urumqi is in fact two glaciers
shf = find_path(SEARCHD, '*_' + row.name + '*.shp')
shp2 = salem.read_shapefile(shf)
assert len(shp2) == 2
for k in [0, 1]:
shp = shp2.iloc[[k]].copy()
area_km2 = shp.iloc[0].geometry.area * 1e-6
shp = salem.gis.transform_geopandas(shp)
shp = shp.iloc[0].geometry
assert sel.loc[sel.index[k], 'geometry'].contains(shp.centroid)
sel.loc[sel.index[k], 'geometry'] = shp
sel.loc[sel.index[k], 'Area'] = area_km2
assert len(sel) == 2
elif len(rgi_parts) > 1:
# Ice-caps. Make divides
# First we gather all the parts:
sel = rgi_df.loc[rgi_df.RGIId.isin(rgi_parts)].copy()
# Make the multipolygon for the record
multi = shpg.MultiPolygon([g for g in sel.geometry])
# update the RGI attributes. We take a dummy rgi ID
new_area = np.sum(sel.Area)
found = False
for i in range(len(sel)):
tsel = sel.iloc[[i]].copy()
parts = list(geometry)
for p in parts:
assert p.type == 'LineString'
exterior = shpg.Polygon(parts[0])
# let's assume that all other polygons are in fact interiors
interiors = []
for p in parts[1:]:
assert exterior.contains(p)
interiors.append(p)
geometry = shpg.Polygon(parts[0], interiors)
assert 'Polygon' in geometry.type
shp.loc[shp.index[0], 'geometry'] = geometry
assert len(shp) == 1
area_km2 = shp.iloc[0].geometry.area * 1e-6
shp = salem.gis.transform_geopandas(shp)
shp = shp.iloc[0].geometry
sel = sel.iloc[[0]]
sel.loc[sel.index[0], 'geometry'] = shp
sel.loc[sel.index[0], 'Area'] = area_km2
elif row.name == 'Urumqi':
# ITMIX Urumqi is in fact two glaciers
shf = find_path(SEARCHD, '*_' + row.name + '*.shp')
shp2 = salem.read_shapefile(shf)
assert len(shp2) == 2
for k in [0, 1]:
shp = shp2.iloc[[k]].copy()
area_km2 = shp.iloc[0].geometry.area * 1e-6
shp = salem.gis.transform_geopandas(shp)
shp = shp.iloc[0].geometry
assert sel.loc[sel.index[k], 'geometry'].contains(shp.centroid)
sel.loc[sel.index[k], 'geometry'] = shp