epsg=srs,
                                     desc=args.description)

# Import DEM into location
demFilepath = os.path.join(context.projectDir, manifest['dem'])
#print demFilepath
result = grassLib.script.run_command('r.in.gdal',
                                     flags="e",
                                     input=demFilepath,
                                     output='dem')
if result != 0:
    sys.exit("Failed to import DEM into new GRASS dataset %s/%s, results:\n%s" % \
             (grassDbase, args.location, result) )

# Set region to DEM
result = grassLib.script.run_command('g.region', rast='dem')
if result != 0:
    sys.exit("Failed to set region to DEM")

# Update metadata
RHESSysMetadata.writeGRASSEntry(context, 'dem_rast', 'dem')
RHESSysMetadata.writeRHESSysEntry(context, 'grass_dbase', dbase)
RHESSysMetadata.writeRHESSysEntry(context, 'grass_location',
                                  grassConfig.location)
RHESSysMetadata.writeRHESSysEntry(context, 'grass_mapset', grassConfig.mapset)
RHESSysMetadata.writeRHESSysEntry(context, 'rhessys_dir', paths.rhessysDir)
RHESSysMetadata.writeRHESSysEntry(context, 'model_description',
                                  args.description)

# Write processing history
RHESSysMetadata.appendProcessingHistoryItem(context, cmdline)
if result != 0:
    sys.exit("r.mask filed, returning %s" % (result,) )
result = grassLib.script.run_command('g.region', rast=demRast)
if result != 0:
    sys.exit("g.region failed to set region to DEM, returning %s" % (result,))

if not args.defonly:
    sys.stdout.write('Generating soil texture map from percent sand and clay maps...')
    sys.stdout.flush()
    # Import percent sand and percent clay raster maps into GRASS
    percentSandRasterPath = os.path.join(context.projectDir, manifest['soil_raster_pctsand'])
    result = grassLib.script.run_command('r.in.gdal', input=percentSandRasterPath, output='soil_pctsand', overwrite=args.overwrite)
    if result != 0:
        sys.exit("Failed to import soil_raster_pctsand into GRASS dataset %s/%s, results:\n%s" % \
                 (grassDbase, metadata['grass_location'], result) )
    RHESSysMetadata.writeGRASSEntry(context, 'soil_pctsand_rast', 'soil_pctsand')
        
    percentClayRasterPath = os.path.join(context.projectDir, manifest['soil_raster_pctclay'])
    result = grassLib.script.run_command('r.in.gdal', input=percentClayRasterPath, output='soil_pctclay', overwrite=args.overwrite)
    if result != 0:
        sys.exit("Failed to import soil_raster_pctclay into GRASS dataset %s/%s, results:\n%s" % \
                 (grassDbase, metadata['grass_location'], result) )
    RHESSysMetadata.writeGRASSEntry(context, 'soil_pctclay_rast', 'soil_pctclay')
    
    # Generate soil texture map
    schemePath = os.path.join(moduleEtc, 'USDA.dat')
    if not os.access(schemePath, os.R_OK):
        raise IOError(errno.EACCES, "Not allowed to read r.soils.texture scheme %s" % (schemePath,) )
    soilTexture = os.path.join(modulePath, 'r.soils.texture')
    result = grassLib.script.read_command(soilTexture, sand='soil_pctsand', clay='soil_pctclay',
                                          scheme=schemePath, output=soil_rast, overwrite=args.overwrite)
(stdoutStr, stderrStr) = p.communicate() 
result = p.returncode
if result != 0:
    sys.stdout.write(stdoutStr)
    sys.exit("\nv.in.ascii failed, returning %s" % (result,))
    
# Generate Thiessen polygons
p = grassLib.script.pipe_command('v.voronoi', input='basestation_points', output='basestation_areas', 
                                 overwrite=args.overwrite)
(stdoutStr, stderrStr) = p.communicate() 
result = p.returncode
if result != 0:
    sys.stdout.write(stdoutStr)
    sys.exit("\nv.voronoi failed, returning %s" % (result,))

# Rasterize Thiessen polygons
p = grassLib.script.pipe_command('v.to.rast', input='basestation_areas', output='basestations', 
                                 use='cat', labelcolumn='name', overwrite=args.overwrite)
(stdoutStr, stderrStr) = p.communicate() 
result = p.returncode
if result != 0:
    sys.stdout.write(stdoutStr)
    sys.exit("\nv.to.rast failed, returning %s" % (result,))

# Write metadata 
RHESSysMetadata.writeRHESSysEntry( context, 'basestations_text', paths.relpath(basestationsDest) )
RHESSysMetadata.writeGRASSEntry( context, 'basestations_rast', 'basestations' )

# Write processing history
RHESSysMetadata.appendProcessingHistoryItem(context, cmdline)
    sys.stdout.flush()
    
    demCols = int(studyArea['dem_columns'])
    result = grassLib.script.write_command('r.mapcalc', 
                             stdin="%s=(row()-1) * %d + col()" % (PATCH_RAST, demCols) )
    if result != 0:
        sys.exit("r.mapcalc failed to create patch map, returning %s" % (result,))
    
if args.patchType == 'clump':
    if args.clumpMap == 'wetness_index':
        clumpMap = grassMetadata['wetness_index_rast']
    else:
        clumpMap = demRast
    
    sys.stdout.write("Generating clumped patch map based on %s raster...\n" % (clumpMap) )
    sys.stdout.flush()
    
    result = grassLib.script.run_command('r.clump', input=clumpMap, output=PATCH_RAST, overwrite=args.overwrite)
    if result != 0:
        sys.exit("r.mapcalc failed to create patch map, returning %s" % (result,))

