2

I have a processing script that will carry out a selection by expression of the input layer, then do a join attributes by location with a join layer.

The next stage will be to add a new field and calculate the field, I got a python script that runs this but I am struggling to adapt it into the processing tool.

The code is below:

def initAlgorithm(self, config=None):
 """
 Here we define the inputs and output of the algorithm, along
 with some other properties.
 """
 # We add the input vector features source. It can have any kind of
 # geometry.
 self.addParameter(
 QgsProcessingParameterFeatureSource(
 self.INPUT,
 self.tr('NRD Layer'),
 [QgsProcessing.TypeVectorPoint]
 )
 )
 self.addParameter(
 QgsProcessingParameterFeatureSource(
 self.JOIN,
 self.tr('Parliamentary Constituency Layer'),
 [QgsProcessing.TypeVectorPolygon]
 )
 )
 self.addParameter(
 QgsProcessingParameterField(
 self.JOIN_FIELDS,
 self.tr('Choose Join Field'),
 parentLayerParameterName = self.JOIN,
 allowMultiple=False,
 optional=False
 )
 )
 self.addParameter(
 QgsProcessingParameterVectorDestination(
 self.OUTPUT,
 self.tr('Output layer')
 )
 )
def processAlgorithm(self, parameters, context, feedback):
 selectData = processing.run(
 'qgis:selectbyexpression',
 {
 "INPUT":parameters['INPUT'],
 "EXPRESSION":'\"mcmcode\" !=\'1\' AND \"mcmcode\" !=\'9\' AND \"mcmcode\" !=\'960\' AND \"mcmcode\" !=\'999\'',
 "METHOD":0,
 'OUTPUT':parameters['OUTPUT']
 },
 context=context,
 feedback=feedback 
 )
 joinoutput = processing.run(
 'qgis:joinattributesbylocation', 
 {
 'INPUT':QgsProcessingFeatureSourceDefinition(selectData['OUTPUT'], True),
 'JOIN':parameters['JOIN'] ,
 'PREDICATE':[0],
 'JOIN_FIELDS':parameters['join_field'],
 'METHOD':1,
 'DISCARD_NONMATCHING':True,
 'PREFIX':'',
 'OUTPUT':parameters['OUTPUT']
 }, 
 context = context, 
 feedback = feedback
 )
 NRDLayer = joinoutput['OUTPUT']
 F_Onset = QgsField('F_Onset',QVariant.Double)
 NRDLayer.dataProvider().addAttributes([F_Onset])
 NRDLayer.updateFields()
 return {'OUTPUT':joinoutput['OUTPUT']}

The error suggests you can't use dataprovider on joinoutput['OUTPUT'].

I thought I might need to use ParameterasSink to get my output in order to be able to use things like .featureCount(), .dataProvider() with it etc.

However not understanding this very well I would rather avoid that. The tool works up to that point.

Any ideas on what to do in QGIS 3?

Kadir Şahbaz
78.6k57 gold badges260 silver badges407 bronze badges
asked Jul 15, 2019 at 9:21
2
  • 1
    check this solution gis.stackexchange.com/a/304791/49538 Commented Jul 15, 2019 at 9:36
  • Thanks, I am trying to avoid using parametersAsSink, firstly because my current method (QgsProcessingParameterVectorDestination) works up to this point, and secondly because i dont quite understand it or know how to apply it (it seems far more complicated? What is the main difference?) Do you know when one has to use parametersAsSink? If I am adding and calculating a field do I need to? Commented Jul 15, 2019 at 10:05

1 Answer 1

2

Okay so it was actually quite simple, you can't use the output of the algorithm straight away, you first need to do this:

layer = self.parameterAsVectorLayer(parameters, self.OUTPUT, context)

Then you can run functions like layer.getFeatures() etc. on that.

Don't know if there are better ways to do what I am trying to do but this works! Anyone who has better ways feel welcome to post a comment.

Kadir Şahbaz
78.6k57 gold badges260 silver badges407 bronze badges
answered Jul 16, 2019 at 10:18

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.