9 votos

Cómo activar una capa por su nombre en PyQGIS?

Estoy escribiendo un guión que requiere de los atributos de las diferentes capas de trabajar, y me gustaría saber cómo llamar a una capa que no es activo (y obtener sus características. Por ejemplo, tengo tres capas, denominada "Polos", "Líneas" y "Cargas", y necesito conseguir todas las características de las capas con la capa.getFeatures() y guardar esas características en una lista para cada capa. Por sólo una capa que suele hacer esto:

Si mi capa activa es "Polos", me escribe:

    layer = iface.activeLayer()
    poles = layer.getFeatures()

Y entonces yo no puedo hacer nada con los "polos", pero ¿cómo puedo hacer esto con las otras capas que no son activos? Si yo quería hacer lo mismo con la capa "Líneas", yo tendría que activar "manualmente", haciendo clic en él, y la repetición de ese código.

Me han tratado con este método: Cómo obtener una capa por nombre en PyQGIS?

Y esta otra: ¿Cómo obtener una capa que no está activo con PyQGIS

Pero siempre me sale este mensaje de error, porque yo no soy la activación de la capa, sólo la creación de una lista de nombres de capa.

Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'list' object has no attribute 'getFeatures'

La pregunta podría ser: ¿Cómo puedo activar una capa por su nombre para obtener las características en él?

16voto

Michael Puntos 11

TL;DR

Para obtener todas las características de una capa y el nombre de la capa no necesita activarlo. Sólo uso

layer = QgsMapLayerRegistry.instance().mapLayersByName( name )[0]
poles = layer.getFeatures()

Capa Activa

Primero de todo, usted no necesita preocuparse acerca de la capa activa. La capa activa es la capa que está seleccionada en el árbol de capas y por lo tanto es bueno para las dos cosas

  1. la selección de una capa de código de prueba
  2. permitir que el usuario seleccione una capa para operar en

La primera es útil cuando usted está en desarrollo, la segunda es lo que todos los maptools se basan en: la capa seleccionada actualmente (el activo ) es modificado, seleccionado, eliminado...

Métodos para acceder a las capas

Sin embargo, parece que quieren acceder a las capas que no se basa en la entrada del usuario, pero basado en algo más.

La identificación de layes

Todas las capas tienen

  • Una identificación que debe ser único
  • Un nombre que no es necesariamente (aunque a menudo) única y puede ser cambiada por el usuario
  • Una referencia (a menudo referido como un puntero , pero en python que los dos términos son intercambiables) que es único y estable para toda la vida de una capa durante la aplicación de tiempo de ejecución y puede ser asignado a una variable (por ejemplo vlayer es una referencia a la capa activa en el ejemplo).
  • Propiedades como la URI (nombre de tabla, etc.)

Si usted ya tiene una referencia a la capa (porque se ha creado/añadido en su plugin) sólo el uso que uno.

Si no, piense acerca de lo que la propiedad que usted desea utilizar para obtener acceso a la capa. Es muy probable que algo que es estable (la capa de id es muy estable durante el tiempo de vida de un proyecto, pero siempre es diferente para los diferentes proyectos), el nombre es ajustable por el usuario, la tabla puede depender de la fuente de datos.

El acceso a las capas

No es el mapa de la capa de registro que le permite acceder a las capas. Gestiona las referencias a todas las capas.

registry = QgsMapLayerRegistry.instance()

Si usted tiene el id de la capa de ir con

layer = registry.mapLayer( id )

Si usted tiene el nombre de la capa

layer = registry.mapLayersByName( name )[0] # The method returns a list since it can be ambiguous, 0 picks the first entry in the list

Si usted tiene algo más que usted tiene que escribir su propio código:

for lyr in registry.mapLayers().values():
    if lyr.dataProvider().dataSourceUri().table() == 'mytable':
        layer = lyr
        break

O una abreviatura que hace lo mismo y te hace sentir más hacker ish, pero hará que la gente que tendrá que mantener el código más adelante en costo algo de tiempo extra para descifrar:

layer = (l for l in registry.mapLayers().values() if l.dataProvider().dataSourceUri().table() == 'mytable').next()

5voto

Yada Puntos 9489

No es completamente por el nombre, pero, también puede utilizar QgsMapCanvas objetos. El siguiente código:

mapcanvas = iface.mapCanvas()

n = mapcanvas.layerCount()

layers = [mapcanvas.layer(i) for i in range(n)]

layers_names = [ layer.name() for layer in layers ]

#truly names of vector layers
print "layers_names = ", layers_names

poles = [ pole for pole in layers[0].getFeatures() ] 

#testing only one feature
if poles[0].geometry().type() == QGis.Point:
    print "It's a point layer"

lines = [ line for line in layers[1].getFeatures() ]

#testing only one feature
if lines[0].geometry().type() == QGis.Line:
    print "It's a line layer"

fue utilizado con estas capas vectoriales en la siguiente imagen:

enter image description here

Cuando el código se ejecuta en la Consola de Python el resultado fue:

layers_names =  [u'random_points', u'line']
It's a point layer
It's a line layer

Si usted invertir el orden de las capas en la Leyenda del Mapa no es sólo imprime esta lista:

layers_names =  [u'line', u'random_points']

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