sys.stdout.write('done\n')

# Write metadata    
RHESSysMetadata.writeGRASSEntry(context, 'patch_rast', PATCH_RAST)
if args.forceZone or not 'zone_rast' in grassMetadata:
    # Only overwrite zone raster
    RHESSysMetadata.writeGRASSEntry(context, 'zone_rast', PATCH_RAST)

# Write processing history
RHESSysMetadata.appendProcessingHistoryItem(context, cmdline)
            # Convert raster to integer
            sys.stdout.write(
                "Converting %s raster to integer using multiplier %s...\n" %
                (t, str(args.multiplier)))
            sys.stdout.flush()
            mapcalcCmd = "%s=int(%s * %s)" % (t, importName,
                                              str(args.multiplier))
            print(mapcalcCmd)
            result = grassLib.script.write_command('r.mapcalc',
                                                   stdin=mapcalcCmd)
            if result != 0:
                sys.exit("Integer conversion failed for raster %s of GRASS dataset %s/%s, result:\n%s" % \
                         (t, grassDbase, metadata['grass_location'], result) )
            result = grassLib.script.run_command('g.remove', rast=importName)
            if result != 0:
                sys.exit("Failed to delete temporary raster %s of GRASS dataset %s/%s, result:\n%s" % \
                         (importName, grassDbase, metadata['grass_location'], result) )

        grassEntryKey = "%s_rast" % (t, )
        RHESSysMetadata.writeGRASSEntry(context, grassEntryKey, t)
        sys.stdout.write('done\n')
        # Invalidate metadata as necessary
        if t == RHESSysMetadata.RASTER_TYPE_LC:
            RHESSysMetadata.deleteRHESSysEntry(context, 'stratum_defs')
            RHESSysMetadata.deleteRHESSysEntry(context, 'landuse_defs')
        elif t == RHESSysMetadata.RASTER_TYPE_SOIL:
            RHESSysMetadata.deleteRHESSysEntry(context, 'soil_defs')

# Write processing history
RHESSysMetadata.appendProcessingHistoryItem(context, cmdline)
# Set up GRASS environment
grassConfig = GRASSConfig(context, grassDbase, location, mapset, newLocation=True, overwrite=args.overwrite)
grassLib = GRASSLib(grassConfig=grassConfig)

# Create the new location
grassLib.script.core.create_location(grassConfig.dbase, grassConfig.location, epsg=srs, desc=args.description)

# Import DEM into location
demFilepath = os.path.join(context.projectDir, manifest["dem"])
# print demFilepath
result = grassLib.script.run_command("r.in.gdal", flags="e", input=demFilepath, output="dem")
if result != 0:
    sys.exit("Failed to import DEM into new GRASS dataset %s/%s, results:\n%s" % (grassDbase, args.location, result))

# Set region to DEM
result = grassLib.script.run_command("g.region", rast="dem")
if result != 0:
    sys.exit("Failed to set region to DEM")

# Update metadata
RHESSysMetadata.writeGRASSEntry(context, "dem_rast", "dem")
RHESSysMetadata.writeRHESSysEntry(context, "grass_dbase", dbase)
RHESSysMetadata.writeRHESSysEntry(context, "grass_location", grassConfig.location)
RHESSysMetadata.writeRHESSysEntry(context, "grass_mapset", grassConfig.mapset)
RHESSysMetadata.writeRHESSysEntry(context, "rhessys_dir", paths.rhessysDir)
RHESSysMetadata.writeRHESSysEntry(context, "model_description", args.description)

# Write processing history
RHESSysMetadata.appendProcessingHistoryItem(context, cmdline)
Ejemplo n.º 7
0
        sys.exit("r.mapcalc failed to create patch map, returning %s" %
                 (result, ))

if args.patchType == 'clump':
    if args.clumpMap == 'wetness_index':
        clumpMap = grassMetadata['wetness_index_rast']
    else:
        clumpMap = demRast

    sys.stdout.write("Generating clumped patch map based on %s raster...\n" %
                     (clumpMap))
    sys.stdout.flush()

    result = grassLib.script.run_command('r.clump',
                                         input=clumpMap,
                                         output=PATCH_RAST,
                                         overwrite=args.overwrite)
    if result != 0:
        sys.exit("r.mapcalc failed to create patch map, returning %s" %
                 (result, ))

sys.stdout.write('done\n')

# Write metadata
RHESSysMetadata.writeGRASSEntry(context, 'patch_rast', PATCH_RAST)
if args.forceZone or not 'zone_rast' in grassMetadata:
    # Only overwrite zone raster
    RHESSysMetadata.writeGRASSEntry(context, 'zone_rast', PATCH_RAST)

# Write processing history
RHESSysMetadata.appendProcessingHistoryItem(context, cmdline)
Ejemplo n.º 8
0
p = grassLib.script.pipe_command('v.voronoi',
                                 input='basestation_points',
                                 output='basestation_areas',
                                 overwrite=args.overwrite)
(stdoutStr, stderrStr) = p.communicate()
result = p.returncode
if result != 0:
    sys.stdout.write(stdoutStr)
    sys.exit("\nv.voronoi failed, returning %s" % (result, ))

