Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#1 Sun 18 November 2018 18:08

olivierh65
Participant occasionnel
Date d'inscription: 23 Aug 2010
Messages: 10

QGIS: Comment identifier en Python les Features visibles?

Bonjour à tous,

En Qgis3, pour une couche vecteur active (cochée dans l'arbre des couches), et dont la visibilité de ses éléments est basée sur un ensemble de règles, dans un programme python, je voudrais pouvoir identifier les features visibles.

Je retrouve bien pour le layer concerné le 'renderer' (de type QgsRulebasedRenderer), mais je ne trouve pas de fonction permettant de tester si une feature est éligible à être tracé ou non (La règle peut être vrai, mais la feature hors des extents de la zone affichée). L’idéal, serait d'avoir une fonction isVisible()!

Les recherches dans la doc, sur Google ne m'ont pas permis de trouver comment faire.

Est ce que l'un de vous à une piste?

Olivier

Hors ligne

 

#2 Mon 19 November 2018 10:27

YoLecomte
Participant assidu
Lieu: Epinal
Date d'inscription: 7 Jul 2015
Messages: 238

Re: QGIS: Comment identifier en Python les Features visibles?

Bonjour,

je pense que c'est ce que vous cherchez :
isFilterOk()
https://qgis.org/api/classQgsRuleBasedR … 611513a852

Ca prend une feature en paramètre et renvoi true ou false selon que la feature doit être affichée ou non.

Donc vous pouvez itérer sur les features de votre couche et les tester une à une

Code:

for feat in layer.getFeatures:
    is_render = myQgsRulesBasedRenderer.rootRule().children()[0].isFilterOk(feat)
    if is_render:
        #do what you want

Ceci dit ce n'est probablement pas l'approche la plus efficace...

la méthode

Code:

getFeatures()

peut prendre en paramètre une expression qui ne renverra que les features qui matche cette expression

Vous pouvez donc:
1 - récuperer l'expression du renderer (

Code:

expression = QgsRulesBasedRenderer.rootRule().children()(0].filter()

)
2 - faire un

Code:

feature_affichee = layer.getFeatures(expression)

a partir de la, feature _affichee
est un QgsFeatureIterator
qui vous permet de travailler sur les features qui matchent dans une boucle for.

Cette méthode est plus performante car elle n'oblige pas à itérer sur l'ensemble des features de la couche layer.

Dernière modification par YoLecomte (Thu 22 November 2018 16:35)

Hors ligne

 

#3 Mon 19 November 2018 10:45

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 3799

Re: QGIS: Comment identifier en Python les Features visibles?

Bonjour,
Juste parce qu'on oublie trop souvent qu'il y a maintenant une doc pyQGIS: https://qgis.org/pyqgis/3.4/core/Rule/Q … derer.html

Hors ligne

 

#4 Mon 19 November 2018 23:18

olivierh65
Participant occasionnel
Date d'inscription: 23 Aug 2010
Messages: 10

Re: QGIS: Comment identifier en Python les Features visibles?

Merci pour vos réponses, mais....
J'ai lu et relus les différentes docs, testé (un peu a taton), mais je n'arrive pas a m'en sortir :-(.
Et il me semble qu'il y a des incohérences entre la doc et les méthodes réellement exposées.
Par exemple, isFilterOK n'existe pas dans QgsRuleBasedRenderer!

Code:

layer
<qgis._core.QgsVectorLayer object at 0x0000000021351318>
layer.renderer()
<qgis._core.QgsRuleBasedRenderer object at 0x0000000021369438>
layer.renderer().isFilterOK(layer.selectedFeatures()[0])
Traceback (most recent call last):
  File "C:\OSGEO4~2\apps\Python37\lib\code.py", line 90, in runcode
    exec(code, self.locals)
  File "<input>", line 1, in <module>
AttributeError: 'QgsRuleBasedRenderer' object has no attribute 'isFilterOK'

Par contre, la récupération du filtre, puis des features marche, mais retourne systématiquement l'ensemble règles, qu'elles soient ou non activées dans l'arbre des couches.
Je vais regarder comment retrouver les ce qui est coché et ne récupérer que les règles correspondantes.

Merci pour vos indications.

Hors ligne

 

#5 Thu 22 November 2018 00:45

dominique.lys
Participant assidu
Date d'inscription: 5 Oct 2006
Messages: 473
Site web

Re: QGIS: Comment identifier en Python les Features visibles?

Bonjour,

isFilterOk est une méthode l'objet rule : https://qgis.org/pyqgis/3.4/core/Rule/Q … isFilterOK

Code:

rules = layer.renderer().rootRule().children()
for rule in rules:
  rule.isFilterOk(...)

Hors ligne

 

#6 Sun 16 December 2018 21:17

olivierh65
Participant occasionnel
Date d'inscription: 23 Aug 2010
Messages: 10

Re: QGIS: Comment identifier en Python les Features visibles?

Bonsoir à tous,
Je n'ai pas trop de temps pour m'occuper de ce sujet, mais je voulais quand même partager ce que j'ai fait.
Pour le layer concerné, je balaye les règles et cré une expression avec les règles actives. ensuite, il suffit juste de récupérer les features correspondantes.
Code pour valider que bon fonctionnement :

Code:

filt=""
for r in iface.activeLayer().renderer().rootRule().children():
    if (r.active()):
        print ("%s Actif" % r.label())
        print ("     Filter : %s" % r.filter())
        if len(filt) == 0:
            filt = "({0})".format(r.filter().expression())
        else:
            filt= "{0} or ({1})".format(filt, r.filter().expression())
    else:
        print ("%s Inactif" % r.label())
print (filt)
f=iface.activeLayer().getFeatures(filt)
for ff in f:
    print(ff)
    iface.mapCanvas().flashGeometries([ff.geometry()], QgsProject.instance().crs(),QColor( 255, 0, 0, 255 ), QColor( 128, 0, 0, 0 ), 5, 800)

Merci pour votre aide.
Olivier.

Hors ligne

 

Pied de page des forums

Powered by FluxBB