29 votos

¿Obtener una capa por su nombre en PyQGIS?

Tengo un plugin que encuentra el buffer para la lista de ciudades, siempre la distancia. Los nombres del estado y de la ciudad se toman de la tabla de atributos y se filtran en consecuencia. Lo que quiero es que mi plugin identifique el nombre de la capa o el orden de la capa en el lienzo, independientemente de otras capas presentes en el lienzo y acceder a los atributos correspondientes de esa capa.

También tengo curiosidad por saber si señalar un nombre de capa específico en el código causaría algún error en la iteración aunque haya otras capas presentes.

A continuación se muestra mi código por favor dígame donde debo hacer cambios y lo que sería el cambio?

    if dist and centerCity:
        #QMessageBox.information(self.dlg, "info", "both True")
        st = '"name" = \'' + centerCity + '\''
        exp = QgsExpression(st)
    else:
        QMessageBox.warning(self.dlg, "Enter the distance","Enter the distance and try again.")        
        return          #terminate the function

    layer = self.iface.activeLayer() 
    it = layer.getFeatures(QgsFeatureRequest(exp))
    feature = it.next()
    mbuf = feature.geometry().buffer(dist, 2)       

    iterFeat = layer.getFeatures()

    for f in iterFeat:
        geom2 = f.geometry()
        valTest = QgsGeometry.within(geom2, mbuf)

61voto

Elliott Maynard Puntos 11

ACTUALIZACIÓN: 10.04.2018

Utilizando QGIS 3.x puede utilizar el mapLayersByName método de QgsProject clase de esta manera:

layers = QgsProject.instance().mapLayersByName('my layer name')

Dado que puede tener varias capas en QGIS con el mismo nombre en el panel de capas, el método anterior le da una lista de capas coincidentes.

Antes de acceder a cualquier elemento de la lista de capas, debe comprobar si la lista tiene elementos. Si es así puedes acceder, por ejemplo, a su primer elemento (capa) de esta manera:

if layers: 
    layer = layers[0]

Que sería el caso común de tener una sola capa que coincida con el nombre buscado.


Para QGIS 2.x :

Sólo tienes que asegurarte de que tu capa tiene un nombre que puedas distinguir de las demás. En lugar de layer = self.iface.activeLayer() hazlo:

layer=None
for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.name() == "YOUR_LAYER_NAME":
        layer = lyr
        break

Si no te fías del nombre de la capa (al fin y al cabo, puede ser cambiado por el usuario en cualquier momento), podrías intentar comprobar el origen de la capa. Si su capa es un Shapefile, podría comprobar la ruta al Shapefile, de esta manera:

layer=None
for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.source() == "/path/to/shapefile.shp":
        layer = lyr
        break

EDIT: Como ha señalado @Jakob en los comentarios, puedes escribir el primer bloque en una sola línea:

layerList = QgsMapLayerRegistry.instance().mapLayersByName("YOUR_LAYER_NAME")

O:

layerList = [lyr for lyr in QgsMapLayerRegistry.instance().mapLayers().values() if lyr.name() == "YOUR_LAYER_NAME"]

De todos modos, habría que comprobar que layerList no está vacío antes de acceder a su primer elemento:

if layerList: 
    layer = layerList[0]

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