Skip to content

Commit 8ab014d

Browse files
committed
Merge branch 'gdal_calc'
2 parents b7ad288 + 5260ef3 commit 8ab014d

File tree

2 files changed

+161
-1
lines changed

2 files changed

+161
-1
lines changed

python/plugins/processing/algs/gdal/GdalOgrAlgorithmProvider.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
from GridNearest import GridNearest
6666
from GridDataMetrics import GridDataMetrics
6767
from gdaltindex import gdaltindex
68+
from gdalcalc import gdalcalc
6869

6970
from ogr2ogr import Ogr2Ogr
7071
from ogr2ogrclip import Ogr2OgrClip
@@ -122,7 +123,7 @@ def createAlgsList(self):
122123
sieve(), fillnodata(), ExtractProjection(), gdal2xyz(),
123124
hillshade(), slope(), aspect(), tri(), tpi(), roughness(),
124125
ColorRelief(), GridInvDist(), GridAverage(), GridNearest(),
125-
GridDataMetrics(), gdaltindex(),
126+
GridDataMetrics(), gdaltindex(), gdalcalc(),
126127
# ----- OGR tools -----
127128
OgrInfo(), Ogr2Ogr(), Ogr2OgrClip(), Ogr2OgrClipExtent(),
128129
Ogr2OgrToPostGis(), Ogr2OgrToPostGisList(), OgrSql(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
# -*- coding: utf-8 -*-
2+
3+
"""
4+
***************************************************************************
5+
gdalcalc.py
6+
---------------------
7+
Date : Janaury 2015
8+
Copyright : (C) 2015 by Giovanni Manghi
9+
Email : giovanni dot manghi at naturalgis dot pt
10+
***************************************************************************
11+
* *
12+
* This program is free software; you can redistribute it and/or modify *
13+
* it under the terms of the GNU General Public License as published by *
14+
* the Free Software Foundation; either version 2 of the License, or *
15+
* (at your option) any later version. *
16+
* *
17+
***************************************************************************
18+
"""
19+
20+
__author__ = 'Giovanni Manghi'
21+
__date__ = 'January 2015'
22+
__copyright__ = '(C) 2015, Giovanni Manghi'
23+
24+
# This will get replaced with a git SHA1 when you do a git archive
25+
26+
__revision__ = '$Format:%H$'
27+
28+
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm
29+
from processing.core.parameters import ParameterString
30+
from processing.core.parameters import ParameterRaster
31+
from processing.core.parameters import ParameterNumber
32+
from processing.core.parameters import ParameterBoolean
33+
from processing.core.parameters import ParameterSelection
34+
from processing.core.parameters import ParameterExtent
35+
from processing.core.parameters import ParameterCrs
36+
from processing.core.outputs import OutputRaster
37+
38+
from processing.tools.system import isWindows
39+
40+
from processing.algs.gdal.GdalUtils import GdalUtils
41+
42+
class gdalcalc(GdalAlgorithm):
43+
44+
INPUT_A = 'INPUT_A'
45+
INPUT_B = 'INPUT_B'
46+
INPUT_C = 'INPUT_C'
47+
INPUT_D = 'INPUT_D'
48+
INPUT_E = 'INPUT_E'
49+
INPUT_F = 'INPUT_F'
50+
BAND_A = 'BAND_A'
51+
BAND_B = 'BAND_B'
52+
BAND_C = 'BAND_C'
53+
BAND_D = 'BAND_D'
54+
BAND_E = 'BAND_E'
55+
BAND_F = 'BAND_F'
56+
FORMULA = 'FORMULA'
57+
OUTPUT = 'OUTPUT'
58+
NO_DATA = 'NO_DATA'
59+
EXTRA = 'EXTRA'
60+
RTYPE = 'RTYPE'
61+
TYPE = ['Byte', 'Int16', 'UInt16', 'UInt32', 'Int32', 'Float32', 'Float64']
62+
#DEBUG = 'DEBUG'
63+
64+
def defineCharacteristics(self):
65+
self.name = 'Raster calculator'
66+
self.group = '[GDAL] Miscellaneous'
67+
self.addParameter(ParameterRaster(
68+
self.INPUT_A, self.tr('Input layer A'), False))
69+
self.addParameter(ParameterString(self.BAND_A,
70+
self.tr('Number of raster band for raster A'), '1', optional=True))
71+
self.addParameter(ParameterRaster(
72+
self.INPUT_B, self.tr('Input layer B'), True))
73+
self.addParameter(ParameterString(self.BAND_B,
74+
self.tr('Number of raster band for raster B'), '1', optional=True))
75+
self.addParameter(ParameterRaster(
76+
self.INPUT_C, self.tr('Input layer C'), True))
77+
self.addParameter(ParameterString(self.BAND_C,
78+
self.tr('Number of raster band for raster C'), '1', optional=True))
79+
self.addParameter(ParameterRaster(
80+
self.INPUT_D, self.tr('Input layer D'), True))
81+
self.addParameter(ParameterString(self.BAND_D,
82+
self.tr('Number of raster band for raster D'), '1', optional=True))
83+
self.addParameter(ParameterRaster(
84+
self.INPUT_E, self.tr('Input layer E'), True))
85+
self.addParameter(ParameterString(self.BAND_E,
86+
self.tr('Number of raster band for raster E'), '1', optional=True))
87+
self.addParameter(ParameterRaster(
88+
self.INPUT_F, self.tr('Input layer F'), True))
89+
self.addParameter(ParameterString(self.BAND_F,
90+
self.tr('Number of raster band for raster F'), '1', optional=True))
91+
self.addParameter(ParameterString(self.FORMULA,
92+
self.tr('Calculation in gdalnumeric syntax using +-/* or any numpy array functions (i.e. logical_and())'), 'A*2', optional=False))
93+
self.addParameter(ParameterString(self.NO_DATA,
94+
self.tr('Set output nodata value'), '-9999'))
95+
self.addParameter(ParameterSelection(self.RTYPE,
96+
self.tr('Output raster type'), self.TYPE, 5))
97+
#self.addParameter(ParameterBoolean(
98+
# self.DEBUG, self.tr('Print debugging information'), False))
99+
self.addParameter(ParameterString(self.EXTRA,
100+
self.tr('Additional creation parameters'), '', optional=True))
101+
self.addOutput(OutputRaster(self.OUTPUT, self.tr('Output layer')))
102+
103+
def processAlgorithm(self, progress):
104+
out = self.getOutputValue(self.OUTPUT)
105+
extra = str(self.getParameterValue(self.EXTRA))
106+
#debug = self.getParameterValue(self.DEBUG)
107+
formula = self.getParameterValue(self.FORMULA)
108+
noData = str(self.getParameterValue(self.NO_DATA))
109+
110+
arguments = []
111+
arguments.append('--calc')
112+
arguments.append('"' + formula + '"')
113+
arguments.append('--format')
114+
arguments.append(GdalUtils.getFormatShortNameFromFilename(out))
115+
arguments.append('--type')
116+
arguments.append(self.TYPE[self.getParameterValue(self.RTYPE)])
117+
if len(noData) > 0:
118+
arguments.append('--NoDataValue')
119+
arguments.append(noData)
120+
if len(extra) > 0:
121+
arguments.append(extra)
122+
#if debug:
123+
# arguments.append('--debug')
124+
arguments.append('-A')
125+
arguments.append(self.getParameterValue(self.INPUT_A))
126+
if self.getParameterValue(self.BAND_A):
127+
arguments.append('--A_band ' + self.getParameterValue(self.BAND_A))
128+
if self.getParameterValue(self.INPUT_B):
129+
arguments.append('-B')
130+
arguments.append(self.getParameterValue(self.INPUT_B))
131+
if self.getParameterValue(self.BAND_B):
132+
arguments.append('--B_band ' + self.getParameterValue(self.BAND_B))
133+
if self.getParameterValue(self.INPUT_C):
134+
arguments.append('-C')
135+
arguments.append(self.getParameterValue(self.INPUT_C))
136+
if self.getParameterValue(self.BAND_C):
137+
arguments.append('--C_band ' + self.getParameterValue(self.BAND_C))
138+
if self.getParameterValue(self.INPUT_D):
139+
arguments.append('-D')
140+
arguments.append(self.getParameterValue(self.INPUT_D))
141+
if self.getParameterValue(self.BAND_D):
142+
arguments.append('--D_band ' + self.getParameterValue(self.BAND_D))
143+
if self.getParameterValue(self.INPUT_E):
144+
arguments.append('-E')
145+
arguments.append(self.getParameterValue(self.INPUT_E))
146+
if self.getParameterValue(self.BAND_E):
147+
arguments.append('--E_band ' + self.getParameterValue(self.BAND_E))
148+
if self.getParameterValue(self.INPUT_F):
149+
arguments.append('-F')
150+
arguments.append(self.getParameterValue(self.INPUT_F))
151+
if self.getParameterValue(self.BAND_F):
152+
arguments.append('--F_band ' + self.getParameterValue(self.BAND_F))
153+
arguments.append('--outfile')
154+
arguments.append(out)
155+
156+
if isWindows():
157+
GdalUtils.runGdal(['gdal_calc', GdalUtils.escapeAndJoin(arguments)], progress)
158+
else:
159+
GdalUtils.runGdal(['gdal_calc.py', GdalUtils.escapeAndJoin(arguments)], progress)

0 commit comments

Comments
 (0)