¿Iterando sobre las capas del mapa en QGIS Python?

27

Estoy teniendo problemas para averiguar cómo iterar sobre las capas del mapa. Puedo acceder a la capa actualmente resaltada en la tabla de contenido a través de iface.activeLayer() , pero quiero que mi código funcione en todas las capas.

No veo nada en la API que proporcione un acceso fácil a esta funcionalidad y no pude encontrar un buen ejemplo en línea, ¿pero tal vez me perdí algo?

    
pregunta spencerrecneps 27.05.2012 - 01:01

4 respuestas

21

Prueba ...

# 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

Se eliminó de consolidatethread.py de QConsolidate plugin .

Descripción de objeto QgsLegendInterface devuelto desde legendInterface ().

Editar : se agregó información sobre el 'yo' anterior.

    
respondido por el dakcarto 27.05.2012 - 01:25
17

También hay otras dos formas:

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

te dará una lista de capas

o

layers = QgsMapLayerRegistry.instance().mapLayers()

for name, layer in layers.iteritems():
     print name, layer.type()
    
respondido por el Nathan W 27.05.2012 - 03:24
10

para QGIS 2.6, aquí está el código para identificar cada capa y agruparlos

#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 agrupar, tengo que eliminar la capa duplicada, así que utilicé root.removeLayer (lyr)

    
respondido por el Abhijit Gujar 09.12.2014 - 16:21
4

Para QGIS 3, la funcionalidad de QgsMapLayerRegistry se ha movido a QgsProject .

Entonces, para iterar sobre las capas del mapa, debes usar esa estructura:

layers = QgsProject.instance().mapLayers()

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

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

Debido a que .mapLayers() devuelve un diccionario ( dict ), también puede utilizar el método de diccionario .values() que devuelve solo un list que contiene capas en ese caso. Luego puedes iterar sobre 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())
    
respondido por el Kadir Şahbaz 29.09.2018 - 00:19

Lea otras preguntas en las etiquetas