QGIS에서 일부 데이터 (예 : hp + tif)를 가져 와서 tamplate Map Composer (파일에서)를 사용하고 생성 된 컴포지션을 png 이미지로 내보내는 Python 스크립트를 만들고 싶습니다.
프로그래밍 경험이 거의 없지만 (기본 Python 지식보다 적음) 일부 코드 스 니펫을 google과 함께 작동 시키려고합니다. 이전에 대답 한 몇 가지 질문에서 맵 작성기 코드를 가져 왔습니다. 인쇄 / 맵 QGIS 작성기보기를 Python을 사용하여 PNG / PDF로 저장합니다 (표시되는 레이아웃을 변경하지 않고)?
데이터 및 Map Composer 템플릿 (단일 맵 및 범례 항목이 정의 된)을로드 할 수 있지만 내 내보내기 png 이미지 에 빈 맵 프레임이 있습니다 (프레임 내에 벡터 / 래스터 데이터가 없음). 그러나 범례 항목은 잘 보입니다.
이 코드를 작동시키는 데 도움이 필요하십니까?
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()
코드 최적화를 위해 순서를 변경하는 대신 먼저 래스터와 벡터 레이어를 추가 할 수 있습니다. 올바른 순서로 즉시 정렬됩니다.
—
Clement