Автоматизация печати проекта QGIS?

9

У меня есть большой проект, который состоит из примерно 10x файлов проекта QGIS. Каждый проект содержит композитор для печати с атласом, настроенным для создания до 10 карт.

Какой самый простой способ автоматизировать открытие каждого проекта и создание PDF с использованием атласа композитора?

(Что-то вроде этого было бы идеально - не уверен, если это возможно)

C: \ OSGeo4W \ bin \ qgis.bat --project MyProject1.qgs - код SaveAtlasAsPdf.py C: \ OSGeo4W \ bin \ qgis.bat --project MyProject2.qgs - код SaveAtlasAsPdf.py

Damien
источник

Ответы:

9

Сохранение этого в файле Python и использование его в аргументе --code должно сделать то, что вам нужно:

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

Это зациклит всех композиторов и напечатает их, если у них включен атлас в один PDF для каждого.

ПРИМЕЧАНИЕ. Вы можете открыть файл проекта в сеансе QGIS, используя iface.addProject. Таким образом, вы можете сделать это, чтобы избежать открытия многих сессий 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()
Натан У
источник
Соответствующий пост и отличный ответ!
CARTOS
Я буду считать, что это сработало? Вы можете использовать, sys.exit()чтобы закрыть QGIS, когда закончите.
Натан В.
Да, работает отлично. Я был на самом деле пытаюсь найти путь к выходу. Я пробовал iface.actionExit (). Trigger () и sys.exit (), но по какой-то причине они не работают.
Дэмиен
ПопробуйтеQgsApplication.exit()
Натан W
iface.actionExit()собирается показать диалоговое окно, если проект изменился, и заблокировать выход, против QgsApplication.exit()которого будет просто сброшен процесс.
Натан В.