Skip to content

Commit 8d91f1f

Browse files
nyalldawsonalexbruy
authored andcommittedNov 9, 2017
Restore more saga functionality
1 parent 9ba4143 commit 8d91f1f

12 files changed

+80
-54
lines changed
 

‎python/plugins/processing/algs/saga/SagaAlgorithm.py

Lines changed: 64 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,13 @@
4141
QgsProcessingParameterMultipleLayers,
4242
QgsProcessingParameterMatrix,
4343
QgsProcessingParameterString,
44-
QgsProcessingParameterField)
44+
QgsProcessingParameterField,
45+
QgsProcessingParameterFile,
46+
QgsProcessingParameterExtent,
47+
QgsProcessingParameterRasterDestination,
48+
QgsProcessingParameterVectorDestination)
4549
from processing.core.ProcessingConfig import ProcessingConfig
46-
from processing.core.parameters import (getParameterFromString,
47-
ParameterExtent)
48-
from processing.core.outputs import (getOutputFromString,
49-
OutputVector,
50-
OutputRaster)
51-
from processing.tools import dataobjects
50+
from processing.core.parameters import getParameterFromString
5251
from processing.algs.help import shortHelp
5352
from processing.tools.system import getTempFilename
5453
from processing.algs.saga.SagaNameDecorator import decoratedAlgorithmName, decoratedGroupName
@@ -131,8 +130,8 @@ def defineCharacteristicsFromFile(self):
131130
elif line.startswith('Extent'):
132131
# An extent parameter that wraps 4 SAGA numerical parameters
133132
self.extentParamNames = line[6:].strip().split(' ')
134-
self.params.append(ParameterExtent(self.OUTPUT_EXTENT,
135-
'Output extent'))
133+
self.params.append(QgsProcessingParameterExtent(self.OUTPUT_EXTENT,
134+
'Output extent'))
136135
else:
137136
pass # TODO
138137
#self.addOutput(getOutputFromString(line))
@@ -160,9 +159,14 @@ def processAlgorithm(self, parameters, context, feedback):
160159
elif isinstance(param, QgsProcessingParameterFeatureSource):
161160
if param.name() not in parameters or parameters[param.name()] is None:
162161
continue
163-
layer_path = self.parameterAsCompatibleSourceLayerPath(parameters, param.name(), context, 'shp', feedback=feedback)
162+
163+
if not crs:
164+
source = self.parameterAsSource(parameters, param.name(), context)
165+
crs = source.sourceCrs()
166+
167+
layer_path = self.parameterAsCompatibleSourceLayerPath(parameters, param.name(), context, ['shp'], 'shp', feedback=feedback)
164168
if layer_path:
165-
self.exportedLayers[parameters[param.name()]] = layer_path
169+
self.exportedLayers[param.name()] = layer_path
166170
else:
167171
raise QgsProcessingException(
168172
self.tr('Unsupported file format'))
@@ -186,6 +190,11 @@ def processAlgorithm(self, parameters, context, feedback):
186190
temp_params = deepcopy(parameters)
187191
for layer in layers:
188192
temp_params[param.name()] = layer
193+
194+
if not crs:
195+
source = self.parameterAsSource(temp_params, param.name(), context)
196+
crs = source.sourceCrs()
197+
189198
layer_path = self.parameterAsCompatibleSourceLayerPath(temp_params, param.name(), context, 'shp',
190199
feedback=feedback)
191200
if layer_path:
@@ -197,31 +206,26 @@ def processAlgorithm(self, parameters, context, feedback):
197206
raise QgsProcessingException(
198207
self.tr('Unsupported file format'))
199208

200-
# TODO - set minimum extent
201-
if not extent:
202-
extent = QgsProcessingUtils.combineLayerExtents([layer])
203-
204209
# 2: Set parameters and outputs
205210
command = self.undecorated_group + ' "' + self.cmdname + '"'
206211
command += ' ' + ' '.join(self.hardcoded_strings)
207212

