mirror of
				https://github.com/qgis/QGIS.git
				synced 2025-11-04 00:04:25 -05:00 
			
		
		
		
	Because EXTRA and NO_DATA parameters are optional, the value can be `None` which is the same as `''`.
		
			
				
	
	
		
			161 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# -*- coding: utf-8 -*-
 | 
						|
 | 
						|
"""
 | 
						|
***************************************************************************
 | 
						|
    gdalcalc.py
 | 
						|
    ---------------------
 | 
						|
    Date                 : Janaury 2015
 | 
						|
    Copyright            : (C) 2015 by Giovanni Manghi
 | 
						|
    Email                : giovanni dot manghi at naturalgis dot pt
 | 
						|
***************************************************************************
 | 
						|
*                                                                         *
 | 
						|
*   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__ = 'Giovanni Manghi'
 | 
						|
__date__ = 'January 2015'
 | 
						|
__copyright__ = '(C) 2015, Giovanni Manghi'
 | 
						|
 | 
						|
# This will get replaced with a git SHA1 when you do a git archive
 | 
						|
 | 
						|
__revision__ = '$Format:%H$'
 | 
						|
 | 
						|
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm
 | 
						|
from processing.core.parameters import ParameterString
 | 
						|
from processing.core.parameters import ParameterRaster
 | 
						|
from processing.core.parameters import ParameterSelection
 | 
						|
from processing.core.outputs import OutputRaster
 | 
						|
 | 
						|
from processing.tools.system import isWindows
 | 
						|
 | 
						|
from processing.algs.gdal.GdalUtils import GdalUtils
 | 
						|
 | 
						|
 | 
						|
class gdalcalc(GdalAlgorithm):
 | 
						|
 | 
						|
    INPUT_A = 'INPUT_A'
 | 
						|
    INPUT_B = 'INPUT_B'
 | 
						|
    INPUT_C = 'INPUT_C'
 | 
						|
    INPUT_D = 'INPUT_D'
 | 
						|
    INPUT_E = 'INPUT_E'
 | 
						|
    INPUT_F = 'INPUT_F'
 | 
						|
    BAND_A = 'BAND_A'
 | 
						|
    BAND_B = 'BAND_B'
 | 
						|
    BAND_C = 'BAND_C'
 | 
						|
    BAND_D = 'BAND_D'
 | 
						|
    BAND_E = 'BAND_E'
 | 
						|
    BAND_F = 'BAND_F'
 | 
						|
    FORMULA = 'FORMULA'
 | 
						|
    OUTPUT = 'OUTPUT'
 | 
						|
    NO_DATA = 'NO_DATA'
 | 
						|
    EXTRA = 'EXTRA'
 | 
						|
    RTYPE = 'RTYPE'
 | 
						|
    TYPE = ['Byte', 'Int16', 'UInt16', 'UInt32', 'Int32', 'Float32', 'Float64']
 | 
						|
    #DEBUG = 'DEBUG'
 | 
						|
 | 
						|
    def defineCharacteristics(self):
 | 
						|
        self.name, self.i18n_name = self.trAlgorithm('Raster calculator')
 | 
						|
        self.group, self.i18n_group = self.trAlgorithm('[GDAL] Miscellaneous')
 | 
						|
        self.addParameter(ParameterRaster(
 | 
						|
            self.INPUT_A, self.tr('Input layer A'), False))
 | 
						|
        self.addParameter(ParameterString(self.BAND_A,
 | 
						|
                                          self.tr('Number of raster band for raster A'), '1', optional=True))
 | 
						|
        self.addParameter(ParameterRaster(
 | 
						|
            self.INPUT_B, self.tr('Input layer B'), True))
 | 
						|
        self.addParameter(ParameterString(self.BAND_B,
 | 
						|
                                          self.tr('Number of raster band for raster B'), '1', optional=True))
 | 
						|
        self.addParameter(ParameterRaster(
 | 
						|
            self.INPUT_C, self.tr('Input layer C'), True))
 | 
						|
        self.addParameter(ParameterString(self.BAND_C,
 | 
						|
                                          self.tr('Number of raster band for raster C'), '1', optional=True))
 | 
						|
        self.addParameter(ParameterRaster(
 | 
						|
            self.INPUT_D, self.tr('Input layer D'), True))
 | 
						|
        self.addParameter(ParameterString(self.BAND_D,
 | 
						|
                                          self.tr('Number of raster band for raster D'), '1', optional=True))
 | 
						|
        self.addParameter(ParameterRaster(
 | 
						|
            self.INPUT_E, self.tr('Input layer E'), True))
 | 
						|
        self.addParameter(ParameterString(self.BAND_E,
 | 
						|
                                          self.tr('Number of raster band for raster E'), '1', optional=True))
 | 
						|
        self.addParameter(ParameterRaster(
 | 
						|
            self.INPUT_F, self.tr('Input layer F'), True))
 | 
						|
        self.addParameter(ParameterString(self.BAND_F,
 | 
						|
                                          self.tr('Number of raster band for raster F'), '1', optional=True))
 | 
						|
        self.addParameter(ParameterString(self.FORMULA,
 | 
						|
                                          self.tr('Calculation in gdalnumeric syntax using +-/* or any numpy array functions (i.e. logical_and())'), 'A*2', optional=False))
 | 
						|
        self.addParameter(ParameterString(self.NO_DATA,
 | 
						|
                                          self.tr('Set output nodata value'), '', optional=True))
 | 
						|
        self.addParameter(ParameterSelection(self.RTYPE,
 | 
						|
                                             self.tr('Output raster type'), self.TYPE, 5))
 | 
						|
        #self.addParameter(ParameterBoolean(
 | 
						|
        #    self.DEBUG, self.tr('Print debugging information'), False))
 | 
						|
        self.addParameter(ParameterString(self.EXTRA,
 | 
						|
                                          self.tr('Additional creation parameters'), '', optional=True))
 | 
						|
        self.addOutput(OutputRaster(self.OUTPUT, self.tr('Calculated')))
 | 
						|
 | 
						|
    def getConsoleCommands(self):
 | 
						|
        out = self.getOutputValue(self.OUTPUT)
 | 
						|
        extra = self.getParameterValue(self.EXTRA)
 | 
						|
        if extra is not None:
 | 
						|
            extra = unicode(extra)
 | 
						|
        #debug = self.getParameterValue(self.DEBUG)
 | 
						|
        formula = self.getParameterValue(self.FORMULA)
 | 
						|
        noData = self.getParameterValue(self.NO_DATA)
 | 
						|
        if noData is not None:
 | 
						|
            noData = unicode(noData)
 | 
						|
 | 
						|
        arguments = []
 | 
						|
        arguments.append('--calc')
 | 
						|
        arguments.append('"' + formula + '"')
 | 
						|
        arguments.append('--format')
 | 
						|
        arguments.append(GdalUtils.getFormatShortNameFromFilename(out))
 | 
						|
        arguments.append('--type')
 | 
						|
        arguments.append(self.TYPE[self.getParameterValue(self.RTYPE)])
 | 
						|
        if noData and len(noData) > 0:
 | 
						|
            arguments.append('--NoDataValue')
 | 
						|
            arguments.append(noData)
 | 
						|
        if extra and len(extra) > 0:
 | 
						|
            arguments.append(extra)
 | 
						|
        #if debug:
 | 
						|
        #    arguments.append('--debug')
 | 
						|
        arguments.append('-A')
 | 
						|
        arguments.append(self.getParameterValue(self.INPUT_A))
 | 
						|
        if self.getParameterValue(self.BAND_A):
 | 
						|
            arguments.append('--A_band ' + self.getParameterValue(self.BAND_A))
 | 
						|
        if self.getParameterValue(self.INPUT_B):
 | 
						|
            arguments.append('-B')
 | 
						|
            arguments.append(self.getParameterValue(self.INPUT_B))
 | 
						|
            if self.getParameterValue(self.BAND_B):
 | 
						|
                arguments.append('--B_band ' + self.getParameterValue(self.BAND_B))
 | 
						|
        if self.getParameterValue(self.INPUT_C):
 | 
						|
            arguments.append('-C')
 | 
						|
            arguments.append(self.getParameterValue(self.INPUT_C))
 | 
						|
            if self.getParameterValue(self.BAND_C):
 | 
						|
                arguments.append('--C_band ' + self.getParameterValue(self.BAND_C))
 | 
						|
        if self.getParameterValue(self.INPUT_D):
 | 
						|
            arguments.append('-D')
 | 
						|
            arguments.append(self.getParameterValue(self.INPUT_D))
 | 
						|
            if self.getParameterValue(self.BAND_D):
 | 
						|
                arguments.append('--D_band ' + self.getParameterValue(self.BAND_D))
 | 
						|
        if self.getParameterValue(self.INPUT_E):
 | 
						|
            arguments.append('-E')
 | 
						|
            arguments.append(self.getParameterValue(self.INPUT_E))
 | 
						|
            if self.getParameterValue(self.BAND_E):
 | 
						|
                arguments.append('--E_band ' + self.getParameterValue(self.BAND_E))
 | 
						|
        if self.getParameterValue(self.INPUT_F):
 | 
						|
            arguments.append('-F')
 | 
						|
            arguments.append(self.getParameterValue(self.INPUT_F))
 | 
						|
            if self.getParameterValue(self.BAND_F):
 | 
						|
                arguments.append('--F_band ' + self.getParameterValue(self.BAND_F))
 | 
						|
        arguments.append('--outfile')
 | 
						|
        arguments.append(out)
 | 
						|
 | 
						|
        if isWindows():
 | 
						|
            return ['gdal_calc', GdalUtils.escapeAndJoin(arguments)]
 | 
						|
        else:
 | 
						|
            return ['gdal_calc.py', GdalUtils.escapeAndJoin(arguments)]
 |