[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