Saltar al contenido

Activando capa por su nombre en PyQGIS

Bienvenido a nuestra página, aquí hallarás la respuesta a lo que andabas buscando.

Solución:

TL;RD

Para obtener todas las funciones de una capa por el nombre de la capa, no necesita activarla. Solo usa

name = 'counties'
layer = QgsProject.instance().mapLayersByName( name )[0]
poles = layer.getFeatures()
for pole in poles:
    if is_north(pole):
        print('it is the north pole')

Capa activa

En primer lugar, no es necesario que te preocupes por el capa activa. los capa activa es la capa que está actualmente seleccionada en el árbol de capas y, por lo tanto, es buena por dos cosas

  1. permitir que el usuario seleccione una capa para operar
  2. seleccionando una capa para probar rápidamente el código desde la consola de python

El segundo es útil cuando está desarrollando, el primero es en lo que se basan todas las herramientas de mapa: la capa seleccionada actualmente (el activo one) se modifica, selecciona, elimina…

Métodos para acceder a las capas

Sin embargo, parece que desea acceder a las capas que no se basan en la entrada del usuario sino en otra cosa.

Identificación de capas

Todas las capas tienen

  • Un identificación eso tiene que ser único
  • A nombre que no es necesariamente (pero a menudo) único y puede ser cambiado por el usuario
  • A referencia (también conocido como puntero pero en python los dos términos son intercambiables) que es único y estable durante la vida útil de una capa durante el tiempo de ejecución de la aplicación y se puede asignar a una variable (p. ej. vlayer es una referencia a la capa actualmente activa en su ejemplo).
  • Propiedades como la URI (nombre de tabla, etc.)

Si ya tiene una referencia a la capa (porque la creó/agregó en su complemento), simplemente use esa.

Si no lo hace, piense qué propiedad desea usar para obtener acceso a la capa. Lo más probable es que sea algo que sea estable (la identificación de la capa es muy estable durante la vida útil de un proyecto, pero siempre es diferente para diferentes proyectos), el usuario puede ajustar el nombre, la tabla puede depender de la fuente de datos.

Acceso a capas

Existe el registro de capas del mapa que le permite acceder a las capas. Gestiona las referencias a todas las capas. Esto solía llamarse QgsMapLayerRegistry, pero ya no está disponible en QGIS 3, por lo que se puede usar QgsProject en su lugar.

registry = QgsProject.instance()

Si tiene la identificación de la capa, vaya con

layer = registry.mapLayer( id )

Si tienes 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 tienes algo más, tienes que escribir tu 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, pero que hará que las personas que tendrán que mantener el código más adelante tarden más tiempo en descifrarlo:

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

No es completamente por nombre, pero también puede usar QgsMapCanvas objetos. 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"

se usó con estas capas vectoriales en la siguiente imagen:

ingrese la descripción de la imagen aquí

Cuando se ejecutó el código 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 inviertes el orden de las capas en la Leyenda del Mapa solo se imprime esta lista:

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

Recuerda que te damos el privilegio glosar si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *