Пример #1
0
    def __init__(self, epsg='5514'):
        ###########
        self.file_type = None
        self.grass_layer_types = {}

        gisdb = os.path.join(tempfile.gettempdir(), 'grassdata')
        if not os.path.isdir(gisdb):
            os.mkdir(gisdb)

        # location/mapset: use random names for batch jobs
        string_length = 16
        location = binascii.hexlify(os.urandom(string_length))
        mapset   = 'PERMANENT'
        location_path = os.path.join(gisdb, location)
        temp_dir = gisdb

        # Create new location
        # GRASS session must be initialized first
        gsetup.init(os.environ['GISBASE'], gisdb, location, mapset)
        try:
            gscript.create_location(gisdb, location, epsg, overwrite=True)
        except ScriptError as e:
            raise ErosionError('{}'.format(e))

        # Be quiet, print only error messages
        os.environ['GRASS_VERBOSE'] = '0'
Пример #2
0
def worker_sun(cpu, julian_seed, step, demr, ow):
    mtemp = 'temp' + str(cpu).zfill(2)
    gsetup.init(gisbase, gisdbase, location, mtemp)
    set_region(bregion, C)

    # Input Maps
    if (demr == 'dem'):
        elevdem = dem + '@PERMANENT'
        horr = demhor
    else:
        elevdem = can + '@PERMANENT'
        horr = canhor

    # Run r.sun for each week of the year 366
    for doy in range(julian_seed, 366, step):  # 366 normal max day of year
        day = str(doy).zfill(3)
        linke = linke_interp(doy, linke_array)
        # Output maps
        beam = P + demr + day + 'beam'
        diff = P + demr + day + 'diff'
        refl = P + demr + day + 'refl'
        dur = P + demr + day + 'dur'
        #glob = P+demr+day+'glob'
        grass.run_command("r.sun", flags="s", elevin=elevdem, albedo=albedo, \
                            horizonstep=hstep, \
                            beam_rad=beam, insol_time=dur, \
                            diff_rad=diff, refl_rad=refl, \
                            day=doy, step=timestep, \
                            lin=linke, overwrite=ow)
Пример #3
0
    def __init__(self):

        # create temp GRASS location
        import tempfile
        import binascii
        import grass.script as gs
        from grass.script import setup as gsetup

        # path to temp location
        gisdb = os.path.join(tempfile.gettempdir(), 'grassdata')
        if not os.path.isdir(gisdb):
            os.mkdir(gisdb)

        # location: use random names for batch jobs
        string_length = 16
        location = binascii.hexlify(os.urandom(string_length)).decode("utf-8")

        # initialize GRASS session
        gsetup.init(os.environ['GISBASE'], gisdb, location, 'PERMANENT')

        # create location
        try:
            gs.create_location(gisdb, location, epsg='5514', overwrite=True)
        except SmoderpError as e:
            raise SmoderpError('{}'.format(e))

        # test GRASS env varible
        if not os.getenv('GISRC'):
            raise SmoderpError('GRASS not found.')

        super().__init__()
Пример #4
0
def function(pa):
 if pa not in pa_list_done:
  mymapset = 'm'+str(pa)
  spn00= str(GRASSDBASE)+'/'+str(MYLOC)+'/PERMANENT/DEFAULT_WIND'
  spn0x= str(GRASSDBASE)+'/'+str(MYLOC)+'/'+str(mymapset)
  spn01= str(GRASSDBASE)+'/'+str(MYLOC)+'/'+str(mymapset)+'/WIND'
  spn= str(GRASSDBASE)+'/'+str(MYLOC)+'/'+str(mymapset)+'/SEARCH_PATH'
  comm0 = 'mkdir '+spn0x
  comm = 'cp '+spn00+' '+spn01
  os.system(comm0)
  os.system(comm)
  wb = open(spn,'a')
  wb.write('PERMANENT')
  wb.write('\n') 
  wb.write('user1')
  wb.write('\n')
  wb.write(str(mymapset))
  wb.write('\n')
  wb.close()

  gsetup.init(GISBASE, GRASSDBASE, MYLOC, mymapset)
  pa0 = 'v0_'+pa
  opt1 = 'NAME=\''+pa+'\''
  grass.run_command('v.extract', input=source, out=pa0, where=opt1,overwrite=True)
  grass.run_command('g.region',vect=pa0)
  pa5 = pa+'.tif'
  grass.run_command('r.mask', vector=pa0)
  opt2 = pa+'= const'
  grass.run_command('r.mapcalc',expression=opt2,overwrite=True)
  grass.run_command('r.out.gdal',input=pa,out=pa5)

  print "Done:"+pa
  comm1 = 'rm -rf '+spn0x
  os.system(comm1)
Пример #5
0
 def initialize_GRASS(self):
   if self.location:
     if not self.quiet:
       print "Using GRASS location", self.location
   else:
     sys.exit("Must define a GRASS GIS location.")
   # Implicitly 
   os.environ['GISBASE'] = self.gisbase
   gisdbase = os.path.join(os.environ['HOME'], self.grassdata_dir)
   sys.path.append(os.path.join(os.environ['GISBASE'], "etc", "python"))
   import grass.script as gr
   import grass.script.setup as gsetup
   gsetup.init(self.gisbase, gisdbase, self.location, self.mapset)
   from grass.script import array as garray
   self.gr = gr
   self.garray = garray
   if self.north is None and self.south is None and self.west is None and self.east is None:
     pass
   elif self.north is None or self.south is None or self.west is None or self.east is None:
     sys.exit('Incomplete description of edge values')
   else:
     self.gr.run_command('g.region', n=self.north, s=self.south, w=self.west, e=self.east)
     # Then apply the desired resolution.
     # This won't be *quite* a square grid, but will be close.
     if self.dx and self.dy:
       self.gr.run_command('g.region', ewres=self.dx, nsres=self.dy)
     else:
       if not self.quiet:
         print "dx and dy not both defined: not updating grid resolution."
   self.gr.run_command('g.region', save='IceFlowRegion', overwrite=True) # Save it
Пример #6
0
        def clip_and_union(la, lb, cell, work, ref, proc, output):
            # Start GRASS GIS Session
            grsbase = run_grass(work, location="proc_" + str(proc), srs=ref)
            import grass.script.setup as gsetup
            gsetup.init(grsbase, work, "proc_" + str(proc), 'PERMANENT')

            # Import GRASS GIS modules
            from gasp.to.shp.grs import shp_to_grs
            from gasp.to.shp.grs import grs_to_shp

            # Add data to GRASS
            a = shp_to_grs(la, get_filename(la), asCMD=True)
            b = shp_to_grs(lb, get_filename(lb), asCMD=True)
            c = shp_to_grs(cell, get_filename(cell), asCMD=True)

            # Clip
            a_clip = clip(a, c, "{}_clip".format(a), api_gis="grass_cmd")
            b_clip = clip(b, c, "{}_clip".format(b), api_gis="grass_cmd")

            # Union
            u_shp = union(a_clip,
                          b_clip,
                          "un_{}".format(c),
                          api_gis="grass_cmd")

            # Export
            o = grs_to_shp(u_shp, output, "area")
def start_grass_session(crs=None):
    """Starts a GRASS session, provided it has been setup before (see
    setup_grass()). This will only search for GRASS projects located in
    Grass.path, which by default is a subdirectory of the provided data
    directory!

    :param crs: EPSG code the GRASS project was set up in (e.g.
        '32629'). This parameter is used to identify automatically generated
        GRASS projects that contain the EPSG code in their name. [str]

    :returns: GRASS session
    """
    ## If no crs is provided, look for a GRASS project starting with
    ## 'GRASS_db_' in the GRASS location (Grass.path). By design there
    ## should be only one project.
    if crs is None:
        res = [x for x in os.listdir(Grass.path) if re.search('GRASS_db_', x)]
        project_name = res[0]

    else:
        location = os.path.join(Grass.path, f'GRASS_db_{crs}')
        if not os.path.isdir(location):
            raise ImportError(
                f"A GRASS Location with the name 'GRASS_db_{crs}' has not "
                f"been set up yet.")
        else:
            project_name = f'GRASS_db_{crs}'

    gisbase = get_grass_gisbase()
    gisdb = Grass.path
    mapset = 'PERMANENT'

    gsetup.init(gisbase, gisdb, project_name, mapset)

    print(f"~~ Current GRASS GIS environment: \n {gscript.gisenv()}")
Пример #8
0
def setup_wrkspace(gisdbase, ccr_grassrc, geo_file):
    """Setup GRASS workspace and modify windows path for GRASS GDAL"""
    lm_util.gprint("Creating GRASS workspace")
    gisbase = cc_env.gisbase
    location = "gcwd"
    mapset = "PERMANENT"

    os.environ['GISRC'] = ccr_grassrc
    os.environ['LD_LIBRARY_PATH'] = os.path.join(gisbase, "lib")
    os.environ['GRASS_SH'] = os.path.join(gisbase, "msys", "bin", "sh.exe")

    try:
        grass.create_location(gisdbase, location, filename=geo_file)
    except:
        cc_util.gdal_fail_check()
        arcpy.AddWarning("GRASS ERROR. Try rebooting and restarting ArcGIS.")
        arcpy.AddWarning("If that doesn't work you can try using ")
        arcpy.AddWarning("the 'CC Run Script.py' python script in the ")
        arcpy.AddWarning("demo directory where the Linkage Mapper toolbox")
        arcpy.AddWarning("is installed instead of ArcGIS to call the tool")
        arcpy.AddWarning("(see user guide).")
        raise Exception("GRASS ERROR: Cannot create workspace.")
    gsetup.init(gisbase, gisdbase, location, mapset)
    run_grass_cmd("g.gisenv", set="OVERWRITE=1")
    os.environ['GRASS_VERBOSE'] = "0"  # Only errors and warnings are printed
Пример #9
0
def worker_sun(cpu,julian_seed,step,demr,ow):
    mtemp = 'temp'+str(cpu).zfill(2)
    gsetup.init(gisbase, gisdbase, location, mtemp)
    set_region(bregion,C)
    
    # Input Maps
    if(demr == 'dem'):
        elevdem = dem+'@PERMANENT'
        horr = demhor
    else:
        elevdem = can+'@PERMANENT'
        horr = canhor

    # Run r.sun for each week of the year 366
    for doy in range(julian_seed,366,step): # 366 normal max day of year
        day = str(doy).zfill(3)
        linke = linke_interp(doy,linke_array)
        # Output maps
        beam = P+demr+day+'beam'
        diff = P+demr+day+'diff'
        refl = P+demr+day+'refl'
        dur = P+demr+day+'dur'
        #glob = P+demr+day+'glob'
        grass.run_command("r.sun", flags="s", elevin=elevdem, albedo=albedo, \
                            horizonstep=hstep, \
                            beam_rad=beam, insol_time=dur, \
                            diff_rad=diff, refl_rad=refl, \
                            day=doy, step=timestep, \
                            lin=linke, overwrite=ow) 
