Tengo un proyecto QGIS que contiene un compositor. Por supuesto, si entro en la GUI, puedo exportarlo como un PDF, etc. Para mi script de creación, aunque quiero hacerlo a través de un script de Python. De leer en línea aquí está mi intento:
#!/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()
Esto falla, específicamente:
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'
¿Me basé en Guardar vista de mapa de impresión QGIS como PNG / PDF usando Python (sin cambiar nada en el diseño visible)? pero lo modificó para simplificar lo más posible. Parece que rompí algo en el proceso ... No tengo este archivo de plantilla. Simplemente tengo un archivo de proyecto board.qgs con un tablero compositor36x48. ¿Algunas ideas?
qgs = QgsApplication(sys.argv, True)
conapp = QtGui.QApplication(sys.argv, True)
yqgs.initQgis()
conQgsApplication.initQgis()
?Respuestas:
¡Está intentando crear el elemento QgsComposerMap a partir de su nombre completo de compositor!
use en su lugar la ID del componente de mapa en su compositor (mapa; mapa0; mapa1 ...). Lo definiste cuando creaste tu compositor.
Según otra parte del código está bien, deberías hacerlo funcionar.
fuente