Skip to content

Commit e27847d

Browse files
committed
[processing] make output crs optional in the raster calculator
1 parent c4874b3 commit e27847d

File tree

1 file changed

+17
-5
lines changed

1 file changed

+17
-5
lines changed

python/plugins/processing/algs/qgis/RasterCalculator.py

+17-5
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ def evaluateForModeler(self, value, model):
9797
self.addParameter(ParameterRasterCalculatorExpression(self.EXPRESSION, self.tr('Expression'),
9898
multiLine=True))
9999
self.addParameter(QgsProcessingParameterMultipleLayers(self.LAYERS,
100-
self.tr('Reference layer(s) (used for automated determination extent and cellsize)'),
100+
self.tr('Reference layer(s) (used for automated extent, cellsize, and CRS)'),
101101
layerType=QgsProcessing.TypeRaster,
102102
optional=True))
103103
self.addParameter(QgsProcessingParameterNumber(self.CELLSIZE,
@@ -107,7 +107,7 @@ def evaluateForModeler(self, value, model):
107107
self.addParameter(QgsProcessingParameterExtent(self.EXTENT,
108108
self.tr('Output extent'),
109109
optional=True))
110-
self.addParameter(QgsProcessingParameterCrs(self.CRS, 'Output CRS', 'ProjectCrs'))
110+
self.addParameter(QgsProcessingParameterCrs(self.CRS, 'Output CRS', optional=True))
111111
self.addParameter(QgsProcessingParameterRasterDestination(self.OUTPUT, self.tr('Output')))
112112

113113
def name(self):
@@ -119,22 +119,34 @@ def displayName(self):
119119
def processAlgorithm(self, parameters, context, feedback):
120120
expression = self.parameterAsString(parameters, self.EXPRESSION, context)
121121
layers = self.parameterAsLayerList(parameters, self.LAYERS, context)
122-
crs = self.parameterAsCrs(parameters, self.CRS, context)
123122

124123
layersDict = {}
125124
if layers:
126125
layersDict = {os.path.basename(lyr.source().split(".")[0]): lyr for lyr in layers}
127126

127+
crs = self.parameterAsCrs(parameters, self.CRS, context)
128+
if not layers and not crs.isValid():
129+
raise QgsProcessingException(self.tr("No reference layer selected nor CRS provided"))
130+
131+
if not crs.isValid() and layers:
132+
crs = list(layersDict.values())[0].crs()
133+
128134
bbox = self.parameterAsExtent(parameters, self.EXTENT, context)
129135
if not layers and bbox.isNull():
130-
raise QgsProcessingException(self.tr("No reference layer selected to automate extent box"))
136+
raise QgsProcessingException(self.tr("No reference layer selected nor extent box provided"))
137+
138+
if not bbox.isNull():
139+
bboxCrs = self.parameterAsExtentCrs(parameters, self.EXTENT, context)
140+
if bboxCrs != crs:
141+
transform = QgsCoordinateTransform(bboxCrs, crs, context.project())
142+
bbox = transform.transformBoundingBox(bbox)
131143

132144
if bbox.isNull() and layers:
133145
bbox = QgsProcessingUtils.combineLayerExtents(layers, crs)
134146

135147
cellsize = self.parameterAsDouble(parameters, self.CELLSIZE, context)
136148
if not layers and cellsize == 0:
137-
raise QgsProcessingException(self.tr("No reference layer selected to automate cellsize value"))
149+
raise QgsProcessingException(self.tr("No reference layer selected nor cellsize value provided"))
138150

139151
def _cellsize(layer):
140152
ext = layer.extent()

0 commit comments

Comments
 (0)