Compositore di esportazione QGIS come pdf in python


11

Ho un progetto QGIS che contiene un compositore. Ovviamente se vado nella GUI posso esportarlo come pdf ecc. Per il mio script make, anche se voglio farlo tramite uno script Python. Dalla lettura online ecco il mio tentativo:

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

Questo non riesce, in particolare:

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'

Ho basato questo fuori dalla vista del compositore Salva Stampa / Mappa QGIS come PNG / PDF usando Python (senza cambiare nulla nel layout visibile)? ma modificato per semplificare il più possibile. Sembra che abbia rotto qualcosa nel processo ... Non ho questo file modello. Ho semplicemente un file di progetto board.qgs con una scheda compositore36x48. Qualche idea?


Prova a sostituire qgs = QgsApplication(sys.argv, True)con app = QtGui.QApplication(sys.argv, True)e qgs.initQgis()con QgsApplication.initQgis()?
Joseph,

Puoi trovare qualche utile codice qui nel plugin Maps_printer: github.com/DelazJ/MapsPrinter/wiki . Cerca def saveFile (self) :, def printToRaster (self, cView, cartella, nome, ext) :, def exportCompo (self, cView, cartella, titolo, estensione):
gisnside,

hai fatto funzionare?
Hugo Roussaffa - GeoDatup,

Risposte:


1

Stai provando a creare l'elemento QgsComposerMap dal tuo nome compositore completo!

map_item = composition.getComposerItemById('board36x48')

usa invece l'ID del componente map nel tuo compositore (map; map0; map1 ...). L'hai definito quando hai creato il tuo compositore.

Secondo l'altro pezzo di codice sono ok, dovresti farlo funzionare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.