[GRASS-SVN] r57554 - grass/trunk/lib/python/pygrass/modules/grid
svn_grass at osgeo.org
svn_grass at osgeo.org
Fri Aug 30 02:38:00 PDT 2013
Author: zarch
Date: 2013-08-30 02:37:59 -0700 (Fri, 30 Aug 2013)
New Revision: 57554
Modified:
grass/trunk/lib/python/pygrass/modules/grid/grid.py
grass/trunk/lib/python/pygrass/modules/grid/patch.py
Log:
Add more feature to the GridModule
Modified: grass/trunk/lib/python/pygrass/modules/grid/grid.py
===================================================================
--- grass/trunk/lib/python/pygrass/modules/grid/grid.py 2013-08-30 09:24:38 UTC (rev 57553)
+++ grass/trunk/lib/python/pygrass/modules/grid/grid.py 2013-08-30 09:37:59 UTC (rev 57554)
@@ -7,10 +7,12 @@
import os
import multiprocessing as mltp
import subprocess as sub
+import shutil as sht
from grass.script.setup import write_gisrc
from grass.pygrass.gis import Mapset, Location, make_mapset
+from grass.pygrass.gis.region import Region
from grass.pygrass.modules import Module
from grass.pygrass.functions import get_mapset_raster
@@ -21,11 +23,99 @@
_GREG = Module('g.region')
+def select(parms, ptype):
+ """Select only a certain type of parameters. ::
+
+ >>> slp = Module('r.slope.aspect',
+ ... elevation='ele', slope='slp', aspect='asp',
+ ... run_=False)
+ >>> for rast in select(slp.outputs, 'raster'):
+ ... print rast
+ ...
+ slp
+ asp
+
+ """
+ for k in parms:
+ par = parms[k]
+ if par.type == ptype or par.typedesc == ptype and par.value:
+ if par.multiple:
+ for p in par.value:
+ yield p
+ else:
+ yield par.value
+
+
+def copy_mapset(mapset, path):
+ """Copy mapset to another place without copying raster and vector data.
+ """
+ per_old = os.path.join(mapset.gisdbase, mapset.location, 'PERMANENT')
+ per_new = os.path.join(path, 'PERMANENT')
+ map_old = mapset.path()
+ map_new = os.path.join(path, mapset.name)
+ if not os.path.isdir(path):
+ os.makedirs(path)
+ if not os.path.isdir(map_new):
+ os.mkdir(map_new)
+ for f in (fi for fi in os.listdir(per_old) if fi.isupper()):
+ sht.copy(os.path.join(per_old, f), per_new)
+ for f in (fi for fi in os.listdir(map_old) if fi.isupper()):
+ sht.copy(os.path.join(map_old, f), map_new)
+ gisdbase, location = os.path.split(path)
+ return Mapset(mapset.name, location, gisdbase)
+
+
+def copy_raster(rasters, src, dst, region=None):
+ """Copy raster from one mapset to another, crop the raster to the region.
+ """
+ # set region
+ if region:
+ region.set_current()
+
+ nam = "copy%d__%s" % (id(dst), '%s')
+ expr = "%s=%s"
+
+ # instantiate modules
+ mpclc = Module('r.mapcalc')
+ rpck = Module('r.pack')
+ rupck = Module('r.unpack')
+ rm = Module('g.remove')
+
+ # get and set GISRC
+ gisrc_src = os.environ['GISRC']
+ gisrc_dst = write_gisrc(dst.gisdbase, dst.location, dst.name)
+
+ pdst = dst.path()
+ for rast in rasters:
+ # change gisdbase to src
+ os.environ['GISRC'] = gisrc_src
+ src.current()
+ name = nam % rast
+ mpclc(expression=expr % (name, rast), overwrite=True)
+ file_dst = "%s.pack" % os.path.join(pdst, name)
+ rpck(input=name, output=file_dst, overwrite=True)
+ rm(rast=name)
+ # change gisdbase to dst
+ os.environ['GISRC'] = gisrc_dst
+ dst.current()
+ rupck(input=file_dst, output=rast, overwrite=True)
+ os.remove(file_dst)
+
+
def get_cmd(cmdd):
"""Transforma a cmd dictionary to a list of parameters"""
cmd = [cmdd['name'], ]
- cmd.extend(("%s=%s" % (k, v) for k, v in cmdd['inputs']))
- cmd.extend(("%s=%s" % (k, v) for k, v in cmdd['outputs']))
+ cmd.extend(("%s=%s" % (k, v) for k, v in cmdd['inputs']
+ if not isinstance(v, list)))
+ cmd.extend(("%s=%s" % (k, ','.join(vals if isinstance(vals[0], str)
+ else map(repr, vals)))
+ for k, vals in cmdd['inputs']
+ if isinstance(vals, list)))
+ cmd.extend(("%s=%s" % (k, v) for k, v in cmdd['outputs']
+ if not isinstance(v, list)))
+ cmd.extend(("%s=%s" % (k, ','.join(map(repr, vals)))
+ for k, vals in cmdd['outputs']
+ if isinstance(vals, list)))
cmd.extend(("%s" % (flg) for flg in cmdd['flags'] if len(flg) == 1))
cmd.extend(("--%s" % (flg[0]) for flg in cmdd['flags'] if len(flg) > 1))
return cmd
@@ -38,6 +128,8 @@
make_mapset(msetname)
except:
pass
+ ms = Mapset(msetname)
+ ms.visible.extend(mset.visible)
env = os.environ.copy()
env['GISRC'] = write_gisrc(mset.gisdbase, mset.location, msetname)
if mapnames:
@@ -49,9 +141,11 @@
# set the region to the tile
_GREG(env_=env, rast=key)
else:
+ #reg = Region() nsres=reg.nsres, ewres=reg.ewres,
# set the computational region
_GREG(env_=env, **bbox)
# run the grass command
+ #import ipdb; ipdb.set_trace()
sub.Popen(get_cmd(cmd), env=env).wait()
@@ -91,7 +185,9 @@
>>> grd.run()
"""
def __init__(self, cmd, width=None, height=None, overlap=0, processes=None,
- split=False, debug=False, *args, **kargs):
+ split=False, debug=False, region=None, move=None,
+ start_row=0, start_col=0, out_prefix='',
+ *args, **kargs):
kargs['run_'] = False
self.mset = Mapset()
self.module = Module(cmd, *args, **kargs)
@@ -99,7 +195,17 @@
self.height = height
self.overlap = overlap
self.processes = processes
- self.bboxes = split_region_tiles(width=width, height=height,
+ self.region = region if region else Region()
+ self.start_row = start_row
+ self.start_col = start_col
+ self.out_prefix = out_prefix
+ self.n_mset = None
+ if move:
+ self.n_mset = copy_mapset(self.mset, move)
+ copy_raster(select(self.module.inputs, 'raster'),
+ self.mset, self.n_mset, region=self.region)
+ self.bboxes = split_region_tiles(region=region,
+ width=width, height=height,
overlap=overlap)
self.msetstr = cmd.replace('.', '') + "_%03d_%03d"
self.inlist = None
@@ -117,21 +223,19 @@
"""Split all the raster inputs using r.tile"""
rtile = Module('r.tile')
inlist = {}
- #import pdb; pdb.set_trace()
- for inmap in self.module.inputs:
- inm = self.module.inputs[inmap]
- if inm.type == 'raster' and inm.value:
- rtile(input=inm.value, output=inm.value,
- width=self.width, height=self.height,
- overlap=self.overlap)
- patt = '%s-*' % inm.value
- inlist[inm.value] = sorted(self.mset.glist(type='rast',
- pattern=patt))
+ for inm in select(self.module.inputs, 'raster'):
+ rtile(input=inm.value, output=inm.value,
+ width=self.width, height=self.height,
+ overlap=self.overlap)
+ patt = '%s-*' % inm.value
+ inlist[inm.value] = sorted(self.mset.glist(type='rast',
+ pattern=patt))
self.inlist = inlist
def get_works(self):
"""Return a list of tuble with the parameters for cmd_exe function"""
works = []
+ reg = Region()
cmd = self.module.get_dict()
for row, box_row in enumerate(self.bboxes):
for col, box in enumerate(box_row):
@@ -145,12 +249,18 @@
self.mset.name)
# set the computational region, prepare the region parameters
bbox = dict([(k[0], str(v)) for k, v in box.items()[:-2]])
- works.append((bbox, inms, self.msetstr % (row, col), cmd))
+ bbox['nsres'] = '%f' % reg.nsres
+ bbox['ewres'] = '%f' % reg.ewres
+ works.append((bbox, inms,
+ self.msetstr % (self.start_row + row,
+ self.start_col + col),
+ cmd))
return works
def define_mapset_inputs(self):
for inmap in self.module.inputs:
inm = self.module.inputs[inmap]
+ # (inm.type == 'raster' or inm.typedesc == 'group') and inm.value:
if inm.type == 'raster' and inm.value:
if '@' not in inm.value:
mset = get_mapset_raster(inm.value)
@@ -182,11 +292,13 @@
# patch all the outputs
for otmap in self.module.outputs:
otm = self.module.outputs[otmap]
- if otm.type == 'raster' and otm.value:
- patch_map(otm.value, self.mset.name, self.msetstr,
+ if otm.typedesc == 'raster' and otm.value:
+ patch_map(self.out_prefix + otm.value,
+ self.mset.name, self.msetstr,
split_region_tiles(width=self.width,
height=self.height),
- self.module.flags.overwrite)
+ self.module.flags.overwrite,
+ self.start_row, self.start_col)
def rm_tiles(self):
"""Remove all the tiles."""
Modified: grass/trunk/lib/python/pygrass/modules/grid/patch.py
===================================================================
--- grass/trunk/lib/python/pygrass/modules/grid/patch.py 2013-08-30 09:24:38 UTC (rev 57553)
+++ grass/trunk/lib/python/pygrass/modules/grid/patch.py 2013-08-30 09:37:59 UTC (rev 57554)
@@ -37,7 +37,8 @@
rast.put_row(rbuff)
-def patch_map(raster, mapset, mset_str, bbox_list, overwrite=False):
+def patch_map(raster, mapset, mset_str, bbox_list, overwrite=False,
+ start_row=0, start_col=0):
"""Patch raster using a bounding box list to trim the raster."""
# Instantiate the RasterRow input objects
rast = RasterRow(raster, mapset)
@@ -49,7 +50,9 @@
for row, rbbox in enumerate(bbox_list):
rrasts = []
for col in range(len(rbbox)):
- rrasts.append(RasterRow(name=raster, mapset=mset_str % (row, col)))
+ rrasts.append(RasterRow(name=raster,
+ mapset=mset_str % (start_row + row,
+ start_col + col)))
rrasts[-1].open('r')
rasts.append(rrasts)
patch_row(rast, rrasts, rbbox)
@@ -58,3 +61,4 @@
for rast_ in rrast:
rast_.close()
rast.close()
+ #import ipdb; ipdb.set_trace()
More information about the grass-commit
mailing list