208213
for param in self.parameterDefinitions():
209214
if not param.name() in parameters or parameters[param.name()] is None:
210215
continue
216+
if param.isDestination():
217+
continue
218+
211219
if isinstance(param, (QgsProcessingParameterRasterLayer, QgsProcessingParameterFeatureSource)):
212-
value = parameters[param.name()]
213-
if value in list(self.exportedLayers.keys()):
214-
command += ' -' + param.name() + ' "' \
215-
+ self.exportedLayers[value] + '"'
216-
else:
217-
command += ' -' + param.name() + ' "' + value + '"'
220+
command += ' -' + param.name() + ' "' \
221+
+ self.exportedLayers[param.name()] + '"'
218222
elif isinstance(param, QgsProcessingParameterMultipleLayers):
219223
s = parameters[param.name()]
220224
for layer in list(self.exportedLayers.keys()):
221225
s = s.replace(layer, self.exportedLayers[layer])
222226
command += ' -' + ';'.join(self.exportedLayers[param.name()]) + ' "' + s + '"'
223227
elif isinstance(param, QgsProcessingParameterBoolean):
224-
if parameters[param.name()]:
228+
if self.parameterAsBool(parameters, param.name(), context):
225229
command += ' -' + param.name().strip() + " true"
226230
else:
227231
command += ' -' + param.name().strip() + " false"
@@ -234,31 +238,48 @@ def processAlgorithm(self, parameters, context, feedback):
234238
s = values[i] + '\t' + values[i + 1] + '\t' + values[i + 2] + '\n'
235239
f.write(s)
236240
command += ' -' + param.name() + ' "' + tempTableFile + '"'
237-
elif isinstance(param, ParameterExtent):
241+
elif isinstance(param, QgsProcessingParameterExtent):
238242
# 'We have to substract/add half cell size, since SAGA is
239243
# center based, not corner based
240-
halfcell = self.getOutputCellsize(parameters) / 2
244+
halfcell = self.getOutputCellsize(parameters, context) / 2
241245
offset = [halfcell, -halfcell, halfcell, -halfcell]
242-
values = parameters[param.name()].split(',')
246+
rect = self.parameterAsExtent(parameters, param.name(), context)
247+
248+
values = []
249+
values.append(rect.xMinimum())
250+
values.append(rect.yMinimum())
251+
values.append(rect.xMaximum())
252+
values.append(rect.yMaximum())
253+
243254
for i in range(4):
244255
command += ' -' + self.extentParamNames[i] + ' ' \
245256
+ str(float(values[i]) + offset[i])
246257
elif isinstance(param, QgsProcessingParameterNumber):
247258
command += ' -' + param.name() + ' ' + str(self.parameterAsDouble(parameters, param.name(), context))
248259
elif isinstance(param, QgsProcessingParameterEnum):
249260
command += ' -' + param.name() + ' ' + str(self.parameterAsEnum(parameters, param.name(), context))
250-
elif isinstance(param, QgsProcessingParameterString, QgsProcessingParameterField):
261+
elif isinstance(param, (QgsProcessingParameterString, QgsProcessingParameterFile)):
262+
command += ' -' + param.name() + ' "' + self.parameterAsFile(parameters, param.name(), context) + '"'
263+
elif isinstance(param, (QgsProcessingParameterString, QgsProcessingParameterField)):
251264
command += ' -' + param.name() + ' "' + self.parameterAsString(parameters, param.name(), context) + '"'
252265

253-
for out in self.outputs:
254-
command += ' -' + out.name + ' "' + out.getCompatibleFileName(self) + '"'
266+
output_layers = []
267+
output_files = {}
268+
for out in self.destinationParameterDefinitions():
269+
# TODO
270+
# command += ' -' + out.name() + ' "' + out.getCompatibleFileName(self) + '"'
271+
file = self.parameterAsOutputLayer(parameters, out.name(), context)
272+
if isinstance(out, (QgsProcessingParameterRasterDestination, QgsProcessingParameterVectorDestination)):
273+
output_layers.append(file)
274+
output_files[out.name()] = file
275+
command += ' -' + out.name() + ' "' + file + '"'
255276

256277
commands.append(command)
257278

258279
# special treatment for RGB algorithm
259280
# TODO: improve this and put this code somewhere else
260-
for out in self.outputs:
261-
if isinstance(out, OutputRaster):
281+
for out in self.destinationParameterDefinitions():
282+
if isinstance(out, QgsProcessingParameterRasterDestination):
262283
filename = out.getCompatibleFileName(self)
263284
filename2 = filename + '.sgrd'
264285
if self.cmdname == 'RGB Composite':
@@ -277,12 +298,17 @@ def processAlgorithm(self, parameters, context, feedback):
277298
QgsMessageLog.logMessage('\n'.join(loglines), self.tr('Processing'), QgsMessageLog.INFO)
278299
SagaUtils.executeSaga(feedback)
279300

