[GRASS-SVN] r34409 - in grass/trunk: raster scripts scripts/r.buffer

svn_grass at osgeo.org svn_grass at osgeo.org
Thu Nov 20 15:03:58 EST 2008


Author: glynn
Date: 2008-11-20 15:03:58 -0500 (Thu, 20 Nov 2008)
New Revision: 34409

Added:
   grass/trunk/scripts/r.buffer/
   grass/trunk/scripts/r.buffer/Makefile
   grass/trunk/scripts/r.buffer/r.buffer.html
   grass/trunk/scripts/r.buffer/r.buffer.py
Modified:
   grass/trunk/raster/Makefile
Log:
Replace r.buffer with a script using r.grow.distance


Modified: grass/trunk/raster/Makefile
===================================================================
--- grass/trunk/raster/Makefile	2008-11-20 19:11:28 UTC (rev 34408)
+++ grass/trunk/raster/Makefile	2008-11-20 20:03:58 UTC (rev 34409)
@@ -4,7 +4,6 @@
 	r.average \
 	r.basins.fill \
 	r.bitpattern \
-	r.buffer \
 	r.carve \
 	r.category \
 	r.circle \

Added: grass/trunk/scripts/r.buffer/Makefile
===================================================================
--- grass/trunk/scripts/r.buffer/Makefile	                        (rev 0)
+++ grass/trunk/scripts/r.buffer/Makefile	2008-11-20 20:03:58 UTC (rev 34409)
@@ -0,0 +1,7 @@
+MODULE_TOPDIR = ../..
+
+PGM = r.buffer
+
+include $(MODULE_TOPDIR)/include/Make/Script.make
+
+default: script

Added: grass/trunk/scripts/r.buffer/r.buffer.html
===================================================================
--- grass/trunk/scripts/r.buffer/r.buffer.html	                        (rev 0)
+++ grass/trunk/scripts/r.buffer/r.buffer.html	2008-11-20 20:03:58 UTC (rev 34409)
@@ -0,0 +1,117 @@
+<h2>DESCRIPTION</h2>
+
+<em>r.buffer</em> creates a new raster map layer showing
+buffer (a.k.a. "distance" or "proximity") zones around all
+cells that contain non-NULL category values in an existing
+raster map layer.  The distances of buffer zones from cells
+with non-zero category values are user-chosen.  Suppose,
+for example, that you want to place buffer zones around
+roads.  This program could create the raster map layer
+shown below on the right based on road information
+contained in the raster map layer shown on the left.
+
+<div class="code"><pre>
+      000000000000000000000000 222233333333333333444444 
+      111000000000000000000000 111222222222223333333333 
+      000111111111100000000000 222111111111122223333333 
+      000000001000011100000000 332222221222211122222222 
+      000000001000000011111111 333333321233222211111111 
+      000000001000000000000000 433333321233333222222222 
+      000000001000000000000000 444443321233333333333333 
+      000000001000000000000000 444443321233443333333333 
+      000000001000000000000000 444443321233444444444444 
+
+      Category 0: No roads
+      Category 1: Road location 
+      Category 2: Buffer Zone 1 around roads 
+      Category 3: Buffer Zone 2 around roads 
+      Category 4: Buffer Zone 3 around roads 
+</pre></div>
+<br>
+
+<h2>NOTES</h2>
+
+The user has the option of identifying up to 250 continuous zones.
+The zones are identified by specifying the upper limit of each desired zone
+(<em>r.buffer</em> assumes that <tt>0</tt> is the starting point).
+("Continuous" is used in the sense that each category
+zone's lower value is the previous zone's upper value. The
+first buffer zone always has distance <tt>0</tt> as its lower
+bound.) Buffer distances can be specified using one of five units with the <em>
+units</em> parameter: <em>meters, kilometers, feet, miles</em>, and <em>nautmiles</em>
+(nautical miles).
+<p>
+
+<!-- ??? is this the real method used or some ancient option ??? -->
+Distances from cells containing the user-specified category values
+are calculated using the "fromcell" method. This method locates each
+cell that contains a category value from which distances are to be
+calculated, and draws the requested distance rings around
+them. This method works very fast when there are few cells
+containing the category values of interest, but works
+slowly when there are numerous cells containing the
+category values of interest spread throughout the area.
+<p>
+
+<em>r.buffer</em> measures distances from center of cell to
+center of cell using Euclidean distance measure for
+planimetric locations (like UTM) and using ellipsoidal
+geodesic distance measure for latitude/longitude locations.
+<p>
+
+<em>r.buffer</em> calculates distance zones from all cells having non-NULL 
+category values in the <em>input</em> map. If the user wishes to calculate
+distances from only selected <em>input</em> map layer 
+category values, the user should run (for example) 
+<em><a href="r.reclass.html">r.reclass</a></em> prior to 
+<em>r.buffer</em>, to reclass all categories from which distance zones 
+are not desired to be calculated into category NULL. 
+<p>
+
+The <b>-z</b> flag can be used to ignore raster values of zero instead of NULL
+values in the input raster map.
+<p>
+
+<h2>EXAMPLE</h2>
+
+In the following example, the buffer zones would be (in the default units
+of meters):  0-100, 101-200, 201-300, 301-400 and 401-500.
+<br>
+<div class="code"><pre>
+<b>r.buffer input=</b>roads <b>output=</b>roads.buf <b>distances=</b>100,200,300,400,500
+</pre></div>
+
+Result:
+
+<div class="code"><pre>
+<b>r.category input=</b>roads.buf
+
+      1       distances calculated from these locations
+      2       0-100 meters
+      3       100-200 meters
+      4       200-300 meters
+      5       300-400 meters
+      6       400-500 meters
+</pre></div>
+
+<h2>SEE ALSO</h2>
+
+<em>
+<a href="g.region.html">g.region</a><br>
+<a href="r.cost.html">r.cost</a><br>
+<a href="r.mapcalc.html">r.mapcalc</a><br>
+<a href="r.reclass.html">r.reclass</a><br>
+<a href="v.buffer.html">v.buffer</a>
+</em>
+
+
+<h2>AUTHORS</h2>
+
+Michael Shapiro, U.S. Army Construction Engineering 
+Research Laboratory
+<br>
+James Westervelt, U.S. Army Construction Engineering 
+Research Laboratory
+
+<p>
+<i>Last changed: $Date: 2008-08-15 07:16:42 +0100 (Fri, 15 Aug 2008) $</i>

