Geographic Information Systems Asked on February 19, 2021
I exported a model as script using the properly option in QGIS 3.8.
The Script works perfectly, but the output name is changed.
Heres a print of the model:
I want that the script´s output name, from the Processing Toolbox, be the one that I designed in the def initAlgorithm section, and not the given default name.
In the model, the output name comes as “output_name”
and in the script, the output name comes as “Reprojected”.
Here’s the converted Script:
from qgis.core import QgsProcessing
from qgis.core import QgsProcessingAlgorithm
from qgis.core import QgsProcessingMultiStepFeedback
from qgis.core import QgsProcessingParameterVectorLayer
from qgis.core import QgsProcessingParameterFeatureSink
from qgis.core import QgsCoordinateReferenceSystem
import processing
class Rename(QgsProcessingAlgorithm):
def initAlgorithm(self, config=None):
self.addParameter(QgsProcessingParameterVectorLayer('shapeinput', 'ShapeInput', types=[QgsProcessing.TypeVector], defaultValue=None))
self.addParameter(QgsProcessingParameterFeatureSink('Output_name', 'output_name', type=QgsProcessing.TypeVectorAnyGeometry, createByDefault=True, defaultValue=None))
def processAlgorithm(self, parameters, context, model_feedback):
# Use a multi-step feedback, so that individual child algorithm progress reports are adjusted for the
# overall progress through the model
feedback = QgsProcessingMultiStepFeedback(1, model_feedback)
results = {}
outputs = {}
# Reproject Layer
alg_params = {
'INPUT': parameters['shapeinput'],
'TARGET_CRS': QgsCoordinateReferenceSystem('EPSG:4326'),
'OUTPUT': parameters['Output_name']
}
outputs['ReprojectLayer'] = processing.run('native:reprojectlayer', alg_params, context=context, feedback=feedback, is_child_algorithm=True)
results['Output_name'] = outputs['ReprojectLayer']['OUTPUT']
return results
def name(self):
return 'rename'
def displayName(self):
return 'rename'
def group(self):
return 'rename'
def groupId(self):
return ''
def createInstance(self):
return Rename()
I got it!
the last step of the script must be executed inside a variable, here called step1
so it respects the name entered in the output parameter through the last block
from qgis.core import QgsProcessing
from qgis.core import QgsProcessingAlgorithm
from qgis.core import QgsProcessingMultiStepFeedback
from qgis.core import QgsProcessingParameterVectorLayer
from qgis.core import QgsProcessingParameterFeatureSink
from qgis.core import QgsFeatureSink
import processing
class Model(QgsProcessingAlgorithm):
def initAlgorithm(self, config=None):
self.addParameter(QgsProcessingParameterVectorLayer('vetor', 'vetor', defaultValue=None))
self.addParameter(QgsProcessingParameterFeatureSink('exit', 'exit name', type=QgsProcessing.TypeVectorPolygon, createByDefault=True, defaultValue=None))
def processAlgorithm(self, parameters, context, model_feedback):
feedback = QgsProcessingMultiStepFeedback(1, model_feedback)
results = {}
outputs = {}
step1 = processing.run("native:buffer", {
'DISSOLVE': False,
'DISTANCE': 10,
'END_CAP_STYLE': 0,
'INPUT': parameters['vetor'],
'JOIN_STYLE': 0,
'MITER_LIMIT': 2,
'SEGMENTS': 5,
'OUTPUT': 'memory:'
}, context=context, feedback=feedback)['OUTPUT']
"""here the output name is changed"""
source = step1
(sink, dest_id) = self.parameterAsSink(parameters,'exit',context,source.fields(),source.wkbType(),source.sourceCrs())
features = source.getFeatures()
for current, feature in enumerate(features):
sink.addFeature(feature, QgsFeatureSink.FastInsert)
return results
def name(self):
return 'rename'
def displayName(self):
return 'rename'
def group(self):
return ''
def groupId(self):
return ''
def createInstance(self):
return Model()
Correct answer by Herbert Santos on February 19, 2021
If you need change the name of output, you can do it with this:
alg_params = {
'INPUT': parameters['shapeinput'],
'TARGET_CRS': QgsCoordinateReferenceSystem('EPSG:4326'),
'OUTPUT': 'memory:Name_layer'
}
or if you want to save, only do this:
path = '/home/shade/Desktop/name_layer.shp' #or something like that
alg_params = {
'INPUT': parameters['shapeinput'],
'TARGET_CRS': QgsCoordinateReferenceSystem('EPSG:4326'),
'OUTPUT': path
}
For example:
I run the next code:
layer = iface.activeLayer()
alg_params = {
'INPUT': layer,
'TARGET_CRS': QgsCoordinateReferenceSystem('EPSG:4326'),
'OUTPUT': 'memory:Name_layer'
}
result = processing.run('native:reprojectlayer', alg_params)
print ('This is the result: {}'.format(result['OUTPUT']))
print ('This is the name of the layer result: {}'.format(result['OUTPUT'].name()))
And obtained this:
Answered by Jhon Galindo on February 19, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP