34 votos

Iterar sobre capas de mapas con PyQGIS

Tengo problemas para saber cómo iterar sobre las capas del mapa. Puedo acceder a la capa actualmente resaltada en el índice mediante iface.activeLayer() pero quiero que mi código funcione en todas las capas.

No veo nada en la API que facilite el acceso a esta funcionalidad y no he podido encontrar un buen ejemplo en línea, pero tal vez me he perdido algo.

0 votos

No veo cómo están usando QgsMapLayerRegistry o QgsProject. En QGIS 3.0.2 esto no funciona. Sin embargo, iface.mapCanvas().layers() sí lo hace. Bueno, más o menos. Parece que sólo te da las capas activas (las que has marcado en el panel de capas). ¿Alguien sabe cómo obtener una lista de todas las capas, incluso las que no están marcadas en el panel de capas? Además, si se utiliza el Plugin Builder, éste crea el shell de su plugin por usted. La función de ejecución tiene un parámetro "self", que es necesario para usar iface. Por ejemplo, self.iface.mapCanvas().layers(), sólo para que lo sepa.

0 votos

25voto

alexis.kennedy Puntos 402

Intenta...

# 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

Extraído de consolidarhilo.py de Plugin QConsolidate .

Descripción de Objeto QgsLegendInterface devuelto por legendInterface().

Editar : información añadida sobre el "yo" arriba.

0 votos

Gracias. Eso hizo el truco. Supongo que estoy demasiado acostumbrado al mundo de ESRI, donde la leyenda es el objeto del diseño del mapa y el índice se refiere a la lista de capas.

2 votos

Tenga en cuenta que hay una diferencia en lo que se devuelve entre esto y la técnica mapCanvas() que menciona Nathan. El objeto legendInterface() devolverá todas las capas, aunque no se muestren en el lienzo del mapa, mientras que mapCanvas() devuelve sólo las que se muestran en el lienzo. El uso de mapCanvas() es una forma agradable y rápida de obtener una referencia a las capas visibles.

1 votos

Por otro lado, las últimas versiones de QGIS (>= 1.8) permiten al usuario definir un orden de representación de las capas independiente del orden que aparece en la leyenda (¡muy bonito!). Los métodos legendInterface() y mapCanvas() devuelven el orden de las capas respectivamente.

22voto

Jauder Ho Puntos 3172

También hay otras dos formas:

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

le dará una lista de capas

o

layers = QgsMapLayerRegistry.instance().mapLayers()

for name, layer in layers.iteritems():
     print name, layer.type()

0 votos

Esta respuesta no parece funcionar en 2.16 y superiores

21voto

nitinsavant Puntos 6

Para QGIS 3, QgsMapLayerRegistry se ha trasladado a QgsProject .

Por lo tanto, para iterar sobre las capas del mapa, debe utilizar esa estructura:

layers = QgsProject.instance().mapLayers()

.mapLayers() devuelve un diccionario estructurado como {layer_x_id: layer_x, layer_y_id: layer_y, ....} . Entonces puedes iterar sobre capas como:

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

Porque .mapLayers() devuelve un diccionario ( dict ), también puede utilizar .values() del diccionario que devuelve sólo un list que contiene capas en ese caso. Entonces puedes iterar sobre las capas como:

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

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

Si lo prefiere, puede iterar de esta manera:

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

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

16voto

Abhijit Gujar Puntos 403

Para QGIS 2.6 aquí está el código para identificar cada capa y agruparlas:

#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)

Nota: Después de la agrupación tengo que eliminar la capa duplicada por lo que he utilizado root.removeLayer(lyr) .

4voto

Elliott Maynard Puntos 11

Capas visibles

Puede iterar las capas visibles de esta manera:

# Iterate visible layers (warning: only spatial ones)
def iterate_visible_layers():
    for layer in iface.mapCanvas().layers():
        # TODO: Do something interesting with the layers
        print(layer.name())

iterate_visible_layers()

Capas en la TOC (panel de capas / leyenda / árbol de capas)

En caso de que necesite todas las capas en el panel TOC/Capas (no sólo las que están visibles/marcadas, como mapCanvas().layers() devuelve), puede utilizar esta función:

# Iterate all ToC layers (warning: only spatial ones)
def iterate_toc_layers(group):
    for tree_layer in group.findLayers():
        # TODO: Do something interesting with the layers
        print(tree_layer.layer().name())

root = QgsProject.instance().layerTreeRoot()
iterate_toc_layers(root)

Nota: Puede iterar capas de un grupo específico pasando dicho grupo a iterate_toc_layers() de esta manera:

my_group = root.findGroup('My group')
iterate_toc_layers(my_group)

Todas las capas registradas

QGIS puede utilizar capas que forman parte del proyecto QGIS pero que no se muestran en el panel TOC/Layers. Por ejemplo, las capas que se pueden utilizar en uniones o relaciones (tablas de búsqueda). Si quiere que esas capas se muestren también, haga lo siguiente:

# Iterate all registered layers (even if they aren't in the TOC)
def iterate_all_layers():
    for k, layer in QgsProject.instance().mapLayers().items():
        # TODO: Do something interesting with the layers
        print(layer.name())

iterate_all_layers()

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X