Added: grass/trunk/scripts/r.buffer/r.buffer.py
===================================================================
--- grass/trunk/scripts/r.buffer/r.buffer.py	                        (rev 0)
+++ grass/trunk/scripts/r.buffer/r.buffer.py	2008-11-20 20:03:58 UTC (rev 34409)
@@ -0,0 +1,140 @@
+#!/usr/bin/env python
+#
+############################################################################
+#
+# MODULE:	r.buffer
+# AUTHOR(S):	Glynn Clements
+# PURPOSE:	Replacement for r.buffer using r.grow.distance
+#
+# COPYRIGHT:	(C) 2008 by Glynn Clements
+#
+#		This program is free software under the GNU General Public
+#		License (>=v2). Read the file COPYING that comes with GRASS
+#		for details.
+#
+#############################################################################
+
+#%Module
+#% description: Creates a raster map layer showing buffer zones surrounding cells that contain non-NULL category values.
+#% keywords: raster, buffer
+#%End
+#%Flag
+#% key: z
+#% description: Ignore zero (0) data cells instead of NULL cells
+#%End
+#%Option
+#% key: input
+#% type: string
+#% required: yes
+#% multiple: no
+#% key_desc: name
+#% description: Name of input raster map
+#% gisprompt: old,cell,raster
+#%End
+#%Option
+#% key: output
+#% type: string
+#% required: yes
+#% multiple: no
+#% key_desc: name
+#% description: Name for output raster map
+#% gisprompt: new,cell,raster
+#%End
+#%Option
+#% key: distances
+#% type: double
+#% required: yes
+#% multiple: yes
+#% description: Distance zone(s)
+#%End
+#%Option
+#% key: units
+#% type: string
+#% required: no
+#% multiple: no
+#% options: meters,kilometers,feet,miles,nautmiles
+#% description: Units of distance
+#% answer: meters
+#%End
+
+import sys
+import os
+import atexit
+import string
+import math
+import grass
+
+scales = {
+    'meters': 1.0,
+    'kilometers': 1000.0,
+    'feet': 0.3048,
+    'miles': 1609.344,
+    'nautmiles': 1852.0
+    }
+
+# what to do in case of user break:
+def cleanup():
+    grass.run_command('g.remove', quiet = True, flags = 'f', rast = temp_src)
+    grass.run_command('g.remove', quiet = True, flags = 'f', rast = temp_dist)
+
+def main():
+    global temp_dist, temp_src
+
+    input = options['input']
+    output = options['output']
+    distances = options['distances']
+    units = options['units']
+    zero = flags['z']
+
+    tmp = str(os.getpid())
+    temp_dist = "r.buffer.tmp.%s.dist" % tmp
+    temp_src = "r.buffer.tmp.%s.src" % tmp
+
+    #check if input file exists
+    if not grass.find_file(input)['file']:
+	grass.fatal("<%s> does not exist." % input)
+
+    scale = scales[units]
+
+    distances  = distances.split(',')
+    distances1 = [scale * float(d) for d in distances]
+    distances2 = [d * d for d in distances1]
+
+    grass.run_command('r.grow.distance',  input = input, metric = 'squared',
+		      distance = temp_dist)
+
+    if zero:
+	t = string.Template("$temp_src = if($input == 0,null(),1)")
+    else:
+	t = string.Template("$temp_src = if(isnull($input),null(),1)")
+
+    e = t.substitute(temp_src = temp_src, input = input)
+    grass.run_command('r.mapcalc', expression = e)
+
+    s = "$output = if(!isnull($input),$input,%s)"
+    for n, dist2 in enumerate(distances2):
+	s %= "if($dist <= %f,%d,%%s)" % (dist2,n + 2)
+    s %= "null()"
+
+    t = string.Template(s)
+    e = t.substitute(output = output, input = temp_src, dist = temp_dist)
+    grass.run_command('r.mapcalc', expression = e)
+
+    p = grass.feed_command('r.category', map = output, rules = '-')
+    p.stdin.write("1:distances calculated from these locations\n")
+    d0 = "0"
+    for n, d in enumerate(distances):
+	p.stdin.write("%d:%s-%s %s\n" % (n + 2, d0, d, units))
+	d0 = d
+    p.stdin.close()
+    p.wait()
+
+    grass.run_command('r.colors', map = output, color = 'rainbow')
+
+    # write cmd history:
+    grass.raster_history(output)
+
+if __name__ == "__main__":
+    options, flags = grass.parser()
+    atexit.register(cleanup)
+    main()


Property changes on: grass/trunk/scripts/r.buffer/r.buffer.py
___________________________________________________________________
Name: svn:executable
   + *



More information about the grass-commit mailing list