[GRASS-SVN] r65560 - grass-addons/tools

svn_grass at osgeo.org svn_grass at osgeo.org
Fri Jul 10 03:30:08 PDT 2015


Author: lucadelu
Date: 2015-07-10 03:30:08 -0700 (Fri, 10 Jul 2015)
New Revision: 65560

Modified:
   grass-addons/tools/std_dataset_display.py
Log:
updated script to create images from standard dataset

Modified: grass-addons/tools/std_dataset_display.py
===================================================================
--- grass-addons/tools/std_dataset_display.py	2015-07-10 08:15:45 UTC (rev 65559)
+++ grass-addons/tools/std_dataset_display.py	2015-07-10 10:30:08 UTC (rev 65560)
@@ -2,12 +2,17 @@
 
 import os
 import grass.script as gscript
-
+from PIL import Image
+import argparse
 # before the script runs, old maps and existing images must be removed
 # g.remove type=raster name=slope,aspect,profile_curvature,shade -f
 # rm *.png
 
+# the size of images could be different between different dataset
+DATASET = {'north_carolina': {'w': 600, 'h': 600},
+           'piemonte': {'w': 600, 'h': 800}}
 
+
 def description_box(title):
     gscript.write_command('d.graph', stdin="""
     color white
@@ -29,45 +34,118 @@
         {x2} {y1}
         {x2} {y2}
     """.format(color=color, x1=x, y1=y, x2=x + 2, y2=y + 2))
-    gscript.run_command('d.text', text=text, at=(x + 3, y + 0.5), size=2, color='black')
+    gscript.run_command('d.text', text=text, at=(x + 3, y + 0.5), size=2,
+                        color='black')
 
 
 def d_rast_legend(raster, title):
+    """Print raster and its legend
+    :param str raster: the name of raster to print
+    :param str title: the text to append to the legend
+    """
     gscript.run_command('d.rast', map=raster)
     description_box(title)
     gscript.run_command('d.legend', raster=raster, at='6,9,6,50')
-    gscript.run_command('d.barscale', style='classic', at='55,9', color='black', text_position='over')
+    gscript.run_command('d.barscale', style='classic', at='55,9',
+                        color='black', text_position='over')
 
 
+def join_output(inputs, output, width, height, resize=None):
+    """Attach several  images in a collage
+    :param list inputs: a list with the input images to attach together
+    :param str output: the output name
+    :param int width: the width of images
+    :param int height: the height of images
+    :param float resize: value beetwen 0 and 1 to resize the finale output
+    """
+    out = Image.new("RGB", (width * len(inputs), height), "white")
+    x = 0
+    for inp in inputs:
+        out.paste(Image.open(inp), (x, 0))
+        x += width
+    if resize and resize < 1.0:
+        out = out.resize(width * resize, height * resize)
+    out.save(output)
+
+
+def cleanup(maps):
+    """Remove all the created maps"""
+    gscript.run_command('g.remove', type='raster', name=','.join(maps),
+                        flags='f')
+
+
+def get_parser():
+    """Create the parser for running as script"""
+    parser = argparse.ArgumentParser(description='')
+    parser.add_argument('dataset', type=str, metavar='DATASET',
+                        help='Name of dataset you are using, possible choices'
+                        ' are: {va}'.format(va=', '.join(DATASET.keys())),
+                        choices=DATASET.keys())
+    parser.add_argument('-o', '--output', type=str, metavar='OUTPUT',
+                        help='Name of output collage', dest='output')
+    parser.add_argument('-e', '--elevation', type=str,
+                        default='shaded_elevation.png',
+                        dest='ele', help='Name of shaded elevation output')
+    parser.add_argument('-s', '--slope', type=str, default='slope.png',
+                        dest='slope', help='Name of slope output')
+    parser.add_argument('-a', '--aspect', type=str, default='aspect.png',
+                        dest='aspect', help='Name of aspect output')
+    parser.add_argument('-p', '--profile', type=str, dest='profile',
+                        default='profile_curvature.png',
+                        help='Name of profile curvature output')
+    parser.add_argument('-r', '--resize', type=float, default=1.0,
+                        dest='resize', help='Value to resize the final output')
+    parser.add_argument('-c', '--cleanup', action='store_true', default=False,
+                        dest='cleanup', help='Remove the maps created by this'
+                        ' script')
+    return parser
+
+
 def main():
