Seleccionando rasgos (features) uno por uno y salvarlos como imagen en PyQGIS

Una interesante pregunta en gis.stackexchange.com hacía mención acerca de como realizar la selección, uno por uno, de los rasgos en una capa vectorial para luego grabarlos cómo imagen después de su respectivo “Zoom In” utilizando PyQGIS. Lo peculiar de la pregunta estaba en el hecho de que si se recorría el loop sin interrupción entonces todas las imágenes erán iguales al del último rasgo seleccionado. Sin embargo, con un delay producido por una QgsMessageBar las imágenes eran grabadas de la forma requerida.

Al principio, usando la librería ‘time’ de python, probé si el delay producido por su método ‘sleep’ era suficiente para obtener un resultado satisfactorio. Sin embargo, ello no fue posible. Por tanto, se me ocurrió tratar de implementar una QMessageBox que se cerrará automáticamente y encontré una respuesta aquí.

Después de varias modificaciones y adaptaciones en el código de la pregunta (yo no use ‘processing’ sino los métodos de QgsVectorLayer) y en el link anterior, obtuve el código siguiente:

from PyQt4.QtGui import QMessageBox

class CustomMessageBox(QMessageBox):

    def __init__(self, *__args):
        QMessageBox.__init__(self)
        self.timeout = 0
        self.autoclose = False
        self.currentTime = 0

    def showEvent(self, QShowEvent):
        self.currentTime = 0
        if self.autoclose:
            self.startTimer(1000)

    def timerEvent(self, *args, **kwargs):
        self.currentTime += 1
        if self.currentTime >= self.timeout:
            self.done(0)

    @staticmethod
    def showWithTimeout(timeoutSeconds, 
                        message, 
                        title, 
                        icon = QMessageBox.Information, 
                        buttons = QMessageBox.NoButton):

        w = CustomMessageBox()
        w.autoclose = True
        w.timeout = timeoutSeconds
        w.setText(message)
        w.setWindowTitle(title)
        w.setIcon(icon)
        w.setStandardButtons(buttons)
        w.exec_()

#Code starts here

layer = iface.activeLayer()

count = layer.featureCount()

for i in range(count):
    layer.select(i)
    iface.mapCanvas().zoomToSelected( layer )
    box = layer.boundingBoxOfSelected()
    iface.mapCanvas().setExtent(box)
    layer.triggerRepaint()
    path = '/home/zeito/Desktop/folder/Test' + str(i) + '.png'
    
    CustomMessageBox.showWithTimeout(.5, 
                                     "Selecting feature: " + str(i), 
                                     "Information", 
                                     icon = QMessageBox.Information)
    
    iface.mapCanvas().saveAsImage(path)

    layer.deselect(i)

Lo ejecuté en la Python Console de QGIS con el vectorial de la imagen siguiente:

features1

La imagen a continuación refleja la ejecución automática cuando se grabó la imagen png para el feature 2. Observe que la QMessageBox no tiene botón OK.

features2

Finalmente, el folder de salida con todas las imágenes png resultantes; tal como se esperaba.

select_feature3

Esta entrada fue publicada en PyQGIS, QGIS, SIG, Software Libre. Guarda el enlace permanente.

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s