Пример #10
0
def grass_setup():
    """
    this function initializes the GRASS session and creates the mapset with the user-specified variables
    """
    user_data()
    location_name = GrassData.location_name
    crs = GrassData.crs

    grassbin = GRASSBIN_import()
    if grassbin == "grass7bin_win":
        print("You're using Windows, this module most likely will not work properly, please use a linux-based OS!!!")
    os.environ['GRASSBIN'] = grassbin
    gisbase = get_grass_gisbase()
    os.environ['GISBASE'] = gisbase
    sys.path.append(os.path.join(os.environ['GISBASE'], 'bin'))
    sys.path.append(os.path.join(os.environ['GISBASE'], 'lib'))
    sys.path.append(os.path.join(os.environ['GISBASE'], 'scripts'))
    sys.path.append(os.path.join(os.environ['GISBASE'], 'etc', 'python'))

    # set folder to proj_lib:
    os.environ['PROJ_LIB'] = '/usr/share/proj'

    gisdb = Paths.grass_path
    mapset = "PERMANENT"
    ##################################################################################
    # open a GRASS session and create the mapset if it does not yet exist
    with Session(gisdb=gisdb,
                 location=GrassData.location_name,
                 create_opts='EPSG:' + crs):
        pass
    ##################################################################################
    # launch session
    gsetup.init(gisbase, gisdb, location_name, mapset)
    print(f"Current GRASS GIS 7 environment: {gscript.gisenv()}")
Пример #11
0
def matrix_od(origins, destinations, networkShp, speedLimitCol, onewayCol,
              grsWorkspace, grsLocation, outputShp):
    """
    Produce matrix OD using GRASS GIS
    """

    from glass.pys.oss import fprop
    from glass.g.wenv.grs import run_grass

    # Open an GRASS GIS Session
    gbase = run_grass(grsWorkspace,
                      grassBIN="grass76",
                      location=grsLocation,
                      srs=networkShp)

    import grass.script as grass
    import grass.script.setup as gsetup

    gsetup.init(gbase, grsWorkspace, grsLocation, 'PERMANENT')

    # Import GRASS GIS Module
    from glass.g.it.shp import shp_to_grs, grs_to_shp

    # Add Data to GRASS GIS
    rdvMain = shp_to_grs(networkShp, fprop(networkShp, 'fn', forceLower=True))
    """Get matrix distance:"""
    MATRIX_OD = prod_matrix(origins, destinations, rdvMain, speedLimitCol,
                            onewayCol)

    return grs_to_shp(MATRIX_OD, outputShp, "line", lyrN=3)
Пример #12
0
def hexagrid(gisbase,gisdb, mapset, location="cea",radius=15000):
    import grass
    reload(grass)
    import grass.script as gscript
    import grass.script.setup as gsetup
    gsetup.init(gisbase,
            gisdb, location, mapset)
    radius=int(radius)
    if radius==0:
        radius = 10000
    radius2 = radius*2
    gscript.run_command('v.proj',location='ll',input='sample',output='sample',overwrite=True,quiet=True)
    gscript.run_command('g.region',vect='sample',quiet=True)
    gscript.run_command('g.region',n='n+%d' % radius2 ,e='e+%d' % radius2, \
            w='w-%d' % radius2,s='s-%d' % radius2,quiet=True)
    gscript.run_command('v.mkgrid',flags='h',map='grid',box=(radius,radius),overwrite=True,quiet=True)
    gscript.run_command('v.out.ogr',input='sample',output='sample_ease',overwrite=True,quiet=True) 
    gscript.run_command('v.out.ogr',input='grid',output='grid_ease',overwrite=True,quiet=True)
    gscript.run_command('v.db.addcolumn',map='sample',column='cellid integer',quiet=True)
    gscript.run_command('v.what.vect',map='sample',column='cellid',query_map='grid',query_column='cat',quiet=True)
    result = gscript.read_command('db.select',sql='select * from sample') 
    with open('result.csv','w') as t:
        t.write(result)
        t.close()
    s = gscript.read_command('db.select', flags='c', \
            sql='select cellid from sample where cellid is not null')
    a = set(s.split('\n'))
    a.discard('')
    b = str(','.join(str(e) for e in a))
    gscript.run_command('v.extract',input='grid',output='subgrid', where="cat in (%s)" % b,overwrite=True,quiet=True)
    gscript.run_command('v.out.ogr',input='subgrid',output='subgrid_ease',overwrite=True,quiet=True,format="ESRI_Shapefile")
Пример #13
0
def working_mapset(gisdb_path,location_name,mapset_name):
    """Launch GRASS GIS working session in the mapset"""
    if os.path.exists(os.path.join(gisdb_path,location_name,mapset_name)):
        gsetup.init(os.environ['GISBASE'], gisdb_path,location_name,mapset_name)
        print "You are now working in mapset '%s'"%mapset_name
    else: 
        print "'%s' mapset doesn't exists in '%s'"%(mapset_name, gisdb_path)
Пример #14
0
def fsegm(pa):

 ### mp.current_process().cnt += 1
 current = multiprocessing.current_process()
 mn = current._identity[0]
 print 'running:', mn

 GISBASE = os.environ['GISBASE'] = "/home/majavie/hierba_hanks/grass-7.1.svn"
 GRASSDBASE = "/home/majavie/hanksgrass7"
 MYLOC = "global_MW"
 mapset = 'm'
 sys.path.append(os.path.join(os.environ['GISBASE'], "etc", "python"))
 import grass.script as grass
 import grass.script.setup as gsetup
 gsetup.init(GISBASE, GRASSDBASE, MYLOC, mapset)

 mapset2 = 'm'+str(mn)#ehabitat'
 os.system ('rm -rf /home/majavie/hanksgrass7/global_MW/'+mapset2)
 grass.run_command('g.mapset',mapset=mapset2,location='global_MW',gisdbase='/home/majavie/hanksgrass7',flags='c')

 gsetup.init(GISBASE, GRASSDBASE, MYLOC, mapset2)
 print mapset2, grass.gisenv()
 print pa
 grass.run_command('g.mapsets',mapset='ehabitat,rasterized_parks',operation='add')
 grass. message ("Deleting tmp layers")
 os.system ('rm -rf /home/majavie/hanksgrass7/global_MW/'+mapset2)
 gc.collect()
Пример #15
0
def matrix_od(origins, destinations, networkShp, speedLimitCol, onewayCol,
              grsWorkspace, grsLocation, outputShp):
    """
    Produce matrix OD using GRASS GIS
    """

    from gasp.oss import get_filename
    from gasp.session import run_grass

    # Open an GRASS GIS Session
    gbase = run_grass(grsWorkspace,
                      grassBIN="grass74",
                      location=grsLocation,
                      srs=networkShp)

    import grass.script as grass
    import grass.script.setup as gsetup

    gsetup.init(gbase, grsWorkspace, grsLocation, 'PERMANENT')

    # Import GRASS GIS Module
    from gasp.to.shp.grs import shp_to_grs

    # Add Data to GRASS GIS
    rdvMain = shp_to_grs(networkShp, get_filename(networkShp, forceLower=True))
    """Get matrix distance:"""
    MATRIX_OD = prod_matrix(origins, destinations, rdvMain, speedLimitCol,
                            onewayCol)

    return grass_converter(MATRIX_OD, outputShp, geom_type="line", lyrN=3)
Пример #16
0
    def gsetup(self):
        path = os.path.join(self.gisbase, 'etc', 'python')
        sys.path.append(path)
        os.environ['PYTHONPATH'] = ':'.join(sys.path)

        import grass.script.setup as gsetup
        gsetup.init(self.gisbase, self.gisdb, self.location, self.mapset)
Пример #17
0
def setup_wrkspace(gisdbase, ccr_grassrc, geo_file):
    """Configure GRASS workspace."""
    lm_util.gprint("Creating GRASS workspace")
    gisbase = cc_env.gisbase
    location = "gcwd"
    mapset = "PERMANENT"

    os.environ['GISRC'] = ccr_grassrc
    os.environ['LD_LIBRARY_PATH'] = os.path.join(gisbase, "lib")
    os.environ['GRASS_SH'] = os.path.join(gisbase, "msys", "bin", "sh.exe")

    try:
        grass.create_location(gisdbase, location, filename=geo_file)
    except grass.ScriptError:
        warn_msg = ("Cannot create GRASS workspace.\n"
                    "Try rebooting and restarting ArcGIS. If that doesn't\n"
                    "work you can try using the 'cc_demo.py' python script\n"
                    "in the demo/demo_scripts/ directory where the Linkage\n"
                    "Mapper toolbox is installed instead of ArcGIS to call\n"
                    "the tool (see user guide).")
        raise Exception(warn_msg)

    gsetup.init(gisbase, gisdbase, location, mapset)
    run_grass_cmd("g.gisenv", set="OVERWRITE=1")
    os.environ['GRASS_VERBOSE'] = "0"  # Only errors and warnings are printed
Пример #18
0
    def gsetup(self):
        path = os.path.join(self.gisbase, 'etc', 'python')
        sys.path.append(path)
        os.environ['PYTHONPATH'] = ':'.join(sys.path)

        import grass.script.setup as gsetup
        gsetup.init(self.gisbase, self.gisdb, self.location, self.mapset)
Пример #19
0
def setup_wrkspace(gisdbase, ccr_grassrc, geo_file):
    """Setup GRASS workspace and modify windows path for GRASS GDAL"""
    lm_util.gprint("Creating GRASS workspace")
    gisbase = cc_env.gisbase
    location = "gcwd"
    mapset = "PERMANENT"

    os.environ['GISRC'] = ccr_grassrc
    os.environ['LD_LIBRARY_PATH'] = os.path.join(gisbase, "lib")
    os.environ['GRASS_SH'] = os.path.join(gisbase, "msys", "bin", "sh.exe")

    try:
        grass.create_location(gisdbase, location, filename=geo_file)
    except:
        cc_util.gdal_fail_check()
        arcpy.AddWarning("GRASS ERROR. Try rebooting and restarting ArcGIS.")
        arcpy.AddWarning("If that doesn't work you can try using ")
        arcpy.AddWarning("the 'CC Run Script.py' python script in the ")
        arcpy.AddWarning("demo directory where the Linkage Mapper toolbox")
        arcpy.AddWarning("is installed instead of ArcGIS to call the tool")
        arcpy.AddWarning("(see user guide).")
        raise Exception("GRASS ERROR: Cannot create workspace.")
    gsetup.init(gisbase, gisdbase, location, mapset)
    run_grass_cmd("g.gisenv", set="OVERWRITE=1")
    os.environ['GRASS_VERBOSE'] = "0"  # Only errors and warnings are printed
Пример #20
0
def Cross(gisbase,gisdb, mapset, location="cea", vector_name="grid", point_name="sample", group=None):
    import grass
    reload(grass)
    import grass.script as gscript
    import grass.script.setup as gsetup
    gsetup.init(gisbase,
            gisdb, location, mapset)
    suffix=""
    if location=="cea":
        suffix="_ease"
    gscript.run_command('v.out.ogr',input=point_name,output=point_name+suffix,overwrite=True,quiet=True) 
    gscript.run_command('v.out.ogr',input=vector_name,output=vector_name+suffix,overwrite=True,quiet=True,flags='m')
    gscript.run_command('v.db.addcolumn',map='sample',column='cellid integer',quiet=True)
    gscript.run_command('v.db.addcolumn',map='sample',column=group+ " VARCHAR(10)",quiet=True)
    gscript.run_command('v.what.vect',map='sample',column='cellid',query_map=vector_name,query_column='cat',quiet=True)
    if group:
        gscript.run_command('v.what.vect',map='sample',column=group,query_map=vector_name,query_column=group,quiet=True)
    result = gscript.read_command('db.select',sql='select * from '+point_name) 
    with open('result.csv','w') as t:
        t.write(result)
        t.close()
    s = gscript.read_command('db.select', flags='c', \
            sql='select cellid from sample where cellid is not null')
    a = set(s.split('\n'))
    a.discard('')
    b = str(','.join(str(e) for e in a))
    subname='sub'+vector_name
    gscript.run_command('v.extract',input=vector_name,output=subname, where="cat in (%s)" % b,overwrite=True,quiet=True)
    gscript.run_command('v.out.ogr',input=subname,output=subname+suffix,overwrite=True,quiet=True,flags="m",format="ESRI_Shapefile")