+    """Main function to run the script"""
+    parser = get_parser()
+    args = parser.parse_args()
+    # original maps
     elevation = 'elevation'
+    streams = 'streams'
+    roadsmajor = 'roadsmajor'
+    # color
+    streams_color = 'aqua'
+    roads_color = 'yellow'
+    # created maps, to be removed
     slope = 'slope'
     aspect = 'aspect'
     profile_curvature = 'profile_curvature'
     shade = 'shade'
-    streams = 'streams'
-    streams_color = 'aqua'
-    roadsmajor = 'roadsmajor'
-    roads_color = 'yellow'
+    # final png outfile
+    ele_out = args.ele
+    aspect_out = args.aspect
+    slope_out = args.slope
+    profile_out = args.profile
 
+    data = DATASET[args.dataset]
+    width = data['w']
+    height = data['h']
+
     # we set region for the whole session (i.e. also outside the script)
     gscript.run_command('g.region', raster=elevation)
 
     gscript.run_command('r.slope.aspect', elevation=elevation,
-                        slope=slope, aspect=aspect, pcurvature=profile_curvature)
+                        slope=slope, aspect=aspect,
+                        pcurvature=profile_curvature)
 
     gscript.run_command('r.relief', input=elevation, output=shade)
 
     # render maps
     # set variables for rendering into a file
     os.environ['GRASS_RENDER_IMMEDIATE'] = 'cairo'
-    os.environ['GRASS_RENDER_WIDTH'] = '600'
-    os.environ['GRASS_RENDER_HEIGHT'] = '600'
+    os.environ['GRASS_RENDER_WIDTH'] = str(width)
+    os.environ['GRASS_RENDER_HEIGHT'] = str(height)
     os.environ['GRASS_RENDER_FILE_READ'] = 'TRUE'
     os.environ['GRASS_FONT'] = 'sans'
 
     # shaded map with vectors
-    os.environ['GRASS_RENDER_FILE'] = 'shaded_elevation.png'
+    os.environ['GRASS_RENDER_FILE'] = ele_out
     gscript.run_command('d.shade', shade=shade, color=elevation)
     gscript.run_command('d.vect', map=streams, width=1, color=streams_color)
     gscript.run_command('d.vect', map=roadsmajor, width=2, color=roads_color)
@@ -75,23 +153,28 @@
     legend_item(streams_color, 'Streams', 3, 3)
     legend_item(roads_color, 'Major roads', 3, 6)
     gscript.run_command('d.legend', raster=elevation, at='3,6,30,50')
-    gscript.run_command('d.text', text='Elevation', at='30,7', size=2, color='black')
-    gscript.run_command('d.barscale', style='classic', at='55,9', color='black', text_position='over')
+    gscript.run_command('d.text', text='Elevation', at='30,7', size=2,
+                        color='black')
+    gscript.run_command('d.barscale', style='classic', at='55,9',
+                        color='black', text_position='over')
 
     # individual rasters
-    os.environ['GRASS_RENDER_FILE'] = 'slope.png'
+    os.environ['GRASS_RENDER_FILE'] = slope_out
     d_rast_legend(slope, 'Slope')
 
-    os.environ['GRASS_RENDER_FILE'] = 'aspect.png'
+    os.environ['GRASS_RENDER_FILE'] = aspect_out
     d_rast_legend(aspect, 'Aspect')
 
-    os.environ['GRASS_RENDER_FILE'] = 'profile_curvature.png'
+    os.environ['GRASS_RENDER_FILE'] = profile_out
     d_rast_legend(profile_curvature, 'Profile curvature')
 
-    # post processing
-    # convert shaded_elevation.png slope.png aspect.png profile_curvature.png +append stripe.png
-    # mogrify -resize 60%x60% stripe.png
-    # optipng stripe.png
+    if args.output:
+        join_inputs = [ele_out, aspect_out, slope_out, profile_out]
+        join_output(join_inputs, args.output, width, height, args.resize)
 
+    if args.cleanup:
+        clean_maps = [slope, aspect, profile_curvature, shade]
+        cleanup(clean_maps)
+
 if __name__ == "__main__":
     main()



More information about the grass-commit mailing list