QGIS экспорт композитор в формате PDF в Python

11

У меня есть проект QGIS, который содержит композитора. Конечно, если я войду в GUI, я могу экспортировать его в формате PDF и т. Д. Для моего скрипта make, хотя я хочу, чтобы это было сделано с помощью скрипта Python. Из чтения онлайн вот моя попытка:

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

Это терпит неудачу, в частности:

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'

Я основывал это на представлении « Сохранить печать / карту QGIS composer» в формате PNG / PDF с использованием Python (без каких-либо изменений в видимом макете)? но изменил его, чтобы максимально упростить. Кажется, что я что-то сломал в процессе ... У меня нет этого файла шаблона. У меня просто есть файл проекта board.qgs с композитором board36x48. Любые идеи?

Дэвид Мокон Бонд
источник
Попробуйте заменить qgs = QgsApplication(sys.argv, True)с app = QtGui.QApplication(sys.argv, True)и qgs.initQgis()с QgsApplication.initQgis()?
Джозеф
Вы можете найти полезную часть кода здесь в плагине Maps_printer: github.com/DelazJ/MapsPrinter/wiki . Найдите def saveFile (self) :, def printToRaster (self, cView, папка, имя, ext) :, def exportCompo (self, cView, папка, заголовок, расширение):
gisnside
у тебя получилось?
Уго Руссаффа - GeoDatup

Ответы:

1

Вы пытаетесь создать элемент QgsComposerMap из вашего полного имени композитора!

map_item = composition.getComposerItemById('board36x48')

используйте вместо этого идентификатор компонента карты в вашем композиторе (map; map0; map1 ...). Вы определили это при создании своего композитора.

В соответствии с другим фрагментом кода все в порядке, вы должны заставить его работать.

Уго Руссаффа - GeoDatup
источник