Pages: 1
- Sujet précédent - QGIS: Comment identifier en Python les Features visibles? - Sujet suivant
#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: 254
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: 3880
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
Pages: 1
- Sujet précédent - QGIS: Comment identifier en Python les Features visibles? - Sujet suivant