Пример #21
0
def preprocessing(localpath,mapset,canr,ow):
    gsetup.init(gisbase, gisdbase, location, mapset)
    set_region(bregion,C)
    
    # Canopy Raster - 2nd test
    boocan = raster_exists(canr,mapset)
    if(boocan == False):
        str_error = "Canopy raster does not exist. Please run ssr_lidar.py first"
        return str_error
    print 'canopy rester exists: ',boocan
    
    # Regrid from Input Raster to Target Cell size
    if(demsource != dem):
        grass.run_command("r.resample",input=demsource,output=dem,overwrite=ow)
    if(canr != can):
        grass.run_command("r.resample",input=canr,output=can,overwrite=ow)
    
    # Slope and Aspect
    grass.run_command("r.slope.aspect", elevation=dem, slope=sloped, \
                        aspect=aspectd, prec="float", zfactor=1, overwrite=ow)
    grass.run_command("r.slope.aspect", elevation=can, slope=slopec, \
                        aspect=aspectc, prec="float", zfactor=1, overwrite=ow)
    
    # Vegetation height
    grass.mapcalc("$vegheight = $can - $dem", overwrite = ow, \
                    vegheight = vegheight, can = can, dem = dem)
    # Albedo
    albedofile = localpath+'albedo_recode.txt'
    grass.run_command("r.recode",flags="a",input=vegheight,output=albedo,\
                        rules=albedofile, overwrite=ow)
    # return to main
    str_result = 'Preprocessing: completed successfully using canopy raster: ',canr
    return str_result
Пример #22
0
    def run_viewshed_by_cpu(tid, obs, dem, output,
        vis_basename='vis', maxdst=None, obselevation=None):

        # Create GRASS GIS location
        loc_name = 'loc_' + str(tid)
        gbase = run_grass(output, location=loc_name, srs=dem)

        # Start GRASS GIS Session
        import grass.script as grass
        import grass.script.setup as gsetup
        gsetup.init(gbase, output, loc_name, 'PERMANENT')

        from glass.g.it.rst   import rst_to_grs, grs_to_rst
        from glass.g.rst.surf import grs_viewshed

        # Send DEM to GRASS GIS
        grs_dem = rst_to_grs(dem, 'grs_dem', as_cmd=True)
    
        # Produce Viewshed for each point in obs
        for idx, row in obs.iterrows():
            vrst = grs_viewshed(
                grs_dem, (row.geometry.x, row.geometry.y),
                '{}_{}'.format(vis_basename, str(row[obs_id])),
                max_dist=maxdst, obs_elv=obselevation
            )
        
            frst = grs_to_rst(vrst, os.path.join(output, vrst + '.tif'))
Пример #23
0
def MakeHexagrid(gisbase,
                 gisdb,
                 mapset,
                 location="cea",
                 radius=15000,
                 point_name="sample",
                 point_loc="ll"):
    import grass
    reload(grass)
    import grass.script as gscript
    import grass.script.setup as gsetup
    gsetup.init(gisbase, gisdb, location, mapset)
    radius = int(radius)
    if radius == 0:
        radius = 10000
    radius2 = radius * 2
    gscript.run_command('v.proj',
                        location=point_loc,
                        input=point_name,
                        output='sample',
                        overwrite=True,
                        quiet=True)
    gscript.run_command('g.region', vect='sample', quiet=True)
    gscript.run_command('g.region',n='n+%d' % radius2 ,e='e+%d' % radius2, \
            w='w-%d' % radius2,s='s-%d' % radius2,quiet=True)
    gscript.run_command('v.mkgrid',
                        flags='h',
                        map='grid',
                        box=(radius, radius),
                        overwrite=True,
                        quiet=True)
Пример #24
0
 def initialize_GRASS(self):
   if self.location:
     if not self.quiet:
       print "Using GRASS location", self.location
   else:
     sys.exit("Must define a GRASS GIS location.")
   # Implicitly 
   os.environ['GISBASE'] = self.gisbase
   gisdbase = os.path.join(os.environ['HOME'], self.grassdata_dir)
   sys.path.append(os.path.join(os.environ['GISBASE'], "etc", "python"))
   import grass.script as gr
   import grass.script.setup as gsetup
   gsetup.init(self.gisbase, gisdbase, self.location, self.mapset)
   from grass.script import array as garray
   self.gr = gr
   self.garray = garray
   if self.north is None and self.south is None and self.west is None and self.east is None:
     pass
   elif self.north is None or self.south is None or self.west is None or self.east is None:
     sys.exit('Incomplete description of edge values')
   else:
     self.gr.run_command('g.region', n=self.north, s=self.south, w=self.west, e=self.east)
     # Then apply the desired resolution.
     # This won't be *quite* a square grid, but will be close.
     if self.dx and self.dy:
       self.gr.run_command('g.region', ewres=self.dx, nsres=self.dy)
     else:
       if not self.quiet:
         print "dx and dy not both defined: not updating grid resolution."
   self.gr.run_command('g.region', save='IceFlowRegion', overwrite=True) # Save it
Пример #25
0
def shp_to_shp(inshp, outshp, gisApi='ogr', supportForSpatialLite=None):
    """
    Convert a vectorial file to another with other file format
    
    API's Available:
    * ogr;
    * grass;
    
    When using gisApi='ogr' - Set supportForSpatialLite to True if outShp is
    a sqlite db and if you want SpatialLite support for that database.
    """

    if gisApi == 'ogr':
        from glass.pys import execmd
        from glass.g.prop import drv_name

        out_driver = drv_name(outshp)

        if out_driver == 'SQLite' and supportForSpatialLite:
            splite = ' -dsco "SPATIALITE=YES"'
        else:
            splite = ''

        cmd = 'ogr2ogr -f "{drv}" {out} {_in}{lite}'.format(drv=out_driver,
                                                            out=outshp,
                                                            _in=inshp,
                                                            lite=splite)

        # Run command
        cmdout = execmd(cmd)

    elif gisApi == 'grass':
        # TODO identify input geometry type

        import os
        from glass.pys.oss import fprop
        from glass.g.wenv.grs import run_grass
        from glass.g.prop.prj import get_epsg

        # Start GRASS GIS Session
        ws = os.path.dirname(outshp)
        loc = f'loc_{fprop(outshp, "fn")}'
        epsg = get_epsg(inshp)

        gbase = run_grass(ws, location=loc, srs=epsg)

        import grass.script.setup as gsetup

        gsetup.init(gbase, ws, loc, 'PERMANENT')

        from glass.g.it.shp import grs_to_shp, shp_to_grs

        gshp = shp_to_grs(inshp, fprop(inshp, 'fn'))
        grs_to_shp(gshp, outshp, 'area')

    else:
        raise ValueError('Sorry, API {} is not available'.format(gisApi))

    return outshp
Пример #26
0
def clip(inFeat, clipFeat, outFeat, api_gis="grass", clip_by_region=None):
    """
    Clip Analysis
    
    api_gis Options:
    * grass
    * pygrass
    * ogr2ogr
    """

    from glass.pys.oss import fprop

    if api_gis == "pygrass" or api_gis == "grass":
        import os
        from glass.g.wenv.grs import run_grass
        from glass.g.prop.prj import get_epsg

        epsg = get_epsg(inFeat)

        work = os.path.dirname(outFeat)
        refname = fprop(outFeat, 'fn')
        loc = f"loc_{refname}"

        grsbase = run_grass(work, location=loc, srs=epsg)

        import grass.script.setup as gsetup

        gsetup.init(grsbase, work, loc, 'PERMANENT')

        from glass.g.it.shp import shp_to_grs, grs_to_shp
        from glass.g.prop.feat import feat_count

        shp = shp_to_grs(inFeat, fprop(inFeat, 'fn'))
        clp = shp_to_grs(clipFeat, fprop(clipFeat, 'fn'))

        # Clip
        rslt = grsclip(shp,
                       clp,
                       refname,
                       cmd=True if api_gis == "grass" else None,
                       clip_by_region=clip_by_region)

        # Export
        grs_to_shp(rslt, outFeat, 'area')

    elif api_gis == 'ogr2ogr':
        from glass.pys import execmd
        from glass.g.prop import drv_name

        rcmd = execmd(
            ("ogr2ogr -f \"{}\" {} {} -clipsrc {} -clipsrclayer {}").format(
                drv_name(outFeat), outFeat, inFeat, clipFeat,
                fprop(clipFeat, 'fn')))

    else:
        raise ValueError("{} is not available!".format(api_gis))

    return outFeat
Пример #27
0
def working_mapset(gisdb_path, location_name, mapset_name):
    ## Launch GRASS GIS working session in the mapset
    if os.path.exists(os.path.join(gisdb_path, location_name, mapset_name)):
        gsetup.init(os.environ['GISBASE'], gisdb_path, location_name,
                    mapset_name)
        return "You are now working in mapset '%s/%s'" % (location_name,
                                                          mapset_name)
    else:
        return "'%s' mapset doesn't exists in '%s'" % (mapset_name, gisdb_path)
Пример #28
0
def addVec(gisbase,gisdb, mapset, pathPythonScript, dirName='terr-ecoregions-TNC/' ,fileName='tnc_terr_ecoregions',location="ll", name="Biome"):
    import grass
    reload(grass)
    import grass.script as gscript
    import grass.script.setup as gsetup
    gsetup.init(gisbase,gisdb, location, mapset)
    wdIN=os.path.dirname(os.path.abspath(pathPythonScript))
    #temp=os.path.join(wdIN,addon,dirName)
    gscript.run_command('v.in.ogr',input=dirName,layer=fileName,output=name, overwrite=True)
Пример #29
0
def remove_temp(cores): # OUTSIDE
        # setup is in the target mapset, not temp mapsets
        gsetup.init(gisbase, gisdbase, location, 'PERMANENT')
        # Delete the temp mapset
        for count in range(0,cores):
                mapset_temp = 'temp'+str(count).zfill(2)
                grass.run_command("g.mapsets", removemapset=mapset_temp)
                temp_path = gisdbase+'/'+location+'/'+mapset_temp
                shutil.rmtree(temp_path)
Пример #30
0
 def init_finish(queue):
     gs.set_capture_stderr(True)
     location = "test"
     gs.core._create_location_xy(  # pylint: disable=protected-access
         tmp_path, location)
     grass_setup.init(tmp_path / location)
     gs.run_command("g.region", flags="p")
     queue.put(os.environ["GISRC"])
     grass_setup.finish()
Пример #31
0
def test_init_finish_global_functions(tmp_path):
    """Check that init and finish global functions work"""
    location = "test"
    gs.core._create_location_xy(tmp_path, location)  # pylint: disable=protected-access
    grass_setup.init(tmp_path / location)
    gs.run_command("g.region", flags="p")
    session_file = os.environ["GISRC"]
    grass_setup.finish()

    assert not os.path.exists(session_file)
