Composeur d'exportation QGIS au format PDF en Python

11

J'ai un projet QGIS qui contient un compositeur. Bien sûr, si je vais dans l'interface graphique, je peux l'exporter sous forme de fichier pdf, etc. De la lecture en ligne, voici ma tentative:

#!/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()

Cela échoue, en particulier:

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'

J'ai basé ceci hors de la vue Save Print / Map QGIS composer en PNG / PDF en utilisant Python (sans rien changer dans la disposition visible)? mais l'a modifié pour simplifier autant que possible. Il semble que j'ai cassé quelque chose dans le processus ... Je n'ai pas ce fichier modèle. J'ai simplement un fichier de projet board.qgs avec un compositeur board36x48. Des idées?

David Mokon Bond
la source
Essayez de remplacer qgs = QgsApplication(sys.argv, True)par app = QtGui.QApplication(sys.argv, True)et qgs.initQgis()par QgsApplication.initQgis()?
Joseph
Vous pouvez trouver un morceau de code utile ici dans le plugin Maps_printer : github.com/DelazJ/MapsPrinter/wiki . Rechercher def saveFile (self):, def printToRaster (self, cView, dossier, nom, ext) :, def exportCompo (self, cView, dossier, titre, extension):
gisnside
avez-vous réussi?
Hugo Roussaffa - GeoDatup

Réponses:

1

Vous essayez de créer l'élément QgsComposerMap à partir de votre nom complet de compositeur!

map_item = composition.getComposerItemById('board36x48')

utilisez plutôt l'ID du composant map dans votre composeur (map; map0; map1 ...). Vous l'avez défini lorsque vous créez votre compositeur.

Selon que d'autres morceaux de code sont ok, vous devriez le faire fonctionner.

Hugo Roussaffa - GeoDatup
la source