Automatizando a impressão do compositor de projetos QGIS?

9

Eu tenho um grande projeto que consiste em cerca de 10x arquivos de projeto QGIS. Cada projeto contém um compositor de impressão com um atlas configurado para gerar até 10 mapas.

Qual é a maneira mais fácil de automatizar a abertura de cada projeto e criar um PDF usando o atlas do compositor?

(Algo assim seria o ideal - não tenho certeza se é possível)

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

Damien
fonte

Respostas:

9

Salvar isso em um arquivo Python e usá-lo no --code arg deve fazer o que você precisa:

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()

Isso fará um loop em todos os compositores e os imprimirá se eles tiverem o atlas ativado em um único PDF para cada um.

NOTA Você pode abrir um arquivo de projeto em uma sessão QGIS usando iface.addProject. Portanto, você pode fazer isso para evitar a abertura de muitas sessões do 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
fonte
Post relevante e ótima resposta!
CARTOS 31/01
Eu vou assumir que funcionou? Você pode usar sys.exit()para fechar o QGIS quando terminar.
Nathan W
Sim, funciona perfeitamente. Na verdade, eu estava tentando encontrar uma maneira de sair. Eu tentei iface.actionExit (). Trigger () e sys.exit (), mas por algum motivo eles não estão funcionando.
Damien
TenteQgsApplication.exit()
Nathan W
iface.actionExit()mostrará uma caixa de diálogo se o projeto tiver sido alterado e bloqueia a saída, vs o QgsApplication.exit()que acabará com o processo
Nathan W