Пример #32
0
def init_grass(path, grasslib):
    """
    Initialisation of Grass GIS in lambert 93.
    
    in : 
        path : directory where create grassdata directory
        grasslib : install directory of Grass GIS
    """

    global gscript

    # Grass folder Initialisation
    if not os.path.exists(os.path.join(path, "grassdata")):
        os.mkdir(os.path.join(path, "grassdata"))
    path_grassdata = os.path.join(path, "grassdata")

    # Init Grass environment
    gisbase = os.environ['GISBASE'] = grasslib
    gisdb = os.path.join(path_grassdata)
    sys.path.append(os.path.join(os.environ["GISBASE"], "etc", "python"))
    os.environ["GISBASE"] = gisbase

    # Overwrite and verbose parameters
    os.environ["GRASS_OVERWRITE"] = "1"
    os.environ['GRASS_VERBOSE'] = '-1'

    # Grass functions import
    import grass.script.setup as gsetup
    import grass.script as gscript

    # Init Grass
    gsetup.init(gisbase, gisdb)

    # Delete existing location
    if os.path.exists(os.path.join(gisdb, "demolocation")):
        shutil.rmtree(os.path.join(gisdb, "demolocation"))

    # Create the location in Lambert 93
    gscript.run_command("g.proj",
                        flags="c",
                        epsg="2154",
                        location="demolocation")

    # Create datas mapset
    if not os.path.exists(os.path.join(gisdb, "/demolocation/datas")):
        try:
            gscript.start_command("g.mapset",
                                  flags="c",
                                  mapset="datas",
                                  location="demolocation",
                                  dbase=gisdb)
        except:
            raise Exception("Folder '%s' does not own to current user") % (
                gisdb)
Пример #33
0
def create_temp(cores,bregion,C,lf): # OUTSIDE
        gsetup.init(gisbase, gisdbase, location, 'PERMANENT')
        for count in range(0,cores,1):
                temp = 'temp'+str(count).zfill(2)
                temp_path = gisdbase+os.sep+location+os.sep+temp
                if(os.path.exists(temp_path) == False):
                        grass.run_command("g.mapset",flags="c", mapset=temp, quiet=1)
                        set_region(bregion,C)
                        printout(temp+" mapset created.",lf)
                else:
                        printout(temp+" mapset already exists. skipping...",lf)
Пример #34
0
def init_grass():
    """!Intialize GRASS session"""
    gisdbase = os.path.join(tempfile.gettempdir())
    location = "test_vfk_%d" % os.getpid()
    
    import grass.script.setup as gsetup
    
    gsetup.init(gisbase,
                gisdbase, location)
    
    grass.create_location(gisdbase, location, epsg = 2065, overwrite=True)
def connectionGrass(gisbase,
                    gisdb,
                    location="",
                    mapset="PERMANENT",
                    projection=2154):
    if location == "":
        gsetup.init(gisbase, gisdb)
    else:
        if not os.path.exists(gisdb + os.sep + location):
            grass.core.create_location(gisdb, location, projection)
        gsetup.init(gisbase, gisdb, location, mapset)
    return
Пример #36
0
def bash_matrix_od(origins, destinationShp, network, costCol, oneway, grsWork,
                   output):
    """
    Produce matrix OD using GRASS GIS - BASH MODE
    """

    from gasp.session import run_grass
    from gasp.oss import get_filename
    from gasp.oss.ops import create_folder
    from gasp.mng.split import splitShp_by_range
    from gasp.mng.gen import merge_feat

    # SPLIT ORIGINS IN PARTS
    originsFld = create_folder(os.path.join(grsWork, 'origins_parts'))

    originsList = splitShp_by_range(origins, 100, originsFld)

    # Open an GRASS GIS Session
    gbase = run_grass(grsWork,
                      grassBIN="grass76",
                      location=grsLoc,
                      srs=network)

    import grass.script as grass
    import grass.script.setup as gsetup

    RESULTS = []
    R_FOLDER = create_folder(os.path.join(grsWork, 'res_parts'))

    for e in range(len(originsList)):
        gsetup.init(gbase, grsWork, "grs_loc_{}".format(e), 'PERMANENT')

        from gasp.to.shp.grs import shp_to_grs, grs_to_shp

        # Add Data to GRASS GIS
        rdvMain = shp_to_grs(network, get_filename(network, forceLower=True))

        # Produce Matrix
        result_part = prod_matrix(originsList[e], destinationShp, rdvMain,
                                  costCol, oneway)

        # Export Result
        shp = grs_to_shp(result_part,
                         os.path.join(R_FOLDER, result_part + '.shp'),
                         geom_type="line",
                         lyrN=3)

        RESULTS.append(shp)

    merge_feat(RESULTS, output, api='pandas')

    return output
Пример #37
0
def union(lyrA, lyrB, outShp, api_gis="grass"):
    """
    Calculates the geometric union of the overlayed polygon layers, i.e.
    the intersection plus the symmetrical difference of layers A and B.
    
    API's Available:
    * saga;
    * grass;
    * pygrass;
    """

    if api_gis == "saga":
        from glass.pys import execmd

        rcmd = execmd(
            ("saga_cmd shapes_polygons 17 -A {} -B {} -RESULT {} -SPLIT 1"
             ).format(lyrA, lyrB, outShp))

    elif api_gis == "pygrass" or api_gis == "grass":
        import os
        from glass.g.wenv.grs import run_grass
        from glass.pys.oss import fprop
        from glass.g.prop.prj import get_epsg

        ws = os.path.dirname(outShp)
        refname = fprop(outShp)
        loc = f"loc_{refname}"

        gbase = run_grass(ws, location=loc, srs=get_epsg(lyrA))

        import grass.script.setup as gs

        gs.init(gbase, ws, loc, 'PERMANENT')

        # Import data
        from glass.g.it.shp import shp_to_grs, grs_to_shp

        lyr_a = shp_to_grs(lyrA, fprop(lyrA, 'fn'), asCMD=True)
        lyr_b = shp_to_grs(lyrB, fprop(lyrB, 'fn'), asCMD=True)

        shpunion = grsunion(lyr_a,
                            lyr_b,
                            refname,
                            cmd=True if api_gis == "grass" else None)

        # Export data
        grs_to_shp(shpunion, outShp, "area")

    else:
        raise ValueError("{} is not available!".format(api_gis))

    return outShp
Пример #38
0
    def run_slope(tid, inrsts, outfolder, oname, percentage):
        """
        Thread function
        """

        iirsts = inrsts.mdt.tolist()

        # Create GRASS GIS Location
        loc_name = f'thread_{str(tid)}'
        gbase = run_grass(
            outfolder, location=loc_name, srs=iirsts[0]
        )

        # Start GRASS GIS Session
        import grass.script as grass
        import grass.script.setup as gsetup
        gsetup.init(gbase, outfolder, loc_name, 'PERMANENT')

        from glass.g.it.rst   import rst_to_grs, grs_to_rst
        from glass.g.rst.surf import slope
        from glass.g.wenv.grs import rst_to_region

        for rst in iirsts:
            # Import data
            mdt = rst_to_grs(rst, fprop(rst, 'fn'))

            # Set region
            rst_to_region(mdt)

            # Get ID in name
            mdt_id = re.search(r'\d+', mdt).group()

            # Get slope
            if percentage:
                slope_perc = slope(
                    mdt, f"pp_{oname}_{mdt_id}",
                    data='percent'
                )
            
            slope_degr = slope(
                mdt, f"{oname}_{mdt_id}", data='degrees'
            )

            # Export
            if percentage:
                grs_to_rst(slope_perc, os.path.join(
                    percentage, slope_degr + '.tif'
                ))
            
            grs_to_rst(slope_degr, os.path.join(
                outfolder, slope_degr + '.tif'
            ))
Пример #39
0
    def _setupGrassScriptingEnvironment(self):
        """ @brief Set up GRASS environment for using GRASS scripting API from 
            Python (e.g. grass.script)
        """
        os.environ['GISBASE'] = self.grassConfig.gisbase
        sys.path.append(os.path.join(self.grassConfig.gisbase, 'etc', 'python'))
        import grass.script.setup as gsetup
        gsetup.init(self.grassConfig.gisbase, \
                    self.grassConfig.dbase, self.grassConfig.location, \
                    self.grassConfig.mapset)

        self.script = importlib.import_module('grass.script')
        return self.script
Пример #40
0
    def _setupGrassScriptingEnvironment(self):
        """ @brief Set up GRASS environment for using GRASS scripting API from 
            Python (e.g. grass.script)
        """
        os.environ['GISBASE'] = self.grass_config.gisbase
        sys.path.append(os.path.join(self.grass_config.gisbase, 'etc', 'python'))
        import grass.script.setup as gsetup
        gsetup.init(self.grass_config.gisbase, \
                    self.grass_config.dbase, self.grass_config.location, \
                    self.grass_config.mapset)

        self.g = importlib.import_module('grass.script')
        return self.g
Пример #41
0
def init(path, location=None, mapset=None, grass_path=None):
    """
    This function initiates a GRASS session and sets GRASS
    environment variables.

    :param str path: path to grass databases
    :param str location: name of GRASS location
    :param str mapset: name of mapset within location
    """
    # Create a GRASS GIS session.
    gsetup.init(path, location=location, mapset=mapset, grass_path=grass_path)
    # Set GRASS env. variables
    _set_notebook_defaults()
Пример #42
0
def copy_mapset(mapset_from,mapset_to,regfilter,overwrite,lf):      # OUTSIDE
        gsetup.init(gisbase, gisdbase, location, mapset_from)
        #grass.run_command("g.mapset", mapset=mapset_from, quiet=1)
        # list contents of temp mapset
        raster_list = grass.list_pairs(type = 'rast')
        # Switch to target mapset and copy rasters over
        grass.run_command("g.mapset", mapset=mapset_to,quiet=0)
        for rast in raster_list:
                if(rast[1] != 'PERMANENT' and re.search(regfilter,rast[0])):
                        old = rast[0]+ '@' + rast[1]
                        new = rast[0]
                        cmd = old+","+new
                        printout("g.copy, rast="+cmd+", overwrite="+str(overwrite),lf)
                        grass.run_command("g.copy", rast=cmd, overwrite=overwrite)
Пример #43
0
    def __init__(self, dbBase="", location="", mapset="PERMANENT"):
        """
		Wrapper of "python.setup.init" defined in GRASS python.
		Initialize system variables to run scripts without starting GRASS explicitly.

		@param dbBase: path to GRASS database (default: '').
		@param location: location name (default: '').
		@param mapset: mapset within given location (default: 'PERMANENT')

		@return: Path to gisrc file.
		"""
        self.gisbase = os.environ["GISBASE"]
        self.gisdb = dbBase
        self.loc = location
        self.mapset = mapset
        gsetup.init(self.gisbase, self.gisdb, self.loc, self.mapset)
Пример #44
0
def MakeHexagrid(gisbase,gisdb, mapset, location="cea",radius=15000, point_name="sample", point_loc="ll"):
    import grass
    reload(grass)
    import grass.script as gscript
    import grass.script.setup as gsetup
    gsetup.init(gisbase,
            gisdb, location, mapset)
    radius=int(radius)
    if radius==0:
        radius = 10000
    radius2 = radius*2
    gscript.run_command('v.proj',location=point_loc,input=point_name,output='sample',overwrite=True,quiet=True)
    gscript.run_command('g.region',vect='sample',quiet=True)
    gscript.run_command('g.region',n='n+%d' % radius2 ,e='e+%d' % radius2, \
            w='w-%d' % radius2,s='s-%d' % radius2,quiet=True)
    gscript.run_command('v.mkgrid',flags='h',map='grid',box=(radius,radius),overwrite=True,quiet=True)
