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?
qgs = QgsApplication(sys.argv, True)
parapp = QtGui.QApplication(sys.argv, True)
etqgs.initQgis()
parQgsApplication.initQgis()
?Réponses:
Vous essayez de créer l'élément QgsComposerMap à partir de votre nom complet de compositeur!
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.
la source