def getParameterFromString(s): # Try the parameter definitions used in description files if '|' in s and (s.startswith("Parameter") or s.startswith("*Parameter")): isAdvanced = False if s.startswith("*"): s = s[1:] isAdvanced = True tokens = s.split("|") params = [t if str(t) != str(None) else None for t in tokens[1:]] try: clazz = getattr(sys.modules[__name__], tokens[0]) param = clazz(*params) if isAdvanced: param.setFlags(param.flags() | QgsProcessingParameterDefinition.FlagAdvanced) return param except: return None else: # try script syntax # try native method param = QgsProcessingParameters.parameterFromScriptCode(s) if param: return param # try Python duck-typed method for paramClass in paramClasses: try: param = paramClass.fromScriptCode(s) if param is not None: return param except: pass
def __init__(self, dialog, param): super(ExtentSelectionPanel, self).__init__(None) self.setupUi(self) self.leText.textChanged.connect(lambda: self.hasChanged.emit()) self.dialog = dialog self.param = param self.crs = QgsProject.instance().crs() if self.param.flags() & QgsProcessingParameterDefinition.FlagOptional: if hasattr(self.leText, 'setPlaceholderText'): self.leText.setPlaceholderText( self.tr('[Leave blank to use min covering extent]')) self.btnSelect.clicked.connect(self.selectExtent) if iface is not None: canvas = iface.mapCanvas() self.prevMapTool = canvas.mapTool() self.tool = RectangleMapTool(canvas) self.tool.rectangleCreated.connect(self.updateExtent) else: self.prevMapTool = None self.tool = None if param.defaultValue() is not None: context = createContext() rect = QgsProcessingParameters.parameterAsExtent(param, {param.name(): param.defaultValue()}, context) crs = QgsProcessingParameters.parameterAsExtentCrs(param, {param.name(): param.defaultValue()}, context) if not rect.isNull(): try: s = '{},{},{},{}'.format( rect.xMinimum(), rect.xMaximum(), rect.yMinimum(), rect.yMaximum()) if crs.isValid(): s += ' [' + crs.authid() + ']' self.crs = crs self.leText.setText(s) except: pass
def executeIterating(alg, parameters, paramToIter, context, feedback): # Generate all single-feature layers parameter_definition = alg.parameterDefinition(paramToIter) if not parameter_definition: return False iter_source = QgsProcessingParameters.parameterAsSource(parameter_definition, parameters, context) sink_list = [] if iter_source.featureCount() == 0: return False total = 100.0 / iter_source.featureCount() for current, feat in enumerate(iter_source.getFeatures()): if feedback.isCanceled(): return False sink, sink_id = QgsProcessingUtils.createFeatureSink('memory:', context, iter_source.fields(), iter_source.wkbType(), iter_source.sourceCrs()) sink_list.append(sink_id) sink.addFeature(feat, QgsFeatureSink.FastInsert) del sink feedback.setProgress(int(current * total)) # store output values to use them later as basenames for all outputs outputs = {} for out in alg.destinationParameterDefinitions(): if out.name() in parameters: outputs[out.name()] = parameters[out.name()] # now run all the algorithms for i, f in enumerate(sink_list): if feedback.isCanceled(): return False parameters[paramToIter] = f for out in alg.destinationParameterDefinitions(): if out.name() not in outputs: continue o = outputs[out.name()] parameters[out.name()] = QgsProcessingUtils.generateIteratingDestination(o, i, context) feedback.setProgressText(QCoreApplication.translate('AlgorithmExecutor', 'Executing iteration {0}/{1}…').format(i + 1, len(sink_list))) feedback.setProgress(i * 100 / len(sink_list)) ret, results = execute(alg, parameters, context, feedback) if not ret: return False handleAlgorithmResults(alg, context, feedback, False) return True
def fromScriptCode(self, line): isOptional, name, definition = _splitParameterOptions(line) descName = QgsProcessingParameters.descriptionFromName(name) if definition.lower().strip().startswith('selectionfromfile'): options = definition.strip()[len('selectionfromfile '):].split(';') return ParameterSelection(name, descName, options, isSource=True, optional=isOptional) elif definition.lower().strip().startswith('selection'): options = definition.strip()[len('selection '):].split(';') return ParameterSelection(name, descName, options, optional=isOptional) elif definition.lower().strip().startswith('multipleselectionfromfile'): options = definition.strip()[len('multipleselectionfromfile '):].split(';') return ParameterSelection(name, descName, options, isSource=True, multiple=True, optional=isOptional) elif definition.lower().strip().startswith('multipleselection'): options = definition.strip()[len('multipleselection '):].split(';') return ParameterSelection(name, descName, options, multiple=True, optional=isOptional)
def getParameterFromString(s): # Try the parameter definitions used in description files if '|' in s and (s.startswith("QgsProcessingParameter") or s.startswith("*QgsProcessingParameter") or s.startswith('Parameter') or s.startswith('*Parameter')): isAdvanced = False if s.startswith("*"): s = s[1:] isAdvanced = True tokens = s.split("|") params = [t if str(t) != str(None) else None for t in tokens[1:]] if True: clazz = getattr(sys.modules[__name__], tokens[0]) # convert to correct type if clazz == QgsProcessingParameterRasterLayer: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False elif clazz == QgsProcessingParameterBand: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False elif clazz == QgsProcessingParameterVectorLayer: if len(params) > 2: params[2] = [int(p) for p in params[2].split(';')] if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False elif clazz == QgsProcessingParameterMapLayer: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False elif clazz == QgsProcessingParameterBoolean: if len(params) > 2: params[2] = True if params[2].lower() == 'true' else False if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False elif clazz == QgsProcessingParameterPoint: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False elif clazz == QgsProcessingParameterCrs: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False elif clazz == QgsProcessingParameterRange: if len(params) > 2: try: params[2] = int(params[2]) except: params[2] = getattr(QgsProcessingParameterNumber, params[2].split(".")[1]) if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False elif clazz == QgsProcessingParameterExtent: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False elif clazz == QgsProcessingParameterExpression: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False elif clazz == QgsProcessingParameterEnum: if len(params) > 2: params[2] = params[2].split(';') if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False if len(params) > 4: # For multiple values; default value is a list of int if params[3] == True: params[4] = [int(v) for v in params[4].split(',')] if params[4] is not None else None else: params[4] = int(params[4]) if params[4] is not None else None if len(params) > 5: params[5] = True if params[5].lower() == 'true' else False elif clazz == QgsProcessingParameterFeatureSource: if len(params) > 2: try: params[2] = [int(p) for p in params[2].split(';')] except: params[2] = [getattr(QgsProcessing, p.split(".")[1]) for p in params[2].split(';')] if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False elif clazz == QgsProcessingParameterMultipleLayers: if len(params) > 2: try: params[2] = int(params[2]) except: params[2] = getattr(QgsProcessing, params[2].split(".")[1]) if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False elif clazz == QgsProcessingParameterMatrix: if len(params) > 2: params[2] = int(params[2]) if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False if len(params) > 4: params[4] = params[4].split(';') if len(params) > 6: params[6] = True if params[6].lower() == 'true' else False elif clazz == QgsProcessingParameterField: if len(params) > 4: try: params[4] = int(params[4]) except: params[4] = getattr(QgsProcessingParameterField, params[4].split(".")[1]) if len(params) > 5: params[5] = True if params[5].lower() == 'true' else False if len(params) > 6: params[6] = True if params[6].lower() == 'true' else False elif clazz == QgsProcessingParameterFile: if len(params) > 2: try: params[2] = int(params[2]) except: params[2] = getattr(QgsProcessingParameterFile, params[2].split(".")[1]) if len(params) > 5: params[5] = True if params[5].lower() == 'true' else False elif clazz == QgsProcessingParameterNumber: if len(params) > 2: try: params[2] = int(params[2]) except: params[2] = getattr(QgsProcessingParameterNumber, params[2].split(".")[1]) if len(params) > 3: params[3] = float(params[3].strip()) if params[3] is not None else None if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False if len(params) > 5: params[5] = float(params[5].strip()) if params[5] is not None else -sys.float_info.max + 1 if len(params) > 6: params[6] = float(params[6].strip()) if params[6] is not None else sys.float_info.max - 1 elif clazz == QgsProcessingParameterString: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False elif clazz == QgsProcessingParameterFileDestination: if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False if len(params) > 5: params[5] = True if params[5].lower() == 'true' else False elif clazz == QgsProcessingParameterFolderDestination: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False elif clazz == QgsProcessingParameterRasterDestination: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False elif clazz == QgsProcessingParameterVectorDestination: if len(params) > 2: try: params[2] = int(params[2]) except: params[2] = getattr(QgsProcessing, params[2].split(".")[1]) if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False if len(params) > 5: params[5] = True if params[5].lower() == 'true' else False param = clazz(*params) if isAdvanced: param.setFlags(param.flags() | QgsProcessingParameterDefinition.FlagAdvanced) return param else: return None else: # try script syntax # try native method param = QgsProcessingParameters.parameterFromScriptCode(s) if param: return param
def prepareAlgorithm(self, parameters, context, feedback): self.m_value = self.parameterAsDouble(parameters, self.M_VALUE, context) self.dynamic_m = QgsProcessingParameters.isDynamic(parameters, self.M_VALUE) if self.dynamic_m: self.m_property = parameters[self.M_VALUE] return True
def getParameterFromString(s, context=''): # Try the parameter definitions used in description files if '|' in s and (s.startswith("QgsProcessingParameter") or s.startswith("*QgsProcessingParameter") or s.startswith('Parameter') or s.startswith('*Parameter')): isAdvanced = False if s.startswith("*"): s = s[1:] isAdvanced = True tokens = s.split("|") params = [t if str(t) != str(None) else None for t in tokens[1:]] if True: clazz = getattr(sys.modules[__name__], tokens[0]) # convert to correct type if clazz == QgsProcessingParameterRasterLayer: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False elif clazz == QgsProcessingParameterBand: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False elif clazz == QgsProcessingParameterVectorLayer: if len(params) > 2: params[2] = [int(p) for p in params[2].split(';')] if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False elif clazz == QgsProcessingParameterMapLayer: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False elif clazz == QgsProcessingParameterBoolean: if len(params) > 2: params[2] = True if params[2].lower() == 'true' else False if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False elif clazz == QgsProcessingParameterPoint: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False elif clazz == QgsProcessingParameterCrs: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False elif clazz == QgsProcessingParameterRange: if len(params) > 2: try: params[2] = int(params[2]) except: params[2] = getattr(QgsProcessingParameterNumber, params[2].split(".")[1]) if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False elif clazz == QgsProcessingParameterExtent: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False elif clazz == QgsProcessingParameterExpression: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False elif clazz == QgsProcessingParameterEnum: if len(params) > 2: params[2] = params[2].split(';') if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False if len(params) > 4: # For multiple values; default value is a list of int if params[3] == True: params[4] = [int(v) for v in params[4].split(',') ] if params[4] is not None else None else: params[4] = int( params[4]) if params[4] is not None else None if len(params) > 5: params[5] = True if params[5].lower() == 'true' else False elif clazz == QgsProcessingParameterFeatureSource: if len(params) > 2: try: params[2] = [int(p) for p in params[2].split(';')] except: params[2] = [ getattr(QgsProcessing, p.split(".")[1]) for p in params[2].split(';') ] if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False elif clazz == QgsProcessingParameterMultipleLayers: if len(params) > 2: try: params[2] = int(params[2]) except: params[2] = getattr(QgsProcessing, params[2].split(".")[1]) if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False elif clazz == QgsProcessingParameterMatrix: if len(params) > 2: params[2] = int(params[2]) if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False if len(params) > 4: params[4] = params[4].split(';') if len(params) > 6: params[6] = True if params[6].lower() == 'true' else False elif clazz == QgsProcessingParameterField: if len(params) > 4: try: params[4] = int(params[4]) except: params[4] = getattr(QgsProcessingParameterField, params[4].split(".")[1]) if len(params) > 5: params[5] = True if params[5].lower() == 'true' else False if len(params) > 6: params[6] = True if params[6].lower() == 'true' else False elif clazz == QgsProcessingParameterFile: if len(params) > 2: try: params[2] = int(params[2]) except: params[2] = getattr(QgsProcessingParameterFile, params[2].split(".")[1]) if len(params) > 5: params[5] = True if params[5].lower() == 'true' else False elif clazz == QgsProcessingParameterNumber: if len(params) > 2: try: params[2] = int(params[2]) except: params[2] = getattr(QgsProcessingParameterNumber, params[2].split(".")[1]) if len(params) > 3: params[3] = float( params[3].strip()) if params[3] is not None else None if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False if len(params) > 5: params[5] = float(params[5].strip( )) if params[5] is not None else -sys.float_info.max + 1 if len(params) > 6: params[6] = float(params[6].strip( )) if params[6] is not None else sys.float_info.max - 1 elif clazz == QgsProcessingParameterString: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False elif clazz == QgsProcessingParameterColor: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False elif clazz == QgsProcessingParameterFileDestination: if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False if len(params) > 5: params[5] = True if params[5].lower() == 'true' else False elif clazz == QgsProcessingParameterFolderDestination: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False elif clazz == QgsProcessingParameterRasterDestination: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False elif clazz == QgsProcessingParameterVectorDestination: if len(params) > 2: try: params[2] = int(params[2]) except: params[2] = getattr(QgsProcessing, params[2].split(".")[1]) if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False if len(params) > 5: params[5] = True if params[5].lower() == 'true' else False param = clazz(*params) if isAdvanced: param.setFlags(param.flags() | QgsProcessingParameterDefinition.FlagAdvanced) param.setDescription( QCoreApplication.translate(context, param.description())) return param else: return None else: # try script syntax # try native method param = QgsProcessingParameters.parameterFromScriptCode(s) if param: return param
def getParameterFromString(s): # Try the parameter definitions used in description files if '|' in s and (s.startswith("QgsProcessingParameter") or s.startswith("*QgsProcessingParameter") or s.startswith('Parameter') or s.startswith('*Parameter')): isAdvanced = False if s.startswith("*"): s = s[1:] isAdvanced = True tokens = s.split("|") params = [t if str(t) != str(None) else None for t in tokens[1:]] if True: clazz = getattr(sys.modules[__name__], tokens[0]) # convert to correct type if clazz == QgsProcessingParameterRasterLayer: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False elif clazz == QgsProcessingParameterVectorLayer: if len(params) > 2: params[2] = [int(p) for p in params[2].split(';')] if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False elif clazz == QgsProcessingParameterBoolean: if len(params) > 2: params[2] = True if params[2].lower() == 'true' else False if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False elif clazz == QgsProcessingParameterPoint: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False elif clazz == QgsProcessingParameterCrs: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False elif clazz == QgsProcessingParameterRange: if len(params) > 2: params[2] = QgsProcessingParameterNumber.Integer if params[ 2].lower().endswith( 'integer') else QgsProcessingParameterNumber.Double if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False elif clazz == QgsProcessingParameterExtent: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False elif clazz == QgsProcessingParameterEnum: if len(params) > 2: params[2] = params[2].split(';') if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False if len(params) > 4: # For multiple values; default value is a list of int if params[3] == True: params[4] = [int(v) for v in params[4].split(',')] else: params[4] = int(params[4]) if len(params) > 5: params[5] = True if params[5].lower() == 'true' else False elif clazz == QgsProcessingParameterFeatureSource: if len(params) > 2: params[2] = [int(p) for p in params[2].split(';')] if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False elif clazz == QgsProcessingParameterMultipleLayers: if len(params) > 2: params[2] = int(params[2]) if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False elif clazz == QgsProcessingParameterMatrix: if len(params) > 2: params[2] = int(params[2]) if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False if len(params) > 4: params[4] = params[4].split(';') elif clazz == QgsProcessingParameterField: if len(params) > 4: params[4] = int(params[4]) if len(params) > 5: params[5] = True if params[5].lower() == 'true' else False if len(params) > 6: params[6] = True if params[6].lower() == 'true' else False elif clazz == QgsProcessingParameterFile: if len(params) > 2: params[2] = QgsProcessingParameterFile.File if params[ 2].lower( ) == 'false' else QgsProcessingParameterFile.Folder if len(params) > 5: params[5] = True if params[5].lower() == 'true' else False elif clazz == QgsProcessingParameterNumber: if len(params) > 2: params[2] = QgsProcessingParameterNumber.Integer if params[ 2].lower().endswith( 'integer') else QgsProcessingParameterNumber.Double if len(params) > 3: params[3] = float( params[3].strip()) if params[3] is not None else None if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False if len(params) > 5: params[5] = float(params[5].strip( )) if params[5] is not None else -sys.float_info.max + 1 if len(params) > 6: params[6] = float(params[6].strip( )) if params[6] is not None else sys.float_info.max - 1 elif clazz == QgsProcessingParameterString: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False elif clazz == QgsProcessingParameterFileDestination: if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False elif clazz == QgsProcessingParameterFolderDestination: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False elif clazz == QgsProcessingParameterRasterDestination: if len(params) > 3: params[3] = True if params[3].lower() == 'true' else False elif clazz == QgsProcessingParameterVectorDestination: if len(params) > 2: if params[2].lower().endswith('point'): params[2] = QgsProcessing.TypeVectorPoint elif params[2].lower().endswith('line'): params[2] = QgsProcessing.TypeVectorLine elif params[2].lower().endswith('polygon'): params[2] = QgsProcessing.TypeVectorPolygon elif params[2].lower().endswith('geometry'): params[2] = QgsProcessing.TypeVectorAnyGeometry elif params[2].lower().endswith('vector'): params[2] = QgsProcessing.TypeVector if len(params) > 4: params[4] = True if params[4].lower() == 'true' else False param = clazz(*params) if isAdvanced: param.setFlags(param.flags() | QgsProcessingParameterDefinition.FlagAdvanced) return param else: return None else: # try script syntax # try native method param = QgsProcessingParameters.parameterFromScriptCode(s) if param: return param
def prepareAlgorithm(self, parameters, context, feedback): self.z_value = self.parameterAsDouble(parameters, self.Z_VALUE, context) self.dynamic_z = QgsProcessingParameters.isDynamic(parameters, self.Z_VALUE) if self.dynamic_z: self.z_property = parameters[self.Z_VALUE] return True
def isSupportedOutputValue(self, value, context): output_path = QgsProcessingParameters.parameterAsOutputLayer(self, value, context) if pathlib.Path(output_path).suffix.lower() != '.tif': return False, QCoreApplication.translate("SAGAAlgorithm", 'Output filename must use a .tif extension') return True, ''
def processAlgorithm(self, parameters, context, feedback): source = self.parameterAsSource(parameters, self.INPUT, context) expressionContext = self.createExpressionContext( parameters, context, source) x_expression = self.parameterAsString(parameters, self.XEXPRESSION, context) x_expression = QgsExpression(x_expression) if x_expression.hasParserError(): x_expression.prepare(expressionContext) raise QgsProcessingException(x_expression.parserErrorString()) y_expression = self.parameterAsString(parameters, self.YEXPRESSION, context) y_expression = QgsExpression(y_expression) if y_expression.hasParserError(): y_expression.prepare(expressionContext) raise QgsProcessingException(y_expression.parserErrorString()) size = self.parameterAsDouble(parameters, self.SIZE, context) size_property = None if QgsProcessingParameters.isDynamic(parameters, "SIZE"): size_property = parameters["SIZE"] color = self.parameterAsColor(parameters, self.COLOR, context) color_property = None if QgsProcessingParameters.isDynamic(parameters, "COLOR"): color_property = parameters["COLOR"] facet_row = self.parameterAsString(parameters, self.FACET_ROW, context) facet_row_expression = QgsExpression(facet_row) if facet_row and facet_row_expression.hasParserError(): facet_row_expression.prepare(expressionContext) raise QgsProcessingException( facet_row_expression.parserErrorString()) facet_col = self.parameterAsString(parameters, self.FACET_COL, context) facet_col_expression = QgsExpression(facet_col) if facet_col and facet_col_expression.hasParserError(): facet_col_expression.prepare(expressionContext) raise QgsProcessingException( facet_col_expression.parserErrorString()) offline = self.parameterAsBool(parameters, self.OFFLINE, context) if offline is not True: offline = 'cdn' output_html = self.parameterAsFileOutput(parameters, self.OUTPUT_HTML_FILE, context) output_json = self.parameterAsFileOutput(parameters, self.OUTPUT_JSON_FILE, context) colnames = ['x', 'y', 'customdata'] data = [] request = QgsFeatureRequest() request.setFlags(QgsFeatureRequest.NoGeometry) for current, f in enumerate(source.getFeatures(request)): tl = [] expressionContext.setFeature(f) x_val = x_expression.evaluate(expressionContext) y_val = y_expression.evaluate(expressionContext) ids = f.id() tl.append(x_val) tl.append(y_val) tl.append(ids) if facet_row: facet_row_val = facet_row_expression.evaluate( expressionContext) tl.append(facet_row_val) if facet_col: facet_col_val = facet_col_expression.evaluate( expressionContext) tl.append(facet_col_val) if size_property: the_size, _ = size_property.valueAsDouble( expressionContext, size) tl.append(the_size) if color_property: the_color, _ = color_property.value(expressionContext, color) tl.append(the_color) data.append(tl) if facet_row: colnames.append('facet_row') if facet_col: colnames.append('facet_col') if size_property: colnames.append('size') if color_property: colnames.append('color') df = pd.DataFrame(data=data, columns=colnames) feedback.pushDebugInfo(f'{df}') fig = px.scatter(df, x='x', y='y', size='size' if size_property else None, color='color' if color_property else None, facet_row="facet_row" if facet_row else None, facet_col="facet_col" if facet_col else None) if size_property is None: fig.update_traces(marker_size=size) if color_property is None: fig.update_traces(marker_color=color.name()) fig.update_layout(showlegend=True) results = {} fig.write_html(output_html, include_plotlyjs=offline) results[self.OUTPUT_HTML_FILE] = output_html if output_json: fig.write_json(output_json, pretty=True) results[self.OUTPUT_JSON_FILE] = output_json return results
def processAlgorithm(self, parameters, context, feedback): source = self.parameterAsSource(parameters, self.INPUT, context) if source is None: raise QgsProcessingException( self.invalidSourceError(parameters, self.INPUT)) strategy = self.parameterAsEnum(parameters, self.STRATEGY, context) if self.MIN_DISTANCE in parameters and parameters[ self.MIN_DISTANCE] is not None: minDistance = self.parameterAsDouble(parameters, self.MIN_DISTANCE, context) else: minDistance = None expressionContext = self.createExpressionContext( parameters, context, source) dynamic_value = QgsProcessingParameters.isDynamic(parameters, "VALUE") value_property = None if self.EXPRESSION in parameters and parameters[ self.EXPRESSION] is not None: expression = QgsExpression( self.parameterAsString(parameters, self.EXPRESSION, context)) value = None if expression.hasParserError(): raise QgsProcessingException(expression.parserErrorString()) expression.prepare(expressionContext) else: expression = None if dynamic_value: value_property = parameters["VALUE"] value = self.parameterAsDouble(parameters, self.VALUE, context) fields = QgsFields() fields.append(QgsField('id', QVariant.Int, '', 10, 0)) (sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context, fields, QgsWkbTypes.Point, source.sourceCrs(), QgsFeatureSink.RegeneratePrimaryKey) if sink is None: raise QgsProcessingException( self.invalidSinkError(parameters, self.OUTPUT)) da = QgsDistanceArea() da.setSourceCrs(source.sourceCrs(), context.transformContext()) da.setEllipsoid(context.ellipsoid()) total = 100.0 / source.featureCount() if source.featureCount() else 0 current_progress = 0 pointId = 0 for current, f in enumerate(source.getFeatures()): if feedback.isCanceled(): break if not f.hasGeometry(): continue current_progress = total * current feedback.setProgress(current_progress) this_value = value if value_property is not None or expression is not None: expressionContext.setFeature(f) if value_property: this_value, _ = value_property.valueAsDouble( expressionContext, value) else: this_value = expression.evaluate(expressionContext) if expression.hasEvalError(): feedback.pushInfo( self.tr('Evaluation error for feature ID {}: {}'). format(f.id(), expression.evalErrorString())) continue fGeom = f.geometry() engine = QgsGeometry.createGeometryEngine(fGeom.constGet()) engine.prepareGeometry() bbox = fGeom.boundingBox() if strategy == 0: pointCount = int(this_value) else: pointCount = int(round(this_value * da.measureArea(fGeom))) if pointCount == 0: feedback.pushInfo( "Skip feature {} as number of points for it is 0.".format( f.id())) continue index = None if minDistance: index = QgsSpatialIndex() points = dict() nPoints = 0 nIterations = 0 maxIterations = pointCount * 200 feature_total = total / pointCount if pointCount else 1 random.seed() while nIterations < maxIterations and nPoints < pointCount: if feedback.isCanceled(): break rx = bbox.xMinimum() + bbox.width() * random.random() ry = bbox.yMinimum() + bbox.height() * random.random() p = QgsPointXY(rx, ry) geom = QgsGeometry.fromPointXY(p) if engine.contains(geom.constGet()) and \ (not minDistance or vector.checkMinDistance(p, index, minDistance, points)): f = QgsFeature(nPoints) f.initAttributes(1) f.setFields(fields) f.setAttribute('id', pointId) f.setGeometry(geom) sink.addFeature(f, QgsFeatureSink.FastInsert) if minDistance: index.addFeature(f) points[nPoints] = p nPoints += 1 pointId += 1 feedback.setProgress(current_progress + int(nPoints * feature_total)) nIterations += 1 if nPoints < pointCount: feedback.pushInfo( self.tr('Could not generate requested number of random ' 'points. Maximum number of attempts exceeded.')) feedback.setProgress(100) return {self.OUTPUT: dest_id}