Suite

Regrouper par programme plusieurs couches en groupes distincts à l'aide de QGIS ?

Regrouper par programme plusieurs couches en groupes distincts à l'aide de QGIS ?


J'essaie de regrouper un grand nombre de couches en fonction d'une partie commune de la chaîne de nom. Ils sont un mélange de polygones et de points. Je voudrais créer des groupes individuels en utilisant une partie du nom du calque. Quelqu'un a des idées ? Je cherchais à créer un plugin mais je n'y arrive pas (en raison de mes capacités de codage).

J'ai joint une photo pour montrer ce que je recherche comme résultat final. J'ai des projets avec une grande quantité d'informations qu'il faut regrouper.


Vous pouvez le faire en trois étapes : obtenir des noms de groupe, créer des groupes et déplacer des calques.

À des fins de test, j'ai reproduit votre exemple de scénario :

Exécutez l'extrait de code suivant dans votre console QGIS Python :

# 1. Obtenir les noms de groupe et la liste des identifiants de couche root = QgsProject.instance().layerTreeRoot() dictGroups={} pour la couche dans root.findLayers() : if QgsLayerTree.isLayer(layer) : prefix="Site "+layer .layerName().split("_")[0] # Ajustez ceci pour répondre à vos besoins s'il n'y a pas de préfixe dans dictGroups : dictGroups[prefix]=[] dictGroups[prefix].append(layer.layerId()) # 2. Créez des groupes pour la clé dans les dictGroups : root.addGroup(key) # 3. Déplacez les calques pour la clé dans les dictGroups : parent = root.findGroup(key) for id in dictGroups[key] : layer = root.findLayer(id) clone = layer .clone() parent.insertChildNode(0, clone) root.removeChildNode(couche)

Vous devriez obtenir quelque chose comme ceci :


Je rajoute seulement un petit extra ici mais j'espère que l'explication pourra aider d'autres.

J'ai passé beaucoup de temps à me concentrer sur les nœuds par rapport aux couches.

Il semble que les couches soient les objets sous-jacents "lourds" et que les nœuds soient utilisés pour représenter l'arrangement dans l'arbre. (https://qgis.org/api/classQgsLayerTreeNode.html#details)

Je propose le code ci-dessous avec quelques avantages par rapport à la publication acceptée (et je ne serais pas arrivé ici sans la réponse acceptée, alors MERCI à Germán Carrillo):

  1. Il manipule le arbre plutôt que des couches. (En fait, il suffit de revérifier les documents - findLayer renvoie en fait un LayerTreeNode (en tant que LayerTreeLayer), donc reste dans le domaine "node". Parfois, le raccourcissement des noms peut conduire à une mauvaise direction… )
  2. Il obtient les nœuds sélectionnés et les forme uniquement dans un sous-groupe. (C'était mon propre cas d'utilisation personnel, pas nécessairement ce que le PO a demandé.)
  3. Conserve les références d'objets (nœuds) plutôt que de collecter et de rechercher à nouveau les identifiants de couche QGIS.
  4. Les usagesaddChildNodeplutôt queinsertChildNode(0,…, afin de préserver l'ordre des nœuds dans le nouveau groupe.
  5. En utilisant délibérément une boucle supplémentaire pour que je puisse vérifier le bon fonctionnement avant de supprimer les nœuds d'origine. (Les trois dernières boucles peuvent en fait être combinées.)

#

v = iface.layerTreeView() # v.collapseAllNodes() nodes = v.selectedNodes() parent = nodes[0].parent() groups = {} pour n dans les nœuds : key = n.name()[:1] sinon, saisissez les groupes : groups[key]=[] groups[key].append(n) new_groups = {} pour la clé dans les groupes : grp_name = key+'00' grp = parent.addGroup(grp_name) new_groups[key] = grp pour la clé dans les groupes : new_group = new_groups[clé] pour n dans les groupes[clé] : clone = n.clone() new_group.addChildNode(clone) pour la clé dans les groupes : pour n dans les groupes[clé] : parent.removeChildNode( n)

Voir la vidéo: 10 A. QGIS Fusion. Regroupement manuel dentités