Eu tenho um projeto QGIS que contém um compositor. É claro que se eu entrar na GUI, posso exportá-lo como um pdf, etc. Para o meu script make, eu quero que isso seja feito através de um script python. Da leitura online aqui está a minha tentativa:
#!/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()
Isso falha, especificamente:
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'
Eu baseei este fora de Memorizar Imprimir / vista compositor Mapa QGIS como PNG / PDF usando Python (sem mudar nada no layout visível)? mas modificou para simplificar o máximo possível. Parece que quebrei algo no processo ... Não tenho esse arquivo de modelo. Simplesmente tenho um arquivo de projeto board.qgs com um compositor board36x48. Alguma ideia?
qgs = QgsApplication(sys.argv, True)
porapp = QtGui.QApplication(sys.argv, True)
eqgs.initQgis()
comQgsApplication.initQgis()
?Respostas:
Você está tentando criar o item QgsComposerMap com o nome completo do compositor!
use o ID do componente do mapa no seu compositor (mapa; mapa0; mapa1 ...). Você o definiu ao criar seu compositor.
De acordo com outro trecho de código, você deve fazê-lo funcionar.
fonte