In the QGIS GUI, the select-by-location algorithm has a choice to only use the selected features from the INTERSECT layer. How can I do this (or use any other algorithm) in a python script for QGIS 3?
I do not want to save temporal layer as mentioned in Run QGIS Model on selected features only?
I have been running this script but it does not use the selected features.
import processing
input_vlayer = 'Some path'
intersect_vlayer = 'Some path'
input_vlayer = iface.addVectorLayer(input_vlayer, 'input_vlayer', 'ogr')
intersect_vlayer = iface.addVectorLayer(intersect_vlayer, 'intersect_vlayer', 'ogr')
# Pass the first 5 features
for i in range(5):
# Select the features
intersect_vlayer.select(i)
# Set input params
params = {'INPUT':input_vlayer,
'PREDICATE':0,
'INTERSECT':intersect_vlayer, # USE HERE THE SELECTED FEATURES
'METHOD':0}
result = processing.run("qgis:selectbylocation", params)
# Remove the current selection and then pass to the next one
intersect_vlayer.removeSelection()
Also, from QGIS select by location doesn't use selected features only they mentioned to enable [Processing] > [Options] > [General] > [Use only selected features]. However I can't see this option in my qgis version. I'm using QGIS Madeira 3.4.3
-
you can use QgsProcessingFeatureSourceDefinition and ecapsulate selected idFran Raga– Fran Raga2019年02月05日 21:02:37 +00:00Commented Feb 5, 2019 at 21:02
1 Answer 1
For only selected feature use the QgsProcessingFeatureSourceDefinition
class.
Code below with the input of selected features only:
import processing
input_vlayer = 'Some path'
intersect_vlayer = 'Some path'
input_vlayer = iface.addVectorLayer(input_vlayer, 'input_vlayer', 'ogr')
intersect_vlayer = iface.addVectorLayer(intersect_vlayer, 'intersect_vlayer', 'ogr')
for i in range(5):
# Select the features
intersect_vlayer.select(i)
# Set input params
params = {'INPUT':input_vlayer,
'PREDICATE':0,
'INTERSECT':QgsProcessingFeatureSourceDefinition(intersect_vlayer.id(), True), # USE HERE THE SELECTED FEATURES
'METHOD':0}
result = processing.run("qgis:selectbylocation", params)
# Remove the current selection and then pass to the next one
intersect_vlayer.removeSelection()
-
Thanks @Francisco Raga. Just one thing, I had to add
QgsProcessingFeatureSourceDefinition(intersect_vlayer.id(), True)
to get it work. Thanks.Jose– Jose2019年02月05日 21:36:41 +00:00Commented Feb 5, 2019 at 21:36 -
Ooops!yes,your are correct!add this to my answerFran Raga– Fran Raga2019年02月05日 21:40:42 +00:00Commented Feb 5, 2019 at 21:40
-
1When I add
QgsProcessingFeatureSourceDefinition
to the INPUT parameter it says me :Could not load source layer for INPUT: layerXXX not found
dmjf08– dmjf082019年02月07日 08:04:02 +00:00Commented Feb 7, 2019 at 8:04 -
you can use this parameter in the INPUT flag!Put your code in other question,because probably the INPUT layer is not correctFran Raga– Fran Raga2019年02月07日 09:46:36 +00:00Commented Feb 7, 2019 at 9:46
-
I posted my question with my code : gis.stackexchange.com/questions/311336/…dmjf08– dmjf082019年02月07日 10:14:34 +00:00Commented Feb 7, 2019 at 10:14
Explore related questions
See similar questions with these tags.