QGIS Export Composer als PDF in Python

11

Ich habe ein QGIS-Projekt, das einen Komponisten enthält. Wenn ich in die GUI gehe, kann ich sie natürlich als PDF usw. exportieren. Für mein Make-Skript möchte ich dies jedoch über ein Python-Skript erledigen lassen. Vom Online-Lesen hier ist mein Versuch:

#!/usr/bin/env python

import sys
from qgis.gui import QgsMapCanvas, QgsLayerTreeMapCanvasBridge
from PyQt4.QtCore import QFileInfo
from PyQt4.QtXml import QDomDocument
from qgis.core import *

qgs = QgsApplication(sys.argv, True) 
QgsApplication.setPrefixPath("/usr", True) 

qgs.initQgis()

def make_pdf():
  canvas = QgsMapCanvas()
  bridge = QgsLayerTreeMapCanvasBridge(
      QgsProject.instance().layerTreeRoot(), canvas)
  bridge.setCanvasLayers()
  QgsProject.instance().read(QFileInfo('../board.qgs'))

  composition = QgsComposition(canvas.mapSettings())
  map_item = composition.getComposerItemById('board36x48')
  map_item.setMapCanvas(canvas)
  map_item.zoomToExtent(canvas.extent())
  composition.refreshItems()
  composition.exportAsPDF('generated/board.pdf')
  QgsProject.instance().clear()

make_pdf()

Dies schlägt insbesondere fehl:

i:./assets/generate_board 
QGraphicsScene::addItem: item has already been added to this scene
Traceback (most recent call last):
  File "./assets/generate_board", line 30, in <module>
    make_pdf()
  File "./assets/generate_board", line 24, in make_pdf
    map_item.setMapCanvas(canvas)
AttributeError: 'NoneType' object has no attribute 'setMapCanvas'

Ich habe dies aus der QGIS-Composer-Ansicht "Drucken / Karten speichern" als PNG / PDF mit Python erstellt (ohne das sichtbare Layout zu ändern). aber geändert, um so viel wie möglich zu vereinfachen. Es scheint, als hätte ich dabei etwas kaputt gemacht ... Ich habe diese Vorlagendatei nicht. Ich habe einfach eine board.qgs-Projektdatei mit einem Composer board36x48. Irgendwelche Ideen?

David Mokon Bond
quelle
Versuchen Sie, qgs = QgsApplication(sys.argv, True)durch app = QtGui.QApplication(sys.argv, True)und qgs.initQgis()mit zu ersetzen QgsApplication.initQgis()?
Joseph
Möglicherweise finden Sie hier im Maps_printer-Plugin einen nützlichen Code: github.com/DelazJ/MapsPrinter/wiki . Suchen Sie nach def saveFile (self):, def printToRaster (self, cView, Ordner, Name, ext):, def exportCompo (self, cView, Ordner, Titel, Erweiterung):
gisnside
Hast du es geschafft?
Hugo Roussaffa - GeoDatup

Antworten:

1

Sie versuchen, das QgsComposerMap-Element aus Ihrem vollständigen Komponisten-Namen zu erstellen!

map_item = composition.getComposerItemById('board36x48')

Verwenden Sie stattdessen die ID der Kartenkomponente in Ihrem Composer (map; map0; map1 ...). Sie haben es beim Erstellen Ihres Komponisten definiert.

Laut anderen Code sind in Ordnung, Sie sollten es zum Laufen bringen.

Hugo Roussaffa - GeoDatup
quelle