Tôi muốn tạo một tập lệnh Python trong QGIS sẽ lấy một số dữ liệu (trong ví dụ của tôi), sử dụng Trình soạn thảo bản đồ (từ một tệp) và xuất thành phần được tạo thành hình ảnh png.
Hầu như không có kinh nghiệm về lập trình (ít hơn kiến thức Python cơ bản), tôi google một số đoạn mã và cố gắng làm cho chúng hoạt động cùng nhau. Tôi đã lấy mã Trình soạn thảo bản đồ từ một số câu hỏi đã được trả lời trước đây: Lưu Chế độ xem của nhà soạn nhạc QGIS dưới dạng PNG / PDF bằng Python (không thay đổi bất cứ điều gì trong bố cục có thể nhìn thấy)?
Tôi đã quản lý để tải dữ liệu và mẫu Trình soạn thảo bản đồ (với một mục bản đồ và chú giải được xác định) nhưng hình ảnh xuất khẩu của tôi có khung bản đồ trống (không có dữ liệu vectơ / raster trong khung). Các mục huyền thoại có vẻ tốt tuy nhiên.
Bất kỳ trợ giúp để làm cho mã này hoạt động?
from qgis.core import *
import qgis.utils
from PyQt4 import QtCore, QtGui
from qgis import core, gui
# ADD VECTOR LAYER
data_folder = "D:/QGIS/dane/"
granica = "granica_SZ VI_UTM34.shp"
granica_name = granica[0:-4]
granica = data_folder + granica
granica_style = "granica_style.qml"
granica_style = data_folder + granica_style
granica = iface.addVectorLayer(granica, granica_name, "ogr")
granica.loadNamedStyle(granica_style)
if not granica.isValid():
print "Granica failed to load or already loaded!"
qgis.utils.iface.legendInterface().setLayerVisible(granica, True)
# ADD RASTER LAYER
landsat = "SZ_VI_LC8-190-022_2015-111_LGN00_OLI_TIRS_atm.TIF"
landsat_name = landsat[0:-4]
landsat = data_folder + landsat
landsat_style = "landsat_style.qml"
landsat_style = data_folder + landsat_style
landsat = iface.addRasterLayer(landsat, landsat_name)
landsat.loadNamedStyle(landsat_style)
qgis.utils.iface.legendInterface().setLayerVisible(landsat, True)
iface.zoomFull()
# MOVE RASTER DOWN (change order)
canvas = qgis.utils.iface.mapCanvas()
layers = canvas.layers()
root = QgsProject.instance().layerTreeRoot()
landsat_old = root.findLayer(landsat.id())
landsat_move = landsat_old.clone()
parent = landsat_old.parent()
parent.insertChildNode(2, landsat_move)
parent.removeChildNode(landsat_old)
# USE MAP COMPOSER TEMPLATE TO EXPORT IMAGE
from qgis.gui import QgsMapCanvas, QgsLayerTreeMapCanvasBridge
from PyQt4.QtXml import QDomDocument
from PyQt4.QtGui import QImage
from PyQt4.QtGui import QPainter
from PyQt4.QtCore import QSize
template_path = data_folder + 'template.qpt'
template_file = file(template_path)
# Set output DPI
dpi = 300
canvas = QgsMapCanvas()
template_file = file(template_path)
template_content = template_file.read()
template_file.close()
document = QDomDocument()
document.setContent(template_content)
ms = canvas.mapSettings()
composition = QgsComposition(ms)
composition.loadFromTemplate(document, {})
# 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()
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()
image.save(data_folder + "out3.png", "png")
QgsApplication.exitQgis()