อาจจะดูคำตอบอื่น ๆของฉันด้วยเครื่องมือใหม่ล่าสุดที่เกิดขึ้นนับตั้งแต่เครื่องมือนี้
ฉันมาที่โค้ดด้านล่างซึ่งน่าเสียดายที่ไม่สามารถใช้งานได้อย่างสมบูรณ์ สิ่งนี้อยู่บนพื้นฐานของการแก้ปัญหาด้านบนและตามคำถามอื่น ๆ :
วิธีส่งออกองค์ประกอบภาพโดยทางโปรแกรม
ฉันจะอ่านการตั้งค่าสำหรับ QgsPaperItem จาก XML ได้อย่างไร
กำลังบันทึก Map Canvas เป็น PNG ที่มีพื้นหลังโปร่งใสแบบเป็นโปรแกรมด้วย QGIS หรือไม่
รหัสของฉันสามารถแยก. qpt จากไฟล์. qgs และโหลดนักแต่งเพลงจากเทมเพลต นอกจากนี้ยังพิมพ์ผู้แต่งไปยังไฟล์. png และแสดงฉลากและรูปร่างที่จัดเก็บไว้ในผู้แต่งอย่างถูกต้อง
อย่างไรก็ตามมันล้มเหลวในการโหลดองค์ประกอบทั้งหมดที่เกี่ยวข้องกับแผนที่ & เลเยอร์จริง (ฉลากที่มีการแสดงออกจากเลเยอร์จะไม่ถูกวาด) ฉันคิดว่าฉันพลาดไปเล็กน้อยว่าโครงการจะต้องโหลดและเชื่อมโยงกับผู้แต่งอย่างไร
บางคนในความคิดเห็นของบทความต้นฉบับจาก Tim Suttonกล่าวว่าพวกเขาติดอยู่ในขั้นตอนเดียวกันภายใต้ Windows (เป็นกรณีของฉัน) มันน่าผิดหวังจริง ๆ เพราะฉันรู้สึกว่าคำตอบนั้นใกล้เข้ามาจริงๆ เรียนอินเทอร์เน็ตโปรดช่วยด้วย!
นี่เป็นความพยายามครั้งแรกของฉันที่ python ดังนั้นฉันหวังว่าคุณจะใจดี;)
#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 : https://gis.stackexchange.com/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()
ฉันลบบรรทัดเหล่านี้ออกจากโค้ดก่อนหน้าเนื่องจากพวกเขาดูเหมือนจะไม่ทำอะไรเลย พวกเขากลับกลายเป็นไม่มีข้อผิดพลาด แต่ไม่ได้ทำอะไรได้ดีกว่า
# 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()
และสิ่งที่จะถูกลบเช่นกันเพราะพวกเขาดูเหมือนไม่จำเป็นเมื่อใช้ 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()