3

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 Madeira 3.4.3 enter image description here

  • you can use QgsProcessingFeatureSourceDefinition and ecapsulate selected id – Fran Raga Feb 5 at 21:02
2

For only use selected feature use QgsProcessingFeatureSourceDefinition

https://qgis.org/api/classQgsProcessingFeatureSourceDefinition.html

your code,but the input is only 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')


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 Feb 5 at 21:36
  • Ooops!yes,your are correct!add this to my answer – Fran Raga Feb 5 at 21:40
  • When I add QgsProcessingFeatureSourceDefinition to the INPUT parameter it says me : Could not load source layer for INPUT: layerXXX not found – dmjf08 Feb 7 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 correct – Fran Raga Feb 7 at 9:46
  • I posted my question with my code : gis.stackexchange.com/questions/311336/… – dmjf08 Feb 7 at 10:14

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.