def from_rast(self, raster_name): """Set the region from the computational region of a raster map layer. :param raster_name: the name of raster :type raster_name: str :param mapset: the mapset of raster :type mapset: str call C function `Rast_get_cellhd` Example :: >>> reg = Region() >>> reg.from_rast(test_raster_name) >>> reg.get_bbox() Bbox(50.0, 0.0, 60.0, 0.0) >>> reg.read() >>> reg.get_bbox() Bbox(40.0, 0.0, 40.0, 0.0) .. """ if not raster_name: raise ValueError("Raster name or mapset are invalid") mapset = get_mapset_raster(raster_name) if mapset: libraster.Rast_get_cellhd(raster_name, mapset, self.byref())
def define_mapset_inputs(self): """Add the mapset information to the input maps""" for inmap in self.module.inputs: inm = self.module.inputs[inmap] if inm.type in ("raster", "vector") and inm.value: if "@" not in inm.value: mset = get_mapset_raster(inm.value) inm.value = inm.value + "@%s" % mset
def layers(self, mapnames): """Setter method for the layers attribute in the RasterStack Parameters ---------- mapnames : str, list Name or list of names of GRASS GIS rasters to add to the RasterStack object. """ # some checks if isinstance(mapnames, str): mapnames = [mapnames] # reset existing attributes for name in list(self.layers.keys()): delattr(self, name) self.loc = _LocIndexer(self) self.iloc = _ILocIndexer(self, self.loc) self.count = len(mapnames) self.mtypes = {} # split raster name from mapset name raster_names = [i.split("@")[0] for i in mapnames] mapset_names = [get_mapset_raster(i) for i in mapnames] if None in mapset_names: missing_idx = mapset_names.index(None) missing_rasters = raster_names[missing_idx] gs.fatal( "GRASS GIS raster(s) {x} is not found in any mapsets".format( x=missing_rasters)) # add rasters and metadata to stack for name, mapset in zip(raster_names, mapset_names): with RasterRow(name=name, mapset=mapset) as src: if src.exist() is True: ras_name = src.name.split("@")[0] # name sans mapset full_name = src.name_mapset() # name with mapset valid_name = ras_name.replace(".", "_") # grass gis raster could have same name if in diff mapset if valid_name in list(self.layers.keys()): raise ValueError( "Cannot append map {name} to the " "RasterStack because a map with the same name " "already exists".format(name=ras_name)) self.mtypes.update({full_name: src.mtype}) self.loc[valid_name] = src setattr(self, valid_name, src) else: gs.fatal("GRASS raster map " + r + " does not exist")
def define_mapset_inputs(self): """Add the mapset information to the input maps """ for inmap in self.module.inputs: inm = self.module.inputs[inmap] if inm.type in ('raster', 'vector') and inm.value: if '@' not in inm.value: mset = get_mapset_raster(inm.value) inm.value = inm.value + '@%s' % mset
def exist(self): """Return True if the map already exist, and set the mapset if were not set. call the C function `G_find_raster`. >>> ele = RasterAbstractBase(test_raster_name) >>> ele.exist() True """ if self.name: if self.mapset == "": mapset = utils.get_mapset_raster(self.name, self.mapset) self.mapset = mapset if mapset else "" return True if mapset else False return bool(utils.get_mapset_raster(self.name, self.mapset)) else: return False
def exist(self): """Return True if the map already exist, and set the mapset if were not set. call the C function `G_find_raster`. >>> ele = RasterAbstractBase(test_raster_name) >>> ele.exist() True """ if self.name: if self.mapset == '': mapset = utils.get_mapset_raster(self.name, self.mapset) self.mapset = mapset if mapset else '' return True if mapset else False return bool(utils.get_mapset_raster(self.name, self.mapset)) else: return False
def main(opt, flg): # # Set check variables # overwrite = True rasters = opt['rasters'].split(',') if opt['rasters'] else [] rprefix = opt['rprefix'].split(',') if opt['rprefix'] else [] def split(x): return x.split('@') if '@' in x else (x, '') vname, vmset = split(opt['vector']) shpcsv = opt['shpcsv'] if opt['shpcsv'] else vname + '.csv' rstcsv = (opt['rstcsv'].split(',') if opt['rstcsv'] else [split(rst)[0] + '.csv' for rst in rasters]) zones = opt['zones'] if opt['zones'] else vname + '_zones' nprocs = int(opt.get('nprocs', 1)) if rasters: if rprefix and len(rasters) != len(rprefix): raise if len(rasters) != len(rstcsv): raise prefixes = rprefix if rprefix else rasters skipshp = opt['skipshape'].split(',') if opt['skipshape'] else [] skiprst = opt['skipunivar'].split(',') if opt['skipunivar'] else [] layer = int(opt['layer']) newlayer = int(opt['newlayer']) newlayername = (opt['newlayername'] if opt['newlayername'] else vname + '_stats') newtabname = opt['newtabname'] if opt['newtabname'] else vname + '_stats' rstpercentile = float(opt['rstpercentile']) separator = opt.get('separator', ';') # # compute # if not os.path.exists(shpcsv): get_shp_csv(opt['vector'], shpcsv, overwrite, separator) if not get_mapset_raster(zones): get_zones(opt['vector'], zones, layer) if not rstcsv or not os.path.exists(rstcsv[0]): get_rst_csv(rasters, zones, rstcsv, rstpercentile, overwrite, nprocs, separator) newlink = Link(newlayer, newlayername, newtabname) newtab = newlink.table() with Vector(vname, vmset, mode='r', layer=layer) as vct: mode = 'r' if newlink in vct.dblinks else 'rw' with VectorTopo(vname, vmset, mode=mode, layer=layer) as vct: update_cols(newtab, shpcsv, rstcsv, prefixes, skipshp, skiprst, separator=separator) if mode == 'rw': # add the new link vct.dblinks.add(newlink) vct.build()
def append(self, other, in_place=True): """Setter method to add new RasterRows to a RasterStack object Note that this modifies the Raster object in-place Parameters ---------- other : str, or list Name of GRASS GIS rasters, or a list of names. in_place : bool (opt). Default is True Whether to change the Raster object in-place or leave original and return a new Raster object. Returns ------- RasterStack Returned only if `in_place` is True """ if isinstance(other, str): other = [other] # check that 'other' exists raster_names = [i.split("@")[0] for i in other] mapset_names = [get_mapset_raster(i) for i in other] other_fullnames = list() for name, mapset in zip(raster_names, mapset_names): with RasterRow(name=name, mapset=mapset) as src: if src.exist() is True: fullname = src.fullname() other_fullnames.append(fullname) else: raise ValueError( "grass raster {} does not exist".format(other)) # get names of raster in existing stack existing_fullnames = [i.fullname() for i in self.loc.values()] if in_place is True: self.layers = existing_fullnames + other_fullnames else: new_raster = RasterStack(rasters=existing_fullnames + other_fullnames) return new_raster
def _get_raster_image_as_np(lock, conn, data): """Convert a raster map into an image and return a numpy array with RGB or Gray values. :param lock: A multiprocessing.Lock instance :param conn: A multiprocessing.Pipe instance used to send True or False :param data: The list of data entries [function_id, raster_name, extent, color] """ array = None try: name = data[1] mapset = data[2] extent = data[3] color = data[4] mapset = utils.get_mapset_raster(name, mapset) if not mapset: raise ValueError("Unable to find raster map <%s>" % (name)) rast = RasterRow(name, mapset) if rast.exist(): reg = Region() reg.from_rast(name) if extent is not None: if "north" in extent: reg.north = extent["north"] if "south" in extent: reg.south = extent["south"] if "east" in extent: reg.east = extent["east"] if "west" in extent: reg.west = extent["west"] if "rows" in extent: reg.rows = extent["rows"] if "cols" in extent: reg.cols = extent["cols"] reg.adjust() array = raster2numpy_img(name, reg, color) except: raise finally: conn.send(array)
def _get_raster_image_as_np(lock, conn, data): """Convert a raster map into an image and return a numpy array with RGB or Gray values. :param lock: A multiprocessing.Lock instance :param conn: A multiprocessing.Pipe instance used to send True or False :param data: The list of data entries [function_id, raster_name, extent, color] """ array = None try: name = data[1] mapset = data[2] extent = data[3] color = data[4] mapset = utils.get_mapset_raster(name, mapset) if not mapset: raise ValueError("Unable to find raster map <%s>"%(name)) rast = RasterRow(name, mapset) if rast.exist(): reg = Region() reg.from_rast(name) if extent is not None: if "north" in extent: reg.north = extent["north"] if "south" in extent: reg.south = extent["south"] if "east" in extent: reg.east = extent["east"] if "west" in extent: reg.west = extent["west"] if "rows" in extent: reg.rows = extent["rows"] if "cols" in extent: reg.cols = extent["cols"] reg.adjust() array = raster2numpy_img(name, reg, color) except: raise finally: conn.send(array)
def get_fullname(name): """ Return a fullname for a raster if only a string with the mapname is provided. Parameters ---------- name : str Name of a GRASS map Returns ------- name : str Name of a GRASS map with the mapset appended as name@mapset is the mapset is not explicitly provided. """ if "@" not in name: name = "@".join([name, get_mapset_raster(name)]) return name
RPCDefs.GET_VECTOR_FEATURES_AS_WKB, name, mapset, extent, feature_type, field, ]) return self.safe_receive("get_vector_features_as_wkb_list") if __name__ == "__main__": import doctest from grass.pygrass.modules import Module Module("g.region", n=40, s=0, e=40, w=0, res=10) Module( "r.mapcalc", expression="%s = row() + (10 * col())" % (test_raster_name), overwrite=True, ) utils.create_test_vector_map(test_vector_name) doctest.testmod() """Remove the generated maps, if exist""" mset = utils.get_mapset_raster(test_raster_name, mapset="") if mset: Module("g.remove", flags="f", type="raster", name=test_raster_name) mset = utils.get_mapset_vector(test_vector_name, mapset="") if mset: Module("g.remove", flags="f", type="vector", name=test_vector_name)
cats="""11:A 12:B 13:C 14:D 21:E 22:F 23:G 24:H 31:I 32:J 33:K 34:L 41:M 42:n 43:O 44:P""" Module("r.category", rules="-", map=test_raster_name, stdin_=cats, separator=":") doctest.testmod() """Remove the generated vector map, if exist""" mset = utils.get_mapset_raster(test_raster_name, mapset='') if mset: Module("g.remove", flags='f', type='raster', name=test_raster_name) mset = utils.get_mapset_raster(test_raster_name + "_segment", mapset='') if mset: Module("g.remove", flags='f', type='raster', name=test_raster_name + "_segment")
14:D 21:E 22:F 23:G 24:H 31:I 32:J 33:K 34:L 41:M 42:n 43:O 44:P""" Module("r.category", rules="-", map=test_raster_name, stdin_=cats, separator=":") doctest.testmod() """Remove the generated vector map, if exist""" mset = utils.get_mapset_raster(test_raster_name, mapset='') if mset: Module("g.remove", flags='f', type='raster', name=test_raster_name) mset = utils.get_mapset_raster(test_raster_name + "_segment", mapset='') if mset: Module("g.remove", flags='f', type='raster', name=test_raster_name + "_segment")
def layers(self, mapnames): """Setter method for the layers attribute in the RasterStack Parameters ---------- mapnames : str, list Name or list of names of GRASS GIS rasters to add to the RasterStack object. """ # some checks if isinstance(mapnames, str): mapnames = [mapnames] # reset existing attributes for src in list(self.loc.values()): try: delattr(self, src.name) except AttributeError: pass self.loc = _LocIndexer(self) self.iloc = _ILocIndexer(self, self.loc) self.count = len(mapnames) self.mtypes = {} # split raster name from mapset name raster_names = [i.split("@")[0] for i in mapnames] mapset_names = [get_mapset_raster(i) for i in mapnames] if None in mapset_names: missing_idx = mapset_names.index(None) missing_rasters = raster_names[missing_idx] gs.fatal( "GRASS GIS raster(s) {} is not found in any mapsets".format( missing_rasters)) # add rasters and metadata to stack for name, mapset in zip(raster_names, mapset_names): with RasterRow(name=name, mapset=mapset) as src: if src.exist() is True: # get mapname and mapset ras_name = src.name fullname = src.fullname() # check if the same layer (and key) already exists if fullname in list(self.layers.keys()): raise ValueError("Cannot include raster {} because " "it already exists in the " "RasterStack".format(fullname)) # update the indexer, metadata and attributes self.loc[fullname] = src self.mtypes.update({fullname: src.mtype}) if "." not in ras_name: setattr(self, ras_name, src) else: gs.fatal("GRASS raster map {} does not exist".format(name))
def exists(raster_name): """Return True if the map already exist """ raster, mapset = (raster_name.split('@') if '@' in raster_name else (raster_name, '')) return bool(get_mapset_raster(raster_name, mapset))
def exists(raster_name): """Return True if the map already exist""" raster, mapset = raster_name.split("@") if "@" in raster_name else (raster_name, "") return bool(get_mapset_raster(raster_name, mapset))
def main(opt, flg): # # Set check variables # overwrite = True rasters = opt["rasters"].split(",") if opt["rasters"] else [] rprefix = opt["rprefix"].split(",") if opt["rprefix"] else [] def split(x): return x.split("@") if "@" in x else (x, "") vname, vmset = split(opt["vector"]) shpcsv = opt["shpcsv"] if opt["shpcsv"] else vname + ".csv" rstcsv = (opt["rstcsv"].split(",") if opt["rstcsv"] else [split(rst)[0] + ".csv" for rst in rasters]) zones = opt["zones"] if opt["zones"] else vname + "_zones" nprocs = int(opt.get("nprocs", 1)) if rasters: if rprefix and len(rasters) != len(rprefix): raise if len(rasters) != len(rstcsv): raise prefixes = rprefix if rprefix else rasters else: prefixes = None skipshp = opt["skipshape"].split(",") if opt["skipshape"] else [] skiprst = opt["skipunivar"].split(",") if opt["skipunivar"] else [] layer = int(opt["layer"]) newlayer = int(opt["newlayer"]) newlayername = opt["newlayername"] if opt[ "newlayername"] else vname + "_stats" newtabname = opt["newtabname"] if opt["newtabname"] else vname + "_stats" rstpercentile = float(opt["rstpercentile"]) separator = opt.get("separator", ";") # # compute # if not os.path.exists(shpcsv): get_shp_csv(opt["vector"], shpcsv, overwrite, separator) if not get_mapset_raster(zones): get_zones(opt["vector"], zones, layer) if not rstcsv or not os.path.exists(rstcsv[0]): get_rst_csv(rasters, zones, rstcsv, rstpercentile, overwrite, nprocs, separator) newlink = Link(newlayer, newlayername, newtabname) newtab = newlink.table() with Vector(vname, vmset, mode="r", layer=layer) as vct: mode = "r" if newlink in vct.dblinks else "rw" with VectorTopo(vname, vmset, mode=mode, layer=layer) as vct: update_cols(newtab, shpcsv, rstcsv, prefixes, skipshp, skiprst, separator=separator) if mode == "rw": # add the new link vct.dblinks.add(newlink) vct.build()
16 None 41 >>> provider.stop() .. """ self.check_server() self.client_conn.send([RPCDefs.GET_VECTOR_FEATURES_AS_WKB, name, mapset, extent, feature_type, field]) return self.safe_receive("get_vector_features_as_wkb_list") if __name__ == "__main__": import doctest from grass.pygrass import utils from grass.pygrass.modules import Module Module("g.region", n=40, s=0, e=40, w=0, res=10) Module("r.mapcalc", expression="%s = row() + (10 * col())"%(test_raster_name), overwrite=True) utils.create_test_vector_map(test_vector_name) doctest.testmod() """Remove the generated maps, if exist""" mset = utils.get_mapset_raster(test_raster_name, mapset='') if mset: Module("g.remove", flags='f', type='raster', name=test_raster_name) mset = utils.get_mapset_vector(test_vector_name, mapset='') if mset: Module("g.remove", flags='f', type='vector', name=test_vector_name)