Compositor de exportação QGIS como pdf em python

11

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?

David Mokon Bond
fonte
Tente substituir qgs = QgsApplication(sys.argv, True)por app = QtGui.QApplication(sys.argv, True)e qgs.initQgis()com QgsApplication.initQgis()?
1955 Joseph
Você pode encontrar algum trecho de código útil aqui no plug-in Maps_printer : github.com/DelazJ/MapsPrinter/wiki . Procure def saveFile (self) :, def printToRaster (self, CView, pasta, nome, ext) :, def exportCompo (self, CView, pasta, título, extensão):
gisnside
você conseguiu?
Hugo Roussaffa - GeoDatup 25/10

Respostas:

1

Você está tentando criar o item QgsComposerMap com o nome completo do compositor!

map_item = composition.getComposerItemById('board36x48')

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.

Hugo Roussaffa - GeoDatup
fonte