def processAlgorithm(self, progress): # TODO: check correct num of bands input = self.getParameterValue(SplitRGBBands.INPUT) temp = getTempFilename(None).replace('.', '') basename = os.path.basename(temp) validChars = \ 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' safeBasename = ''.join(c for c in basename if c in validChars) temp = os.path.join(os.path.dirname(temp), safeBasename) r = self.getOutputValue(SplitRGBBands.R) g = self.getOutputValue(SplitRGBBands.G) b = self.getOutputValue(SplitRGBBands.B) commands = [] version = SagaUtils.getSagaInstalledVersion(True) trailing = "000" if version != "2.1.4" else "" lib = "" if isWindows() else "lib" commands.append('%sio_gdal 0 -GRIDS "%s" -FILES "%s"' % (lib, temp, input) + '"') commands.append('%sio_gdal 1 -GRIDS "%s_%s1.sgrd" -FORMAT 1 -TYPE 0 -FILE "%s"' %(lib, temp, trailing, r) ) commands.append('%sio_gdal 1 -GRIDS "%s_%s2.sgrd" -FORMAT 1 -TYPE 0 -FILE "%s"' %(lib, temp, trailing, g) ) commands.append('%sio_gdal 1 -GRIDS "%s_%s3.sgrd" -FORMAT 1 -TYPE 0 -FILE "%s"' %(lib, temp, trailing, b) ) SagaUtils.createSagaBatchJobFileFromSagaCommands(commands) SagaUtils.executeSaga(progress)
def processAlgorithm(self, progress): # TODO: check correct num of bands input = self.getParameterValue(SplitRGBBands.INPUT) temp = getTempFilename(None).replace('.', '') basename = os.path.basename(temp) validChars = \ 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' safeBasename = ''.join(c for c in basename if c in validChars) temp = os.path.join(os.path.dirname(temp), safeBasename) r = self.getOutputValue(SplitRGBBands.R) g = self.getOutputValue(SplitRGBBands.G) b = self.getOutputValue(SplitRGBBands.B) commands = [] if isWindows(): commands.append('io_gdal 0 -GRIDS "' + temp + '" -FILES "' + input + '"') commands.append('io_gdal 1 -GRIDS "' + temp + '_0001.sgrd" -FORMAT 1 -TYPE 0 -FILE "' + r + '"') commands.append('io_gdal 1 -GRIDS "' + temp + '_0002.sgrd" -FORMAT 1 -TYPE 0 -FILE "' + g + '"') commands.append('io_gdal 1 -GRIDS "' + temp + '_0003.sgrd" -FORMAT 1 -TYPE 0 -FILE "' + b + '"') else: commands.append('libio_gdal 0 -GRIDS "' + temp + '" -FILES "' + input + '"') commands.append('libio_gdal 1 -GRIDS "' + temp + '_0001.sgrd" -FORMAT 1 -TYPE 0 -FILE "' + r + '"') commands.append('libio_gdal 1 -GRIDS "' + temp + '_0002.sgrd" -FORMAT 1 -TYPE 0 -FILE "' + g + '"') commands.append('libio_gdal 1 -GRIDS "' + temp + '_0003.sgrd" -FORMAT 1 -TYPE 0 -FILE "' + b + '"') SagaUtils.createSagaBatchJobFileFromSagaCommands(commands) SagaUtils.executeSaga(progress)
def processAlgorithm(self, progress): # TODO: check correct num of bands input = self.getParameterValue(SplitRGBBands.INPUT) temp = getTempFilename(None).replace('.', '') basename = os.path.basename(temp) validChars = \ 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' safeBasename = ''.join(c for c in basename if c in validChars) temp = os.path.join(os.path.dirname(temp), safeBasename) r = self.getOutputValue(SplitRGBBands.R) g = self.getOutputValue(SplitRGBBands.G) b = self.getOutputValue(SplitRGBBands.B) commands = [] version = SagaUtils.getSagaInstalledVersion(True) trailing = "" lib = "" commands.append('%sio_gdal 0 -GRIDS "%s" -FILES "%s"' % (lib, temp, input)) commands.append( '%sio_gdal 1 -GRIDS "%s_%s1.sgrd" -FORMAT 1 -TYPE 0 -FILE "%s"' % (lib, temp, trailing, r)) commands.append( '%sio_gdal 1 -GRIDS "%s_%s2.sgrd" -FORMAT 1 -TYPE 0 -FILE "%s"' % (lib, temp, trailing, g)) commands.append( '%sio_gdal 1 -GRIDS "%s_%s3.sgrd" -FORMAT 1 -TYPE 0 -FILE "%s"' % (lib, temp, trailing, b)) SagaUtils.createSagaBatchJobFileFromSagaCommands(commands) SagaUtils.executeSaga(progress)
def _loadAlgorithms(self): self.algs = [] version = SagaUtils.getSagaInstalledVersion(True) if version is None: ProcessingLog.addToLog( ProcessingLog.LOG_ERROR, self.tr("Problem with SAGA installation: SAGA was not found or is not correctly installed"), ) return if version not in self.supportedVersions: lastVersion = sorted(self.supportedVersions.keys())[-1] if version > lastVersion: version = lastVersion else: ProcessingLog.addToLog( ProcessingLog.LOG_ERROR, self.tr("Problem with SAGA installation: installed SAGA version (%s) is not supported" % version), ) return folder = SagaUtils.sagaDescriptionPath() folder = os.path.join(folder, self.supportedVersions[version][0]) for descriptionFile in os.listdir(folder): if descriptionFile.endswith("txt"): f = os.path.join(folder, descriptionFile) self._loadAlgorithm(f, version) self.algs.append(SplitRGBBands())
def _loadAlgorithms(self): self.algs = [] version = SagaUtils.getSagaInstalledVersion(True) if version is None: ProcessingLog.addToLog( ProcessingLog.LOG_ERROR, self. tr('Problem with SAGA installation: SAGA was not found or is not correctly installed' )) return if version not in self.supportedVersions: ProcessingLog.addToLog( ProcessingLog.LOG_ERROR, self. tr('Problem with SAGA installation: installed SAGA version (%s) is not supported' % version)) return folder = SagaUtils.sagaDescriptionPath() folder = os.path.join(folder, self.supportedVersions[version][0]) for descriptionFile in os.listdir(folder): if descriptionFile.endswith('txt'): f = os.path.join(folder, descriptionFile) self._loadAlgorithm(f) self.algs.append(SplitRGBBands())
def unload(self): AlgorithmProvider.unload(self) if (isWindows() or isMac()) and SagaUtils.findSagaFolder() is None: ProcessingConfig.removeSetting(SagaUtils.SAGA_FOLDER) ProcessingConfig.removeSetting(SagaUtils.SAGA_LOG_CONSOLE) ProcessingConfig.removeSetting(SagaUtils.SAGA_LOG_COMMANDS)
def _loadAlgorithms(self): self.algs = [] version = SagaUtils.getSagaInstalledVersion(True) if version is None: ProcessingLog.addToLog(ProcessingLog.LOG_ERROR, self.tr('Problem with SAGA installation: SAGA was not found or is not correctly installed')) return if version not in self.supportedVersions: ProcessingLog.addToLog(ProcessingLog.LOG_ERROR, self.tr('Problem with SAGA installation: installed SAGA version (%s) is not supported' % version)) return folder = SagaUtils.sagaDescriptionPath() folder = os.path.join(folder, self.supportedVersions[SagaUtils.getSagaInstalledVersion()][0]) for descriptionFile in os.listdir(folder): if descriptionFile.endswith('txt'): f = os.path.join(folder, descriptionFile) self._loadAlgorithm(f) self.algs.append(SplitRGBBands())
def _loadAlgorithm(self, descriptionFile): try: alg = self.supportedVersions[SagaUtils.getSagaInstalledVersion()][1](descriptionFile) if alg.name.strip() != '': self.algs.append(alg) else: ProcessingLog.addToLog(ProcessingLog.LOG_ERROR, self.tr('Could not open SAGA algorithm: %s' % descriptionFile)) except Exception, e: ProcessingLog.addToLog(ProcessingLog.LOG_ERROR, self.tr('Could not open SAGA algorithm: %s\n%s' % (descriptionFile, str(e))))
def processAlgorithm(self, progress): # TODO: check correct num of bands input = self.getParameterValue(SplitRGBBands.INPUT) temp = getTempFilename(None).replace('.', '') basename = os.path.basename(temp) validChars = \ 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' safeBasename = ''.join(c for c in basename if c in validChars) temp = os.path.join(os.path.dirname(temp), safeBasename) r = self.getOutputValue(SplitRGBBands.R) g = self.getOutputValue(SplitRGBBands.G) b = self.getOutputValue(SplitRGBBands.B) commands = [] if isWindows(): commands.append('io_gdal 0 -GRIDS "' + temp + '" -FILES "' + input + '"') commands.append('io_gdal 1 -GRIDS "' + temp + '_0001.sgrd" -FORMAT 1 -TYPE 0 -FILE "' + r + '"' ) commands.append('io_gdal 1 -GRIDS "' + temp + '_0002.sgrd" -FORMAT 1 -TYPE 0 -FILE "' + g + '"' ) commands.append('io_gdal 1 -GRIDS "' + temp + '_0003.sgrd" -FORMAT 1 -TYPE 0 -FILE "' + b + '"' ) else: commands.append('libio_gdal 0 -GRIDS "' + temp + '" -FILES "' + input + '"') commands.append('libio_gdal 1 -GRIDS "' + temp + '_0001.sgrd" -FORMAT 1 -TYPE 0 -FILE "' + r + '"' ) commands.append('libio_gdal 1 -GRIDS "' + temp + '_0002.sgrd" -FORMAT 1 -TYPE 0 -FILE "' + g + '"' ) commands.append('libio_gdal 1 -GRIDS "' + temp + '_0003.sgrd" -FORMAT 1 -TYPE 0 -FILE "' + b + '"' ) SagaUtils.createSagaBatchJobFileFromSagaCommands(commands) SagaUtils.executeSaga(progress)
def initializeSettings(self): if (isWindows() or isMac()) and SagaUtils.findSagaFolder() is None: ProcessingConfig.addSetting(Setting("SAGA", SagaUtils.SAGA_FOLDER, self.tr('SAGA folder'), '', valuetype=Setting.FOLDER)) ProcessingConfig.addSetting(Setting("SAGA", SagaUtils.SAGA_IMPORT_EXPORT_OPTIMIZATION, self.tr('Enable SAGA Import/Export optimizations'), False)) ProcessingConfig.addSetting(Setting("SAGA", SagaUtils.SAGA_LOG_COMMANDS, self.tr('Log execution commands'), True)) ProcessingConfig.addSetting(Setting("SAGA", SagaUtils.SAGA_LOG_CONSOLE, self.tr('Log console output'), True)) ProcessingConfig.settingIcons["SAGA"] = self.getIcon() ProcessingConfig.addSetting(Setting("SAGA", "ACTIVATE_SAGA", self.tr('Activate'), self.activate))
def getDescription(self): version = SagaUtils.getSagaInstalledVersion() return 'SAGA (%s)' % version if version is not None else 'SAGA'
def getDescription(self): return "SAGA (%s)" % SagaUtils.getSagaInstalledVersion()
def processAlgorithm(self, progress): commands = list() self.exportedLayers = {} self.preProcessInputs() # 1: Export rasters to sgrd and vectors to shp # Tables must be in dbf format. We check that. for param in self.parameters: if isinstance(param, ParameterRaster): if param.value is None: continue if param.value.endswith('sdat'): param.value = param.value[:-4] + "sgrd" elif not param.value.endswith('sgrd'): exportCommand = self.exportRasterLayer(param.value) if exportCommand is not None: commands.append(exportCommand) if isinstance(param, ParameterVector): if param.value is None: continue layer = dataobjects.getObjectFromUri(param.value, False) if layer: filename = dataobjects.exportVectorLayer(layer) self.exportedLayers[param.value] = filename elif not param.value.endswith('shp'): raise GeoAlgorithmExecutionException( self.tr('Unsupported file format')) if isinstance(param, ParameterTable): if param.value is None: continue table = dataobjects.getObjectFromUri(param.value, False) if table: filename = dataobjects.exportTable(table) self.exportedLayers[param.value] = filename elif not param.value.endswith('shp'): raise GeoAlgorithmExecutionException( self.tr('Unsupported file format')) if isinstance(param, ParameterMultipleInput): if param.value is None: continue layers = param.value.split(';') if layers is None or len(layers) == 0: continue if param.datatype == ParameterMultipleInput.TYPE_RASTER: for i, layerfile in enumerate(layers): if layerfile.endswith('sdat'): layerfile = param.value[:-4] + "sgrd" layers[i] = layerfile elif not layerfile.endswith('sgrd'): exportCommand = self.exportRasterLayer(layerfile) if exportCommand is not None: commands.append(exportCommand) param.value = ";".join(layers) elif param.datatype in [ ParameterMultipleInput.TYPE_VECTOR_ANY, ParameterMultipleInput.TYPE_VECTOR_LINE, ParameterMultipleInput.TYPE_VECTOR_POLYGON, ParameterMultipleInput.TYPE_VECTOR_POINT ]: for layerfile in layers: layer = dataobjects.getObjectFromUri(layerfile, False) if layer: filename = dataobjects.exportVectorLayer(layer) self.exportedLayers[layerfile] = filename elif not layerfile.endswith('shp'): raise GeoAlgorithmExecutionException( self.tr('Unsupported file format')) # 2: Set parameters and outputs command = self.undecoratedGroup + ' "' + self.cmdname + '"' command += ' ' + ' '.join(self.hardcodedStrings) for param in self.parameters: if param.value is None: continue if isinstance(param, (ParameterRaster, ParameterVector, ParameterTable)): value = param.value if value in self.exportedLayers.keys(): command += ' -' + param.name + ' "' \ + self.exportedLayers[value] + '"' else: command += ' -' + param.name + ' "' + value + '"' elif isinstance(param, ParameterMultipleInput): s = param.value for layer in self.exportedLayers.keys(): s = s.replace(layer, self.exportedLayers[layer]) command += ' -' + param.name + ' "' + s + '"' elif isinstance(param, ParameterBoolean): if param.value: command += ' -' + param.name elif isinstance(param, ParameterFixedTable): tempTableFile = getTempFilename('txt') f = open(tempTableFile, 'w') f.write('\t'.join([col for col in param.cols]) + '\n') values = param.value.split(',') for i in range(0, len(values), 3): s = values[i] + '\t' + values[i + 1] + '\t' + values[i + 2] + '\n' f.write(s) f.close() command += ' -' + param.name + ' "' + tempTableFile + '"' elif isinstance(param, ParameterExtent): # 'We have to substract/add half cell size, since SAGA is # center based, not corner based halfcell = self.getOutputCellsize() / 2 offset = [halfcell, -halfcell, halfcell, -halfcell] values = param.value.split(',') for i in range(4): command += ' -' + self.extentParamNames[i] + ' ' \ + unicode(float(values[i]) + offset[i]) elif isinstance(param, (ParameterNumber, ParameterSelection)): command += ' -' + param.name + ' ' + unicode(param.value) else: command += ' -' + param.name + ' "' + unicode( param.value) + '"' for out in self.outputs: command += ' -' + out.name + ' "' + out.getCompatibleFileName( self) + '"' commands.append(command) # special treatment for RGB algorithm #TODO: improve this and put this code somewhere else for out in self.outputs: if isinstance(out, OutputRaster): filename = out.getCompatibleFileName(self) filename2 = filename + '.sgrd' if self.cmdname == 'RGB Composite': commands.append('io_grid_image 0 -IS_RGB -GRID:"' + filename2 + '" -FILE:"' + filename + '"') # 3: Run SAGA commands = self.editCommands(commands) SagaUtils.createSagaBatchJobFileFromSagaCommands(commands) loglines = [] loglines.append(self.tr('SAGA execution commands')) for line in commands: progress.setCommand(line) loglines.append(line) if ProcessingConfig.getSetting(SagaUtils.SAGA_LOG_COMMANDS): ProcessingLog.addToLog(ProcessingLog.LOG_INFO, loglines) SagaUtils.executeSaga(progress) if self.crs is not None: for out in self.outputs: if isinstance(out, (OutputVector, OutputRaster)): prjFile = os.path.splitext( out.getCompatibleFileName(self))[0] + ".prj" with open(prjFile, "w") as f: f.write(self.crs.toWkt())
def processAlgorithm(self, progress): commands = list() self.exportedLayers = {} self.preProcessInputs() # 1: Export rasters to sgrd and vectors to shp # Tables must be in dbf format. We check that. for param in self.parameters: if isinstance(param, ParameterRaster): if param.value is None: continue if param.value.endswith('sdat'): param.value = param.value[:-4] + "sgrd" elif not param.value.endswith('sgrd'): exportCommand = self.exportRasterLayer(param.value) if exportCommand is not None: commands.append(exportCommand) if isinstance(param, ParameterVector): if param.value is None: continue layer = dataobjects.getObjectFromUri(param.value, False) if layer: filename = dataobjects.exportVectorLayer(layer) self.exportedLayers[param.value] = filename elif not param.value.endswith('shp'): raise GeoAlgorithmExecutionException( self.tr('Unsupported file format')) if isinstance(param, ParameterTable): if param.value is None: continue table = dataobjects.getObjectFromUri(param.value, False) if table: filename = dataobjects.exportTable(table) self.exportedLayers[param.value] = filename elif not param.value.endswith('shp'): raise GeoAlgorithmExecutionException( self.tr('Unsupported file format')) if isinstance(param, ParameterMultipleInput): if param.value is None: continue layers = param.value.split(';') if layers is None or len(layers) == 0: continue if param.datatype == ParameterMultipleInput.TYPE_RASTER: for i, layerfile in enumerate(layers): if layerfile.endswith('sdat'): layerfile = param.value[:-4] + "sgrd" layers[i] = layerfile elif not layerfile.endswith('sgrd'): exportCommand = self.exportRasterLayer(layerfile) if exportCommand is not None: commands.append(exportCommand) param.value = ";".join(layers) elif param.datatype == ParameterMultipleInput.TYPE_VECTOR_ANY: for layerfile in layers: layer = dataobjects.getObjectFromUri(layerfile, False) if layer: filename = dataobjects.exportVectorLayer(layer) self.exportedLayers[layerfile] = filename elif not layerfile.endswith('shp'): raise GeoAlgorithmExecutionException( self.tr('Unsupported file format')) # 2: Set parameters and outputs command = self.undecoratedGroup + ' "' + self.cmdname + '"' if self.hardcodedStrings: for s in self.hardcodedStrings: command += ' ' + s for param in self.parameters: if param.value is None: continue if isinstance(param, (ParameterRaster, ParameterVector, ParameterTable)): value = param.value if value in self.exportedLayers.keys(): command += ' -' + param.name + ' "' \ + self.exportedLayers[value] + '"' else: command += ' -' + param.name + ' "' + value + '"' elif isinstance(param, ParameterMultipleInput): s = param.value for layer in self.exportedLayers.keys(): s = s.replace(layer, self.exportedLayers[layer]) command += ' -' + param.name + ' "' + s + '"' elif isinstance(param, ParameterBoolean): if param.value: command += ' -' + param.name elif isinstance(param, ParameterFixedTable): tempTableFile = getTempFilename('txt') f = open(tempTableFile, 'w') f.write('\t'.join([col for col in param.cols]) + '\n') values = param.value.split(',') for i in range(0, len(values), 3): s = values[i] + '\t' + values[i + 1] + '\t' + values[i + 2] + '\n' f.write(s) f.close() command += ' -' + param.name + ' "' + tempTableFile + '"' elif isinstance(param, ParameterExtent): # 'We have to substract/add half cell size, since SAGA is # center based, not corner based halfcell = self.getOutputCellsize() / 2 offset = [halfcell, -halfcell, halfcell, -halfcell] values = param.value.split(',') for i in range(4): command += ' -' + self.extentParamNames[i] + ' ' \ + unicode(float(values[i]) + offset[i]) elif isinstance(param, (ParameterNumber, ParameterSelection)): command += ' -' + param.name + ' ' + unicode(param.value) else: command += ' -' + param.name + ' "' + unicode(param.value) + '"' for out in self.outputs: command += ' -' + out.name + ' "' + out.getCompatibleFileName(self) + '"' commands.append(command) # special treatment for RGB algorithm #TODO: improve this and put this code somewhere else for out in self.outputs: if isinstance(out, OutputRaster): filename = out.getCompatibleFileName(self) filename2 = filename + '.sgrd' if self.cmdname == 'RGB Composite': commands.append('io_grid_image 0 -IS_RGB -GRID:"' + filename2 + '" -FILE:"' + filename + '"') # 3: Run SAGA commands = self.editCommands(commands) SagaUtils.createSagaBatchJobFileFromSagaCommands(commands) loglines = [] loglines.append(self.tr('SAGA execution commands')) for line in commands: progress.setCommand(line) loglines.append(line) if ProcessingConfig.getSetting(SagaUtils.SAGA_LOG_COMMANDS): ProcessingLog.addToLog(ProcessingLog.LOG_INFO, loglines) SagaUtils.executeSaga(progress) if self.crs is not None: for out in self.outputs: if isinstance(out, (OutputVector, OutputRaster)): prjFile = os.path.splitext(out.getCompatibleFileName(self))[0] + ".prj" with open(prjFile, "w") as f: f.write(self.crs.toWkt())
def processAlgorithm(self, progress): commands = list() self.exportedLayers = {} self.preProcessInputs() # 1: Export rasters to sgrd and vectors to shp # Tables must be in dbf format. We check that. for param in self.parameters: if isinstance(param, ParameterRaster): if param.value is None: continue value = param.value if not value.endswith('sgrd'): exportCommand = self.exportRasterLayer(value) if exportCommand is not None: commands.append(exportCommand) if isinstance(param, ParameterVector): if param.value is None: continue layer = dataobjects.getObjectFromUri(param.value, False) if layer: filename = dataobjects.exportVectorLayer(layer) self.exportedLayers[param.value] = filename elif not param.value.endswith('shp'): raise GeoAlgorithmExecutionException( self.tr('Unsupported file format')) if isinstance(param, ParameterTable): if param.value is None: continue table = dataobjects.getObjectFromUri(param.value, False) if table: filename = dataobjects.exportTable(table) self.exportedLayers[param.value] = filename elif not param.value.endswith('shp'): raise GeoAlgorithmExecutionException( self.tr('Unsupported file format')) if isinstance(param, ParameterMultipleInput): if param.value is None: continue layers = param.value.split(';') if layers is None or len(layers) == 0: continue if param.datatype == ParameterMultipleInput.TYPE_RASTER: for layerfile in layers: if not layerfile.endswith('sgrd'): exportCommand = self.exportRasterLayer(layerfile) if exportCommand is not None: commands.append(exportCommand) elif param.datatype == ParameterMultipleInput.TYPE_VECTOR_ANY: for layerfile in layers: layer = dataobjects.getObjectFromUri(layerfile, False) if layer: filename = dataobjects.exportVectorLayer(layer) self.exportedLayers[layerfile] = filename elif not layerfile.endswith('shp'): raise GeoAlgorithmExecutionException( self.tr('Unsupported file format')) # 2: Set parameters and outputs command = self.undecoratedGroup + ' "' + self.cmdname + '"' if self.hardcodedStrings: for s in self.hardcodedStrings: command += ' ' + s for param in self.parameters: if param.value is None: continue if isinstance(param, (ParameterRaster, ParameterVector, ParameterTable)): value = param.value if value in self.exportedLayers.keys(): command += ' -' + param.name + ' "' \ + self.exportedLayers[value] + '"' else: command += ' -' + param.name + ' "' + value + '"' elif isinstance(param, ParameterMultipleInput): s = param.value for layer in self.exportedLayers.keys(): s = s.replace(layer, self.exportedLayers[layer]) command += ' -' + param.name + ' "' + s + '"' elif isinstance(param, ParameterBoolean): if param.value: command += ' -' + param.name elif isinstance(param, ParameterFixedTable): tempTableFile = getTempFilename('txt') f = open(tempTableFile, 'w') f.write('\t'.join([col for col in param.cols]) + '\n') values = param.value.split(',') for i in range(0, len(values), 3): s = values[i] + '\t' + values[i + 1] + '\t' + values[i + 2] + '\n' f.write(s) f.close() command += ' -' + param.name + ' "' + tempTableFile + '"' elif isinstance(param, ParameterExtent): # 'We have to substract/add half cell size, since SAGA is # center based, not corner based halfcell = self.getOutputCellsize() / 2 offset = [halfcell, -halfcell, halfcell, -halfcell] values = param.value.split(',') for i in range(4): command += ' -' + self.extentParamNames[i] + ' ' \ + str(float(values[i]) + offset[i]) elif isinstance(param, (ParameterNumber, ParameterSelection)): command += ' -' + param.name + ' ' + str(param.value) else: command += ' -' + param.name + ' "' + str(param.value) + '"' for out in self.outputs: if isinstance(out, OutputRaster): filename = out.getCompatibleFileName(self) filename += '.sgrd' command += ' -' + out.name + ' "' + filename + '"' if isinstance(out, OutputVector): filename = out.getCompatibleFileName(self) command += ' -' + out.name + ' "' + filename + '"' if isinstance(out, OutputTable): filename = out.getCompatibleFileName(self) command += ' -' + out.name + ' "' + filename + '"' commands.append(command) # 3: Export resulting raster layers # optim = ProcessingConfig.getSetting(SagaUtils.SAGA_IMPORT_EXPORT_OPTIMIZATION) for out in self.outputs: if isinstance(out, OutputRaster): filename = out.getCompatibleFileName(self) filename2 = filename + '.sgrd' formatIndex = (4 if isWindows() else 1) sessionExportedLayers[filename] = filename2 # Do not export is the output is not a final output # of the model # dontExport = True # if self.model is not None and optim: # for subalg in self.model.algOutputs: # if out.name in subalg: # if subalg[out.name] is not None: # dontExport = False # break # if dontExport: # continue if self.cmdname == 'RGB Composite': commands.append('io_grid_image 0 -IS_RGB -GRID:"' + filename2 + '" -FILE:"' + filename + '"') else: commands.append('io_gdal 1 -GRIDS "' + filename2 + '" -FORMAT ' + str(formatIndex) + ' -TYPE 0 -FILE "' + filename + '"') # 4: Run SAGA commands = self.editCommands(commands) SagaUtils.createSagaBatchJobFileFromSagaCommands(commands) loglines = [] loglines.append(self.tr('SAGA execution commands')) for line in commands: progress.setCommand(line) loglines.append(line) if ProcessingConfig.getSetting(SagaUtils.SAGA_LOG_COMMANDS): ProcessingLog.addToLog(ProcessingLog.LOG_INFO, loglines) SagaUtils.executeSaga(progress)
def processAlgorithm(self, progress): commands = list() self.exportedLayers = {} self.preProcessInputs() # 1: Export rasters to sgrd and vectors to shp # Tables must be in dbf format. We check that. for param in self.parameters: if isinstance(param, ParameterRaster): if param.value is None: continue value = param.value if not value.endswith("sgrd"): exportCommand = self.exportRasterLayer(value) if exportCommand is not None: commands.append(exportCommand) if isinstance(param, ParameterVector): if param.value is None: continue layer = dataobjects.getObjectFromUri(param.value, False) if layer: filename = dataobjects.exportVectorLayer(layer) self.exportedLayers[param.value] = filename elif not param.value.endswith("shp"): raise GeoAlgorithmExecutionException(self.tr("Unsupported file format")) if isinstance(param, ParameterTable): if param.value is None: continue table = dataobjects.getObjectFromUri(param.value, False) if table: filename = dataobjects.exportTable(table) self.exportedLayers[param.value] = filename elif not param.value.endswith("shp"): raise GeoAlgorithmExecutionException(self.tr("Unsupported file format")) if isinstance(param, ParameterMultipleInput): if param.value is None: continue layers = param.value.split(";") if layers is None or len(layers) == 0: continue if param.datatype == ParameterMultipleInput.TYPE_RASTER: for layerfile in layers: if not layerfile.endswith("sgrd"): exportCommand = self.exportRasterLayer(layerfile) if exportCommand is not None: commands.append(exportCommand) elif param.datatype == ParameterMultipleInput.TYPE_VECTOR_ANY: for layerfile in layers: layer = dataobjects.getObjectFromUri(layerfile, False) if layer: filename = dataobjects.exportVectorLayer(layer) self.exportedLayers[layerfile] = filename elif not layerfile.endswith("shp"): raise GeoAlgorithmExecutionException(self.tr("Unsupported file format")) # 2: Set parameters and outputs command = self.undecoratedGroup + ' "' + self.cmdname + '"' if self.hardcodedStrings: for s in self.hardcodedStrings: command += " " + s for param in self.parameters: if param.value is None: continue if isinstance(param, (ParameterRaster, ParameterVector, ParameterTable)): value = param.value if value in self.exportedLayers.keys(): command += " -" + param.name + ' "' + self.exportedLayers[value] + '"' else: command += " -" + param.name + ' "' + value + '"' elif isinstance(param, ParameterMultipleInput): s = param.value for layer in self.exportedLayers.keys(): s = s.replace(layer, self.exportedLayers[layer]) command += " -" + param.name + ' "' + s + '"' elif isinstance(param, ParameterBoolean): if param.value: command += " -" + param.name elif isinstance(param, ParameterFixedTable): tempTableFile = getTempFilename("txt") f = open(tempTableFile, "w") f.write("\t".join([col for col in param.cols]) + "\n") values = param.value.split(",") for i in range(0, len(values), 3): s = values[i] + "\t" + values[i + 1] + "\t" + values[i + 2] + "\n" f.write(s) f.close() command += " -" + param.name + ' "' + tempTableFile + '"' elif isinstance(param, ParameterExtent): # 'We have to substract/add half cell size, since SAGA is # center based, not corner based halfcell = self.getOutputCellsize() / 2 offset = [halfcell, -halfcell, halfcell, -halfcell] values = param.value.split(",") for i in range(4): command += " -" + self.extentParamNames[i] + " " + str(float(values[i]) + offset[i]) elif isinstance(param, (ParameterNumber, ParameterSelection)): command += " -" + param.name + " " + str(param.value) else: command += " -" + param.name + ' "' + str(param.value) + '"' for out in self.outputs: if isinstance(out, OutputRaster): filename = out.getCompatibleFileName(self) filename += ".sgrd" command += " -" + out.name + ' "' + filename + '"' if isinstance(out, OutputVector): filename = out.getCompatibleFileName(self) command += " -" + out.name + ' "' + filename + '"' if isinstance(out, OutputTable): filename = out.getCompatibleFileName(self) command += " -" + out.name + ' "' + filename + '"' commands.append(command) # 3: Export resulting raster layers # optim = ProcessingConfig.getSetting(SagaUtils.SAGA_IMPORT_EXPORT_OPTIMIZATION) for out in self.outputs: if isinstance(out, OutputRaster): filename = out.getCompatibleFileName(self) filename2 = filename + ".sgrd" formatIndex = 4 if isWindows() else 1 sessionExportedLayers[filename] = filename2 # Do not export is the output is not a final output # of the model # dontExport = True # if self.model is not None and optim: # for subalg in self.model.algOutputs: # if out.name in subalg: # if subalg[out.name] is not None: # dontExport = False # break # if dontExport: # continue if self.cmdname == "RGB Composite": commands.append('io_grid_image 0 -IS_RGB -GRID:"' + filename2 + '" -FILE:"' + filename + '"') else: commands.append( 'io_gdal 1 -GRIDS "' + filename2 + '" -FORMAT ' + str(formatIndex) + ' -TYPE 0 -FILE "' + filename + '"' ) # 4: Run SAGA commands = self.editCommands(commands) SagaUtils.createSagaBatchJobFileFromSagaCommands(commands) loglines = [] loglines.append(self.tr("SAGA execution commands")) for line in commands: progress.setCommand(line) loglines.append(line) if ProcessingConfig.getSetting(SagaUtils.SAGA_LOG_COMMANDS): ProcessingLog.addToLog(ProcessingLog.LOG_INFO, loglines) SagaUtils.executeSaga(progress)