diff --git a/python/plugins/processing/algs/grass7/description/r.category.out.txt b/python/plugins/processing/algs/grass7/description/r.category.out.txt new file mode 100644 index 000000000000..f6310244ab5a --- /dev/null +++ b/python/plugins/processing/algs/grass7/description/r.category.out.txt @@ -0,0 +1,8 @@ +r.category +r.category.out - Exports category values and labels associated with user-specified raster map layers. +Raster (r.*) +ParameterRaster|map|Name of raster map|False +ParameterString|cats|Category values (for Integer rasters). Example: 1,3,7-9,13|None|False|True +ParameterString|values|Comma separated value list (for float rasters). Example: 1.4,3.8,13|None|False|True +ParameterString|separator|Field separator (Special characters: pipe, comma, space, tab, newline)|tab|False|True +OutputFile|output|Category diff --git a/python/plugins/processing/algs/grass7/description/r.category.txt b/python/plugins/processing/algs/grass7/description/r.category.txt new file mode 100644 index 000000000000..6641cf0f8cc2 --- /dev/null +++ b/python/plugins/processing/algs/grass7/description/r.category.txt @@ -0,0 +1,11 @@ +r.category +Manages category values and labels associated with user-specified raster map layers. +Raster (r.*) +ParameterRaster|map|Name of raster map|False +ParameterString|separator|Field separator (Special characters: pipe, comma, space, tab, newline)|tab|False|True +ParameterFile|rules|File containing category label rules|False|True +ParameterString|txtrules|Inline category label rules|None|True|True +ParameterRaster|raster|Raster map from which to copy category table|True +*ParameterString|format|Default label or format string for dynamic labeling. Used when no explicit label exists for the category|None|False|True +*ParameterString|coefficients|Dynamic label coefficients. Two pairs of category multiplier and offsets, for $1 and $2|None|False|True +OutputRaster|output|Category diff --git a/python/plugins/processing/algs/grass7/ext/r_category.py b/python/plugins/processing/algs/grass7/ext/r_category.py new file mode 100644 index 000000000000..6aae66b6ffb3 --- /dev/null +++ b/python/plugins/processing/algs/grass7/ext/r_category.py @@ -0,0 +1,118 @@ +# -*- coding: utf-8 -*- + +""" +*************************************************************************** + r_category.py + ------------- + Date : February 2016 + Copyright : (C) 2016 by Médéric Ribreux + Email : medspx at medspx dot fr +*************************************************************************** +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation; either version 2 of the License, or * +* (at your option) any later version. * +* * +*************************************************************************** +""" + +__author__ = 'Médéric Ribreux' +__date__ = 'February 2016' +__copyright__ = '(C) 2016, Médéric Ribreux' + +# This will get replaced with a git SHA1 when you do a git archive + +__revision__ = '$Format:%H$' + +import codecs +from processing.tools.system import getTempFilename + +def checkParameterValuesBeforeExecuting(alg): + """ Verify if we have the right parameters """ + rules = alg.getParameterValue(u'rules') + txtrules = alg.getParameterValue(u'txtrules') + raster = alg.getParameterValue(u'raster') + + if rules and txtrules: + return alg.tr("You need to set either a rules file or write directly the rules !") + elif (rules and raster) or (txtrules and raster): + return alg.tr("You need to set either rules or a raster from which to copy categories !") + + return None + +def processInputs(alg): + # If there is another raster to copy categories from + # we need to import it with r.in.gdal rather than r.external + inputRaster = alg.getParameterValue(u'map') + copyRaster = alg.getParameterValue(u'raster') + if copyRaster: + if copyRaster in alg.exportedLayers.keys(): + return + + for raster,method in (inputRaster, 'r.external'),(copyRaster, 'r.in.gdal'): + alg.setSessionProjectionFromLayer(raster, alg.commands) + + destFilename = alg.getTempFilename() + alg.exportedLayers[raster] = destFilename + command = '{} input={} output={} band=1 --overwrite -o'.format(method, raster, destFilename) + alg.commands.append(command) + + alg.setSessionProjectionFromProject(alg.commands) + + region = unicode(alg.getParameterValue(alg.GRASS_REGION_EXTENT_PARAMETER)) + regionCoords = region.split(',') + command = 'g.region' + command += ' -a' + command += ' n=' + unicode(regionCoords[3]) + command += ' s=' + unicode(regionCoords[2]) + command += ' e=' + unicode(regionCoords[1]) + command += ' w=' + unicode(regionCoords[0]) + cellsize = alg.getParameterValue(alg.GRASS_REGION_CELLSIZE_PARAMETER) + if cellsize: + command += ' res=' + unicode(cellsize) + else: + command += ' res=' + unicode(alg.getDefaultCellsize()) + alignToResolution = alg.getParameterValue(alg.GRASS_REGION_ALIGN_TO_RESOLUTION) + if alignToResolution: + command += ' -a' + alg.commands.append(command) + else: + alg.processInputs() + + +def processCommand(alg): + # We temporary remove the output + out = alg.getOutputFromName('output') + mapParam = alg.getParameterValue('map') + alg.exportedLayers[out.value] = alg.exportedLayers[mapParam] + alg.removeOutputFromName('output') + txtRulesParam = alg.getParameterFromName(u'txtrules') + rules = alg.getParameterFromName(u'rules') + + # Handle inline rules + if txtRulesParam.value: + # Creates a temporary txt file + tempRulesName = getTempFilename('txt') + + # Inject rules into temporary txt file + with codecs.open(tempRulesName, 'w', 'utf-8') as tempRules: + tempRules.write(txtRulesParam.value) + + # Replace rules with temporary file + rules.value = tempRulesName + alg.parameters.remove(txtRulesParam) + + alg.processCommand() + + # We re-add the new output + alg.addOutput(out) + + +def processOutputs(alg): + # Output results ('from' table and output table) + out = alg.getOutputValue('output') + command = u"r.out.gdal --overwrite -t -c createopt=\"TFW=YES,COMPRESS=LZW\" input={} output=\"{}\"".format( + alg.exportedLayers[out], out) + alg.commands.append(command) + alg.outputCommands.append(command)