8 votos

Ampliando hasta la extensión de cada capa vectorial, una a la vez, usando PyQGIS

Estoy tratando de escribir un script en python que se acerque a las extensiones de cada capa y luego exporte el lienzo como una imagen después de cada zoom.

Escribí un bucle for que itera a través de cada capa, hace que cada una sea activa, una a la vez, luego obtiene las extensiones de la capa mientras está activa, y luego se acerca a la extensión.

Aunque el script itera con éxito a través de cada capa, el lienzo del mapa no cambia, lo que significa que solo se acerca a la extensión de la primera capa en la lista y se detiene allí.

Incluso agregué un canvas.refresh() al final del bucle, pero nada. Además, agregué una función de espera usando time.sleep(5), pero tampoco tuve suerte.

Puedo ver que cada capa en la lista se está iterando porque cada una está seleccionada y resaltada a través de setActiveLayer, pero ¿cómo puedo acercar cada extensión de capa activa una a la vez, quizás cada 5 segundos? ¿Y cómo puedo hacer que el lienzo del mapa refleje esta selección, y se acerque?

Este es el código:

import math
import time
from qgis.core import QgsProject

for layer in QgsProject.instance().mapLayers().values():

    qgis.utils.iface.setActiveLayer(layer)
    extent = layer.extent()
    canvas.setExtent(extent)
    iface.mapCanvas().zoomScale(700)
    time.sleep(5)
    canvas.refresh()
    print(extent)

Please note that "QGIS" and "iface" are not translated as they are proper nouns.

9voto

nitinsavant Puntos 6

Puedes resolver tu problema usando QTimer, el cual controla cuándo ejecutar funciones y es asíncrono, es decir, permite que otras funciones sigan en ejecución (piensa en un map.refresh()) mientras espera unos milisegundos para ejecutar la siguiente instrucción.

Necesitas definir dos funciones, una para preparar el mapa (en tu caso, establecer la nueva extensión y refrescar el mapa) y otra para exportar el mapa. Después de que el mapa esté preparado, se establece un QTimer para esperar 1 segundo antes de llamar a exportMap(). Este segundo da suficiente tiempo para que el mapa refleje los cambios y esté listo para ser exportado: Referencia

Usa este script:

from os.path import join

canvas = iface.mapCanvas()
root = QgsProject.instance().layerTreeRoot()
layers = root.layerOrder()

i = 0
folder = "c:/ruta/a/carpeta"

def process():
    iface.actionHideAllLayers().trigger() # hace que todas las capas sean invisibles
    root.findLayer(layers[i].id()).setItemVisibilityChecked(True)
    canvas.setExtent(layers[i].extent())
    canvas.refresh()
    QTimer.singleShot(250, save_as_image) # 250 milisegundos

def save_as_image():
    global i
    nombre_archivo = join(folder, layers[i].name()+".png")
    canvas.saveAsImage(nombre_archivo)
    if i < len(layers) - 1:
        QTimer.singleShot(250, process)
    i += 1

process()

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