Пример #45
0
def compute_discrete_geodesic_v1():
    # this a new version using r.drain to extract discrete goedesics
    gisbase = os.environ['GISBASE']
    gisdbdir = Parameters.gisdbdir
    locationGeonet = 'geonet'
    mapsetGeonet = 'geonetuser'
    print gsetup.init(gisbase, gisdbdir, locationGeonet, mapsetGeonet)
    # Read the filtered DEM
    print 'r.in.gdal'
    outfilepathgeodesic = Parameters.geonetResultsDir
    outfilenamegeodesic = Parameters.demFileName
    outfilenamegeodesic = outfilenamegeodesic.split('.')[0]+'_geodesicDistance.tif'
    inputgeodesictifile = outfilepathgeodesic +'\\'+outfilenamegeodesic
    print 'importing goedesic tif: ',inputgeodesictifile
    print g.run_command('r.in.gdal', input=inputgeodesictifile, \
                        output=outfilenamegeodesic,overwrite=True)
    
    # The maximum number of points is 1024
    # --- have to add a check---
    # -- seems to run for large point shapefiles without fail.
    
    print 'importing channel heads shape file'
    channeheadsshapefileName = Parameters.pointshapefileName
    inputshapefilepath = Parameters.pointFileName
    print g.run_command('v.in.ogr',input = inputshapefilepath,\
                        layer=channeheadsshapefileName,output=channeheadsshapefileName,\
                        geometry='Point')
    
    print 'executing r.drain'
    print g.run_command('r.drain',input=outfilenamegeodesic,\
                        output='discretegeodesicsras',\
                        start_points=channeheadsshapefileName)
    print 'thining the discrete geodesic raster'
    print g.run_command('r.thin',input='discretegeodesicsras',\
                        output='discretegeodesicsrasthin')
    
    print 'converting the raster geodesic to vector map'
    print g.run_command('r.to.vect',input = 'discretegeodesicsrasthin',\
                        output='discretegeovec', type='line')
     
    
    print 'exporting the geodesics as shapefile'
    print g.run_command('v.out.ogr', input= 'discretegeovec',\
                        output=Parameters.drainagelineFileName,\
                        format='ESRI_Shapefile')
    print 'completed discrete geodesics'
Пример #46
0
def copy_fromtemp(cores,mapset_to,suffixes,overwrite,bregion,C,lf):  # OUTSIDE
        gsetup.init(gisbase, gisdbase, location, mapset_to)
        for count in range(0,cores):
                # Switch to temp mapset
                mapset_temp = 'temp'+str(count).zfill(2)
                grass.run_command("g.mapset", mapset=mapset_temp, quiet=1)
                # list contents of temp mapset
                raster_list = grass.list_pairs(type = 'rast')
                # Switch to target mapset and copy rasters over
                grass.run_command("g.mapset", mapset=mapset_to,quiet=0)
                for regfilter in suffixes:
                        for rast in raster_list:
                                if(rast[1] != 'PERMANENT' and re.search(regfilter,rast[0])):
                                        old = rast[0]+ '@' + rast[1]
                                        new = rast[0]
                                        cmd = old+","+new
                                        printout("g.copy, rast="+cmd+", overwrite="+str(overwrite),lf)
                                        grass.run_command("g.copy", rast=cmd, overwrite=overwrite)
Пример #47
0
def LoadData(gisbase,gisdb, mapset, location="ll", samplefile="sample.csv", sep=","):
    # find decimalLatitude and Longitude in table
    DF=read_csv(samplefile, header=0,sep=sep)
    print DF.columns
    Lat=[number for number,value in enumerate(DF.columns) if value=="decimalLatitude"][0]+1
    Long=[number for number,value in enumerate(DF.columns) if value=="decimalLongitude"][0]+1
    def MakeUp(label,size): return " ".join(["'"+label.upper()+"'","varchar({size})".format(size=size)])
    form=[ MakeUp(x, DF.loc[:,x].astype("str").apply(len).max()) for x in DF.columns]
    form[Lat-1]="decimalLatitude double precision"
    form[Long-1]="decimalLongitude double precision"
    # import GRASS Python bindings (see also pygrass)
    import grass
    import grass.script as gscript
    import grass.script.setup as gsetup
    ###########
    # launch session
    gsetup.init(gisbase,gisdb, location, mapset)
    gscript.run_command('v.in.ascii',input=samplefile,output='sample',x=Long,y=Lat,skip=1,overwrite=True,quiet=True, separator=sep)
Пример #48
0
def slopeVector(mapset, bnd, erast):
    gsetup.init(evt.gisbase, evt.gisdb, 'socal_hfrd', mapset)
    slopecat()
    gs.parse_command('v.in.ogr',
                     flags='e',
                     input=bnd,
                     output=grassname(bnd),
                     overwrite=True,
                     verbose=True)
    gs.parse_command('g.region',
                     vect=grassname(bnd))
    gs.parse_command('r.in.gdal',
                     input=erast,
                     output=grassname(erast),
                     overwrite=True,
                     verbose=True)
    gs.parse_command('r.slope.aspect',
                     elevation=grassname(erast),
                     slope=grassname(erast)+'slp',
                     format='percent',
                     overwrite=True,
                     verbose=True)
    gs.parse_command('g.region',
                     rast=grassname(erast)+'slp')
    gs.parse_command('r.recode',
                     input=grassname(erast)+'slp',
                     output=grassname(erast)+'slprc',
                     rules='slp_reclass',
                     overwrite=True,
                     verbose=True)
    gs.parse_command('r.to.vect',
                     flags='s',
                     input=grassname(erast)+'slprc',
                     output=grassname(bnd)+'slope',
                     type_='area',
                     verbose=True,
                     overwrite=True)
    gs.parse_command('v.out.postgis',
                     input=grassname(bnd)+'slope',
                     output="PG:dbname=hfrd",
                     overwrite=True,
                     options="SRID=98226")
Пример #49
0
def grass_config(location, mapset, gisbase='/usr/local/grass-6.4.5svn', gisdbase='.'):
    """ Set grass environment to run grass.script as grass
    """
    os.environ['GISBASE'] = gisbase
    os.environ['GRASS_VERBOSE'] = '0'
    os.environ['GRASS_OVERWRITE'] = '1'
    sys.path.append(os.path.join(gisbase, 'etc', 'python'))

    global grass
    __import__('grass.script')
    grass = sys.modules['grass.script']
    from grass.script.setup import init
    gisrc = init(gisbase, gisdbase, location, mapset)    
