def loadAlgorithms(self): if not self.canBeActivated(): return version_file = os.path.join(OtbUtils.otbFolder(), 'share', 'doc', 'otb', 'VERSION') if not os.path.isfile(version_file): version_file = os.path.join(OtbUtils.otbFolder(), 'VERSION') if os.path.isfile(version_file): with open(version_file) as vf: vlines = vf.readlines() vlines = [l.strip() for l in vlines] vline = vlines[0] if 'OTB Version:' in vline: self.version = vline.split(':')[1].strip() QgsMessageLog.logMessage(self.tr("Loading OTB '{}'.".format(self.version)), self.tr('Processing'), Qgis.Info) self.algs = self.createAlgsList() for a in self.algs: self.addAlgorithm(a) self.algs = [] otb_folder = self.normalize_path(OtbUtils.otbFolder()) otb_app_path_env = os.pathsep.join(self.appDirs(OtbUtils.appFolder())) gdal_data_dir = None geotiff_csv_dir = None otbcli_path = OtbUtils.cliPath() try: if os.name == 'nt': app_vargs = " %*" export_cmd = 'SET ' first_line = ':: Setup environment for OTB package. Generated by QGIS plugin' otb_app_launcher = os.path.join(otb_folder, 'bin', 'otbApplicationLauncherCommandLine.exe') gdal_data_dir = os.path.join(otb_folder, 'share', 'data') geotiff_csv_dir = os.path.join(otb_folder, 'share', 'epsg_csv') else: app_vargs = " \"$@\"" export_cmd = 'export ' first_line = '#!/bin/sh' otb_app_launcher = os.path.join(otb_folder, 'bin', 'otbApplicationLauncherCommandLine') lines = None env_profile = os.path.join(otb_folder, 'otbenv.profile') if os.path.exists(env_profile): with open(env_profile) as f: lines = f.readlines() lines = [x.strip() for x in lines] for line in lines: if not line or line.startswith('#'): continue if 'GDAL_DATA=' in line: gdal_data_dir = line.split("GDAL_DATA=")[1] if 'GEOTIFF_CSV='in line: geotiff_csv_dir = line.split("GEOTIFF_CSV=")[1] with open(otbcli_path, 'w') as otb_cli_file: otb_cli_file.write(first_line + os.linesep) otb_cli_file.write(export_cmd + "LC_NUMERIC=C" + os.linesep) otb_cli_file.write(export_cmd + "GDAL_DRIVER_PATH=disable" + os.linesep) if gdal_data_dir: otb_cli_file.write(export_cmd + "GDAL_DATA=" + "\"" + gdal_data_dir + "\"" + os.linesep) if geotiff_csv_dir: otb_cli_file.write(export_cmd + "GEOTIFF_CSV=" + "\"" + geotiff_csv_dir + "\"" + os.linesep) if OtbUtils.loggerLevel(): otb_cli_file.write(export_cmd + "OTB_LOGGER_LEVEL=" + OtbUtils.loggerLevel() + os.linesep) max_ram_hint = OtbUtils.maxRAMHint() if max_ram_hint and not int(max_ram_hint) == 128: otb_cli_file.write(export_cmd + "OTB_MAX_RAM_HINT=" + max_ram_hint + os.linesep) otb_cli_file.write(export_cmd + "OTB_APPLICATION_PATH=" + "\"" + otb_app_path_env + "\"" + os.linesep) otb_cli_file.write("\"" + otb_app_launcher + "\"" + app_vargs + os.linesep) if not os.name == 'nt': os.chmod(otbcli_path, 0o744) except BaseException as e: import traceback os.remove(otbcli_path) errmsg = "Cannot write:" + otbcli_path + "\nError:\n" + traceback.format_exc() QgsMessageLog.logMessage(self.tr(errmsg), self.tr('Processing'), Qgis.Critical) raise e QgsMessageLog.logMessage(self.tr("Using otbcli: '{}'.".format(otbcli_path)), self.tr('Processing'), Qgis.Info)
def loadAlgorithms(self): if not self.canBeActivated(): return version_file = os.path.join(OtbUtils.otbFolder(), 'share', 'doc', 'otb', 'VERSION') if not os.path.isfile(version_file): version_file = os.path.join(OtbUtils.otbFolder(), 'VERSION') if os.path.isfile(version_file): with open(version_file) as vf: vlines = vf.readlines() vlines = [l.strip() for l in vlines] vline = vlines[0] if 'OTB Version:' in vline: self.version = vline.split(':')[1].strip() QgsMessageLog.logMessage( self.tr("Loading OTB '{}'.".format(self.version)), self.tr('Processing'), Qgis.Info) self.algs = self.createAlgsList() for a in self.algs: self.addAlgorithm(a) self.algs = [] otb_folder = self.normalize_path(OtbUtils.otbFolder()) otb_app_path_env = os.pathsep.join(self.appDirs(OtbUtils.appFolder())) gdal_data_dir = None geotiff_csv_dir = None otbcli_path = OtbUtils.cliPath() try: if os.name == 'nt': app_vargs = " %*" export_cmd = 'SET ' first_line = ':: Setup environment for OTB package. Generated by QGIS plugin' otb_app_launcher = os.path.join( otb_folder, 'bin', 'otbApplicationLauncherCommandLine.exe') gdal_data_dir = os.path.join(otb_folder, 'share', 'data') geotiff_csv_dir = os.path.join(otb_folder, 'share', 'epsg_csv') else: app_vargs = " \"$@\"" export_cmd = 'export ' first_line = '#!/bin/sh' otb_app_launcher = os.path.join( otb_folder, 'bin', 'otbApplicationLauncherCommandLine') lines = None env_profile = os.path.join(otb_folder, 'otbenv.profile') if os.path.exists(env_profile): with open(env_profile) as f: lines = f.readlines() lines = [x.strip() for x in lines] for line in lines: if not line or line.startswith('#'): continue if 'GDAL_DATA=' in line: gdal_data_dir = line.split("GDAL_DATA=")[1] if 'GEOTIFF_CSV=' in line: geotiff_csv_dir = line.split("GEOTIFF_CSV=")[1] with open(otbcli_path, 'w') as otb_cli_file: otb_cli_file.write(first_line + os.linesep) otb_cli_file.write(export_cmd + "LC_NUMERIC=C" + os.linesep) otb_cli_file.write(export_cmd + "GDAL_DRIVER_PATH=disable" + os.linesep) if gdal_data_dir: otb_cli_file.write(export_cmd + "GDAL_DATA=" + "\"" + gdal_data_dir + "\"" + os.linesep) if geotiff_csv_dir: otb_cli_file.write(export_cmd + "GEOTIFF_CSV=" + "\"" + geotiff_csv_dir + "\"" + os.linesep) if OtbUtils.loggerLevel(): otb_cli_file.write(export_cmd + "OTB_LOGGER_LEVEL=" + OtbUtils.loggerLevel() + os.linesep) max_ram_hint = OtbUtils.maxRAMHint() if max_ram_hint and not int(max_ram_hint) == 128: otb_cli_file.write(export_cmd + "OTB_MAX_RAM_HINT=" + max_ram_hint + os.linesep) otb_cli_file.write(export_cmd + "OTB_APPLICATION_PATH=" + "\"" + otb_app_path_env + "\"" + os.linesep) otb_cli_file.write("\"" + otb_app_launcher + "\"" + app_vargs + os.linesep) if not os.name == 'nt': os.chmod(otbcli_path, 0o744) except BaseException as e: import traceback os.remove(otbcli_path) errmsg = "Cannot write:" + otbcli_path + "\nError:\n" + traceback.format_exc( ) QgsMessageLog.logMessage(self.tr(errmsg), self.tr('Processing'), Qgis.Critical) raise e QgsMessageLog.logMessage( self.tr("Using otbcli: '{}'.".format(otbcli_path)), self.tr('Processing'), Qgis.Info)
def processAlgorithm(self, parameters, context, feedback): otb_cli_file = OtbUtils.cliPath() command = '"{}" {} {}'.format(otb_cli_file, self.name(), OtbUtils.appFolder()) outputPixelType = None for k, v in parameters.items(): # if value is None for a parameter we don't have any businees with this key if v is None: continue # for 'outputpixeltype' parameter we find the pixeltype string from self.pixelTypes if k == 'outputpixeltype': pixel_type = self.pixelTypes[int( parameters['outputpixeltype'])] outputPixelType = None if pixel_type == 'float' else pixel_type continue param = self.parameterDefinition(k) if param.isDestination(): continue if isinstance(param, QgsProcessingParameterEnum): value = self.parameterAsEnum(parameters, param.name(), context) elif isinstance(param, QgsProcessingParameterBoolean): value = self.parameterAsBool(parameters, param.name(), context) elif isinstance(param, QgsProcessingParameterCrs): crsValue = self.parameterAsCrs(parameters, param.name(), context) authid = crsValue.authid() if authid.startswith('EPSG:'): value = authid.split('EPSG:')[1] else: raise QgsProcessingException( self. tr("Incorrect value for parameter '{}'. No EPSG code found in '{}'" .format(param.name(), authid))) elif isinstance(param, QgsProcessingParameterFile): value = self.parameterAsFile(parameters, param.name(), context) elif isinstance(param, QgsProcessingParameterMultipleLayers): layers = self.parameterAsLayerList(parameters, param.name(), context) if layers is None or len(layers) == 0: continue value = ' '.join([ '"{}"'.format(self.getLayerSource(param.name(), layer)) for layer in layers ]) elif isinstance(param, QgsProcessingParameterNumber): if param.dataType() == QgsProcessingParameterNumber.Integer: value = self.parameterAsInt(parameters, param.name(), context) else: value = self.parameterAsDouble(parameters, param.name(), context) elif isinstance(param, (QgsProcessingParameterRasterLayer, QgsProcessingParameterVectorLayer)): value = '"{}"'.format( self.getLayerSource( param.name(), self.parameterAsLayer(parameters, param.name(), context))) elif isinstance(param, QgsProcessingParameterString): value = '"{}"'.format( self.parameterAsString(parameters, param.name(), context)) else: # Use whatever is given value = '"{}"'.format(parameters[param.name()]) # Check if value is set in above if elif ladder and update command string if value and value is not None: command += ' -{} {}'.format(k, value) output_files = {} for out in self.destinationParameterDefinitions(): filePath = self.parameterAsOutputLayer(parameters, out.name(), context) output_files[out.name()] = filePath if outputPixelType is not None: command += ' -{} "{}" "{}"'.format(out.name(), filePath, outputPixelType) else: command += ' -{} "{}"'.format(out.name(), filePath) QgsMessageLog.logMessage(self.tr('cmd={}'.format(command)), self.tr('Processing'), Qgis.Info) if not os.path.exists(otb_cli_file) or not os.path.isfile( otb_cli_file): import errno raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), otb_cli_file) OtbUtils.executeOtb(command, feedback) result = {} for o in self.outputDefinitions(): if o.name() in output_files: result[o.name()] = output_files[o.name()] return result
def processAlgorithm(self, parameters, context, feedback): otb_cli_file = OtbUtils.cliPath() command = '"{}" {} {}'.format(otb_cli_file, self.name(), OtbUtils.appFolder()) outputPixelType = None for k, v in parameters.items(): # if value is None for a parameter we don't have any businees with this key if v is None: continue # for 'outputpixeltype' parameter we find the pixeltype string from self.pixelTypes if k == 'outputpixeltype': pixel_type = self.pixelTypes[int(parameters['outputpixeltype'])] outputPixelType = None if pixel_type == 'float' else pixel_type continue param = self.parameterDefinition(k) if param.isDestination(): continue if isinstance(param, QgsProcessingParameterEnum): value = self.parameterAsEnum(parameters, param.name(), context) elif isinstance(param, QgsProcessingParameterBoolean): value = self.parameterAsBool(parameters, param.name(), context) elif isinstance(param, QgsProcessingParameterCrs): crsValue = self.parameterAsCrs(parameters, param.name(), context) authid = crsValue.authid() if authid.startswith('EPSG:'): value = authid.split('EPSG:')[1] else: raise QgsProcessingException( self.tr("Incorrect value for parameter '{}'. No EPSG code found in '{}'".format( param.name(), authid))) elif isinstance(param, QgsProcessingParameterFile): value = self.parameterAsFile(parameters, param.name(), context) elif isinstance(param, QgsProcessingParameterMultipleLayers): layers = self.parameterAsLayerList(parameters, param.name(), context) if layers is None or len(layers) == 0: continue value = ' '.join(['"{}"'.format(self.getLayerSource(param.name(), layer)) for layer in layers]) elif isinstance(param, QgsProcessingParameterNumber): if param.dataType() == QgsProcessingParameterNumber.Integer: value = self.parameterAsInt(parameters, param.name(), context) else: value = self.parameterAsDouble(parameters, param.name(), context) elif isinstance(param, (QgsProcessingParameterRasterLayer, QgsProcessingParameterVectorLayer)): value = '"{}"'.format(self.getLayerSource(param.name(), self.parameterAsLayer(parameters, param.name(), context))) elif isinstance(param, QgsProcessingParameterString): value = '"{}"'.format(self.parameterAsString(parameters, param.name(), context)) else: # Use whatever is given value = '"{}"'.format(parameters[param.name()]) # Check if value is set in above if elif ladder and update command string if value and value is not None: command += ' -{} {}'.format(k, value) output_files = {} for out in self.destinationParameterDefinitions(): filePath = self.parameterAsOutputLayer(parameters, out.name(), context) output_files[out.name()] = filePath if outputPixelType is not None: command += ' -{} "{}" "{}"'.format(out.name(), filePath, outputPixelType) else: command += ' -{} "{}"'.format(out.name(), filePath) QgsMessageLog.logMessage(self.tr('cmd={}'.format(command)), self.tr('Processing'), Qgis.Info) if not os.path.exists(otb_cli_file) or not os.path.isfile(otb_cli_file): import errno raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), otb_cli_file) OtbUtils.executeOtb(command, feedback) result = {} for o in self.outputDefinitions(): if o.name() in output_files: result[o.name()] = output_files[o.name()] return result