Automatyzacja drukowania kompozytora projektu QGIS?

9

Mam duży projekt, który składa się z około 10x plików projektu QGIS. Każdy projekt zawiera kompozytora wydruku z atlasem skonfigurowanym do generowania do 10 map.

Jaki jest najłatwiejszy sposób zautomatyzowania otwierania każdego projektu i tworzenia pliku PDF za pomocą atlasu kompozytora?

(Coś takiego byłoby idealne - nie jestem pewien, czy to możliwe)

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

Damien
źródło

Odpowiedzi:

9

Zapisanie tego w pliku Python i użycie go w argumencie --code powinno zrobić to, czego potrzebujesz:

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

Spowoduje to zapętlenie wszystkich kompozytorów i wydrukowanie ich, jeśli mają włączony atlas w jednym pliku PDF dla każdego z nich.

UWAGA Możesz otworzyć plik projektu w sesji QGIS za pomocą iface.addProject. Możesz to zrobić, aby uniknąć otwierania wielu sesji 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.
źródło
Odpowiedni post i świetna odpowiedź!
CARTOS
Zakładam, że zadziałało? Po sys.exit()zakończeniu można użyć do zamknięcia QGIS.
Nathan W
Tak, działa idealnie. I był rzeczywiście próbuje znaleźć drogę do wyjścia. Próbowałem iface.actionExit (). Trigger () i sys.exit (), ale z jakiegoś powodu nie działają.
Damien
SpróbujQgsApplication.exit()
Nathan W
iface.actionExit()pokaże okno dialogowe, jeśli projekt się zmienił i zablokuje wyjście, a QgsApplication.exit()to po prostu niuczy proces.
Nathan W