Có lẽ cũng nên xem câu trả lời khác của tôi khi các công cụ cập nhật mới hơn đã xuất hiện kể từ câu hỏi này.
Tôi đã đến với mã dưới đây rất tiếc là không đầy đủ chức năng. Điều này dựa trên giải pháp trên và dựa trên các câu hỏi khác:
Làm thế nào để lập trình xuất một tác phẩm như hình ảnh?
Làm cách nào tôi có thể đọc các cài đặt cho QssPaperItem từ XML?
Lưu Map Canvas dưới dạng PNG với nền trong suốt theo chương trình với QGIS?
Mã của tôi có thể trích xuất .qpt từ tệp .qss và tải thành công một trình soạn thảo từ mẫu. Nó cũng in một trình soạn thảo thành tệp .png và hiển thị chính xác các nhãn và hình dạng được lưu trữ trong trình soạn thảo.
Tuy nhiên, nó không tải được tất cả các yếu tố liên quan đến Bản đồ & Lớp thực tế (nhãn chứa biểu thức từ lớp này cũng không được vẽ). Tôi nghĩ rằng tôi đã bỏ lỡ một chút về cách dự án phải được tải và liên kết với nhà soạn nhạc.
Một số người trong bình luận của bài viết gốc từ Tim Sutton đã đề cập rằng họ bị kẹt ở cùng một giai đoạn trong Windows (đó là trường hợp của tôi). Điều này thực sự gây bực bội vì tôi cảm thấy câu trả lời thực sự rất gần. Kính gửi Internet xin giúp đỡ!
Ngoài ra đây là lần thử đầu tiên của tôi tại python nên tôi hy vọng bạn sẽ tử tế;)
#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()
Tôi đã bỏ các dòng này từ mã trước đó vì chúng dường như không làm gì cả. Họ sinh ra không có lỗi nhưng không làm gì tốt hơn.
# 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()
và các mục cũng bị xóa vì chúng dường như không cần thiết khi sử dụng 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()