Mungkin juga melihat jawaban saya yang lain karena alat baru yang lebih baru telah muncul sejak ini.
Saya datang ke kode di bawah ini yang sayangnya tidak berfungsi penuh. Ini didasarkan pada solusi di atas dan pada pertanyaan-pertanyaan tesis lainnya:
Bagaimana cara pemrograman mengekspor komposisi sebagai gambar?
Bagaimana saya bisa membaca pengaturan untuk QgsPaperItem dari XML?
Menyimpan Peta Kanvas sebagai PNG dengan latar belakang transparan secara terprogram dengan QGIS?
Kode saya dapat mengekstrak .qpt dari file .qgs dan berhasil memuat komposer dari templat. Ini juga mencetak komposer ke file .png dan menampilkan dengan benar label dan bentuk yang disimpan dalam komposer.
Namun gagal memuat semua elemen yang terkait dengan Map & Layers yang sebenarnya (label yang mengandung ekspresi dari layer juga tidak diambil). Saya rasa saya sedikit ketinggalan tentang bagaimana proyek harus dimuat dan ditautkan ke komposer.
Beberapa orang dalam komentar dari artikel asli dari Tim Sutton menyebutkan bahwa mereka terjebak pada tahap yang sama di bawah Windows (ini kasus saya). Ini sangat frustasi karena saya merasa jawabannya sangat dekat. Internet yang terhormat, tolong bantu!
Juga ini adalah upaya pertama saya di python jadi saya harap Anda akan baik;)
#This python code aim to programmatically export the first composer stored in a qgs file using PyQgis API v 2.10
#Version 0.4 (non functional) WTFPL MarHoff 2015 - This code is mostly a "frankenstein" stub made with a lot of other snippets. Feel welcome to improve!
#Credits to gis.stackexchange community : drnextgis,ndawson,patdevelop,dakcarto,ahoi, underdark & Tim Sutton from kartoza
#More informations and feedback can be found at /gis/144792/
#This script assume your environement is setup for PyGis as a stand-alone script. Some nice hints for windows users : /gis//a/130102/17548
import sys
from PyQt4.QtCore import *
from PyQt4.QtXml import *
from qgis.core import *
from qgis.gui import *
gui_flag = True
app = QgsApplication(sys.argv, gui_flag)
# Make sure QGIS_PREFIX_PATH is set in your env if needed!
app.initQgis()
# Name of the .qgs file without extension
project_name = 'myproject'
#Important : The code is assuming that the .py file is in the same folder as the project
folderPath = QString(sys.path[0])+'/'
projectPath = QString(folderPath+project_name+'.qgs')
templatePath = QString(folderPath+project_name+'_firstcomposer.qpt')
imagePath = QString(folderPath+project_name+'.png')
#Getting project as Qfile and the first composer of the project as a QDomElement from the .qgs
projectAsFile = QFile(projectPath)
projectAsDocument = QDomDocument()
projectAsDocument.setContent(projectAsFile)
composerAsElement = projectAsDocument.elementsByTagName("Composer").at(0).toElement()
#This block store the composer into a template file
templateFile = QFile(templatePath)
templateFile.open(QIODevice.WriteOnly)
out = QTextStream(templateFile)
#I need next line cause UTF-8 is somewhat tricky in my setup, comment out if needed
out.setCodec("UTF-8")
param = QString
composerAsElement.save(out,2)
templateFile.close()
#And this block load back the composer into a QDomDocument
#Nb: This is ugly as hell, i guess there is a way to convert a QDomElement to a QDomDocument but every attemps failed on my side...
composerAsDocument = QDomDocument()
composerAsDocument.setContent(templateFile)
#Now that we got all we can open our project
canvas = QgsMapCanvas()
QgsProject.instance().read(QFileInfo(projectAsFile))
bridge = QgsLayerTreeMapCanvasBridge(
QgsProject.instance().layerTreeRoot(), canvas)
bridge.setCanvasLayers()
#Lets try load that composer template we just extracted
composition = QgsComposition(canvas.mapSettings())
composition.loadFromTemplate(composerAsDocument, {})
#And lets print in our .png
image = composition.printPageAsRaster(0)
image.save(imagePath,'png')
#Some cleanup maybe?
QgsProject.instance().clear()
QgsApplication.exitQgis()
Saya membuang baris tesis dari kode sebelumnya karena mereka sepertinya tidak melakukan apa-apa. Mereka tidak menghasilkan kesalahan tetapi tidak melakukan yang lebih baik.
# You must set the id in the template
map_item = composition.getComposerItemById('map')
map_item.setMapCanvas(canvas)
map_item.zoomToExtent(canvas.extent())
# You must set the id in the template
legend_item = composition.getComposerItemById('legend')
legend_item.updateLegend()
composition.refreshItems()
dan mereka juga dihilangkan karena sepertinya tidak diperlukan saat menggunakan printPageAsRaster ()
dpmm = dpi / 25.4
width = int(dpmm * composition.paperWidth())
height = int(dpmm * composition.paperHeight())
# create output image and initialize it
image = QImage(QSize(width, height), QImage.Format_ARGB32)
image.setDotsPerMeterX(dpmm * 1000)
image.setDotsPerMeterY(dpmm * 1000)
image.fill(0)
# render the composition
imagePainter = QPainter(image)
composition.renderPage(imagePainter, 0)
imagePainter.end()