Vous parcourez les couches de carte dans QGIS Python?

30

J'ai du mal à comprendre comment itérer sur les couches de la carte. Je peux accéder à la couche actuellement mise en évidence dans la table des matières via iface.activeLayer()mais je veux que mon code fonctionne sur toutes les couches.

Je ne vois rien dans l'API qui offre un accès facile à cette fonctionnalité et je n'ai pas pu trouver un bon exemple en ligne mais peut-être que j'ai raté quelque chose?

spencerrecneps
la source
Je ne vois pas comment vous utilisez QgsMapLayerRegistry ou QgsProject. Dans QGIS 3.0.2, cela ne fonctionne pas. Cependant, iface.mapCanvas (). Couches () le fait. Bon type de. Il semble seulement vous donner les calques actifs (ceux que vous avez cochés dans le volet Calques). Quelqu'un sait-il comment obtenir une liste de tous les calques, même ceux qui ne sont pas cochés dans le volet Calques? De plus, si vous utilisez Plugin Builder, il crée pour vous le shell de votre plugin. La fonction d'exécution a un paramètre "self", qui est nécessaire pour utiliser iface. c'est-à-dire self.iface.mapCanvas (). couches (), juste fyi.
ajpieri

Réponses:

24

Essayer...

# substitute 'self' with 'qgis.utils.iface' when run from Python console
# 'self.iface = iface' would usually precede this command in your class 
layers = self.iface.legendInterface().layers()

for layer in layers:
    layerType = layer.type()
    if layerType == QgsMapLayer.VectorLayer:
        # do some stuff here

Culled from consolidatethread.py from QConsolidate plugin .

Description de l' objet QgsLegendInterface renvoyée par legendInterface ().

Edit : ajout d'informations sur «soi» ci-dessus.

dakcarto
la source
Merci! Cela a fait l'affaire. Je suppose que je suis trop habitué au monde ESRI où la légende est l'objet dans la disposition de la carte et la table des matières fait référence à la liste des couches.
spencerrecneps
2
Notez qu'il y a une différence dans ce qui est retourné entre cela et la technique mapCanvas () mentionnée par Nathan. L'objet legendInterface () renverra toutes les couches, même si elles ne sont pas affichées dans le canevas de carte, tandis que mapCanvas () ne renvoie que celles affichées sur le canevas. L'utilisation de mapCanvas () est un moyen agréable et rapide d'obtenir une référence aux couches visibles.
dakcarto
1
Sur une autre note, les dernières versions de QGIS (> = 1.8) permettent à l'utilisateur de définir un ordre de rendu des couches séparément de l'ordre indiqué dans la légende (très sympa!). Les méthodes legendInterface () et mapCanvas () renvoient respectivement l'ordre des couches.
dakcarto
19

Il existe également deux autres méthodes:

layers = self.iface.mapCanvas().layers()

vous donnera une liste de couches

ou

layers = QgsMapLayerRegistry.instance().mapLayers()

for name, layer in layers.iteritems():
     print name, layer.type()
Nathan W
la source
Cette réponse ne semble pas fonctionner dans 2.16et au
raphael
10

Pour QGIS 2.6, voici le code pour identifier chaque couche et les regrouper:

#make the desired groups for layers
toc = self.iface.legendInterface()
root = QgsProject.instance().layerTreeRoot()
group1 = root.insertGroup(0, "Group Point")
group2 = root.insertGroup(1, "Group Line")
group3 = root.insertGroup(2, "Group Polygon")
#get the list of layers  from registry
layers = QgsMapLayerRegistry.instance().mapLayers()
#segregate layers into groups 
for name, layer in layers.iteritems():
    # check the layer geometry type 
    if layer.geometryType() == QGis.Point:
        toc.moveLayer(layer, 0)

    if layer.geometryType() == QGis.Line:
        toc.moveLayer(layer, 1)

    if layer.geometryType() == QGis.Polygon:
        toc.moveLayer(layer, 2)

Remarque: Après le regroupement, je dois supprimer le calque en double, j'ai donc utilisé root.removeLayer(lyr).

Abhijit Gujar
la source
9

Pour QGIS 3, QgsMapLayerRegistry la fonctionnalité de a été déplacée vers QgsProject.

Donc, pour itérer sur des couches de carte, vous devez utiliser cette structure:

layers = QgsProject.instance().mapLayers()

.mapLayers()renvoie un dictionnaire structuré comme {layer_x_id: layer_x, layer_y_id: layer_y, ....}. Ensuite, vous pouvez parcourir les calques comme:

for layer_id, layer in layers.items():
    print(layer.name())

Parce que .mapLayers()renvoie un dictionnaire ( dict), vous pouvez également utiliser la .values()méthode du dictionnaire qui renvoie uniquement un listqui contient des couches dans ce cas. Ensuite, vous pouvez parcourir les calques comme:

layers = QgsProject.instance().mapLayers().values()

for layer in layers:
    print(layer.name())

Si vous préférez, vous pouvez répéter de cette façon:

layers = QgsProject.instance().mapLayers() # dictionary

for layer in layers.values():
    print(layer.name())
Kadir Şahbaz
la source
Salut! Merci de le partager. Imprimer les noms des calques fonctionne très bien ... mais je ne peux pas imprimer les clés du dictionnaire. Pouvez-vous m'aider?
caio villaca
1
for layer in layers: print(layer)Vous pouvez utiliser le script pour imprimer les clés. Ou utilisez simplement print(layers.keys())sans forboucle.
Kadir Şahbaz