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

GeoDataDays 2025

#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


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

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

 

Pied de page des forums

Copyright Association GeoRezo