Kompozytor eksportu QGIS jako pdf w Pythonie

11

Mam projekt QGIS, który zawiera kompozytora. Oczywiście, jeśli przejdę do GUI, mogę go wyeksportować jako plik pdf itp. W moim skrypcie make chcę to jednak zrobić za pomocą skryptu python. Z czytania online oto moja próba:

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

To się nie udaje, w szczególności:

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'

I na podstawie tego off z Save Print / Mapa QGIS kompozytora widzenia jako PNG / PDF przy użyciu Python (bez zmieniania czegokolwiek w widocznym układu)? ale zmodyfikowałem go, aby maksymalnie uprościć. Wygląda na to, że coś zepsułem w trakcie ... Nie mam tego pliku szablonu. Po prostu mam plik projektu board.qgs z płytą kompozytora36x48. Jakieś pomysły?

David Mokon Bond
źródło
Spróbuj wymienić qgs = QgsApplication(sys.argv, True)ze app = QtGui.QApplication(sys.argv, True)i qgs.initQgis()ze QgsApplication.initQgis()?
Joseph
Przydatny fragment kodu możesz znaleźć tutaj we wtyczce Maps_printer : github.com/DelazJ/MapsPrinter/wiki . Poszukaj def saveFile (self) :, def printToRaster (self, cView, folder, nazwa, rozszerzenie) :, def exportCompo (self, cView, folder, tytuł, rozszerzenie):
gisnside
dostałeś to działa?
Hugo Roussaffa - GeoDatup

Odpowiedzi:

1

Próbujesz utworzyć element QgsComposerMap z pełnej nazwy kompozytora!

map_item = composition.getComposerItemById('board36x48')

zamiast tego użyj identyfikatora komponentu mapy w swoim kompozytorze (mapa; mapa0; mapa1 ...). Zdefiniowałeś go podczas tworzenia kompozytora.

Według innych fragmentów kodu są w porządku, powinieneś zacząć działać.

Hugo Roussaffa - GeoDatup
źródło