[GRASS-SVN] r58000 - grass/trunk/lib/python/pygrass/modules/grid

svn_grass at osgeo.org svn_grass at osgeo.org
Tue Oct 15 02:52:01 PDT 2013


Author: zarch
Date: 2013-10-15 02:52:01 -0700 (Tue, 15 Oct 2013)
New Revision: 58000

Modified:
   grass/trunk/lib/python/pygrass/modules/grid/grid.py
   grass/trunk/lib/python/pygrass/modules/grid/patch.py
Log:
Improve isolations between mapsets when copy data, remove temporary GISRC, add support for groups and vectors as input, copy them to the temporary mapset if needed

Modified: grass/trunk/lib/python/pygrass/modules/grid/grid.py
===================================================================
--- grass/trunk/lib/python/pygrass/modules/grid/grid.py	2013-10-14 17:43:45 UTC (rev 57999)
+++ grass/trunk/lib/python/pygrass/modules/grid/grid.py	2013-10-15 09:52:01 UTC (rev 58000)
@@ -17,7 +17,7 @@
 from grass.pygrass.functions import get_mapset_raster
 
 from split import split_region_tiles
-from patch import patch_map
+from patch import rpatch_map
 
 
 def select(parms, ptype):
@@ -62,13 +62,44 @@
     return Mapset(mapset.name, location, gisdbase)
 
 
