¿Automatizar la impresión del compositor de proyectos QGIS?

9

Tengo un gran proyecto que consta de alrededor de 10x archivos de proyecto QGIS. Cada proyecto contiene un compositor de impresión con un atlas configurado para generar hasta 10 mapas.

¿Cuál es la forma más fácil de automatizar la apertura de cada proyecto y crear un PDF utilizando el atlas compositor?

(Algo como esto sería ideal, no estoy seguro si es posible)

C: \ OSGeo4W \ bin \ qgis.bat --proyecto MyProject1.qgs --code SaveAtlasAsPdf.py C: \ OSGeo4W \ bin \ qgis.bat --project MyProject2.qgs --code SaveAtlasAsPdf.py

Damien
fuente

Respuestas:

9

Guardar esto en un archivo Python y usarlo en --code arg debería hacer lo que necesita:

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import os

from qgis.core import *
from qgis.gui import *
from qgis.utils import iface

for comp in iface.activeComposers():
    print comp
    folder = r"C:\temp"
    title = "testing"
    printer = QPrinter()
    painter = QPainter()
    comp.composition().setUseAdvancedEffects(False)
    myAtlas = comp.composition().atlasComposition()

    if myAtlas.enabled():
        myAtlas.beginRender()
        comp.composition().setAtlasMode(QgsComposition.ExportAtlas)
        myAtlas.setFilenamePattern(u"'{}_'||$feature".format(title))
        for i in range(0, myAtlas.numFeatures()):
            myAtlas.prepareForFeature(i)
            filename = os.path.join(folder, title + '.pdf')
            print filename
            comp.composition().beginPrintAsPDF(printer, filename)
            comp.composition().beginPrint(printer)
            printReady = painter.begin(printer)
            if i > 0:
                printer.newPage()
            comp.composition().doPrint(printer, painter)
        myAtlas.endRender()
        painter.end()

Esto repetirá a todos los compositores e imprimirá si tienen un atlas habilitado en un solo PDF para cada uno.

NOTA Puede abrir un archivo de proyecto en una sesión QGIS usando iface.addProject. Entonces puede hacer esto para evitar abrir muchas sesiones de QGIS.

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import os

from qgis.core import *
from qgis.gui import *
from qgis.utils import iface

def print_it():
    for comp in iface.activeComposers():
        print comp
        folder = r"C:\temp"
        title = "testing"
        printer = QPrinter()
        painter = QPainter()
        comp.composition().setUseAdvancedEffects(False)
        myAtlas = comp.composition().atlasComposition()

        if myAtlas.enabled():
            myAtlas.beginRender()
            comp.composition().setAtlasMode(QgsComposition.ExportAtlas)
            myAtlas.setFilenamePattern(u"'{}_'||$feature".format(title))
            for i in range(0, myAtlas.numFeatures()):
                myAtlas.prepareForFeature(i)
                filename = os.path.join(folder, title + '.pdf')
                print filename
                comp.composition().beginPrintAsPDF(printer, filename)
                comp.composition().beginPrint(printer)
                printReady = painter.begin(printer)
                if i > 0:
                    printer.newPage()
                comp.composition().doPrint(printer, painter)
            myAtlas.endRender()
            painter.end()

for project in projectlist:
    iface.addProject(project)
    print_it()
Nathan W
fuente
Publicación relevante y gran respuesta!
CARTOS
¿Asumiré que funcionó? Puede usar sys.exit()para cerrar QGIS cuando haya terminado.
Nathan W
Si, funciona perfectamente. En realidad estaba tratando de encontrar una manera de salir. Intenté iface.actionExit (). Trigger () y sys.exit () pero por alguna razón no funcionan.
Damien
PruebaQgsApplication.exit()
Nathan W
iface.actionExit()mostrará un cuadro de diálogo si el proyecto ha cambiado y bloqueará la salida, en comparación con QgsApplication.exit()lo que simplemente destruirá el proceso.
Nathan W