Saya punya proyek QGIS yang berisi komposer. Tentu saja jika saya masuk ke GUI saya dapat mengekspornya sebagai pdf dll. Untuk membuat skrip saya meskipun saya ingin ini dilakukan melalui skrip python. Dari membaca online di sini adalah usaha saya:
#!/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()
Ini gagal, khususnya:
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'
Saya mendasarkan ini dari tampilan Simpan Cetak / Peta QGIS komposer sebagai PNG / PDF menggunakan Python (tanpa mengubah apa pun dalam tata letak yang terlihat)? tetapi memodifikasinya untuk menyederhanakan sebanyak mungkin. Sepertinya saya memecahkan sesuatu dalam proses ... Saya tidak punya file templat ini. Saya sederhana memiliki file proyek board.qgs dengan komposer board36x48. Ada ide?
qgs = QgsApplication(sys.argv, True)
denganapp = QtGui.QApplication(sys.argv, True)
danqgs.initQgis()
denganQgsApplication.initQgis()
?Jawaban:
Anda mencoba membuat item QgsComposerMap dari nama komposer lengkap Anda!
gunakan sebaliknya ID komponen peta di komposer Anda (peta; map0; map1 ...). Anda mendefinisikannya saat Anda membuat komposer Anda.
Menurut potongan kode lain ok, Anda harus membuatnya bekerja.
sumber