#1 Wed 12 February 2025 12:52
- pyjoubert
- Participant assidu
- Lieu: Lyon
- Date d'inscription: 21 Mar 2006
- Messages: 376
QGIS/PYQGIS: Interpretation Legende de couches
Bonjour,
J'ai créé des layer mémoire (préfixés par tmp_)
J'ai appliqué pour chacun une représentation à base de règles
Dans la légende de couche j'ai donc un arbre montrant les différents layers et les classes de représentation en niveau inférieurs (Voir capture jointe)
Maintenant, je voudrais "relire" cet arbre en récupérant le nom de chaque layer et pour chacun d'eux le nom de leurs classes de représentation ainsi que le nombre d'entité pour chaque layer et pour chaque classe
Je n'arrive pas à descendre au niveau des classes
Merci de votre aide et bonne journée, PYJ
Hors ligne
#2 Wed 12 February 2025 15:34
- GlaDal
- Participant assidu
- Date d'inscription: 30 Aug 2013
- Messages: 1173
Re: QGIS/PYQGIS: Interpretation Legende de couches
Bonjour,
Je n'ai pas compris votre besoin. En faisant un clic droit sur la couche 'afficher le nombre d'entités' vous suffit ?
Hors ligne
#3 Wed 12 February 2025 19:32
- pyjoubert
- Participant assidu
- Lieu: Lyon
- Date d'inscription: 21 Mar 2006
- Messages: 376
Re: QGIS/PYQGIS: Interpretation Legende de couches
Bonjour,
Je vais reformuler ma demande
Considérant la légende de couche présente dans la capture de mon post initial, je voudrais en langage python, récupérer dans une variable le nombre d'entités pour chaque classe de représentation de chaque couche (sachant que les classes de représentation sont toutes à base d'ensemble de règles
voilà ce que j'ai fait mais qui est à compléter (ou à corriger)
Code:
for layer in QgsProject.instance().mapLayers().values(): nom = layer.name() if (nom.startswith("tmp_")): renderer = layer.renderer() root_rule = renderer.rootRule() for i in range(len(root_rule.children())): nom_classe = root_rule.children()[i].label() nb = "comment récupérer ne nombre ????" print ("- Couche : " + nom + " --> Classe : " + nom_classe + " --> Nombre entités : " + nb) pass
Dernière modification par pyjoubert (Thu 13 February 2025 07:25)
Hors ligne
#4 Thu 13 February 2025 09:38
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1204
Re: QGIS/PYQGIS: Interpretation Legende de couches
Bonjour,
est-ce qu'il ne faudrait pas utiliser QgsVectorLayerFeatureCounter (https://qgis.org/pyqgis/3.40/core/QgsVe … unter.html) ?
Hors ligne
#5 Thu 13 February 2025 11:01
- pyjoubert
- Participant assidu
- Lieu: Lyon
- Date d'inscription: 21 Mar 2006
- Messages: 376
Re: QGIS/PYQGIS: Interpretation Legende de couches
En faisant
Code:
for layer in QgsProject.instance().mapLayers().values(): nom = layer.name() if (nom.startswith("tmp_")): print(nom) ftCounter = layer.countSymbolFeatures() print(ftCounter)
ftCounter renvoi systématiquement None
Hors ligne
#6 Thu 13 February 2025 12:23
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1204
Re: QGIS/PYQGIS: Interpretation Legende de couches
countSymbolFeatures lance le comptage des entités (qui peut êter long et est calculé de manière asynchrone au script qui appelle cette fonction).
Si le comptage a déjà été effectué il renvoie None, sinon il renvoie un QgsVectorLayerFeatureCounter qui permet
d'attendre la fin du comptage avec la fonction waitForFinished (si on n'appelle pas cette fonction, le script continue sans attendre que le comptage soit terminé, ce qui renverra -1 quand on appelle featureCount avec une couche.
Code:
for layer in QgsProject.instance().mapLayers().values(): nom = layer.name() if (nom.startswith("tmp_")): print(nom) cntr = layer.countSymbolFeatures() if cntr: cntr.waitForFinished() r = layer.renderer() k = r.legendKeys() for l in k: print(l) print(layer.featureCount(l))
Dernière modification par tumasgiu (Thu 13 February 2025 12:24)
Hors ligne
#7 Thu 13 February 2025 13:01
- pyjoubert
- Participant assidu
- Lieu: Lyon
- Date d'inscription: 21 Mar 2006
- Messages: 376
Re: QGIS/PYQGIS: Interpretation Legende de couches
La solution fonctionne pour récupérer le nombre d'entités par classe de représentation
Par contre, la variable l contient la clé de la classe, mais comment récupérer le libelle ?
Merci encore
Dernière modification par pyjoubert (Thu 13 February 2025 13:42)
Hors ligne
#8 Fri 14 February 2025 08:56
- pyjoubert
- Participant assidu
- Lieu: Lyon
- Date d'inscription: 21 Mar 2006
- Messages: 376
Re: QGIS/PYQGIS: Interpretation Legende de couches
Bonjour,
J'ai trouvé,
Voici mon code
Code:
for layer in QgsProject.instance().mapLayers().values(): nom = layer.name() if (nom.startswith("tmp_")): print(nom) cntr = layer.countSymbolFeatures() if cntr: cntr.waitForFinished() renderer = layer.renderer() k = renderer.legendKeys() try: root_rule = renderer.rootRule() for i in range(len(root_rule.children())): label = root_rule.children()[i].label() print(label) desc = root_rule.children()[i].description() print(desc) expression = root_rule.children()[i].filterExpression() print(expression) k = root_rule.children()[i].ruleKey() print(layer.featureCount(k)) except: pass
Hors ligne