-def copy_raster(rasters, src, dst, region=None, gisrc_dst=None):
-    """Copy raster from one mapset to another, crop the raster to the region.
+def copy_groups(groups, src, dst, gisrc_dst=None, region=None):
+    """Copy groupd from one mapset to another, crop the raster to the region.
     """
+    env = os.environ.copy()
     # set region
     if region:
         region.set_current()
 
+    # instantiate modules
+    get_grp = Module('i.group', flags='lg', stdout_=sub.PIPE, run_=False)
+    set_grp = Module('i.group')
+    get_grp.run_ = True
+
+    # get and set GISRC
+    gisrc_src = env['GISRC']
+    gisrc_dst = gisrc_dst if gisrc_dst else write_gisrc(dst.gisdbase,
+                                                        dst.location,
+                                                        dst.name)
+
+    for grp in groups:
+        # change gisdbase to src
+        env['GISRC'] = gisrc_src
+        get_grp(group=grp, env_=env)
+        rasts = get_grp.outputs.stdout.split()
+        # change gisdbase to dst
+        env['GISRC'] = gisrc_dst
+        set_grp(group=grp, input=rasts, env_=env)
+    return gisrc_src, gisrc_dst
+
+
+def copy_rasters(rasters, src, dst, gisrc_dst=None, region=None):
+    """Copy rasters from one mapset to another, crop the raster to the region.
+    """
+    env = os.environ.copy()
+    # set region
+    if region:
+        region.set_current()
+
     nam = "copy%d__%s" % (id(dst), '%s')
     expr = "%s=%s"
 
@@ -79,7 +110,7 @@
     rm = Module('g.remove')
 
     # get and set GISRC
-    gisrc_src = os.environ['GISRC']
+    gisrc_src = env['GISRC']
     gisrc_dst = gisrc_dst if gisrc_dst else write_gisrc(dst.gisdbase,
                                                         dst.location,
                                                         dst.name)
@@ -87,21 +118,55 @@
     pdst = dst.path()
     for rast in rasters:
         # change gisdbase to src
-        os.environ['GISRC'] = gisrc_src
-        src.current()
+        env['GISRC'] = gisrc_src
         name = nam % rast
-        mpclc(expression=expr % (name, rast), overwrite=True)
+        mpclc(expression=expr % (name, rast), overwrite=True, env_=env)
         file_dst = "%s.pack" % os.path.join(pdst, name)
-        rpck(input=name, output=file_dst, overwrite=True)
-        rm(rast=name)
+        rpck(input=name, output=file_dst, overwrite=True, env_=env)
+        rm(rast=name, env_=env)
         # change gisdbase to dst
-        os.environ['GISRC'] = gisrc_dst
-        dst.current()
-        rupck(input=file_dst, output=rast, overwrite=True)
+        env['GISRC'] = gisrc_dst
+        rupck(input=file_dst, output=rast, overwrite=True, env_=env)
         os.remove(file_dst)
     return gisrc_src, gisrc_dst
 
 
+def copy_vectors(vectors, src, dst, gisrc_dst=None, region=None):
+    """Copy vectors from one mapset to another, crop the raster to the region.
+    """
+    env = os.environ.copy()
+    # set region
+    if region:
+        region.set_current()
+
+    nam = "copy%d__%s" % (id(dst), '%s')
+
+    # instantiate modules
+    vpck = Module('v.pack')
+    vupck = Module('v.unpack')
+    rm = Module('g.remove')
+
+    # get and set GISRC
+    gisrc_src = env['GISRC']
+    gisrc_dst = gisrc_dst if gisrc_dst else write_gisrc(dst.gisdbase,
+                                                        dst.location,
+                                                        dst.name)
+
+    pdst = dst.path()
+    for vect in vectors:
+        # change gisdbase to src
+        env['GISRC'] = gisrc_src
+        name = nam % vect
+        file_dst = "%s.pack" % os.path.join(pdst, name)
+        vpck(input=name, output=file_dst, overwrite=True, env_=env)
+        rm(vect=name, env_=env)
+        # change gisdbase to dst
+        env['GISRC'] = gisrc_dst
+        vupck(input=file_dst, output=vect, overwrite=True, env_=env)
+        os.remove(file_dst)
+    return gisrc_src, gisrc_dst
+
+
 def get_cmd(cmdd):
     """Transforma a cmd dictionary to a list of parameters"""
     cmd = [cmdd['name'], ]
@@ -123,7 +188,7 @@
 
 def cmd_exe(args):
     """Create a mapset, and execute a cmd inside."""
-    bbox, mapnames, msetname, cmd = args
+    bbox, mapnames, msetname, cmd, groups = args
     mset = Mapset()
     try:
         make_mapset(msetname)
@@ -147,8 +212,12 @@
         lcmd = ['g.region', ]
         lcmd.extend(["%s=%s" % (k, v) for k, v in bbox.iteritems()])
         sub.Popen(lcmd, env=env).wait()
+    if groups:
+        src, dst = copy_groups(groups, mset, ms, env['GISRC'])
     # run the grass command
     sub.Popen(get_cmd(cmd), env=env).wait()
+    # remove temp GISRC
+    os.remove(env['GISRC'])
 
 
 class GridModule(object):
@@ -165,7 +234,7 @@
         Height of the tile, in pixel.
     overlap: integer
         Overlap between tiles, in pixel.
-    nthreads: number of threads
+    processes: number of threads
         Default value is equal to the number of processor available.
     split: boolean
         If True use r.tile to split all the inputs.
@@ -204,13 +273,17 @@
         self.n_mset = None
         self.gisrc_src = self.gisrc_dst = None
         self.log = log
-        if move:
-            self.n_mset = copy_mapset(self.mset, move)
+        self.move = move
+        if self.move:
+            self.n_mset = copy_mapset(self.mset, self.move)
             rasters = select(self.module.inputs, 'raster')
-            self.gisrc_src, self.gisrc_dst = copy_raster(rasters,
-                                                         self.mset,
-                                                         self.n_mset,
-                                                         region=self.region)
+            self.gisrc_src, self.gisrc_dst = copy_rasters(rasters,
+                                                          self.mset,
+                                                          self.n_mset,
+                                                          region=self.region)
+            vectors = select(self.module.inputs, 'vector')
+            copy_vectors(vectors, self.mset, self.n_mset,
+                         gisrc_dst=self.gisrc_dst, region=self.region)
 
         self.bboxes = split_region_tiles(region=region,
                                          width=width, height=height,
@@ -221,9 +294,10 @@
             self.split()
         self.debug = debug
 
-    def clean_location(self):
+    def clean_location(self, location=None):
         """Remove all created mapsets."""
-        mapsets = Location().mapsets(self.msetstr.split('_')[0] + '_*')
+        location = location if location else Location()
+        mapsets = location.mapsets(self.msetstr.split('_')[0] + '_*')
         for mset in mapsets:
             Mapset(mset).delete()
 
@@ -245,6 +319,7 @@
         works = []
         reg = Region()
         cmd = self.module.get_dict()
+        groups = [g for g in select(self.module.inputs, 'group')]
         for row, box_row in enumerate(self.bboxes):
             for col, box in enumerate(box_row):
                 inms = None
@@ -262,7 +337,7 @@
                 works.append((bbox, inms,
                               self.msetstr % (self.start_row + row,
                                               self.start_col + col),
-                              cmd))
+                              cmd, groups))
         return works
 
     def define_mapset_inputs(self):
@@ -288,15 +363,17 @@
             if not result.successful():
                 raise RuntimeError
 
+        self.mset.current()
+
         if patch:
             self.patch()
 
         if self.n_mset is not None:
-            # move the outputs to the original mapset
-            outputs = [self.out_prefix + o
-                       for o in select(self.module.outputs, 'raster')]
-            copy_raster(outputs, self.n_mset, self.mset, self.region,
-                        self.gisrc_src)
+            # move the raster outputs to the original mapset
+            routputs = [self.out_prefix + o
+                        for o in select(self.module.outputs, 'raster')]
+            copy_rasters(routputs, self.n_mset, self.mset,
+                         self.gisrc_src, self.region)
 
         if self.log:
             # record in the temp directory
@@ -314,21 +391,29 @@
                     fp.close()
 
         if clean:
+            self.mset.current()
             self.clean_location()
             self.rm_tiles()
+            if self.n_mset:
+                gisdbase, location = os.path.split(self.move)
+                self.clean_location(Location(location, gisdbase))
+                # rm temporary gis_rc
+                os.remove(self.gisrc_dst)
+                self.gisrc_dst = None
+                sht.rmtree(os.path.join(self.move, 'PERMANENT'))
+                sht.rmtree(os.path.join(self.move, self.mset.name))
 
     def patch(self):
         """Patch the final results."""
         # patch all the outputs
+        bboxes = split_region_tiles(width=self.width, height=self.height)
         for otmap in self.module.outputs:
             otm = self.module.outputs[otmap]
             if otm.typedesc == 'raster' and otm.value:
-                patch_map(otm.value,
-                          self.mset.name, self.msetstr,
-                          split_region_tiles(width=self.width,
-                                             height=self.height),
-                          self.module.flags.overwrite,
-                          self.start_row, self.start_col, self.out_prefix)
+                rpatch_map(otm.value,
+                           self.mset.name, self.msetstr, bboxes,
+                           self.module.flags.overwrite,
+                           self.start_row, self.start_col, self.out_prefix)
 
     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-10-14 17:43:45 UTC (rev 57999)
+++ grass/trunk/lib/python/pygrass/modules/grid/patch.py	2013-10-15 09:52:01 UTC (rev 58000)
@@ -22,7 +22,7 @@
     return ss_list
 
 
-def patch_row(rast, rasts, bboxes):
+def rpatch_row(rast, rasts, bboxes):
     """Patch a row of bound boxes."""
     sei = get_start_end_index(bboxes)
     # instantiate two buffer
@@ -37,8 +37,8 @@
         rast.put_row(rbuff)
 
 
-def patch_map(raster, mapset, mset_str, bbox_list, overwrite=False,
-              start_row=0, start_col=0, prefix=''):
+def rpatch_map(raster, mapset, mset_str, bbox_list, overwrite=False,
+               start_row=0, start_col=0, prefix=''):
     """Patch raster using a bounding box list to trim the raster."""
     # Instantiate the RasterRow input objects
     rast = RasterRow(prefix + raster, mapset)
@@ -55,10 +55,9 @@
                                                        start_col + col)))
             rrasts[-1].open('r')
         rasts.append(rrasts)
-        patch_row(rast, rrasts, rbbox)
+        rpatch_row(rast, rrasts, rbbox)
 
     for rrast in rasts:
         for rast_ in rrast:
             rast_.close()
     rast.close()
-



More information about the grass-commit mailing list