# Rasterize Thiessen polygons
p = grassLib.script.pipe_command('v.to.rast',
                                 input='basestation_areas',
                                 output='basestations',
                                 use='cat',
                                 labelcolumn='name',
                                 overwrite=args.overwrite)
(stdoutStr, stderrStr) = p.communicate()
result = p.returncode
if result != 0:
    sys.stdout.write(stdoutStr)
    sys.exit("\nv.to.rast failed, returning %s" % (result, ))

# Write metadata
RHESSysMetadata.writeRHESSysEntry(context, 'basestations_text',
                                  paths.relpath(basestationsDest))
RHESSysMetadata.writeGRASSEntry(context, 'basestations_rast', 'basestations')

# Write processing history
RHESSysMetadata.appendProcessingHistoryItem(context, cmdline)
Ejemplo n.º 9
0
    def run(self, *args, **kwargs):
        """ Create flow tables for multiple worldfiles

        Arguments:
        scenario_id -- int    ID of the GI Notebook scenario whose GI instances are to be parameterized.
        auth_token -- string    Authorization token to use for authenticating to the GI Notebook.
        host -- string    Hostname of GI Notebook server. Default: None.
        api_root -- string    The root of the API URL to use. Default: None.
        use_HTTPS -- boolean    Use HTTPS for communication with the GI Notebook.
        force -- boolean        Force overwrite of existing scenario output. Default: False.
        verbose -- boolean    Produce verbose output. Default: False.
        """
        scenario_id = kwargs.get('scenario_id')
        if scenario_id is None:
            raise RunException('Scenario ID was not specified.')
        auth_token = kwargs.get('auth_token')
        if auth_token is None:
            raise RunException('Authorization token was not specified.')
        host = kwargs.get('host', DEFAULT_HOSTNAME)
        api_root = kwargs.get('api_path', DEFAULT_API_ROOT)
        use_HTTPS = kwargs.get('use_HTTPS', False)
        force = kwargs.get('force', False)
        verbose = kwargs.get('verbose', False)

        self.checkMetadata()
        self.param_const, self.param_db = self._init_paramdb()
        self.paths = RHESSysPaths(self.context.projectDir, self.metadata['rhessys_dir'])

        gi_scenario_base = 'gi_scenario'
        gi_scenario_data = "{0}.geojson".format(gi_scenario_base)
        scenario_geojson_path = os.path.join(self.context.projectDir, gi_scenario_data)
        gi_scenario_soils_base = "{0}_wsoils".format(gi_scenario_base)
        gi_scenario_soils = "{0}.geojson".format(gi_scenario_soils_base)
        scenario_soils_geojson_path = os.path.join(self.context.projectDir, gi_scenario_soils)
        gi_scenario_landuse_base = "{0}_landuse".format(gi_scenario_base)
        gi_scenario_landuse = "{0}.geojson".format(gi_scenario_landuse_base)
        scenario_landuse_geojson_path = os.path.join(self.context.projectDir, gi_scenario_landuse)
        gi_scenario_data_key = 'gi_scenario_data'
        gi_scenario_soils_data_key = "{0}_soils".format(gi_scenario_data_key)
        gi_scenario_landuse_data_key = "{0}_landuse".format(gi_scenario_data_key)
        if gi_scenario_data_key in self.metadata:
            if verbose:
                self.outfp.write('Existing GI scenario found.\n')
            if force:
                if verbose:
                    self.outfp.write('Force option specified, overwriting existing GI scenario.\n')
                if os.path.exists(scenario_geojson_path):
                    os.unlink(scenario_geojson_path)
                if os.path.exists(scenario_soils_geojson_path):
                    os.unlink(scenario_soils_geojson_path)
                if os.path.exists(scenario_landuse_geojson_path):
                    os.unlink(scenario_landuse_geojson_path)
            else:
                raise RunException('Exiting.  Use force option to overwrite.')

        if verbose:
            output = None
        else:
            output = open('/dev/null')
        try:
            # Connect to GI Notebook and fetch GI instance information (in GeoJSON format)
            # for this scenario ID.
            if verbose:
                self.outfp.write("\nDownloading GI scenario {0} from GI database...\n".format(scenario_id))
            nb = GINotebook(hostname=host,
                            api_root=api_root,
                            use_https=use_HTTPS, auth_token=auth_token)
            scenario = nb.get_scenario(scenario_id)
            scenario_geojson = scenario.get_instances_as_geojson(indent=2, shorten=True)
            (gi_scenario_data_wgs84, scenario_geojson_wgs84_path), (gi_scenario_data, scenario_geojson_path) = \
                self._write_geojson_and_reproject(scenario_geojson, gi_scenario_base, verbose=verbose, output=output)

            # Filter out instances that do not contain soils data
            gi_scenario_soils_base = "{0}_wsoils".format(gi_scenario_base)
            scenario_geojson_wsoils = scenario.get_instances_as_geojson(indent=2, shorten=True,
                                                                        filter=lambda a: a.get('e_1_pedid') is not None)
            (gi_scenario_soils_wgs84, scenario_soils_geojson_wgs84_path), (gi_scenario_soils, scenario_soils_geojson_path) = \
                self._write_geojson_and_reproject(scenario_geojson_wsoils, gi_scenario_soils_base,
                                                  verbose=verbose, output=output)

            # Import scenario GeoJSON into GRASS
            self._import_vector_into_grass(scenario_geojson_path, gi_scenario_data_key,
                                           force=force, verbose=verbose, output=output)

            # Import scenario (instances with soils data) GeoJSON into GRASS
            self._import_vector_into_grass(scenario_soils_geojson_path, gi_scenario_soils_data_key,
                                           force=force, verbose=verbose, output=output)

            # Generate raster layers from vector-based GI Scenario
            # Raster for updating soil type
            self._rasterize(gi_scenario_soils_data_key, gi_scenario_soils_data_key,
                            column='e_1_pedid', labelcolumn='e_1_pednm',
                            rast_title='GI soil types',
                            verbose=verbose,
                            force=force,
                            redir_fp=output)
            # Raster for updating stratum type
            gi_scenario_strata = "gi_scenario_strata"
            self._rasterize(gi_scenario_data_key, gi_scenario_strata,
                            column='e_1_vegid', labelcolumn='e_1_vegnm',
                            rast_title='GI vegetation types',
                            verbose=verbose,
                            force=force,
                            redir_fp=output)

            # Raster for updating land use
            # Filter out instances that are not rain gardens (i.e. the only GI type for which we currently have a
            #   land use).
            scenario_geojson_landuse = scenario.get_instances_as_geojson(indent=2, shorten=True,
                                                                         filter=lambda a: a.get('type',
                                                                                                '') == 'Rain Garden')
            (gi_scenario_landuse_wgs84, scenario_landuse_geojson_wgs84_path), \
            (gi_scenario_landuse, scenario_landuse_geojson_path) = \
                self._write_geojson_and_reproject(scenario_geojson_landuse, gi_scenario_landuse_base,
                                                  verbose=verbose, output=output)
            # Import land use (i.e. instances that are rain gardens) GeoJSON into GRASS
            self._import_vector_into_grass(scenario_landuse_geojson_path, gi_scenario_landuse_data_key,
                                           force=force, verbose=verbose, output=output)

            # Search for raster value for rain gardens in RHESSys parameter DB
            rg_name = 'raingarden'
            rg_found = self.param_db.search(self.param_const.SEARCH_TYPE_HIERARCHICAL, 'landuse', rg_name,
                                            None, None, None, None, None, None, None, None)
            if not rg_found:
                raise RunException("Unable to find raingarden landuse class in parameter database")

            rg_id = [c[1][2] for c in self.param_db.classes.iteritems()][0]

            # Generate raster layer from vector-based GI Scenario
            # Raster for updating landuse type
            self._rasterize_single_value(gi_scenario_landuse_data_key, gi_scenario_landuse_data_key,
                                         value=rg_id, label=rg_name,
                                         rast_title='GI landuse types',
                                         verbose=verbose,
                                         force=force,
                                         redir_fp=output)

            # Write out updated landuse, stratum, and soil rasters and parameter definitions
            # Backup landuse raster
            self._backup_raster(self.grassMetadata['landuse_rast'])
            # Update landuse raster
            self._update_raster(self.grassMetadata['landuse_rast'], gi_scenario_landuse_data_key)
            # Generate parameter definition file for landuse raster
            self._generate_parameter_definitions_for_raster(self.grassMetadata['landuse_rast'], 'landuse',
                                                            verbose=verbose)
            # Backup stratum raster
            self._backup_raster(self.grassMetadata['stratum_rast'])
            # Update stratum raster
            self._update_raster(self.grassMetadata['stratum_rast'], gi_scenario_strata)
            # Generate parameter definition file for stratum raster
            self._generate_parameter_definitions_for_raster(self.grassMetadata['stratum_rast'], 'stratum',
                                                            verbose=verbose)
            # Backup soils raster
            self._backup_raster(self.grassMetadata['soil_rast'])
            # Update soils raster
            self._update_raster(self.grassMetadata['soil_rast'], gi_scenario_soils_data_key)
            # Generate parameter definition file for soil raster
            self._generate_parameter_definitions_for_raster(self.grassMetadata['soil_rast'], 'soil',
                                                            verbose=verbose)
            # Write metadata
            RHESSysMetadata.writeGRASSEntry(self.context, "{0}_rast".format(gi_scenario_landuse_data_key),
                                            gi_scenario_landuse_data_key)
            RHESSysMetadata.writeGRASSEntry(self.context, "{0}_rast".format(gi_scenario_soils_data_key),
                                            gi_scenario_soils_data_key)
            RHESSysMetadata.writeGRASSEntry(self.context, "{0}_rast".format(gi_scenario_strata), gi_scenario_strata)

            RHESSysMetadata.writeGRASSEntry(self.context, "{0}_vect".format(gi_scenario_data_key), gi_scenario_data_key)
            RHESSysMetadata.writeGRASSEntry(self.context, "{0}_vect".format(gi_scenario_soils_data_key),
                                            gi_scenario_soils_data_key)
            RHESSysMetadata.writeGRASSEntry(self.context, "{0}_vect".format(gi_scenario_landuse_data_key),
                                            gi_scenario_landuse_data_key)
            RHESSysMetadata.writeRHESSysEntry(self.context, gi_scenario_data_key, gi_scenario_data)

            if verbose:
                self.outfp.write('\n\nFinished parameterizing GI.\n')

            # Write processing history
            RHESSysMetadata.appendProcessingHistoryItem(self.context, RHESSysMetadata.getCommandLine())

        finally:
            if output:
                output.close()
