def project_year(model, model_dir, what, scenario, year): print("projecting %s for %d using %s" % (what, year, scenario)) models = select_models(model, model_dir) # Read Sam's abundance model (forested and non-forested) modf = modelr.load(models[0]) intercept_f = modf.intercept predicts.predictify(modf) modn = modelr.load(models[1]) intercept_n = modn.intercept predicts.predictify(modn) # Open forested/non-forested mask layer fstnf = rasterio.open(utils.luh2_static('fstnf')) # Import standard PREDICTS rasters rastersf = predicts.rasterset('luh2', scenario, year, 'f') rsf = RasterSet(rastersf, mask=fstnf, maskval=0.0) rastersn = predicts.rasterset('luh2', scenario, year, 'n') rsn = RasterSet(rastersn, mask=fstnf, maskval=1.0) #rsn = RasterSet(rastersn) if what == 'bii': vname = 'bii' rsf[vname] = SimpleExpr( vname, 'exp(%s) / exp(%f)' % (modf.output, intercept_f)) rsn[vname] = SimpleExpr( vname, 'exp(%s) / exp(%f)' % (modn.output, intercept_n)) rsf[modf.output] = modf rsn[modn.output] = modn else: vname = modf.output assert modf.output == modn.output rsf[vname] = modf rsn[vname] = modn if what not in rsf: print('%s not in rasterset' % what) print(', '.join(sorted(rsf.keys()))) sys.exit(1) stime = time.time() datan, meta = rsn.eval(what, quiet=False) dataf, _ = rsf.eval(what, quiet=True) data_vals = dataf.filled(0) + datan.filled(0) data = data_vals.view(ma.MaskedArray) data.mask = np.logical_and(dataf.mask, datan.mask) #data = datan etime = time.time() print("executed in %6.2fs" % (etime - stime)) oname = '%s/luh2/%s-%s-%d.tif' % (utils.outdir(), scenario, what, year) with rasterio.open(oname, 'w', **meta) as dst: dst.write(data.filled(meta['nodata']), indexes=1) if None: fig = plt.figure(figsize=(8, 6)) ax = plt.gca() show(data, cmap='viridis', ax=ax) plt.savefig('luh2-%s-%d.png' % (scenario, year)) return
def project(year): print("projecting %d" % year) # Open the mask shape file shp_file = 'c:/data/from-adriana/tropicalforests.shp' shapes = fiona.open(shp_file) # Read Adriana's abundance model (mainland) mod = modelr.load('../tropical-bii/simplifiedAbundanceModel.rds') predicts.predictify(mod) # Import standard PREDICTS rasters rasters = predicts.rasterset('1km', '', year, 'medium') rasters['primary_lightintense'] = SimpleExpr( 'primary_lightintense', 'primary_light + primary_intense') rasters['cropland_lightintense'] = SimpleExpr( 'cropland_lightintense', 'cropland_light + cropland_intense') rasters['pasture_lightintense'] = SimpleExpr( 'pasture_lightintense', 'pasture_light + pasture_intense') rasters['rd_dist'] = Raster('rd_dist', '/out/1km/roads-adrid.tif') rasters['hpd'] = Raster( 'hpd', '/vsizip//data/from-adriana/HPD01to12.zip/yr%d/hdr.adf' % year) rs = RasterSet(rasters, shapes=shapes, crop=True, all_touched=True) what = 'LogAbund' rs[what] = mod stime = time.time() rs.write(what, utils.outfn('1km', 'adrid-%d.tif' % year)) etime = time.time() print("executed in %6.2fs" % (etime - stime))
def project_year(model, model_dir, what, scenario, year): print("projecting %s for %d using %s" % (what, year, scenario)) models = select_models(model, model_dir) # Read Sam's abundance model (forested and non-forested) mod = modelr.load(models[0]) predicts.predictify(mod) # Import standard PREDICTS rasters by_age = 'young_secondary' in mod.syms print('by_age: %s' % str(by_age)) rasters = predicts.rasterset('luh5', scenario, year, by_age) rs = RasterSet(rasters) if what == 'bii': vname = 'bii' rs[vname] = SimpleExpr(vname, '%s / %f' % (mod.output, intercept)) else: vname = mod.output rs[vname] = mod if what not in rs: print('%s not in rasterset' % what) print(', '.join(sorted(rs.keys()))) sys.exit(1) stime = time.time() data, meta = rs.eval(what, quiet=False) etime = time.time() print("executed in %6.2fs" % (etime - stime)) oname = os.path.join(os.environ['OUTDIR'], 'luh5/%s-%s-%d.tif' % (scenario, what, year)) #hpd, _ = rs.eval('hpd', quiet=False) #hpd_max, meta2 = rs.eval('hpd_max', quiet=False) with rasterio.open(oname, 'w', **meta) as dst: #bb = dst.bounds #ul = map(int, ~meta2['affine'] * (bb[0], bb[3])) #lr = map(int, ~meta2['affine'] * (bb[2], bb[1])) #cap = ma.where(hpd > hpd_max[ul[1]:lr[1], ul[0]:lr[0]], True, False) #show(hpd, norm=colors.PowerNorm(gamma=0.2)) #show(cap * 1) #data.mask = np.logical_or(data.mask, cap) dst.write(data.filled(meta['nodata']), indexes=1) if None: fig = plt.figure(figsize=(8, 6)) ax = plt.gca() show(data, cmap='viridis', ax=ax) plt.savefig('luh2-%s-%d.png' % (scenario, year)) return
def project_year(model, model_dir, scenario, year): """Run a projection for a single year. Can be called in parallel when projecting a range of years. """ print("projecting %s for %d using %s" % (model, year, scenario)) # Import standard PREDICTS rasters rasters = predicts.rasterset('luh2', scenario, year) rs = RasterSet(rasters) what, model = select_model(model, model_dir) # Read Sam's models if model: mod = modelr.load(model) predicts.predictify(mod) rs[mod.output] = mod if what in ('CompSimAb', 'CompSimSR', 'Abundance', 'Richness'): if what in ('CompSimAb', 'CompSimSR'): expr = '(inv_logit(%s) - 0.01) / (inv_logit(%f) - 0.01)' else: expr = '(exp(%s) / exp(%f))' rs[what] = SimpleExpr(what, expr % (mod.output, mod.intercept)) if what not in rs: print('%s not in rasterset' % what) print(', '.join(sorted(rs.keys()))) sys.exit(1) stime = time.time() data, meta = rs.eval(what, quiet=True) etime = time.time() print("executed in %6.2fs" % (etime - stime)) oname = '%s/luh2/%s-%s-%04d.tif' % (utils.outdir(), scenario, what, year) with rasterio.open(oname, 'w', **meta) as dst: dst.write(data.filled(meta['nodata']), indexes=1) if None: fig = plt.figure(figsize=(8, 6)) show(data, cmap='viridis', ax=plt.gca()) fig.savefig('luh2-%s-%d.png' % (scenario, year)) return
years = range(1970, 2015) hpdtrend = 'wpp' else: years = range(2015, 2101) hpdtrend = 'medium' for year in years: rasters = predicts.rasterset('luh2', scenario, year, hpd_trend=hpdtrend) # set soil properties to 0 rasters['BD'] = SimpleExpr('BD', 0) rasters['CLAY'] = SimpleExpr('CLAY', 0) rasters['OC'] = SimpleExpr('OC', 0) rasters['phkcl'] = SimpleExpr('phkcl', 0) #note that rasters.keys() shows you all the names of the rasters in this object rasters['secondary_vegetation_minimal'] = SimpleExpr( 'secondary_vegetation_minimal', 'young_secondary_minimal + intermediate_secondary_minimal + mature_secondary_minimal' ) rasters['secondary_vegetation_light'] = SimpleExpr( 'secondary_vegetation_light', 'young_secondary_light + intermediate_secondary_light + mature_secondary_light' ) rasters['secondary_vegetation_intense'] = SimpleExpr( 'secondary_vegetation_intense',
year) + '.tif' ru.clip(inname, outname, 0, None) # calculate bii (with only a lower bound) # pull in all the rasters for computing bii bii_rs = RasterSet({ 'abundance': Raster( 'abundance', 'C:/ds/temporal-bii/' + version + '/bii-ab-low-bound-%d.tif' % year), 'comp_sim': Raster( 'comp_sim', 'C:/ds/temporal-bii/' + version + '/bii-cs-low-bound-%d.tif' % year), 'bii_ab': SimpleExpr('bii_ab', 'abundance * comp_sim') }) # write out bii raster bii_rs.write( 'bii_ab', utils.outfn('temporal-bii/' + version, 'bii-%d.tif' % year)) # calculate bounded bii # clip the abundance rasters inname = 'C:/ds/temporal-bii/' + version + '/bii-ab-' + str( year) + '.tif' outname = 'C:/ds/temporal-bii/' + version + '/bii-ab-bound-' + str( year) + '.tif' ru.clip(inname, outname, 0, abmax)
mask_file = os.path.join(utils.data_root(), '1km/islands-from-igor-edited-at.tif') # Open the mask raster file (Mainlands) mask_ds = rasterio.open(mask_file) # Read Katia's abundance model mod = modelr.load('/home/vagrant/katia/models/best_model_abund.rds') predicts.predictify(mod) # Import standard PREDICTS rasters rasters = predicts.rasterset('1km', 'medium', year=2005) # create an ISL_MAINL raster # set it to Mainlands this time round (set Mainlands to 1 and Islands to 0) rasters['ISL_MAINLMAINLAND'] = SimpleExpr('ISL_MAINLMAINLAND', ISLMAIN) # specify the plantation forest maps as 0 # not sure why it's plantations_pri rather than plantation, but hey ho rasters['plantation_pri'] = SimpleExpr('plantation_pri', 0) rasters['plantation_pri_minimal'] = SimpleExpr('plantation_pri_minimal', 0) rasters['plantation_pri_light'] = SimpleExpr('plantation_pri_light', 0) rasters['plantation_pri_intense'] = SimpleExpr('plantation_pri_intense', 0) ## If CLIP is true, limit the predictor variable values to the max seen ## when fitting the model if args.clip: rasters['clip_hpd'] = SimpleExpr( 'clip_hpd', 'clip(hpd_ref, %f, %f)' % (HPD_MIN, HPD_MAX)) else: rasters['clip_hpd'] = SimpleExpr('clip_hpd', 'hpd_ref')
# Open the mask raster file mask_file = os.path.join(utils.data_root(), '1km/mainland-from-igor-edited.tif') mask_ds = rasterio.open(mask_file) # Richness compositional similarity model with updated PriMin-Urb coefficient mod = modelr.load('/home/vagrant/katia/models/updated_compsim_rich.rds') predicts.predictify(mod) # Import standard PREDICTS rasters rasters = predicts.rasterset('1km', 'medium', year=2005) # create an ISL_MAINL raster # set it to Mainlands this time round (set Mainlands to 1 and Islands to 0) rasters['ISL_MAINMAINLAND'] = SimpleExpr('ISL_MAINMAINLAND', '2') rasters['ISL_MAINISLAND'] = SimpleExpr('ISL_MAINISLAND', '0') rasters['adjGeogDist'] = SimpleExpr('adjGeogDist', '0') rasters['cubeRtEnvDist'] = SimpleExpr('cubeRtEnvDist', '0') # set up the rasterset, cropping to mainlands rs = RasterSet(rasters, mask=mask_ds, maskval=0, crop=True) # if you're projecting the whole world, use this code instead #rs = RasterSet(rasters) # evaluate the model # model is logit transformed with an adjustment, so back-transformation rs[mod.output] = mod rs['output'] = SimpleExpr( 'output', '(inv_logit(%s) - 0.01) / (inv_logit(%f) - 0.01)' %
def rset_add(rasters, name, expr): rasters[name] = SimpleExpr(name, expr)
import numpy as np import time import matplotlib.pyplot as plt from rasterio.plot import show, show_hist from projections.atlas import atlas from projections.rasterset import RasterSet, Raster from projections.simpleexpr import SimpleExpr import projections.predicts as predicts import projections.rds as rds # Import standard PREDICTS rasters rasters = predicts.rasterset('rcp', 'aim', 2020, 'medium') rs = RasterSet(rasters) rs['logHPD_rs2'] = SimpleExpr('logHPD_rs', 'scale(log(hpd + 1), 0.0, 1.0)') data1 = rs.eval('logHPD_rs') data2 = rs.eval('logHPD_rs2') data3 = np.where(np.isclose(data1, data2, equal_nan=True), 1, 0) diff = np.fabs(data1 - data2) print("max diff %f" % diff.max()) print("max in hpd_ref: %f" % rs['hpd_ref'].data.values.max()) print("max in hpd: %f" % rs['hpd'].data.dropna().values.max()) fig, ((ax1, ax2, ax3), (hx1, hx2, hx3)) = plt.subplots(2, 3, figsize=(21, 7)) show(data1, ax=ax1, cmap='Greens', title='Global max/min') show(data2, ax=ax2, cmap='Greens', title='Computed max/min') show(diff, ax=ax3, cmap='viridis', title='Difference', vmin=0, vmax=1.0) show_hist(data1, ax=hx1, histtype='stepfilled')
else: suffix = 'islands' ab_max = 1.443549 sr_max = 1.413479 folder = 'clip' if args.clip else 'no-clip' # pull in all the rasters for computing bii bii_rs = RasterSet({'abundance': Raster('abundance', utils.outfn('katia', folder, 'ab-%s.tif' % suffix)), 'comp_sim': Raster('comp_sim', utils.outfn('katia', 'ab-cs-%s.tif' % suffix)), 'clip_ab': SimpleExpr('clip_ab', 'clip(abundance, 0, %f)' % ab_max), 'bii_ab': SimpleExpr('bii_ab', 'abundance * comp_sim'), 'bii_ab2': SimpleExpr('bii_ab2', 'clip_ab * comp_sim'), }) # write out bii raster bii_rs.write('bii_ab' if args.clip else 'bii_ab2', utils.outfn('katia', folder, 'abundance-based-bii-%s.tif' % suffix)) # do the same for species richness # pull in all the rasters for computing bii bii_rs = RasterSet({'sp_rich': Raster('sp_rich', utils.outfn('katia', folder, 'sr-%s.tif' % suffix)),
# This line imports standard PREDICTS rasters #rasters = predicts.rasterset('1km', 'version3.3', year, 'medium') # we don't need this anymore as we're importing our own data # so set up an empty rasters object rasters = dict() # update the land-use classes that we need for the model rasters['cropland_minimal'] = Raster( 'cropland_minimal', 'C:/ds/adrid/cropland_minimal-%d.tif' % year) rasters['cropland_light'] = Raster( 'cropland_light', 'C:/ds/adrid/cropland_light-%d.tif' % year) rasters['cropland_intense'] = Raster( 'cropland_intense', 'C:/ds/adrid/cropland_intense-%d.tif' % year) rasters['cropland'] = SimpleExpr( 'cropland', 'cropland_minimal + cropland_light + cropland_intense') rasters['pasture_minimal'] = Raster( 'pasture_minimal', 'C:/ds/adrid/pasture_minimal-%d.tif' % year) rasters['pasture_light'] = Raster( 'pasture_light', 'C:/ds/adrid/pasture_light-%d.tif' % year) rasters['pasture_intense'] = Raster( 'pasture_intense', 'C:/ds/adrid/pasture_intense-%d.tif' % year) rasters['pasture'] = SimpleExpr( 'pasture', 'pasture_minimal + pasture_light + pasture_intense') rasters['primary_minimal'] = Raster( 'primary_minimal', 'C:/ds/adrid/primary_minimal-%d.tif' % year) rasters['primary_light'] = Raster( 'primary_light', 'C:/ds/adrid/primary_light-%d.tif' % year) rasters['primary_intense'] = Raster(
from projections.simpleexpr import SimpleExpr import projections.predicts as predicts import projections.r2py.modelr as modelr import projections.utils as utils import projections.raster_utils as ru CLIP = 'no-clip' # pull in all the rasters for computing bii bii_rs = RasterSet({ 'abundance': Raster('abundance', utils.outfn('katia', CLIP, 'bii-ab-mainlands.tif')), 'comp_sim': Raster('comp_sim', utils.outfn('katia', 'bii-ab-cs-mainlands.tif')), 'clip_ab': SimpleExpr('clip_ab', 'clip(abundance, 0, 1.655183)'), 'bii_ab': SimpleExpr('bii_ab', 'abundance * comp_sim'), 'bii_ab2': SimpleExpr('bii_ab2', 'clip_ab * comp_sim'), }) # write out bii raster bii_rs.write('bii_ab' if CLIP == 'clip' else 'bii_ab2', utils.outfn('katia', CLIP, 'abundance-based-bii-mainlands.tif')) # do the same for species richness # pull in all the rasters for computing bii bii_rs = RasterSet({ 'sp_rich': Raster('sp_rich', utils.outfn('katia', CLIP, 'bii-sr-mainlands.tif')),
# This line imports standard PREDICTS rasters #rasters = predicts.rasterset('1km', 'version3.3', year, 'medium') # we don't need this anymore as we're importing our own data # so set up an empty rasters object rasters = dict() # update the land-use classes that we need for the model rasters['cropland_minimal'] = Raster( 'cropland_minimal', 'C:/ds/adrid/cropland_minimal-%d.tif' % year) rasters['cropland_light'] = Raster( 'cropland_light', 'C:/ds/adrid/cropland_light-%d.tif' % year) rasters['cropland_intense'] = Raster( 'cropland_intense', 'C:/ds/adrid/cropland_intense-%d.tif' % year) rasters['cropland'] = SimpleExpr( 'cropland', 'cropland_minimal + cropland_light + cropland_intense') rasters['pasture_minimal'] = Raster( 'pasture_minimal', 'C:/ds/adrid/pasture_minimal-%d.tif' % year) rasters['pasture_light'] = Raster( 'pasture_light', 'C:/ds/adrid/pasture_light-%d.tif' % year) rasters['pasture_intense'] = Raster( 'pasture_intense', 'C:/ds/adrid/pasture_intense-%d.tif' % year) rasters['pasture'] = SimpleExpr( 'pasture', 'pasture_minimal + pasture_light + pasture_intense') rasters['primary_minimal'] = Raster( 'primary_minimal', 'C:/ds/adrid/primary_minimal-%d.tif' % year) rasters['primary_light'] = Raster( 'primary_light', 'C:/ds/adrid/primary_light-%d.tif' % year) rasters['primary_intense'] = Raster(