Skip to content

Commit

Permalink
[processing] Fix incorrect GDAL raster calc sources for layers when
Browse files Browse the repository at this point in the history
the extent handling option is set
  • Loading branch information
nyalldawson committed Dec 8, 2022
1 parent 4010706 commit 59332bb
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 22 deletions.
38 changes: 19 additions & 19 deletions python/plugins/processing/algs/gdal/gdalcalc.py
Expand Up @@ -227,8 +227,8 @@ def getConsoleCommands(self, parameters, context, feedback, executing=True):
if noData is not None:
arguments.append('--NoDataValue')
arguments.append(noData)
layer = self.parameterAsRasterLayer(parameters, self.INPUT_A, context)
if layer is None:
layer_a = self.parameterAsRasterLayer(parameters, self.INPUT_A, context)
if layer_a is None:
raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT_A))

def all_equal(iterator):
Expand Down Expand Up @@ -263,7 +263,7 @@ def all_equal(iterator):
if extent != 'ignore':
arguments.append(f'--extent={extent}')

bbox = self.parameterAsExtent(parameters, self.EXTENT, context, layer.crs())
bbox = self.parameterAsExtent(parameters, self.EXTENT, context, layer_a.crs())
if not bbox.isNull():
arguments.append('--projwin')
arguments.append(str(bbox.xMinimum()))
Expand All @@ -272,52 +272,52 @@ def all_equal(iterator):
arguments.append(str(bbox.yMinimum()))

arguments.append('-A')
arguments.append(layer.source())
arguments.append(layer_a.source())
if self.parameterAsString(parameters, self.BAND_A, context):
arguments.append('--A_band ' + self.parameterAsString(parameters, self.BAND_A, context))

if self.INPUT_B in parameters and parameters[self.INPUT_B] is not None:
layer = self.parameterAsRasterLayer(parameters, self.INPUT_B, context)
if layer is None:
layer_b = self.parameterAsRasterLayer(parameters, self.INPUT_B, context)
if layer_b is None:
raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT_B))
arguments.append('-B')
arguments.append(layer.source())
arguments.append(layer_b.source())
if self.parameterAsString(parameters, self.BAND_B, context):
arguments.append('--B_band ' + self.parameterAsString(parameters, self.BAND_B, context))

if self.INPUT_C in parameters and parameters[self.INPUT_C] is not None:
layer = self.parameterAsRasterLayer(parameters, self.INPUT_C, context)
if layer is None:
layer_c = self.parameterAsRasterLayer(parameters, self.INPUT_C, context)
if layer_c is None:
raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT_C))
arguments.append('-C')
arguments.append(layer.source())
arguments.append(layer_c.source())
if self.parameterAsString(parameters, self.BAND_C, context):
arguments.append('--C_band ' + self.parameterAsString(parameters, self.BAND_C, context))

if self.INPUT_D in parameters and parameters[self.INPUT_D] is not None:
layer = self.parameterAsRasterLayer(parameters, self.INPUT_D, context)
if layer is None:
layer_d = self.parameterAsRasterLayer(parameters, self.INPUT_D, context)
if layer_d is None:
raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT_D))
arguments.append('-D')
arguments.append(layer.source())
arguments.append(layer_d.source())
if self.parameterAsString(parameters, self.BAND_D, context):
arguments.append('--D_band ' + self.parameterAsString(parameters, self.BAND_D, context))

if self.INPUT_E in parameters and parameters[self.INPUT_E] is not None:
layer = self.parameterAsRasterLayer(parameters, self.INPUT_E, context)
if layer is None:
layer_e = self.parameterAsRasterLayer(parameters, self.INPUT_E, context)
if layer_e is None:
raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT_E))
arguments.append('-E')
arguments.append(layer.source())
arguments.append(layer_e.source())
if self.parameterAsString(parameters, self.BAND_E, context):
arguments.append('--E_band ' + self.parameterAsString(parameters, self.BAND_E, context))

if self.INPUT_F in parameters and parameters[self.INPUT_F] is not None:
layer = self.parameterAsRasterLayer(parameters, self.INPUT_F, context)
if layer is None:
layer_f = self.parameterAsRasterLayer(parameters, self.INPUT_F, context)
if layer_f is None:
raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT_F))
arguments.append('-F')
arguments.append(layer.source())
arguments.append(layer_f.source())
if self.parameterAsString(parameters, self.BAND_F, context):
arguments.append('--F_band ' + self.parameterAsString(parameters, self.BAND_F, context))

Expand Down
8 changes: 5 additions & 3 deletions python/plugins/processing/tests/GdalAlgorithmsRasterTest.py
Expand Up @@ -658,6 +658,8 @@ def testGdalCalc(self):
context = QgsProcessingContext()
feedback = QgsProcessingFeedback()
source = os.path.join(testDataPath, 'dem.tif')
source2 = os.path.join(testDataPath, 'raster.tif')
source3 = os.path.join(testDataPath, 'raster with spaces.tif')
alg = gdalcalc()
alg.initAlgorithm()

Expand Down Expand Up @@ -687,15 +689,15 @@ def testGdalCalc(self):

# Inputs A and B share same pixel size and CRS
self.assertEqual(
alg.getConsoleCommands({'INPUT_A': source,
alg.getConsoleCommands({'INPUT_A': source2,
'BAND_A': 1,
'INPUT_B': source,
'INPUT_B': source3,
'BAND_B': 1,
'FORMULA': formula,
'EXTENT_OPT': 3,
'OUTPUT': output}, context, feedback),
['gdal_calc.py',
'--overwrite --calc "{}" --format JPEG --type Float32 --extent=intersect -A {} --A_band 1 -B {} --B_band 1 --outfile {}'.format(formula, source, source, output)])
'--overwrite --calc "{}" --format JPEG --type Float32 --extent=intersect -A {} --A_band 1 -B "{}" --B_band 1 --outfile {}'.format(formula, source2, source3, output)])

# Test mutually exclusive --extent and --projwin. Should raise an exception
self.assertRaises(
Expand Down

0 comments on commit 59332bb

Please sign in to comment.