Cách điền bản đồ của nhà soạn nhạc với dữ liệu canvas và xuất thành phần dưới dạng png bằng cách sử dụng tập lệnh Python trong QGIS


10

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()

Chỉ để tối ưu hóa mã, trước tiên bạn có thể thêm raster và lớp vectơ thay vì thay đổi thứ tự. Nó sẽ được theo đúng thứ tự ngay lập tức.
Clement

Câu trả lời:


1
canvas = QgsMapCanvas()
layers = [QgsMapCanvasLayer(landsat),QgsMapCanvasLayer(granica)] 
canvas.setLayerSet(layers)

Bạn sẽ phải thêm các lớp này vào khung vẽ trước khi xuất dưới dạng png

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.