From 59332bb40dbf5becdc50bffd0fece0837da1e272 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Thu, 8 Dec 2022 09:32:42 +1000 Subject: [PATCH] [processing] Fix incorrect GDAL raster calc sources for layers when the extent handling option is set --- .../plugins/processing/algs/gdal/gdalcalc.py | 38 +++++++++---------- .../tests/GdalAlgorithmsRasterTest.py | 8 ++-- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/python/plugins/processing/algs/gdal/gdalcalc.py b/python/plugins/processing/algs/gdal/gdalcalc.py index db2337fa436..c88a6384b7e 100644 --- a/python/plugins/processing/algs/gdal/gdalcalc.py +++ b/python/plugins/processing/algs/gdal/gdalcalc.py @@ -227,8 +227,8 @@ class gdalcalc(GdalAlgorithm): 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): @@ -263,7 +263,7 @@ class gdalcalc(GdalAlgorithm): 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())) @@ -272,52 +272,52 @@ class gdalcalc(GdalAlgorithm): 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)) diff --git a/python/plugins/processing/tests/GdalAlgorithmsRasterTest.py b/python/plugins/processing/tests/GdalAlgorithmsRasterTest.py index 6b1ab55471e..76d72027b80 100644 --- a/python/plugins/processing/tests/GdalAlgorithmsRasterTest.py +++ b/python/plugins/processing/tests/GdalAlgorithmsRasterTest.py @@ -658,6 +658,8 @@ class TestGdalRasterAlgorithms(unittest.TestCase, AlgorithmsTestBase.AlgorithmsT 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() @@ -687,15 +689,15 @@ class TestGdalRasterAlgorithms(unittest.TestCase, AlgorithmsTestBase.AlgorithmsT # 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(