5 votos

¿Obtener el nombre del grupo en el que está la capa usando PyQGIS?

He estado utilizando el plugin "Lista de capas" ( https://plugins.qgis.org/plugins/layerList/ ) que hace un gran trabajo de crear un archivo de texto con todas las capas en un archivo de proyecto qgs.

Quiero ampliarlo para obtener el grupo y subgrupo en el que se encuentra la capa.

El resultado deseado será

Proveedor,Grupo,Subgrupo,Nombre, Ruta, Filename.ext

ogr,Administración, Terreno,CL_TENURE_POLYGON_DC,D:/GIS/Data/DSE/Vicmap/VMCLTENURE/,CL_TENURE_POLYGON_DC.tab

Supongo que el cambio sería

def loadActiveLayers(self): 
self.dlgCreate.listWidget.clear() # Clear the list widget before it is filled again
canvas = iface.mapCanvas()
activeLayers = canvas.layers() # Create list with all active layers
layers = u"# Layer List - QGIS Plugin by Klas Karlsson\n" # Create list header and "test" line in a text string
for layer in reversed(activeLayers): # Repeat for all layers in the list
    layerType = layer.type() # Is it Vector or Raster?
    layerSource = layer.publicSource() # path or command for the layer source
    provider = layer.providerType() # Example org, gdal, wms, wfs, postgres, etc
    if layerType == QgsMapLayer.VectorLayer:
    layers = layers + (u"%s,%s,%s\n" % (provider, layer.name(), layerSource))

después de layerSource añadir algo para grupo y subgrupo (tal vez .layerTreeRoot() de https://qgis.org/api/classQgsLayerTreeGroup.html )

    self.dlgCreate.listWidget.addItem(layer.name()) # Add the layer name to the list

self.dlgCreate.listWidget.addItem(capa.?

 if layerType == QgsMapLayer.RasterLayer:
    layers = layers + (u"%s,%s,%s\n" % (provider, layer.name(), layerSource))
    self.dlgCreate.listWidget.addItem(layer.name()) # Add the layer name to the list
return layers   # Send back all the layers in a text string ready to be saved to a file

¿Harían falta otros cambios?

6voto

Elliott Maynard Puntos 11

En lugar de utilizar las capas del QgsMapCanvas podría iterar mejor la raíz de la vista de árbol de capas ( QgsProject.instance().layerTreeRoot().children() ) como muestro en ¿Cómo crear un archivo de texto con nombres de capas en QGIS? . De esta forma podría tener acceso directo a los grupos de vistas de árbol de capas y a las capas. Tener una QgsLayerTreeLayer puede ir fácilmente a la QgsMapLayer llamando al my_tree_layer.layer() .

Sin embargo, si quieres seguir iterando capas, puedes acceder al grupo en el que se encuentra una capa:

my_layer = iface.activeLayer() # Just for you to test

root = QgsProject.instance().layerTreeRoot()
tree_layer = root.findLayer(my_layer.id())
if tree_layer:
    layer_parent = tree_layer.parent()

    if layer_parent: 
        print("Layer parent: {}".format(layer_parent.name() or 'root'))
        group_parent = layer_parent.parent() # If you want to go up another level

        if group_parent: 
            print("Group parent: {}".format(group_parent.name() or 'root'))

Dado que usarías esto repetidamente, basándote en el fragmento de código anterior podrías crear una función que obtenga una capa de mapa y te dé grupo y subgrupo.

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