Ejemplo n.º 10
0
if not args.defonly:
    sys.stdout.write(
        'Generating soil texture map from percent sand and clay maps...')
    sys.stdout.flush()
    # Import percent sand and percent clay raster maps into GRASS
    percentSandRasterPath = os.path.join(context.projectDir,
                                         manifest['soil_raster_pctsand'])
    result = grassLib.script.run_command('r.in.gdal',
                                         input=percentSandRasterPath,
                                         output='soil_pctsand',
                                         overwrite=args.overwrite)
    if result != 0:
        sys.exit("Failed to import soil_raster_pctsand into GRASS dataset %s/%s, results:\n%s" % \
                 (grassDbase, metadata['grass_location'], result) )
    RHESSysMetadata.writeGRASSEntry(context, 'soil_pctsand_rast',
                                    'soil_pctsand')

    percentClayRasterPath = os.path.join(context.projectDir,
                                         manifest['soil_raster_pctclay'])
    result = grassLib.script.run_command('r.in.gdal',
                                         input=percentClayRasterPath,
                                         output='soil_pctclay',
                                         overwrite=args.overwrite)
    if result != 0:
        sys.exit("Failed to import soil_raster_pctclay into GRASS dataset %s/%s, results:\n%s" % \
                 (grassDbase, metadata['grass_location'], result) )
    RHESSysMetadata.writeGRASSEntry(context, 'soil_pctclay_rast',
                                    'soil_pctclay')

    # Generate soil texture map
    schemePath = os.path.join(moduleEtc, 'USDA.dat')
            if result != 0:
                sys.exit("Failed to resample imported raster %s of GRASS dataset %s/%s, result:\n%s" % \
                         (t, grassDbase, metadata['grass_location'], result) )
        if args.integer:
            # Convert raster to integer
            sys.stdout.write("Converting %s raster to integer using multiplier %s...\n" % (t, str(args.multiplier)) )
            sys.stdout.flush()
            mapcalcCmd = "%s=int(%s * %s)" % (t, importName, str(args.multiplier) )
            print(mapcalcCmd)
            result = grassLib.script.write_command('r.mapcalc', stdin=mapcalcCmd)
            if result != 0:
                sys.exit("Integer conversion failed for raster %s of GRASS dataset %s/%s, result:\n%s" % \
                         (t, grassDbase, metadata['grass_location'], result) )
            result = grassLib.script.run_command('g.remove', rast=importName)
            if result != 0:
                sys.exit("Failed to delete temporary raster %s of GRASS dataset %s/%s, result:\n%s" % \
                         (importName, grassDbase, metadata['grass_location'], result) )
        
        grassEntryKey = "%s_rast" % (t,)
        RHESSysMetadata.writeGRASSEntry(context, grassEntryKey, t)
        sys.stdout.write('done\n')
        # Invalidate metadata as necessary
        if t == RHESSysMetadata.RASTER_TYPE_LC:
            RHESSysMetadata.deleteRHESSysEntry(context, 'stratum_defs')
            RHESSysMetadata.deleteRHESSysEntry(context, 'landuse_defs')
        elif t == RHESSysMetadata.RASTER_TYPE_SOIL:
            RHESSysMetadata.deleteRHESSysEntry(context, 'soil_defs')

