¿Obtener capa por nombre en PyQGIS?

14

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

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

A continuación se muestra mi código, por favor dígame dónde debo hacer cambios y cuál 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)
Usuario123
fuente

Respuestas:

38

ACTUALIZACIÓN: 10.04.2018

Usando QGIS 3.x puede usar el mapLayersByNamemétodo de la QgsProjectclase de esta manera:

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

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


Para QGIS 2.x :

Solo debe asegurarse de que su capa tenga un nombre que pueda distinguir de los demás. En lugar de layer = self.iface.activeLayer()hacer:

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

Si no confía en el nombre de la capa (después de todo, el usuario puede cambiarlo en cualquier momento), puede intentar verificar el origen de la capa. Si su capa es un Shapefile, puede verificar 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

EDITAR: como @Jakob ha señalado en los comentarios, puede escribir el primer bloque en una 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, deberá verificar que layerListno esté vacío antes de acceder a su primer elemento:

if layerList: 
    layer = layerList[0]
Germán Carrillo
fuente
2
print [lyr para lyr en QgsMapLayerRegistry.instance (). mapLayers (). values ​​() if lyr.name () == "LAND"] [0] .name ()
Jakob
77
layer = QgsMapLayerRegistry.instance (). mapLayersByName ("mylayername") [0]
Jakob
¿Por qué está configurando layer = noneal principio de su código? No parece necesario sobre todo si está en una función
user32882
1
Es un valor predeterminado, porque hay un if dentro de for. Si el if nunca se cumple, la capa no existirá después del for. Entonces, solo para asegurarte de que puedes leer la variable de capa después.
Germán Carrillo