¿Es posible tener nombres de capa dinámicos en el proyecto QGIS?

9

Tengo un proyecto QGIS con capas, basado en consultas SQL PostGIS que usan la fecha actual. Como los datos en la base de datos cambian, estas consultas devuelven datos diferentes cada día nuevo.

¿Es posible cambiar dinámicamente el nombre de la capa en el panel del árbol de capas, por lo que representa la fecha actual? (es decir, el nombre de la capa Traffic on 24.01.2015, que cambia cada día). Los datos para el título deben tomarse del atributo de cualquier entidad en una capa; todos tienen el mismo valor para el campo traffic_date.

mofoyoda
fuente
¿Qué extraería exactamente de la tabla de su base de datos, "Tráfico" o la fecha actual?
Germán Carrillo
Extraigo datos de la fecha actual a una capa y pronostico datos a otras capas. Entonces "24.01.2015" es en realidad un valor de campo, que proviene de la base de datos. Necesito que el nombre de la capa en el proyecto cambie automáticamente según la fecha.
mofoyoda
¿Estaría bien cambiar el nombre cada vez que se carga el proyecto?
Nathan W

Respuestas:

13

Si lo entendí bien, la respuesta es sí, QGIS admite nombres de capa dinámicos.

Debería escribir una macro de Python para que se ejecute cada vez que se abra el proyecto. Este sería el flujo de trabajo:

  1. Vaya QGIS->Project->Project Propertiesy reemplace openProject()con el siguiente código de Python:

    def openProject():
        import re, qgis     
        iface = qgis.utils.iface
        layers = iface.mapCanvas().layers()
        for lyr in layers:
            # Get date from layer
            it=lyr.getFeatures()
            feat = next(it)
            idx = lyr.fieldNameIndex('traffic_da')
            currDate = feat.attributes()[idx]
    
            # Set new layer name
            name = lyr.name()
            if re.search(' on \d{2,2}.\d{2,2}.\d{4,4}$', name):
                 name = name[:-14]
            name = name + " on " + currDate
            lyr.setLayerName( name )

    ingrese la descripción de la imagen aquí

    Nota 1: Lo probé en archivos de forma, por lo que el campo del que tomo las fechas se traffic_dadebe a que los archivos de forma no admiten más letras en los nombres de campo. Ajuste eso en el código para trabajar en sus capas.

    Nota 2: Dependiendo de la configuración de su proyecto, debe agregar un código de validación para actuar solo en las capas que desee. Por ejemplo, si ejecuta el código en capas ráster, los errores aparecerán con seguridad. Si necesita ayuda con esto, abra una nueva pregunta, puedo ayudarlo.

  2. Asegúrese de habilitar macros en su proyecto, de esta manera: Settings->Options->General->Enable macros: Always

  3. Cargue sus capas al proyecto.

  4. Guarda tu proyecto.

Cada vez que abra su proyecto desde este punto, los nombres de sus capas serán dinámicos, la fecha se tomará del campo traffic_dateen la tabla de atributos de cada capa.

Después de la primera vez que abrí el proyecto, así es como se generaron dinámicamente los nombres de mis capas:

ingrese la descripción de la imagen aquí

Creo que esto puede ayudarte a comenzar. Dime si te enfrentas a problemas no obvios.

Germán Carrillo
fuente
Lo descubrí leyendo tu comentario, publicado 1s antes de enviar la respuesta. Se deben hacer algunos ajustes en el código para adaptarse a la disposición específica de las capas, pero espero que @mofoyoda pueda lidiar con ellas.
Germán Carrillo
1
Sí, es un buen primer intento. También puede encontrar el índice ony la tira desde allí hasta el final para ahorrar en el uso de expresiones regulares.
Nathan W
1
@gcarrillo intenso! Pero genial!
DPSSpatial
1
@gcarrillo Muy bien, gracias! Aún tratando de descubrir cómo aplicar solo a ciertas capas, espero que lo logre. Gracias por una gran respuesta!
mofoyoda