# Write processing history
RHESSysMetadata.appendProcessingHistoryItem(context, cmdline)
# Make sure mask and region are properly set
result = grassLib.script.run_command('r.mask', flags='r')
if result != 0:
    sys.exit("r.mask filed, returning %s" % (result,) )
result = grassLib.script.run_command('g.region', rast=demRast)
if result != 0:
    sys.exit("g.region failed to set region to DEM, returning %s" % (result,))

# Reclassify custom soils map into one compatible with RHESSys soil types defined in ParamDB
soilReclassName = 'soil_reclass'
result = grassLib.script.read_command('r.reclass', input=soilRast, output=soilReclassName, 
                           rules=soilsRulePath, overwrite=args.overwrite)
if None == result:
    sys.exit("r.reclass failed to create soils map, returning %s" % (result,))
RHESSysMetadata.writeGRASSEntry(context, 'soil_rast', soilReclassName)

# Fetch relevant stratum default files from param DB
pipe = grassLib.script.pipe_command('r.stats', flags='licn', input=soilReclassName)
rasterVals = {}
for line in pipe.stdout:
    (dn, cat, num) = line.strip().split()
    if cat != 'NULL':
        rasterVals[cat] = int(dn)
pipe.wait()
print("Writing soil definition files to %s" % (paths.RHESSYS_DEF) )
for key in rasterVals.keys():
    print("soil '%s' has dn %d" % (key, rasterVals[key]) )
    paramsFound = paramDB.search(paramConst.SEARCH_TYPE_CONSTRAINED, None, key, None, None, None, None, None, None, None, None,
                                 limitToBaseClasses=True, defaultIdOverride=rasterVals[key])
    assert(paramsFound)
result = grassLib.script.run_command('g.region', rast=demRast)
if result != 0:
    sys.exit("g.region failed to set region to DEM, returning %s" % (result,))

# Generate drainage direction map
flags = None
if args.multiflowdirection:
    flags = 'f'
result = grassLib.script.run_command('r.watershed', 
                                     elevation=flowDirDem, drainage='drain', accumulation='uaa',
                                     overwrite=args.overwrite,
                                     flags=flags)
if result != 0:
    sys.exit("r.watershed failed creating drainage direction and uaa maps, returning %s" % (result,))

RHESSysMetadata.writeGRASSEntry(context, 'drain_rast', 'drain')
RHESSysMetadata.writeGRASSEntry(context, 'uaa_rast', 'uaa')

# Convert gage coordinates into dem_srs coordinates
(easting, northing) = transformCoordinates(studyArea['gage_lon_wgs84'],
                                           studyArea['gage_lat_wgs84'],
                                           t_srs=studyArea['dem_srs'])

RHESSysMetadata.writeRHESSysEntry(context, 'gage_easting_raw', easting)
RHESSysMetadata.writeRHESSysEntry(context, 'gage_northing_raw', northing)

point = "%f|%f\n" % (easting, northing) 
result = grassLib.script.write_command('v.in.ascii', output='gage', stdin=point, overwrite=args.overwrite)
if result != 0:
    sys.exit("v.in.ascii failed to create 'gage' vector, returning %s" % (result,))
if result != 0:
    sys.exit("r.mask filed, returning %s" % (result, ))
result = grassLib.script.run_command('g.region', rast=demRast)
if result != 0:
    sys.exit("g.region failed to set region to DEM, returning %s" % (result, ))

# Reclassify custom soils map into one compatible with RHESSys soil types defined in ParamDB
soilReclassName = 'soil_reclass'
result = grassLib.script.read_command('r.reclass',
                                      input=soilRast,
                                      output=soilReclassName,
                                      rules=soilsRulePath,
                                      overwrite=args.overwrite)
if None == result:
    sys.exit("r.reclass failed to create soils map, returning %s" % (result, ))
RHESSysMetadata.writeGRASSEntry(context, 'soil_rast', soilReclassName)

# Fetch relevant stratum default files from param DB
pipe = grassLib.script.pipe_command('r.stats',
                                    flags='licn',
                                    input=soilReclassName)
rasterVals = {}
for line in pipe.stdout:
    (dn, cat, num) = line.strip().split()
    if cat != 'NULL':
        rasterVals[cat] = int(dn)