def main(gisdb,georeffile,gisrc,loc='tuolumneCA',mapsets=['wind']):

    location_path = os.path.join(gisdb, loc)
    # Create new location
    startcmd = 'grass70 -c ' + georeffile + ' -e ' + location_path
    
    print startcmd
    p = subprocess.Popen(startcmd, shell=True, 
                         stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out, err = p.communicate()
    if p.returncode != 0:
        print >>sys.stderr, 'ERROR: %s' % err
        print >>sys.stderr, 'ERROR: Cannot generate location (%s)' % startcmd
        sys.exit(-1)
    else:
        print 'Created location %s' % location_path
     
    # Now the location with PERMANENT mapset exists.
     
    ########
    # Launch session and do something
     
    gisbase = os.environ.get('GISBASE')
    gsetup.init(gisbase, gisdb, loc, 'PERMANENT')

    for ms in mapsets:
        gscript.run_command('g.mapset', flags='c',
                        verbose=True,
                        mapset=ms,
                        location=loc,
                        dbase=gisdb)


    # Write gisrc file
    with open(gisrc,'w') as rc:
        rc.write("GISDBASE: %s\n" % gisdb)
        rc.write("LOCATION_NAME: %s\n" % loc)
        rc.write("MAPSET: PERMANENT")
Пример #51
0
import os
import sys
import csv


GISBASE = os.environ['GISBASE'] = '/home/majavie/grass_last/grass-7.1.svn'
gisdbase = os.path.join("/local1/majavie/hanksgrass7")
location = "global_MW"
mapset   = "rasterized_parks"

sys.path.append(os.path.join(os.environ['GISBASE'], "etc", "python"))

import grass.script as grass
import grass.script.setup as gsetup
 
gsetup.init(GISBASE,
            gisdbase, location, mapset)

print grass.gisenv()

source = 'wdpa_snapshot_new_mollweide@javier'
grass. message ("Extracting list of PAs")
pa_list0 = grass. read_command ('v.db.select', map=source,column='wdpa_id'). splitlines ()
pa_list2 = np.unique(pa_list0)
n = len(pa_list2)-1#2
#pa_list = pa_list2[0:n]
pa_list = '257','101922','2017','11','68175','643','555542456' # testing set

csvname1 = 'pas_segm_done.csv'
if os.path.isfile(csvname1) == False:
 wb = open(csvname1,'a')
 wb.write('None')
Пример #52
0
def fsegm(pa):

 #gc.collect()
 pa_list_done = np.genfromtxt(csvname1,dtype='string')
 ### mp.current_process().cnt += 1
 if pa not in pa_list_done:
  current = multiprocessing.current_process()
  mn = current._identity[0]
  print 'running:', mn
 #rmk = 'MASK=if(MASK>0,MASK,0)'
 #rmk = 'MASK = if( MASK > 0 , MASK , 0)'


  GISBASE = os.environ['GISBASE'] = "/home/majavie/hierba_hanks/grass-7.1.svn"
  GRASSDBASE = "/home/majavie/hanksgrass7"
  MYLOC = "global_MW"
  mapset = 'm'

  sys.path.append(os.path.join(os.environ['GISBASE'], "etc", "python"))
  import grass.script as grass
  import grass.script.setup as gsetup
  gsetup.init(GISBASE, GRASSDBASE, MYLOC, mapset)

  #sys.path.append(os.path.join(os.environ['GISBASE'], "etc", "python"))
  #import grass.script as grass
  #import grass.script.setup as gsetup

  mapset2 = 'm'+str(mn)#ehabitat'
  os.system ('rm -rf /home/majavie/hanksgrass7/global_MW/'+mapset2)
  #os.system ('grass70 -c -text /home/majavie/hanksgrass7/global_MW/'+mapset2)
  col= 'wdpaid'
  grass.run_command('g.mapset',mapset=mapset2,location='global_MW',gisdbase='/home/majavie/hanksgrass7',flags='c')
  os.system('rm csv/*_'+str(pa)+'_*')
  os.system('rm shp/*_'+str(pa)+'_*')

  gsetup.init(GISBASE, GRASSDBASE, MYLOC, mapset2)
  print pa, mapset2, grass.gisenv()
  ong = str(pa)+str(mapset2)+str(grass.gisenv())
  grass.run_command('g.mapsets',mapset='ehabitat,rasterized_parks',operation='add')
  source = 'wdpa_aug14_100km2_moll'

  wb = open(csvong1,'a')
  wb.write(ong)
  wb.write('\n')
  wb.close() 

  #grass.run_command('g.remove',group='segm')
  #grass.run_command('r.mask',flags='r')
  #grass.run_command('g.rename',rast='MASK,masc',overwrite=True)
  #grass.run_command('g.mremove',typ='vect',patt='*',flags='f') 
  #grass.run_command('g.mremove',typ='rast',patt='*',flags='bf')

  reps = [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9]

  #if os.path.isfile('/home/majavie/hanksgrass7/global_MW/'+mapset2+'/group/segm/REF') == True:
  # os.system ('rm /home/majavie/hanksgrass7/global_MW/'+mapset2+'/group/segm/REF')
  print pa
  pa44 = 'pa_'+str(pa)
  pa44x = 'pax_'+str(pa)
  pa0 = 'v0_'+pa
  opt1 = col+'='+pa
  grass.run_command('v.extract', input=source, out=pa0, where = opt1,overwrite=True) # check inital region from which to copy from!
  pa2 = pa+'v2_'
  pa3 = pa+'v3'
  pa4 = 'paa_'+pa
  pa5 = pa4+'.txt'
  same = pa2+'= const'
  #grass. message ("setting up the working region")
  grass.run_command('g.region',vect=pa0,res=1000)
  grass.run_command('r.mapcalc',expression='const = if(gcmask>=0,1,null())',overwrite=True)
  grass.run_command('r.mapcalc',expression=same,overwrite=True)
  a = grass.read_command('r.stats',input='const',flags='nc',separator='\n').splitlines()
  if len(a)==0: a = [1, 625]
  #print a
  minarea = np.sqrt(int(a[1]))#/2 #10
  minaream = minarea#*1000
  grass.run_command('i.pca', flags='n', input='pre,eprsqrt,slope,tree,herb,ndwi,ndvimax2,ndvimin,bio', output=pa44x, overwrite=True) # dem
  pca1 = pa44x+'.1'
  pca2 = pa44x+'.2'
  pca3 = pa44x+'.3'
  pcas = pca1+','+pca2+','+pca3
  grass.run_command('i.group',gr='segm',input=pcas)
  os.system ('cat /home/majavie/hanksgrass7/global_MW/'+mapset2+'/group/segm/REF')
  j = 0
  for thr in reps:
  	  pa2 = pa+'v2_'+str(j)
  	  pa2s = pa+'v2_'+str(j-1)
	  aleat = np.random.random_integers(1000)
  	  grass.run_command('g.region',vect=pa0,res=1000)
	  j= j + 1
	  if thr==0.1:
	  	grass.run_command('i.segment', group='segm', output=pa2, threshold=thr, method='region_growing', minsize=minarea, similarity='euclidean', memory='100000', iterations='20',overwrite=True) #  ,seed=pa2i minsize=minarea,
	  else:
	  	grass.run_command('i.segment', group='segm', output=pa2, threshold=thr, method='region_growing', similarity='euclidean', memory='100000', iterations='20',seed=pa2s,overwrite=True) # minsize=minarea
	  #grass. message ("cropping the segments")
	  grass.run_command('r.mask', vector=source, where=opt1)
	  opt2 = pa3+'='+pa2
	  grass.run_command('r.mapcalc',expression=opt2,overwrite=True) # usar const como mapa para crear plantilla de PA con unos y ceros
	  grass.run_command('g.rename',rast='MASK,masc',overwrite=True)
	  #grass.run_command('g.remove', rast='MASK')
	  print minarea

	  b = grass.read_command('r.stats',input=pa3,flags='nc',separator='\n').splitlines()
	  print b
	  clean = None
	  c = pa3
	  for g in np.arange(1,len(b),2):
	   if np.int(b[g]) < minarea:#/10: # lower the threshold if omitting min area!
	    print 'Cleaning small segments I...'
	    print 'cleaning cat '+ str(b[g-1])
	    c2 = 'old'+ str(b[g-1])
	    c22 = c2+'b10km'
	    c3 = 'new'+ str(b[g-1])
	    oper1 = c2+'='+'if('+pa3+'=='+str(b[g-1])+',1,null())'
	    grass.run_command('r.mapcalc',expression=oper1,overwrite=True)
	    grass.run_command('r.buffer',input=c2,output=c22,distances=3,units='kilometers',overwrite=True)
	    grass.run_command('r.mask', raster=c22,maskc=2)
	    buff = grass.read_command('r.stats',input=pa3,flags='nc',sort='desc',separator='\n').splitlines()
 	    grass.run_command('g.rename',rast='MASK,masc',overwrite=True)
	    #grass.run_command('g.remove', rast='MASK')
	    if len(buff) > 0:
	     clean = 'T'
	     print 'New: '+str(buff[0])
	     oper1 = c3+'='+'if('+c2+'==1,'+str(buff[0])+',null())'
	     c = c3 + ',' + c
	     grass.run_command('r.mapcalc',expression=oper1,overwrite=True)
	  if clean=='T':
	   print c
	   grass.run_command('r.patch',input=c,out=pa3,overwrite=True)
	   bv = grass.read_command('r.stats',input=pa3,flags='nc',separator='\n').splitlines()
	   print bv

	  b = grass.read_command('r.stats',input=pa3,flags='nc',separator='\n').splitlines()
	  print b
	  clean = None
	  c = pa3
	  for g in np.arange(1,len(b),2):
	   if np.int(b[g]) < minarea:#/10: # lower the threshold if omitting min area!
	    print 'Cleaning small segments II...'
	    print 'cleaning cat '+ str(b[g-1])
	    c2 = 'old'+ str(b[g-1])
	    c22 = c2+'b10km'
	    c3 = 'new'+ str(b[g-1])
	    oper1 = c2+'='+'if('+pa3+'=='+str(b[g-1])+',1,null())'
	    grass.run_command('r.mapcalc',expression=oper1,overwrite=True)
	    grass.run_command('r.buffer',input=c2,output=c22,distances=10,units='kilometers',overwrite=True)
	    grass.run_command('r.mask', raster=c22,maskc=2)
	    buff = grass.read_command('r.stats',input=pa3,flags='nc',sort='desc',separator='\n').splitlines()
 	    grass.run_command('g.rename',rast='MASK,masc',overwrite=True)
	    #grass.run_command('g.remove', rast='MASK')
	    if len(buff) > 0:
	     clean = 'T'
	     print 'New: '+str(buff[0])
	     oper1 = c3+'='+'if('+c2+'==1,'+str(buff[0])+',null())'
	     c = c3 + ',' + c
	     grass.run_command('r.mapcalc',expression=oper1,overwrite=True)
	  if clean=='T':
	   print c
	   grass.run_command('r.patch',input=c,out=pa3,overwrite=True)
	   bv = grass.read_command('r.stats',input=pa3,flags='nc',separator='\n').splitlines()
	   print bv

	  b = grass.read_command('r.stats',input=pa3,flags='nc',sort='desc',separator='\n').splitlines()
	  print b
	  for g in np.arange(1,len(b),2):
	   if np.int(b[g]) < minarea:#/10: # lower the threshold if omitting min area!
	    print 'Cleaning small segments III...'
	    print 'cleaning cat '+ str(b[g-1])
	    oper1 = pa3+'='+'if('+pa3+'=='+str(b[g-1])+','+str(b[0])+','+pa3+')'
	    grass.run_command('r.mapcalc',expression=oper1,overwrite=True)
	    bv = grass.read_command('r.stats',input=pa3,flags='nc',separator='\n').splitlines()
	    print bv

	  #grass. message ("Number of cells per segment")
	  #grass.run_command('r.stats',input=pa3,out=pa5,overwrite=True) # flags='nc'
	  #grass. message ("converting to vector")
	  grass.run_command('r.to.vect', input=pa3,out=pa4,type ='area',flags='v',overwrite=True)
	  #grass. message ("adding labels to segments")
	  grass.run_command('v.db.addcolumn', map=pa4,col='wdpaid_pa VARCHAR')
	  grass.run_command('v.db.update', map=pa4,col='wdpaid_pa',value=pa)
	  grass.run_command('v.db.addcolumn', map=pa4,col='aleat VARCHAR')
	  grass.run_command('v.db.update', map=pa4,col='aleat',value=aleat)
	  #grass. message ("Checking shapefile")
	  pa44 = pa4
	  pa442 = pa44+'_diss'
	  #grass.run_command('v.clean', input=pa4,out=pa44,tool='rmarea',thres=minaream,overwrite=True)
	  grass.run_command('v.db.addcolumn', map=pa44,col='segm_id numeric')#VARCHAR')
	  grass.run_command('v.db.update', map=pa44,col='segm_id',qcol='wdpaid_pa || cat || aleat')
	  #grass. message ("Exporting shapefile")
	  name = 'shp/park_segm_'+str(pa)+'_'+str(j)
	  if os.path.isfile(name+'.shp') == False:
	   grass.run_command('v.out.ogr',input=pa44,ola=name,type='area',dsn='.') 
	  else:
	   grass.run_command('v.out.ogr',flags='a',input=pa44,ola=name,type='area',dsn='.')

	  grass. message ("Done1")
	  #grass.run_command('v.in.ogr',flags='oe',dsn='.',lay=name,out=name,overwrite=True)
    	  spa_list0 = grass. read_command ('v.db.select', map=pa44,column='segm_id'). splitlines ()
	  spa_list = np.unique(spa_list0)
	  print spa_list
	# save it as a csv excluding last item!

	  grass. message("omitting previous masks")
	  grass.run_command('g.rename',rast='MASK,masc',overwrite=True)
	  #grass.run_command('g.remove', rast='MASK')

	#pa_list_done = np.genfromtxt(csvname1,dtype='string')
	  sn = len(spa_list)-1 # there is also a segm_id element!
	  for spx in range(0,sn): # 0
	   spa = spa_list[spx]
	   spa2 = 'svv'+spa
	 #pa3 = pa+'v3'
	   spa4 = 'spa_'+spa
	   spa5 = 'tiffs/pa_'+spa+'.tif'
	   spa0 = 'sv0_'+spa
	   sopt1 = 'segm_id = '+spa
	 #if pa not in pa_list_done:
	   print spx
	   print "Extracting PA:"+spa
	   grass.run_command('v.extract', input=pa44, out=spa0, where = sopt1,overwrite=True)
	  # try to crop PAs shapefile with coastal line or input vars
	   grass. message ("setting up the working region")
	   grass.run_command('g.region',vect=spa0,res=1000)
	   grass.run_command('v.to.rast',input=spa0,out=spa0,use='val')#use='cat',labelcol='segm_id')
	   soptt = spa4+'='+spa0
	   grass.run_command('r.mask', rast='pre') # new to crop parks to where we have indicators information
	   grass.run_command('r.mapcalc',expression=soptt,overwrite=True) # opt3
	   grass.run_command('g.rename',rast='MASK,masc',overwrite=True)
	   #grass.run_command('g.remove', rast='MASK') # new
	   grass.run_command('r.null',map=spa4,null=0)
	   econame = 'csv/park_'+str(pa)+'_'+str(j)+'.csv'
	   eco = str(j)
	   econ = 'csv/ecoregs'+str(j)+'.csv'
	   grass.run_command('r.out.gdal',input=spa4,out=spa5,overwrite=True)
#	   grass. message ("Deleting tmp layers") 
	   wb = open(econame,'a')
	   wb.write(spa)
	   wb.write('\n')
	   wb.close() 
	   wb = open(econ,'a')
	   wb.write(eco)
	   wb.write('\n')
	   wb.close() 
  grass. message ("Deleting tmp layers")
 #grass.run_command('g.mremove',typ='vect',patt='*',flags='f') 
 #grass.run_command('g.mremove',typ='rast',patt='*',flags='bf')
 #grass.run_command('g.rename',rast='MASK,masc',overwrite=True)
 #grass.run_command('g.remove', rast='MASK')
  os.system ('rm -rf /home/majavie/hanksgrass7/global_MW/'+mapset2)

  wb = open(csvong2,'a')
  wb.write(ong)
  wb.write('\n')
  wb.close()

  wb = open(csvname1,'a')
  var = str(pa)
  wb.write(var)
  wb.write('\n')
  wb.close() 
Пример #53
0
import os
import sys

metadata = {
    "grass_dbase" : "/home/ga/ga_cms/src/DR5/GRASSData",
    "grass_location" : "DR5",
    "grass_mapset" : "taehee",
}

grassDbase = metadata['grass_dbase']
os.environ['GISBASE'] = gisBase = "/usr/lib/grass64"
sys.path.append(os.path.join(gisBase, "etc", "python"))
import grass.script as grass
import grass.script.setup as gsetup
gsetup.init(gisBase, grassDbase, metadata['grass_location'], metadata['grass_mapset'])
Пример #54
0
from tqdm import *
import os
import sys
import csv

GISBASE = os.environ['GISBASE'] = "/home/majavie/grass_last/new/grass7_trunk/dist.x86_64-unknown-linux-gnu"
GRASSDBASE = "/local0/majavie/hanksgrass7"
MYLOC = "global_MW"
mapset = 'ehabitat'
col= 'wdpaid'

sys.path.append(os.path.join(os.environ['GISBASE'], "etc", "python"))
import grass.script as grass
import grass.script.setup as gsetup

gsetup.init(GISBASE, GRASSDBASE, MYLOC, mapset)
source = 'wdpa_aug14_100km2_moll'
grass. message ("Extracting list of PAs")
pa_list0 = grass. read_command ('v.db.select', map=source,column=col). splitlines ()
pa_list2 = np.unique(pa_list0)
n = len(pa_list2)
pa_list = pa_list2[0:n-2] # testing 5 first!
#pa_list = '257','101922','2017','11','68175','643','555542456'
print pa_list

csvname1 = 'pas_segm_done.csv'
if os.path.isfile(csvname1) == False:
 wb = open(csvname1,'a')
 wb.write('None')
 wb.write('\n')
 wb.close()
def SC(jobid, xlon, ylat, prj):

    dem_full_path = DEM_FULL_PATH
    dem = DEM_NAME
    drainage_full_path = DRAINAGE_FULL_PATH
    drainage = DRAINAGE_NAME
    gisbase = GISBASE
    grass7bin = GRASS7BIN

    # Define grass data folder, location, mapset
    gisdb = os.path.join(tempfile.gettempdir(), 'grassdata')
    if not os.path.exists(gisdb):
        os.mkdir(gisdb)
    location = "location_{0}".format(dem)
    mapset = "PERMANENT"
    msg = ""

    # Create log file for each job
    log_name = 'log_{0}.log'.format(jobid)
    log_path = os.path.join(gisdb, log_name)
    f = open(log_path, 'w', 0)

    # Create output_data folder path
    output_data_path = OUTPUT_DATA_PATH
    if not os.path.exists(output_data_path):
        os.mkdir(output_data_path)


    try:
        # Create location
        location_path = os.path.join(gisdb, location)
        if not os.path.exists(location_path):
            f.write('\n---------Create Location from DEM--------------------\n')
            f.write('{0}\n'.format(location_path))
            startcmd = grass7bin + ' -c ' + dem_full_path + ' -e ' + location_path

            print startcmd
            p = subprocess.Popen(startcmd, shell=True,
                                 stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            out, err = p.communicate()
            if p.returncode != 0:
                print >>sys.stderr, 'ERROR: %s' % err
                print >>sys.stderr, 'ERROR: Cannot generate location (%s)' % startcmd
                f.write('\n---------Create Location failed--------------------\n')
                sys.exit(-1)
            else:
                f.write('\n---------Create Location done--------------------\n')
                print 'Created location %s' % location_path

        xlon = float(xlon)
        ylat = float(ylat)
        outlet = (xlon, ylat)

        # Set GISBASE environment variable
        os.environ['GISBASE'] = gisbase
        # the following not needed with trunk
        os.environ['PATH'] += os.pathsep + os.path.join(gisbase, 'extrabin')
        # Set GISDBASE environment variable
        os.environ['GISDBASE'] = gisdb

        # define GRASS-Python environment
        gpydir = os.path.join(gisbase, "etc", "python")
        sys.path.append(gpydir)

        f.write('\n---------sys.path--------------------\n')
        f.write('\n'.join(sys.path))
        f.write('\n----------sys.version-------------------\n')
        f.write(sys.version)
        f.write('\n----------os.environ-----------------\n')
        f.write(str(os.environ))

        # import GRASS Python bindings (see also pygrass)
        import grass.script as gscript
        import grass.script.setup as gsetup
        gscript.core.set_raise_on_error(True)

        # launch session
        gsetup.init(gisbase, gisdb, location, mapset)
        f.write(str(gscript.gisenv()))

        # Check the dem file, import if not exist
        dem_mapset_path = location_path = os.path.join(gisdb, location, mapset, "cell", dem)

        if not os.path.exists(dem_mapset_path):
            f.write("\n ---------- import DEM file ------------- \n")
            stats = gscript.read_command('r.in.gdal', input=dem_full_path, output=dem)
        #import drainage
        drainage_mapset_path = location_path = os.path.join(gisdb, location, mapset, "cell", drainage)
        if not os.path.exists(drainage_mapset_path):
            f.write("\n ---------- import Drainage file ------------- \n")
            stats = gscript.read_command('r.in.gdal', input=drainage_full_path, output=drainage)

        # List all files in location to check if the DEM file imported successfully
        f.write("\n ---------- List raster ------------- \n")
        for rast in gscript.list_strings(type='rast'):
            f.write(str(rast))
        f.write("\n ---------- List vector ------------- \n")
        for vect in gscript.list_strings(type='vect'):
            f.write(str(vect))

        f.write("\n ---------------------------JOB START-------------------------------- \n")
        f.write(str(datetime.now()))

        # Project xlon, ylat wgs84 into current
        if prj.lower() != "native" or prj.lower() == "wgs84":
            f.write("\n ---------- Reproject xlon and ylat into native dem projection ------------- \n")
            stats = gscript.read_command('m.proj', coordinates=(xlon, ylat), flags='i')
            coor_list = stats.split("|")
            xlon = float(coor_list[0])
            ylat = float(coor_list[1])
            outlet = (xlon, ylat)

        # Define region
        f.write("\n ---------- Define region ------------- \n")
        stats = gscript.parse_command('g.region', raster=dem, flags='p')
        f.write(str(stats))

        # Read extent of the dem file
        for key in stats:
            if "north:" in key:
                north = float(key.split(":")[1])
            elif "south:" in key:
                south = float(key.split(":")[1])
            elif "west:" in key:
                west = float(key.split(":")[1])
            elif "east:" in key:
                east = float(key.split(":")[1])
            elif "nsres:" in key:
                nsres = float(key.split(":")[1])
            elif "ewres:" in key:
                ewres = float(key.split(":")[1])

        # check if xlon, ylat is within the extent of dem
        if xlon < west or xlon > east:
            f.write("\n ERROR: xlon is out of dem region. \n")
            raise Exception("(xlon, ylat) is out of dem region.")
        elif ylat < south or ylat > north:
            f.write("\n ERROR: ylat is out of dem region. \n")
            raise Exception("(xlon, ylat) is out of dem region.")


        # Flow accumulation analysis
        f.write("\n ---------- Flow accumulation analysis ------------- \n")
        if not os.path.exists(drainage_mapset_path):
            stats = gscript.read_command('r.watershed', elevation=dem, threshold='10000', drainage=drainage, flags='s', overwrite=True)

        # Delineate watershed
        f.write("\n ---------- Delineate watershed ------------- \n")
        basin = "{0}_basin_{1}".format(dem, jobid)
        stats = gscript.read_command('r.water.outlet', input=drainage, output=basin, coordinates=outlet, overwrite=True)

        # output lake
        # r.mapcalc expression="lake_285.7846_all_0 = if( lake_285.7846, 0)" --o
        f.write("\n -------------- Set all values of raster basin to 0 ----------------- \n")
        basin_all_0 = "{0}_all_0".format(basin)
        mapcalc_cmd = '{0} = if({1}, 0)'.format(basin_all_0, basin)
        gscript.mapcalc(mapcalc_cmd, overwrite=True, quiet=True)

        # covert raster lake_rast_all_0 into vector
        # r.to.vect input='lake_285.7846_all_0@drew' output='lake_285_all_0_vec' type=area --o
        f.write("\n -------------- convert raster lake_rast_all_0 into vector ----------------- \n")
        basin_all_0_vect = "{0}_all_0_vect".format(basin)
        f.write("\n -------------- {0} ----------------- \n".format(basin_all_0_vect))
        stats = gscript.parse_command('r.to.vect', input=basin_all_0, output=basin_all_0_vect, type="area", overwrite=True)

        # output GeoJSON
        # v.out.ogr -c input='lake_285_alll_0_vec' output='/tmp/lake_285_all_0_vec.geojson' format=GeoJSON type=area --overwrite
        geojson_f_name = "{0}.GEOJSON".format(basin)
        basin_GEOJSON = os.path.join(output_data_path, geojson_f_name)
        stats = gscript.parse_command('v.out.ogr', input=basin_all_0_vect, output=basin_GEOJSON, \
                                      format="GeoJSON", type="area", overwrite=True, flags="c")

        f.write("\n-------------------------END--------------------------\n")
        f.write(str(datetime.now()))
        f.close()
        return basin_GEOJSON, msg

    except Exception as e:
        print e.message
        msg = e.message
        if f is not None:
            f.write("\n-------------!!!!!!  ERROR  !!!!!!--------------\n")
            f.write(e.message)
            f.close()
        return None, msg
def SC(jobid, xlon, ylat, prj, damh, interval, output_lake=False):
    logger.info("run SC")

    dem_full_path = DEM_FULL_PATH
    dem = DEM_NAME
    drainage_full_path = DRAINAGE_FULL_PATH
    drainage = DRAINAGE_NAME
    gisbase = GISBASE
    grass7bin = GRASS7BIN
    gisdb = GISDB

    # Define grass data folder, location, mapset
    if not os.path.exists(gisdb):
        os.mkdir(gisdb)
    location = "location_{0}".format(dem)
    mapset = "PERMANENT"
    keep_intermediate = False
    msg = ""

    # Create log file for each job
    logs_path = LOGS_PATH
    if not os.path.exists(logs_path):
        os.mkdir(logs_path)
    log_name = 'log_{0}.log'.format(jobid)
    f = open(os.path.join(logs_path, log_name), 'w', 0)

    # Create output_data folder path
    output_data_path = OUTPUT_DATA_PATH
    if not os.path.exists(output_data_path):
        os.mkdir(output_data_path)

    temp_files_list = []
    result = {}
    result['jobid'] = jobid

    try:
        # Create location
        location_path = os.path.join(gisdb, location)
        if not os.path.exists(location_path):
            f.write('\n---------Create Location from DEM--------------------\n')
            f.write('{0}\n'.format(location_path))
            startcmd = grass7bin + ' -c ' + dem_full_path + ' -e ' + location_path

            print startcmd
            p = subprocess.Popen(startcmd, shell=True,
                                 stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            out, err = p.communicate()
            if p.returncode != 0:
                print >>sys.stderr, 'ERROR: %s' % err
                print >>sys.stderr, 'ERROR: Cannot generate location (%s)' % startcmd
                f.write('\n---------Create Location failed--------------------\n')
                sys.exit(-1)
            else:
                f.write('\n---------Create Location done--------------------\n')
                print 'Created location %s' % location_path

        xlon = float(xlon)
        ylat = float(ylat)
        outlet = (xlon, ylat)
        dam_h = float(damh)
        elev_interval = dam_h/interval

        # Set GISBASE environment variable
        os.environ['GISBASE'] = gisbase
        # the following not needed with trunk
        os.environ['PATH'] += os.pathsep + os.path.join(gisbase, 'extrabin')
        # Set GISDBASE environment variable
        os.environ['GISDBASE'] = gisdb

        # define GRASS-Python environment
        gpydir = os.path.join(gisbase, "etc", "python")
        sys.path.append(gpydir)

        f.write('\n---------sys.path--------------------\n')
        f.write('\n'.join(sys.path))
        f.write('\n----------sys.version-------------------\n')
        f.write(sys.version)
        f.write('\n----------os.environ-----------------\n')
        f.write(str(os.environ))

        # import GRASS Python bindings (see also pygrass)
        import grass.script as gscript
        import grass.script.setup as gsetup
        gscript.core.set_raise_on_error(True)

        # launch session
        gsetup.init(gisbase, gisdb, location, mapset)
        f.write(str(gscript.gisenv()))

        # Check dem file, import if not exist
        dem_in_mapset_path = location_path = os.path.join(gisdb, location, mapset, "cell", dem)
        if not os.path.exists(dem_in_mapset_path):
            f.write("\n ---------- import DEM file ------------- \n")
            stats = gscript.read_command('r.in.gdal', input=dem_full_path, output=dem)

        #import drainage
        drainage_mapset_path = location_path = os.path.join(gisdb, location, mapset, "cell", drainage)
        if not os.path.exists(drainage_mapset_path):
            f.write("\n ---------- import Drainage file ------------- \n")
            stats = gscript.read_command('r.in.gdal', input=drainage_full_path, output=drainage)


        # List all files in location to check if the DEM file imported successfully
        f.write("\n ---------- raster ------------- \n")
        for rast in gscript.list_strings(type='rast'):
            f.write(str(rast))
        f.write("\n ---------- vector ------------- \n")
        for vect in gscript.list_strings(type='vect'):
            f.write(str(vect))

        f.write("\n ---------------------------JOB START-------------------------------- \n")
        f.write(str(datetime.now()))

        # Project xlon, ylat wgs84 into current
        if prj.lower() != "native" or prj.lower() == "wgs84":
            f.write("\n ---------- Reproject xlon and ylat into native dem projection ------------- \n")
            stats = gscript.read_command('m.proj', coordinates=(xlon, ylat), flags='i')
            coor_list = stats.split("|")
            xlon = float(coor_list[0])
            ylat = float(coor_list[1])
            outlet = (xlon, ylat)

        # Define region
        f.write("\n ---------- Define region ------------- \n")
        stats = gscript.parse_command('g.region', raster=dem, flags='p')
        f.write(str(stats))

        # Read extent of the dem file
        for key in stats:
            if "north:" in key:
                north = float(key.split(":")[1])
            elif "south:" in key:
                south = float(key.split(":")[1])
            elif "west:" in key:
                west = float(key.split(":")[1])
            elif "east:" in key:
                east = float(key.split(":")[1])
            elif "nsres:" in key:
                nsres = float(key.split(":")[1])
            elif "ewres:" in key:
                ewres = float(key.split(":")[1])

        # check if xlon, ylat is within the extent of dem
        if xlon < west or xlon > east:
            f.write("\n ERROR: xlon is out of dem region. \n")
            raise Exception("(xlon, ylat) is out of dem region.")
        elif ylat < south or ylat > north:
            f.write("\n ERROR: ylat is out of dem region. \n")
            raise Exception("(xlon, ylat) is out of dem region.")

        # Calculate cell area
        cell_area = nsres * ewres

        # Flow accumulation analysis
        f.write("\n ---------- Flow accumulation analysis ------------- \n")
        if not os.path.exists(drainage_mapset_path):
            stats = gscript.read_command('r.watershed', elevation=dem, threshold='10000', drainage=drainage, flags='s', overwrite=True)

        # Delineate watershed
        f.write("\n ---------- Delineate watershed ------------- \n")
        basin = "{0}_{1}_basin".format(dem, jobid)
        temp_files_list.append(basin)
        stats = gscript.read_command('r.water.outlet', input=drainage, output=basin, coordinates=outlet, overwrite=True)

        # Cut dem with watershed
        f.write("\n -------------- Cut dem ----------------- \n")
        dem_cropped = "{0}_{1}_cropped".format(dem, jobid)
        mapcalc_cmd = '{0} = if({1}, {2})'.format(dem_cropped, basin, dem)
        temp_files_list.append(dem_cropped)
        gscript.mapcalc(mapcalc_cmd, overwrite=True, quiet=True)

        # Read outlet elevation
        f.write("\n ---------- Read outlet elevation ------------- \n")
        outlet_info = gscript.read_command('r.what', map=dem, coordinates=outlet)
        f.write("\n{0} \n".format(outlet_info))
        outlet_elev = outlet_info.split('||')[1]
        try:
            outlet_elev = float(outlet_elev)
        except Exception as e:
            f.write("{0} \n".format(e.message))
            raise Exception("This point has no data.")

        f.write("------------Outlet elevation--{0} ---------------- \n".format(outlet_elev))

        # Create a list including elevations of all interval points
        dam_elev = outlet_elev + dam_h
        elev_list = []
        elev = outlet_elev + elev_interval
        while elev < dam_elev:
             elev_list.append(elev)
             elev += elev_interval
        elev_list.append(dam_elev)
        f.write("\n----------Elevation list----------\n")
        f.write(str(elev_list))

        #For each interval point, calculate reservior volume
        f.write("\n ------------- Reservoir volume calculation ---------------- \n")
        storage_list = []
        lake_output_list = []
        count = 0
        for elev in elev_list:
            count += 1
            f.write(str(elev))
            f.write(", ")

            # Generate reservoir raster file
            f.write("\n-----------Generate lake file ---------- No.{}\n".format(count))
            lake_rast = '{0}_{1}_lake_{2}'.format(dem, jobid, str(int(elev)))
            temp_files_list.append(lake_rast)
            stats = gscript.read_command('r.lake', elevation=dem_cropped, coordinates=outlet, waterlevel=elev, lake=lake_rast, overwrite=True)

            #Calculate reservoir volume
            f.write("\n-----------Calculate lake volume --------- No.{}\n".format(count))
            stats = gscript.parse_command('r.univar', map=lake_rast, flags='g')
            f.write("\n{0}\n".format(str(stats)))

            sum_height = float(stats['sum'])
            f.write("\n-------Cell area--{0}----------\n".format(str(cell_area)))
            volume = sum_height * cell_area
            storage = (volume, elev)
            print("\nNo. {0}--------> sc is {1} \n".format(count, str(storage)))
            storage_list.append(storage)

            if output_lake:
                # output lake
                # r.mapcalc expression="lake_285.7846_all_0 = if( lake_285.7846, 0)" --o
                f.write("\n -------------- Set all values of raster lake to 0 ----------------- \n")
                lake_rast_all_0 = "{0}_all_0".format(lake_rast)
                mapcalc_cmd = '{0} = if({1}, 0)'.format(lake_rast_all_0, lake_rast)
                gscript.mapcalc(mapcalc_cmd, overwrite=True, quiet=True)

                # covert raster lake_rast_all_0 into vector
                # r.to.vect input='lake_285.7846_all_0@drew' output='lake_285_all_0_vec' type=area --o
                f.write("\n -------------- convert raster lake_rast_all_0 into vector ----------------- \n")
                lake_rast_all_0_vec = "{0}_all_0_vect".format(lake_rast)
                lake_rast_all_0_vec = lake_rast_all_0_vec.replace(".", "_")
                f.write("\n -------------- {0} ----------------- \n".format(lake_rast_all_0_vec))
                stats = gscript.parse_command('r.to.vect', input=lake_rast_all_0, output=lake_rast_all_0_vec, type="area", overwrite=True)

                # output GeoJSON
                # v.out.ogr -c input='lake_285_all_0_vec' output='/tmp/lake_285_all_0_vec.geojson' format=GeoJSON type=area --overwrite
                geojson_f_name = "{0}.GEOJSON".format(lake_rast.replace(".", "_"))
                lake_rast_all_0_vec_GEOJSON = os.path.join(output_data_path, geojson_f_name)
                stats = gscript.parse_command('v.out.ogr', input=lake_rast_all_0_vec, output=lake_rast_all_0_vec_GEOJSON, \
                                              format="GeoJSON", type="area", overwrite=True, flags="c")

                # output KML
                # v.out.ogr -c input='lake_285_all_0_vec' output='/tmp/lake_285_all_0_vec.KML' format=KML type=area --overwrite
                kml_f_name = "{0}.KML".format(lake_rast.replace(".", "_"))
                lake_rast_all_0_vec_KML = os.path.join(output_data_path, kml_f_name)
                stats = gscript.parse_command('v.out.ogr', input=lake_rast_all_0_vec, output=lake_rast_all_0_vec_KML, \
                                              format="KML", type="area", overwrite=True, flags="c")

                output_tuple = (str(elev), geojson_f_name, kml_f_name)
                lake_output_list.append(output_tuple)

        zero_point = (0, outlet_elev)
        storage_list.insert(0, zero_point)
        for sc in storage_list:
            f.write(str(sc))
            f.write("\n")
        f.write("\n-------------------------END--------------------------\n")
        f.write(str(datetime.now()))
        f.close()
        keep_intermediate = True

        result['status'] = 'success'
        result['storage_list'] = storage_list
        result['lake_output_list'] = lake_output_list
        result['msg'] = msg

        return result
    except Exception as e:

        keep_intermediate = True
        print e.message
        msg = e.message
        if f is not None:
            f.write("\n-------------!!!!!!  ERROR  !!!!!!--------------\n")
            f.write(e.message)
            f.close()
        result['status'] = 'error'
        result['storage_list'] = None
        result['lake_output_list'] = None
        result['msg'] = msg
        return result

    finally:

        save_result_to_db(jobid, result)

        # Remove all temp files
        if not keep_intermediate:
            for f in temp_files_list:
                f_fullpath = "{0}/{1}/{2}/cell/{3}".format(gisdb, location, mapset, f)
                if os.path.exists(f_fullpath):
                    os.remove(f_fullpath)
Пример #57
0
                
    finally:
        try:
            grass.run_command('g.remove', type='vector', name=tmp_vect, flags='f') 
        except:
            pass
        outfile.close()
        
if __name__ == "__main__":
    gisbase = os.environ['GISBASE']
    gisdbase = os.environ['GISDBASE']
    location = os.environ['LOCATION_NAME']
    
    # Find mapset in params:
    for param in sys.argv:
        if not 'mapset=' in param:
            continue
        else:
            break
    mapset = param.split('=')[1]
    sys.path.append(os.path.join(os.environ['GISBASE'], "etc", "python"))
    
    from grass.script.core import gisenv
    import grass.script as grass
    import grass.script.setup as gsetup
    gsetup.init(gisbase, gisdbase, location, mapset)

    options, flags = grass.parser()
    sys.exit(main(options, flags))