[GRASS-SVN] r69592 - in grass-addons/grass7/raster3d: . r3.count.categories
svn_grass at osgeo.org
svn_grass at osgeo.org
Tue Sep 27 18:03:12 PDT 2016
Author: wenzeslaus
Date: 2016-09-27 18:03:12 -0700 (Tue, 27 Sep 2016)
New Revision: 69592
Added:
grass-addons/grass7/raster3d/r3.count.categories/
grass-addons/grass7/raster3d/r3.count.categories/r3.count.categories.html
grass-addons/grass7/raster3d/r3.count.categories/r3.count.categories.py
Removed:
grass-addons/grass7/raster3d/r3.count.categories/r3.count.cats.html
grass-addons/grass7/raster3d/r3.count.categories/r3.count.cats.py
grass-addons/grass7/raster3d/r3.count.cats/
Modified:
grass-addons/grass7/raster3d/r3.count.categories/Makefile
Log:
r3.count.categories: rename from r3.count.cats
New name is not as funny, but on the other hand it follows
r|v.category, r.sample.category and r.category.trim.
Modified: grass-addons/grass7/raster3d/r3.count.categories/Makefile
===================================================================
--- grass-addons/grass7/raster3d/r3.count.cats/Makefile 2016-09-26 02:53:54 UTC (rev 69573)
+++ grass-addons/grass7/raster3d/r3.count.categories/Makefile 2016-09-28 01:03:12 UTC (rev 69592)
@@ -1,6 +1,6 @@
MODULE_TOPDIR = ../..
-PGM = r3.count.cats
+PGM = r3.count.categories
include $(MODULE_TOPDIR)/include/Make/Script.make
Copied: grass-addons/grass7/raster3d/r3.count.categories/r3.count.categories.html (from rev 69573, grass-addons/grass7/raster3d/r3.count.cats/r3.count.cats.html)
===================================================================
--- grass-addons/grass7/raster3d/r3.count.categories/r3.count.categories.html (rev 0)
+++ grass-addons/grass7/raster3d/r3.count.categories/r3.count.categories.html 2016-09-28 01:03:12 UTC (rev 69592)
@@ -0,0 +1,30 @@
+<h2>DESCRIPTION</h2>
+
+<em>r3.count.categories</em> iterates over whole numbers (categories,
+classes) in the 3D raster (considers values to be integers) and for
+each vertical column counts them in the given column.
+
+<p>
+The 3D raster map is considered to be integer, i.e. all values are
+converted to integer values with truncation. When some conversion
+is appropriate the <b>multiply</b> option can be used to scale
+the value before conversion. For example, if the values are percentages
+with values between 0 and 1, value 100 can be used to obtain percentages
+between 0 and 100. The values will be then preserved with precision 1
+(decimal part is truncated).
+
+
+<h2>SEE ALSO</h2>
+
+<em>
+<a href="r3.to.rast.html">r3.to.rast</a>,
+<a href="r3.to.group.html">r3.to.group</a>,
+<a href="r3.what.html">r3.what</a>
+</em>
+
+
+<h2>AUTHORS</h2>
+
+Vaclav Petras, <a href="http://geospatial.ncsu.edu/osgeorel/">NCSU GeoForAll Lab</a>
+
+<p><i>Last changed: $Date$</i>
Copied: grass-addons/grass7/raster3d/r3.count.categories/r3.count.categories.py (from rev 69573, grass-addons/grass7/raster3d/r3.count.cats/r3.count.cats.py)
===================================================================
--- grass-addons/grass7/raster3d/r3.count.categories/r3.count.categories.py (rev 0)
+++ grass-addons/grass7/raster3d/r3.count.categories/r3.count.categories.py 2016-09-28 01:03:12 UTC (rev 69592)
@@ -0,0 +1,187 @@
+#!/usr/bin/env python
+#
+############################################################################
+#
+# MODULE: r3.count.categories
+# AUTHOR(S): Vaclav Petras <wenzeslaus gmail com>
+# PURPOSE: Count categories in vertical direction
+# COPYRIGHT: (C) 2016 by Vaclav Petras, and the GRASS Development Team
+#
+# This program is free software under the GNU General Public
+# License (>=v2). Read the file COPYING that comes with GRASS
+# for details.
+#
+#############################################################################
+
+#%module
+#% description: Count categories in vertical direction
+#% keyword: raster3d
+#% keyword: conversion
+#% keyword: raster
+#% keyword: categories
+#% keyword: voxel
+#%end
+#%option G_OPT_R3_INPUT
+#%end
+#%option G_OPT_R_BASENAME_OUTPUT
+#% required: yes
+#%end
+#%option G_OPT_R_BASENAME_OUTPUT
+#% key: slices
+# TODO: required: no
+#% required: yes
+#% label: Basename for horizontal slices of the 3D raster
+#%end
+#%option
+#% key: multiply
+#% type: double
+#% required: no
+#% label: Value to multiply the raster values with
+#% description: Coefficient a in the equation y = ax + b
+#%end
+#%option
+#% key: add
+#% type: double
+#% required: no
+#% label: Value to add to the raster values
+#% description: Coefficient b in the equation y = ax + b
+#%end
+#%option
+#% key: size
+#% type: integer
+#% required: no
+#% label: Moving window size
+#% description: By default, only the given cell is considered
+#%end
+
+
+import grass.script as gs
+from grass.exceptions import CalledModuleError
+
+
+def check_raster3d_exists(name):
+ """Check if the raster map exists, call GRASS fatal otherwise"""
+ file_info = gs.find_file(name, element='grid3')
+ if not file_info['fullname']:
+ gs.fatal(_("3D Raster map <%s> not found") % name)
+
+
+def remove(maps):
+ """Remove raster maps"""
+ if maps:
+ gs.run_command('g.remove', flags='f', quiet=True,
+ type='rast', name=maps)
+
+
+def list_in_current_mapset(pattern):
+ """List names of raster maps in the current mapset"""
+ maps = gs.list_pairs(type='rast', mapset=".", pattern=pattern, flag='e')
+ maps = [name for name, mapset in maps]
+ return maps
+
+
+def basename_in_use_message(basename, rasters):
+ if len(rasters) > 3:
+ formatted = "%s,..." % ", ".join(rasters[:3])
+ else:
+ formatted = ", ".join(rasters)
+ gs.fatal(_("There are rasters with basename <%s> (%s), use"
+ " different name or overwrite") % (basename, formatted))
+
+
+# TODO: create name for slices if not provided
+def create_tmp_map_name(name):
+ return '{mod}_{pid}_{map_}_tmp'.format(mod='r3_reduce',
+ pid=os.getpid(),
+ map_=name)
+
+
+def main():
+ options, flags = gs.parser()
+
+ input_ = options['input']
+ output_basename = options['output']
+ slices_basename = options['slices']
+
+ check_raster3d_exists(input_)
+
+ size = None
+ if options['size']:
+ size = int(options['size'])
+ if size % 2 == 0:
+ gs.fatal(_("Please provide an odd number for the moving"
+ " window size, not %d") % size)
+
+ # options to be passed to r3.to.rast
+ additional_options = {}
+ for option in ['multiply', 'add']:
+ if options[option]:
+ additional_options[option] = options[option]
+ additional_options['type'] = 'CELL'
+
+ basename_sep = "_"
+ output_pattern = "%s%s[0-9]+" % (output_basename, basename_sep)
+ slices_pattern = "%s%s[0-9]+" % (slices_basename, basename_sep)
+
+ overwrite = gs.overwrite()
+ rasters = list_in_current_mapset(output_pattern)
+ if not overwrite and rasters:
+ basename_in_use_message(output_basename, rasters)
+ rasters = list_in_current_mapset(slices_pattern)
+ if not overwrite and rasters:
+ basename_in_use_message(slices_basename, rasters)
+
+ # TODO: list of categories would be better
+ info = gs.parse_command('r3.info', map=input_, flags='r')
+ map_min = int(float(info['min']))
+ map_max = int(float(info['max']))
+ gs.verbose(_("Categories from %d to %d") % (map_min, map_max))
+
+ rasters = []
+ try:
+ # TODO: we should switch to 3D region for the following computations?
+ # or should we require resolutions to be the same?
+ gs.run_command('r3.to.rast', input=input_, output=slices_basename,
+ **additional_options)
+ # it's clear we created just the ones in the current mapset
+ # and we need to make the command line as short as possible
+ rasters = list_in_current_mapset(slices_pattern)
+ if size:
+ base_expr = "int({m}[{a},{b}] == $num)"
+ size = int((size - 1) / 2) # window size to max index
+ expr_list = []
+ for raster in rasters:
+ for j in range(-size, size + 1):
+ for i in range(-size, size + 1):
+ expr_list.append(base_expr.format(
+ m=raster, a=i, b=j))
+ expr = " + ".join(expr_list)
+ expr = "{out}{sep}$num = {inp}".format(
+ out=output_basename, sep=basename_sep,
+ inp=expr)
+ else:
+ expr = "{out}{sep}$num = int({inp} == $num)".format(
+ out=output_basename, sep=basename_sep,
+ inp=" == $num) + int(".join(rasters))
+
+ # TODO: define behavior when the map is empty or has just one class
+ try:
+ # TODO: this uses uncommitted experimental code for trunk
+ from grass.script.parallel import ModuleCallList, execute_by_module
+ call = ModuleCallList()
+ parallel = True
+ except ImportError:
+ call = gs # fall back to grass.script
+ parallel = False
+ for i in range(map_min, map_max + 1):
+ call.mapcalc(expr, num=i)
+ if parallel:
+ execute_by_module(call, nprocs=4)
+ except CalledModuleError as error:
+ remove(rasters)
+ gs.fatal(_("Module %s failed. Check the above error messages.") %
+ error.cmd)
+
+
+if __name__ == "__main__":
+ main()
Deleted: grass-addons/grass7/raster3d/r3.count.categories/r3.count.cats.html
===================================================================
--- grass-addons/grass7/raster3d/r3.count.cats/r3.count.cats.html 2016-09-26 02:53:54 UTC (rev 69573)
+++ grass-addons/grass7/raster3d/r3.count.categories/r3.count.cats.html 2016-09-28 01:03:12 UTC (rev 69592)
@@ -1,30 +0,0 @@
-<h2>DESCRIPTION</h2>
-
-<em>r3.count.cats</em> iterates over whole numbers (categories, classes)
-in the 3D raster (considers values to be integers) and for each vertical
-column counts them in the given column.
-
-<p>
-The 3D raster map is considered to be integer, i.e. all values are
-converted to integer values with truncation. When some conversion
-is appropriate the <b>multiply</b> option can be used to scale
-the value before conversion. For example, if the values are percentages
-with values between 0 and 1, value 100 can be used to obtain percentages
-between 0 and 100. The values will be then preserved with precision 1
-(decimal part is truncated).
-
-
-<h2>SEE ALSO</h2>
-
-<em>
-<a href="r3.to.rast.html">r3.to.rast</a>,
-<a href="r3.to.group.html">r3.to.group</a>,
-<a href="r3.what.html">r3.what</a>
-</em>
-
-
-<h2>AUTHORS</h2>
-
-Vaclav Petras, <a href="http://geospatial.ncsu.edu/osgeorel/">NCSU GeoForAll Lab</a>
-
-<p><i>Last changed: $Date$</i>
Deleted: grass-addons/grass7/raster3d/r3.count.categories/r3.count.cats.py
===================================================================
--- grass-addons/grass7/raster3d/r3.count.cats/r3.count.cats.py 2016-09-26 02:53:54 UTC (rev 69573)
+++ grass-addons/grass7/raster3d/r3.count.categories/r3.count.cats.py 2016-09-28 01:03:12 UTC (rev 69592)
@@ -1,188 +0,0 @@
-#!/usr/bin/env python
-#
-############################################################################
-#
-# MODULE: r3.count.cats
-# AUTHOR(S): Vaclav Petras <wenzeslaus gmail com>
-# PURPOSE: Count categories in vertical direction
-# COPYRIGHT: (C) 2016 by Vaclav Petras, and the GRASS Development Team
-#
-# This program is free software under the GNU General Public
-# License (>=v2). Read the file COPYING that comes with GRASS
-# for details.
-#
-#############################################################################
-
-#%module
-#% description: Count categories in vertical direction
-#% keyword: raster3d
-#% keyword: conversion
-#% keyword: raster
-#% keyword: categories
-#% keyword: voxel
-#%end
-#%option G_OPT_R3_INPUT
-#%end
-#%option G_OPT_R_BASENAME_OUTPUT
-#% required: yes
-#%end
-#%option G_OPT_R_BASENAME_OUTPUT
-#% key: slices
-# TODO: required: no
-#% required: yes
-#% label: Basename for horizontal slices of the 3D raster
-#%end
-#%option
-#% key: multiply
-#% type: double
-#% required: no
-#% label: Value to multiply the raster values with
-#% description: Coefficient a in the equation y = ax + b
-#%end
-#%option
-#% key: add
-#% type: double
-#% required: no
-#% label: Value to add to the raster values
-#% description: Coefficient b in the equation y = ax + b
-#%end
-#%option
-#% key: size
-#% type: integer
-#% required: no
-#% label: Moving window size
-#% description: By default, only the given cell is considered
-#%end
-
-
-import grass.script as gs
-from grass.exceptions import CalledModuleError
-
-
-def check_raster3d_exists(name):
- """Check if the raster map exists, call GRASS fatal otherwise"""
- file_info = gs.find_file(name, element='grid3')
- if not file_info['fullname']:
- gs.fatal(_("3D Raster map <%s> not found") % name)
-
-
-def remove(maps):
- """Remove raster maps"""
- if maps:
- gs.run_command('g.remove', flags='f', quiet=True,
- type='rast', name=maps)
-
-
-def list_in_current_mapset(pattern):
- """List names of raster maps in the current mapset"""
- maps = gs.list_pairs(type='rast', mapset=".", pattern=pattern, flag='e')
- maps = [name for name, mapset in maps]
- return maps
-
-
-def basename_in_use_message(basename, rasters):
- if len(rasters) > 3:
- formatted = "%s,..." % ", ".join(rasters[:3])
- else:
- formatted = ", ".join(rasters)
- gs.fatal(_("There are rasters with basename <%s> (%s), use"
- " different name or overwrite") % (basename, formatted))
-
-
-# TODO: create name for slices if not provided
-def create_tmp_map_name(name):
- return '{mod}_{pid}_{map_}_tmp'.format(mod='r3_reduce',
- pid=os.getpid(),
- map_=name)
-
-
-def main():
- options, flags = gs.parser()
-
- input_ = options['input']
- output_basename = options['output']
- slices_basename = options['slices']
-
- check_raster3d_exists(input_)
-
- size = None
- if options['size']:
- size = int(options['size'])
- if size % 2 == 0:
- gs.fatal(_("Please provide an odd number for the moving"
- " window size, not %d") % size)
-
- # options to be passed to r3.to.rast
- additional_options = {}
- for option in ['multiply', 'add']:
- if options[option]:
- additional_options[option] = options[option]
- additional_options['type'] = 'CELL'
-
- basename_sep = "_"
- output_pattern = "%s%s[0-9]+" % (output_basename, basename_sep)
- slices_pattern = "%s%s[0-9]+" % (slices_basename, basename_sep)
-
- overwrite = gs.overwrite()
- rasters = list_in_current_mapset(output_pattern)
- if not overwrite and rasters:
- basename_in_use_message(output_basename, rasters)
- rasters = list_in_current_mapset(slices_pattern)
- if not overwrite and rasters:
- basename_in_use_message(slices_basename, rasters)
-
- # TODO: list of categories would be better
- info = gs.parse_command('r3.info', map=input_, flags='r')
- map_min = int(float(info['min']))
- map_max = int(float(info['max']))
- gs.verbose(_("Categories from %d to %d") % (map_min, map_max))
-
- rasters = []
- try:
- # TODO: we should switch to 3D region for the following computations?
- # or should we require resolutions to be the same?
- gs.run_command('r3.to.rast', input=input_, output=slices_basename,
- **additional_options)
- # it's clear we created just the ones in the current mapset
- # and we need to make the command line as short as possible
- rasters = list_in_current_mapset(slices_pattern)
- if size:
- base_expr = "int({m}[{a},{b}] == $num)"
- size = int((size - 1) / 2) # window size to max index
- expr_list = []
- for raster in rasters:
- for j in range(-size, size + 1):
- for i in range(-size, size + 1):
- expr_list.append(base_expr.format(
- m=raster, a=i, b=j))
- expr = " + ".join(expr_list)
- expr = "{out}{sep}$num = {inp}".format(
- out=output_basename, sep=basename_sep,
- inp=expr)
- else:
- expr = "{out}{sep}$num = int({inp} == $num)".format(
- out=output_basename, sep=basename_sep,
- inp=" == $num) + int(".join(rasters))
-
- # TODO: define behavior when the map is empty or has just one class
- try:
- # TODO: this uses uncommitted experimental code for trunk
- from grass.script.parallel import ModuleCallList, execute_by_module
- call = ModuleCallList()
- parallel = True
- except ImportError:
- call = gs # fall back to grass.script
- parallel = False
- for i in range(map_min, map_max + 1):
- # TODO: parallelize here
- call.mapcalc(expr, num=i)
- if parallel:
- execute_by_module(call, nprocs=4)
- except CalledModuleError as error:
- remove(rasters)
- gs.fatal(_("Module %s failed. Check the above error messages.") %
- error.cmd)
-
-
-if __name__ == "__main__":
- main()
More information about the grass-commit
mailing list