Is there a way to select features and use them in subsequent algorithms within a processing script context?
I am looking to iteratively selectbyexpression
a subset of line features in a layer based on geometry lengths, then using the selected lines in the snapgeometries
processing algorithm.
I can do so in the python console with the following code:
point_layer = QgsProject.instance().mapLayersByName('points')[0]
line_layer = QgsProject.instance().mapLayersByName('lines')[0]
longest_length = max([line.geometry().length() for line in line_layer.getFeatures()])
length = 0
while length < longest_length:
line_layer.selectbyexpression('$length >= {} and $length < {}'.format(length,length+10))
thresh = (length+5)/2
params = {'INPUT':QgsProcessingFeatureSourceDefinition(line_layer.id(), True),
'REFERENCE_LAYER':point_layer,
'TOLERANCE':thresh,
'BEHAVIOR':3,
'OUTPUT':'TEMPORARY_OUTPUT'}
result = processing.run("native:snapgeometries", params)
QgsProject.instance().addMapLayer(result['OUTPUT'])
length += 10
When I attempt to replicate it in a processing script context with:
...
source_line = self.parameterAsSource(parameters, self.IN_LINES, context)
...
source_line.selectByExpression('$length >= {} and $length <= {}'.format(length,length+10))
...
I get this error:
'QgsProcessingFeatureSource' object has no attribute 'selectByExpression'
Best Answer
I'm not sure if these example scripts will work exactly the way you want but you are welcome to try them.
The scripts are based on the template found here.
One option is to use the materialize() method of
QgsFeatureSource
which returns aQgsVectorLayer
. Example below:Or another option is to use
QgsProcessingParameterVectorLayer
instead ofQgsProcessingParameterFeatureSource
and work directly withQgsVectorLayer
objects.Example: