QGIS exportar compositor como pdf en python

11

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?

David Mokon Bond
fuente
Intenta reemplazar qgs = QgsApplication(sys.argv, True)con app = QtGui.QApplication(sys.argv, True)y qgs.initQgis()con QgsApplication.initQgis()?
Joseph
Puede encontrar algún código útil aquí en el complemento Maps_printer : github.com/DelazJ/MapsPrinter/wiki . Busque def saveFile (self) :, def printToRaster (self, cView, carpeta, nombre, ext) :, def exportCompo (self, cView, carpeta, título, extensión):
gisnside
lo hiciste funcionar?
Hugo Roussaffa - GeoDatup

Respuestas:

1

¡Está intentando crear el elemento QgsComposerMap a partir de su nombre completo de compositor!

map_item = composition.getComposerItemById('board36x48')

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.

Hugo Roussaffa - GeoDatup
fuente