280-
if self.crs is not None:
281-
for out in self.outputs:
282-
if isinstance(out, (OutputVector, OutputRaster)):
283-
prjFile = os.path.splitext(out.getCompatibleFileName(self))[0] + ".prj"
284-
with open(prjFile, "w") as f:
285-
f.write(self.crs.toWkt())
301+
if crs is not None:
302+
for out in output_layers:
303+
prjFile = os.path.splitext(out)[0] + ".prj"
304+
with open(prjFile, "w") as f:
305+
f.write(crs.toWkt())
306+
307+
result = {}
308+
for o in self.outputDefinitions():
309+
if o.name() in output_files:
310+
result[o.name()] = output_files[o.name()]
311+
return result
286312

287313
def preProcessInputs(self):
288314
name = self.name().replace('.', '_')
@@ -305,7 +331,7 @@ def editCommands(self, commands):
305331
else:
306332
return commands
307333

308-
def getOutputCellsize(self, parameters):
334+
def getOutputCellsize(self, parameters, context):
309335
"""Tries to guess the cell size of the output, searching for
310336
a parameter with an appropriate name for it.
311337
:param parameters:
@@ -314,7 +340,7 @@ def getOutputCellsize(self, parameters):
314340
cellsize = 0
315341
for param in self.parameterDefinitions():
316342
if param.name() in parameters and param.name() == 'USER_SIZE':
317-
cellsize = float(parameters[param.name()])
343+
cellsize = self.parameterAsDouble(parameters, param.name(), context)
318344
break
319345
return cellsize
320346

‎python/plugins/processing/algs/saga/description/AddPointAttributestoPolygons.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ shapes_polygons
33
QgsProcessingParameterFeatureSource|INPUT|Polygons|2|None|False
44
QgsProcessingParameterFeatureSource|POINTS|Points|0|None|False
55
QgsProcessingParameterField|FIELDS|Attributes|None|POINTS|-1|False|False
6-
QgsProcessingParameterBoolean|ADD_LOCATION_INFO|Add location info|False
6+
QgsProcessingParameterBoolean|ADD_LOCATION_INFO|Add locPation info|False
77
QgsProcessingParameterVectorDestination|OUTPUT|Result

‎python/plugins/processing/algs/saga/description/ClusterAnalysisforGrids.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
K-Means Clustering for Grids
22
imagery_classification
3-
QgsProcessingParameterMultipleLayers|GRIDS|Grids|3.0|None|False
3+
QgsProcessingParameterMultipleLayers|GRIDS|Grids|3|None|False
44
QgsProcessingParameterEnum|METHOD|Method|[0] Iterative Minimum Distance (Forgy 1965);[1] Hill-Climbing (Rubin 1967);[2] Combined Minimum Distance / Hillclimbing
55
QgsProcessingParameterNumber|NCLUSTER|Clusters|QgsProcessingParameterNumber.Integer|10|False|2|None
66
QgsProcessingParameterNumber|MAXITER|Maximum Iterations|QgsProcessingParameterNumber.Integer|0|False|0|None

‎python/plugins/processing/algs/saga/description/GeographicallyWeightedMultipleRegression(PointsGrids).txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
GWR for Multiple Predictor Grids
22
statistics_regression
3-
QgsProcessingParameterMultipleLayers|PREDICTORS|Predictors|3.0|None|False
3+
QgsProcessingParameterMultipleLayers|PREDICTORS|Predictors|3|None|False
44
QgsProcessingParameterFeatureSource|POINTS|Points|0|None|False
55
QgsProcessingParameterField|DEPENDENT|Dependent Variable|None|POINTS|-1|False|False
66
QgsProcessingParameterEnum|RESOLUTION|Model Resolution|[0] same as predictors;[1] user defined|False|1

‎python/plugins/processing/algs/saga/description/GridCombination.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
GridCombination
22
sim_rivflow
33
QgsProcessingParameterRasterLayer|INPUT|Gelaendemodell (DTM)|None|False
4-
ParameterFile|Folder1|Pfad WaterGap Raster|False|False
4+
QgsProcessingParameterFile|Folder1|Pfad WaterGap Raster|False|None|False
55
QgsProcessingParameterNumber|sY|Start-Jahr|QgsProcessingParameterNumber.Integer|1990|False| 1906| 2000
66
QgsProcessingParameterNumber|eY|End-Jahr|QgsProcessingParameterNumber.Integer|1990|False| 1906| 2000
77
QgsProcessingParameterBoolean|DomW|Domestic Water|True

‎python/plugins/processing/algs/saga/description/MaximumEntropyPresencePrediction.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ QgsProcessingParameterRasterDestination|PREDICTION|Presence Prediction
77
QgsProcessingParameterRasterDestination|PROBABILITY|Presence Probability
88
QgsProcessingParameterNumber|BACKGROUND|Background Sample Density [Percent]|QgsProcessingParameterNumber.Double|1.000000|False| 0.000000| 100.000000
99
QgsProcessingParameterEnum|METHOD|Method|[0] Yoshimasa Tsuruoka;[1] Dekang Lin|False|0
10-
ParameterFile|YT_FILE_LOAD|Load from File...|False|False
11-
ParameterFile|YT_FILE_SAVE|Save to File...|False|False
10+
QgsProcessingParameterFile|YT_FILE_LOAD|Load from File...|False|None|False
11+
QgsProcessingParameterFile|YT_FILE_SAVE|Save to File...|False|None|False
1212
QgsProcessingParameterEnum|YT_REGUL|Regularization|[0] none;[1] L1;[2] L2|False|1
1313
QgsProcessingParameterNumber|YT_REGUL_VAL|Regularization Factor|QgsProcessingParameterNumber.Double|1.000000|False| 0.000000|None
1414
QgsProcessingParameterBoolean|YT_NUMASREAL|Real-valued Numerical Features|True

‎python/plugins/processing/algs/saga/description/RandomForestPresencePrediction(ViGrA).txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ QgsProcessingParameterNumber|mRMR_NFEATURES|Number of Features|QgsProcessingPara
1010
QgsProcessingParameterBoolean|mRMR_DISCRETIZE|Discretization|True
1111
QgsProcessingParameterNumber|mRMR_THRESHOLD|Discretization Threshold|QgsProcessingParameterNumber.Double|1.000000|False| 0.000000|None
1212
QgsProcessingParameterEnum|mRMR_METHOD|Selection Method|[0] Mutual Information Difference (MID);[1] Mutual Information Quotient (MIQ)|False|0
13-
ParameterFile|RF_IMPORT|Import from File|False|False
14-
ParameterFile|RF_EXPORT|Export to File|False|False
13+
QgsProcessingParameterFile|RF_IMPORT|Import from File|False|None|False
14+
QgsProcessingParameterFile|RF_EXPORT|Export to File|False|None|False
1515
QgsProcessingParameterNumber|RF_TREE_COUNT|Tree Count|QgsProcessingParameterNumber.Integer|32|False| 1|None
1616
QgsProcessingParameterNumber|RF_TREE_SAMPLES|Samples per Tree|QgsProcessingParameterNumber.Double|1.000000|False| 0.000000| 1.000000
1717
QgsProcessingParameterBoolean|RF_REPLACE|Sample with Replacement|True

‎python/plugins/processing/algs/saga/description/SVMClassification.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ QgsProcessingParameterRasterDestination|CLASSES|Classification
55
QgsProcessingParameterEnum|SCALING|Scaling|[0] none;[1] normalize (0-1);[2] standardize|False|2
66
QgsProcessingParameterBoolean|MESSAGE|Verbose Messages|False
77
QgsProcessingParameterEnum|MODEL_SRC|Model Source|[0] create from training areas;[1] restore from file|False|0
8-
ParameterFile|MODEL_LOAD|Restore Model from File|False|False
8+
QgsProcessingParameterFile|MODEL_LOAD|Restore Model from File|False|None|False
99
QgsProcessingParameterFeatureSource|ROI|Training Areas|-1|None|False
1010
QgsProcessingParameterFeatureSource|ROI_ID|Class Identifier|5|None|False
11-
ParameterFile|MODEL_SAVE|Store Model to File|False|False
11+
QgsProcessingParameterFile|MODEL_SAVE|Store Model to File|False|None|False
1212
QgsProcessingParameterEnum|SVM_TYPE|SVM Type|[0] C-SVC;[1] nu-SVC;[2] one-class SVM;[3] epsilon-SVR;[4] nu-SVR|False|0
1313
QgsProcessingParameterEnum|KERNEL_TYPE|Kernel Type|[0] linear;[1] polynomial;[2] radial basis function;[3] sigmoid|False|2
1414
QgsProcessingParameterNumber|DEGREE|Degree|QgsProcessingParameterNumber.Integer|3|False|None|None

‎python/plugins/processing/algs/saga/description/SupervisedClassification.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Supervised Classification
22
imagery_classification
3-
QgsProcessingParameterMultipleLayers|GRIDS|Grids|3.0|None|False
3+
QgsProcessingParameterMultipleLayers|GRIDS|Grids|3|None|False
44
QgsProcessingParameterFeatureSource|ROI|Training Areas|2|None|False
55
QgsProcessingParameterField|ROI_ID|Class Identifier|None|ROI|-1|False|False
66
QgsProcessingParameterFeatureSource|STATS|Class Statistics|5|None|False

‎python/plugins/processing/algs/saga/description/SupervisedClassificationforGrids.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ QgsProcessingParameterRasterDestination|CLASSES|Classification
66
QgsProcessingParameterRasterDestination|QUALITY|Quality
77
QgsProcessingParameterFeatureSource|TRAINING|Training Areas|-1|None|True
88
QgsProcessingParameterFeatureSource|TRAINING_CLASS|Class Identifier|5|None|False
9-
ParameterFile|FILE_LOAD|Load Statistics from File...|False|False
10-
ParameterFile|FILE_SAVE|Save Statistics to File...|False|False
9+
QgsProcessingParameterFile|FILE_LOAD|Load Statistics from File...|False|None|False
10+
QgsProcessingParameterFile|FILE_SAVE|Save Statistics to File...|False|None|False
1111
QgsProcessingParameterEnum|METHOD|Method|[0] Binary Encoding;[1] Parallelepiped;[2] Minimum Distance;[3] Mahalanobis Distance;[4] Maximum Likelihood;[5] Spectral Angle Mapping;[6] Winner Takes All|False|2
1212
QgsProcessingParameterNumber|THRESHOLD_DIST|Distance Threshold|QgsProcessingParameterNumber.Double|0.000000|False| 0.000000|None
1313
QgsProcessingParameterNumber|THRESHOLD_ANGLE|Spectral Angle Threshold (Degree)|QgsProcessingParameterNumber.Double|0.000000|False| 0.000000| 90.000000

‎python/plugins/processing/algs/saga/description/SupervisedClassificationforShapes.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ QgsProcessingParameterVectorDestination|CLASSES|Classification
55
QgsProcessingParameterFeatureSource|FEATURES|Features|5|None|False
66
QgsProcessingParameterBoolean|NORMALISE|Normalise|False
77
QgsProcessingParameterFeatureSource|TRAINING|Training Classes|5|None|False
8-
ParameterFile|FILE_LOAD|Load Statistics from File...|False|False
9-
ParameterFile|FILE_SAVE|Save Statistics to File...|False|False
8+
QgsProcessingParameterFile|FILE_LOAD|Load Statistics from File...|False|None|False
9+
QgsProcessingParameterFile|FILE_SAVE|Save Statistics to File...|False|None|False
1010
QgsProcessingParameterEnum|METHOD|Method|[0] Binary Encoding;[1] Parallelepiped;[2] Minimum Distance;[3] Mahalanobis Distance;[4] Maximum Likelihood;[5] Spectral Angle Mapping;[6] Winner Takes All|False|2
1111
QgsProcessingParameterNumber|THRESHOLD_DIST|Distance Threshold|QgsProcessingParameterNumber.Double|0.000000|False| 0.000000|None
1212
QgsProcessingParameterNumber|THRESHOLD_ANGLE|Spectral Angle Threshold (Degree)|QgsProcessingParameterNumber.Double|0.000000|False| 0.000000| 90.000000

‎python/plugins/processing/algs/saga/description/TopofAtmosphereReflectance.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ QgsProcessingParameterRasterDestination|RF_OLI10|Reflectance Band 10
4848
QgsProcessingParameterRasterDestination|RF_OLI11|Reflectance Band 11
4949
QgsProcessingParameterRasterLayer|DN_PAN08|DN Band 8|None|True
5050
QgsProcessingParameterRasterDestination|RF_PAN08|Reflectance Band 8
51-
ParameterFile|METAFILE|Metadata File|False|False
51+
QgsProcessingParameterFile|METAFILE|Metadata File|False|None|False
5252
QgsProcessingParameterEnum|SENSOR|Spacecraft Sensor|[0] Landsat-1 MSS;[1] Landsat-2 MSS;[2] Landsat-3 MSS;[3] Landsat-4 MSS;[4] Landsat-5 MSS;[5] Landsat-4 TM;[6] Landsat-5 TM;[7] Landsat-7 ETM+;[8] Landsat-8 OLI/TIRS|False|7
5353
QgsProcessingParameterString|DATE_ACQU|Image Acquisition Date
5454
QgsProcessingParameterString|DATE_PROD|Image Creation Date

0 commit comments

Comments
 (0)
Please sign in to comment.