pipe.wait()
print("Writing soil definition files to %s" % (paths.RHESSYS_DEF))
for key in rasterVals.keys():
    print("soil '%s' has dn %d" % (key, rasterVals[key]))
    paramsFound = paramDB.search(paramConst.SEARCH_TYPE_CONSTRAINED,
result = grassLib.script.run_command('g.region', rast=demRast)
if result != 0:
    sys.exit("g.region failed to set region to DEM, returning %s" % (result, ))

# Generate drainage direction map
result = grassLib.script.run_command('r.watershed',
                                     elevation=flowDirDem,
                                     drainage='drain',
                                     accumulation='uaa',
                                     overwrite=args.overwrite)
if result != 0:
    sys.exit(
        "r.watershed failed creating drainage direction and uaa maps, returning %s"
        % (result, ))

RHESSysMetadata.writeGRASSEntry(context, 'drain_rast', 'drain')
RHESSysMetadata.writeGRASSEntry(context, 'uaa_rast', 'uaa')

# Convert gage coordinates into dem_srs coordinates
(easting, northing) = transformCoordinates(studyArea['gage_lon_wgs84'],
                                           studyArea['gage_lat_wgs84'],
                                           t_srs=studyArea['dem_srs'])

RHESSysMetadata.writeRHESSysEntry(context, 'gage_easting_raw', easting)
RHESSysMetadata.writeRHESSysEntry(context, 'gage_northing_raw', northing)

point = "%f|%f\n" % (easting, northing)
result = grassLib.script.write_command('v.in.ascii',
                                       output='gage',
                                       stdin=point,
                                       overwrite=args.overwrite)
    sys.exit("r.mask filed, returning %s" % (result,) )
result = grassLib.script.run_command('g.region', rast=demRast)
if result != 0:
    sys.exit("g.region failed to set region to DEM, returning %s" % (result,))

# Reclassify landcover into stratum map
stratumRast = 'stratum'
if args.defonly:
    stratumRast = grassMetadata['stratum_rast']
else:
    # Create stratum map
    result = grassLib.script.read_command('r.reclass', input=landcoverRast, output=stratumRast, 
                               rules=stratumRulePath, overwrite=args.overwrite)
    if None == result:
        sys.exit("r.reclass failed to create stratum map, returning %s" % (result,))
    RHESSysMetadata.writeGRASSEntry(context, 'stratum_rast', stratumRast)

# Fetch relevant stratum default files from param DB
pipe = grassLib.script.pipe_command('r.stats', flags='licn', input=stratumRast)
rasterVals = {}
for line in pipe.stdout:
    (dn, cat, num) = line.strip().split()
    if cat != 'NULL':
        rasterVals[cat] = int(dn)
pipe.wait()
print("Writing stratum definition files to %s" % (paths.RHESSYS_DEF) )
for key in rasterVals.keys():
    print("stratum '%s' has dn %d" % (key, rasterVals[key]) )
    paramsFound = paramDB.search(paramConst.SEARCH_TYPE_HIERARCHICAL, None, key, None, None, None, None, None, None, None, None,
                                 defaultIdOverride=rasterVals[key])
    assert(paramsFound)
# Reclassify landcover into stratum map
stratumRast = 'stratum'
if args.defonly:
    stratumRast = grassMetadata['stratum_rast']
else:
    # Create stratum map
    result = grassLib.script.read_command('r.reclass',
                                          input=landcoverRast,
                                          output=stratumRast,
                                          rules=stratumRulePath,
                                          overwrite=args.overwrite)
    if None == result:
        sys.exit("r.reclass failed to create stratum map, returning %s" %
                 (result, ))
    RHESSysMetadata.writeGRASSEntry(context, 'stratum_rast', stratumRast)

# Fetch relevant stratum default files from param DB
pipe = grassLib.script.pipe_command('r.stats', flags='licn', input=stratumRast)
rasterVals = {}
for line in pipe.stdout:
    (dn, cat, num) = line.strip().split()
    if cat != 'NULL':
        rasterVals[cat] = int(dn)
pipe.wait()
print("Writing stratum definition files to %s" % (paths.RHESSYS_DEF))
for key in rasterVals.keys():
    print("stratum '%s' has dn %d" % (key, rasterVals[key]))
    paramsFound = paramDB.search(paramConst.SEARCH_TYPE_HIERARCHICAL,
                                 None,
                                 key,
Ejemplo n.º 18
0
    def run(self, *args, **kwargs):
        """ Create flow tables for multiple worldfiles

        Arguments:
        scenario_id -- int    ID of the GI Notebook scenario whose GI instances are to be parameterized.
        auth_token -- string    Authorization token to use for authenticating to the GI Notebook.
        host -- string    Hostname of GI Notebook server. Default: None.
        api_root -- string    The root of the API URL to use. Default: None.
        use_HTTPS -- boolean    Use HTTPS for communication with the GI Notebook.
        force -- boolean        Force overwrite of existing scenario output. Default: False.
        verbose -- boolean    Produce verbose output. Default: False.
        """
        scenario_id = kwargs.get('scenario_id')
        if scenario_id is None:
            raise RunException('Scenario ID was not specified.')
        auth_token = kwargs.get('auth_token')
        if auth_token is None:
            raise RunException('Authorization token was not specified.')
        host = kwargs.get('host', DEFAULT_HOSTNAME)
        api_root = kwargs.get('api_path', DEFAULT_API_ROOT)
        use_HTTPS = kwargs.get('use_HTTPS', False)
        force = kwargs.get('force', False)
        verbose = kwargs.get('verbose', False)

        self.checkMetadata()
        self.param_const, self.param_db = self._init_paramdb()
        self.paths = RHESSysPaths(self.context.projectDir,
                                  self.metadata['rhessys_dir'])

        gi_scenario_base = 'gi_scenario'
        gi_scenario_data = "{0}.geojson".format(gi_scenario_base)
        scenario_geojson_path = os.path.join(self.context.projectDir,
                                             gi_scenario_data)
        gi_scenario_soils_base = "{0}_wsoils".format(gi_scenario_base)
        gi_scenario_soils = "{0}.geojson".format(gi_scenario_soils_base)
        scenario_soils_geojson_path = os.path.join(self.context.projectDir,
                                                   gi_scenario_soils)
        gi_scenario_landuse_base = "{0}_landuse".format(gi_scenario_base)
        gi_scenario_landuse = "{0}.geojson".format(gi_scenario_landuse_base)
        scenario_landuse_geojson_path = os.path.join(self.context.projectDir,
                                                     gi_scenario_landuse)
        gi_scenario_data_key = 'gi_scenario_data'
        gi_scenario_soils_data_key = "{0}_soils".format(gi_scenario_data_key)
        gi_scenario_landuse_data_key = "{0}_landuse".format(
            gi_scenario_data_key)
        if gi_scenario_data_key in self.metadata:
            if verbose:
                self.outfp.write('Existing GI scenario found.\n')
            if force:
                if verbose:
                    self.outfp.write(
                        'Force option specified, overwriting existing GI scenario.\n'
                    )
                if os.path.exists(scenario_geojson_path):
                    os.unlink(scenario_geojson_path)
                if os.path.exists(scenario_soils_geojson_path):
                    os.unlink(scenario_soils_geojson_path)
                if os.path.exists(scenario_landuse_geojson_path):
                    os.unlink(scenario_landuse_geojson_path)
            else:
                raise RunException('Exiting.  Use force option to overwrite.')

        if verbose:
            output = None
        else:
            output = open('/dev/null')
        try:
            # Connect to GI Notebook and fetch GI instance information (in GeoJSON format)
            # for this scenario ID.
            if verbose:
                self.outfp.write(
                    "\nDownloading GI scenario {0} from GI database...\n".
                    format(scenario_id))
            nb = GINotebook(hostname=host,
                            api_root=api_root,
                            use_https=use_HTTPS,
                            auth_token=auth_token)
            scenario = nb.get_scenario(scenario_id)
            scenario_geojson = scenario.get_instances_as_geojson(indent=2,
                                                                 shorten=True)
            (gi_scenario_data_wgs84, scenario_geojson_wgs84_path), (gi_scenario_data, scenario_geojson_path) = \
                self._write_geojson_and_reproject(scenario_geojson, gi_scenario_base, verbose=verbose, output=output)

            # Filter out instances that do not contain soils data
            gi_scenario_soils_base = "{0}_wsoils".format(gi_scenario_base)
            scenario_geojson_wsoils = scenario.get_instances_as_geojson(
                indent=2,
                shorten=True,
                filter=lambda a: a.get('e_1_pedid') is not None)
            (gi_scenario_soils_wgs84, scenario_soils_geojson_wgs84_path), (gi_scenario_soils, scenario_soils_geojson_path) = \
                self._write_geojson_and_reproject(scenario_geojson_wsoils, gi_scenario_soils_base,
                                                  verbose=verbose, output=output)

            # Import scenario GeoJSON into GRASS
            self._import_vector_into_grass(scenario_geojson_path,
                                           gi_scenario_data_key,
                                           force=force,
                                           verbose=verbose,
                                           output=output)

            # Import scenario (instances with soils data) GeoJSON into GRASS
            self._import_vector_into_grass(scenario_soils_geojson_path,
                                           gi_scenario_soils_data_key,
                                           force=force,
                                           verbose=verbose,
                                           output=output)

            # Generate raster layers from vector-based GI Scenario
            # Raster for updating soil type
            self._rasterize(gi_scenario_soils_data_key,
                            gi_scenario_soils_data_key,
                            column='e_1_pedid',
                            labelcolumn='e_1_pednm',
                            rast_title='GI soil types',
                            verbose=verbose,
                            force=force,
                            redir_fp=output)
            # Raster for updating stratum type
            gi_scenario_strata = "gi_scenario_strata"
            self._rasterize(gi_scenario_data_key,
                            gi_scenario_strata,
                            column='e_1_vegid',
                            labelcolumn='e_1_vegnm',
                            rast_title='GI vegetation types',
                            verbose=verbose,
                            force=force,
                            redir_fp=output)

            # Raster for updating land use
            # Filter out instances that are not rain gardens (i.e. the only GI type for which we currently have a
            #   land use).
            scenario_geojson_landuse = scenario.get_instances_as_geojson(
                indent=2,
                shorten=True,
                filter=lambda a: a.get('type', '') == 'Rain Garden')
            (gi_scenario_landuse_wgs84, scenario_landuse_geojson_wgs84_path), \
            (gi_scenario_landuse, scenario_landuse_geojson_path) = \
                self._write_geojson_and_reproject(scenario_geojson_landuse, gi_scenario_landuse_base,
                                                  verbose=verbose, output=output)
            # Import land use (i.e. instances that are rain gardens) GeoJSON into GRASS
            self._import_vector_into_grass(scenario_landuse_geojson_path,
                                           gi_scenario_landuse_data_key,
                                           force=force,
                                           verbose=verbose,
                                           output=output)

            # Search for raster value for rain gardens in RHESSys parameter DB
            rg_name = 'raingarden'
            rg_found = self.param_db.search(
                self.param_const.SEARCH_TYPE_HIERARCHICAL, 'landuse', rg_name,
                None, None, None, None, None, None, None, None)
            if not rg_found:
                raise RunException(
                    "Unable to find raingarden landuse class in parameter database"
                )

            rg_id = [c[1][2] for c in self.param_db.classes.iteritems()][0]

            # Generate raster layer from vector-based GI Scenario
            # Raster for updating landuse type
            self._rasterize_single_value(gi_scenario_landuse_data_key,
                                         gi_scenario_landuse_data_key,
                                         value=rg_id,
                                         label=rg_name,
                                         rast_title='GI landuse types',
                                         verbose=verbose,
                                         force=force,
                                         redir_fp=output)

            # Write out updated landuse, stratum, and soil rasters and parameter definitions
            # Backup landuse raster
            self._backup_raster(self.grassMetadata['landuse_rast'])
            # Update landuse raster
            self._update_raster(self.grassMetadata['landuse_rast'],
                                gi_scenario_landuse_data_key)
            # Generate parameter definition file for landuse raster
            self._generate_parameter_definitions_for_raster(
                self.grassMetadata['landuse_rast'], 'landuse', verbose=verbose)
            # Backup stratum raster
            self._backup_raster(self.grassMetadata['stratum_rast'])
            # Update stratum raster
            self._update_raster(self.grassMetadata['stratum_rast'],
                                gi_scenario_strata)
            # Generate parameter definition file for stratum raster
            self._generate_parameter_definitions_for_raster(
                self.grassMetadata['stratum_rast'], 'stratum', verbose=verbose)
            # Backup soils raster
            self._backup_raster(self.grassMetadata['soil_rast'])
            # Update soils raster
            self._update_raster(self.grassMetadata['soil_rast'],
                                gi_scenario_soils_data_key)
            # Generate parameter definition file for soil raster
            self._generate_parameter_definitions_for_raster(
                self.grassMetadata['soil_rast'], 'soil', verbose=verbose)
            # Write metadata
            RHESSysMetadata.writeGRASSEntry(
                self.context, "{0}_rast".format(gi_scenario_landuse_data_key),
                gi_scenario_landuse_data_key)
            RHESSysMetadata.writeGRASSEntry(
                self.context, "{0}_rast".format(gi_scenario_soils_data_key),
                gi_scenario_soils_data_key)
            RHESSysMetadata.writeGRASSEntry(
                self.context, "{0}_rast".format(gi_scenario_strata),
                gi_scenario_strata)

            RHESSysMetadata.writeGRASSEntry(
                self.context, "{0}_vect".format(gi_scenario_data_key),
                gi_scenario_data_key)
            RHESSysMetadata.writeGRASSEntry(
                self.context, "{0}_vect".format(gi_scenario_soils_data_key),
                gi_scenario_soils_data_key)
            RHESSysMetadata.writeGRASSEntry(
                self.context, "{0}_vect".format(gi_scenario_landuse_data_key),
                gi_scenario_landuse_data_key)
            RHESSysMetadata.writeRHESSysEntry(self.context,
                                              gi_scenario_data_key,
                                              gi_scenario_data)

            if verbose:
                self.outfp.write('\n\nFinished parameterizing GI.\n')

            # Write processing history
            RHESSysMetadata.appendProcessingHistoryItem(
                self.context, RHESSysMetadata.getCommandLine())

        finally:
            if output:
                output.close()