Harita bestecisini kullanarak çeşitli katmanların oluşturulmasını kaydedecek bir komut dosyası yazmaya çalışıyorum. Karşılaştığım sorun, qgis tüm katmanları oluşturmayı tamamlamadan önce komut dosyasının kaydetmesidir.
Diğer birkaç cevaba ( 1 , 2 , 3 ) dayanarak iface.mapCanvas.mapCanvasRefreshed.connect(), görüntü kaydetmeyi bir fonksiyonun içine koymaya çalıştım, ancak yine de aynı sorunla karşılaşıyorum - görüntüler tüm katmanları içermiyor.
Kullandığım kodun yanı sıra ana pencerenin ve kaplamaların nasıl göründüğünün görüntüleri aşağıda listelenmiştir.
Konsol penceresini açıp üç print layerListçizgiyi kaldırırsam , programın görüntüleri kaydetmeden önce oluşturma işleminin bitmesini bekleyeceğini fark ettim . Bunun artan işlem süresinden kaynaklanıp kaynaklanmadığından veya programın çalışma şeklini değiştirip değiştirmediğinden emin değilim.
Tüm katmanlar görüntüye dahil edilecek şekilde bunu nasıl düzgün bir şekilde uygulayabilirim?
from qgis.core import *
from qgis.utils import *
from qgis.gui import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import os.path
##StackExchange Version=name
##Map_Save_Folder=folder
##Map_Save_Name=string roadmap
# Create save file location
mapName = "%s.png" %Map_Save_Name
outfile = os.path.join(Map_Save_Folder,mapName)
pdfName = "%s.pdf" %Map_Save_Name
outPDF = os.path.join(Map_Save_Folder,pdfName)
# Create point and line layers for later
URIstrP = "Point?crs=EPSG:3035"
layerP = QgsVectorLayer(URIstrP,"pointsPath","memory")
provP = layerP.dataProvider()
URIstrL = "LineString?crs=EPSG:3035"
layerL = QgsVectorLayer(URIstrL,"linePath","memory")
provL = layerL.dataProvider()
# Add points to point layer
feat1 = QgsFeature()
feat2 = QgsFeature()
feat3 = QgsFeature()
feat1.setGeometry(QgsGeometry.fromPoint(QgsPoint(5200000,2600000)))
feat2.setGeometry(QgsGeometry.fromPoint(QgsPoint(5300000,2800000)))
provP.addFeatures([feat1, feat2])
# Add line to line layer
feat3.setGeometry(QgsGeometry.fromPolyline([feat1.geometry().asPoint(),feat2.geometry().asPoint()]))
provL.addFeatures([feat3])
# Set symbology for line layer
symReg = QgsSymbolLayerV2Registry.instance()
metaRegL = symReg.symbolLayerMetadata("SimpleLine")
symLayL = QgsSymbolV2.defaultSymbol(layerL.geometryType())
metaL = metaRegL.createSymbolLayer({'width':'1','color':'0,0,0'})
symLayL.deleteSymbolLayer(0)
symLayL.appendSymbolLayer(metaL)
symRendL = QgsSingleSymbolRendererV2(symLayL)
layerL.setRendererV2(symRendL)
# Set symbology for point layer
metaRegP = symReg.symbolLayerMetadata("SimpleMarker")
symLayP = QgsSymbolV2.defaultSymbol(layerP.geometryType())
metaP = metaRegP.createSymbolLayer({'size':'3','color':'0,0,0'})
symLayP.deleteSymbolLayer(0)
symLayP.appendSymbolLayer(metaP)
symRendP = QgsSingleSymbolRendererV2(symLayP)
layerP.setRendererV2(symRendP)
# Load the layers
QgsMapLayerRegistry.instance().addMapLayer(layerP)
QgsMapLayerRegistry.instance().addMapLayer(layerL)
iface.mapCanvas().refresh()
# --------------------- Using Map Composer -----------------
def custFunc():
mapComp.exportAsPDF(outPDF)
mapImage.save(outfile,"png")
mapCanv.mapCanvasRefreshed.disconnect(custFunc)
return
layerList = []
for layer in QgsMapLayerRegistry.instance().mapLayers().values():
layerList.append(layer.id())
#print layerList
#print layerList
#print layerList
mapCanv = iface.mapCanvas()
bound = layerP.extent()
bound.scale(1.25)
mapCanv.setExtent(bound)
mapRend = mapCanv.mapRenderer()
mapComp = QgsComposition(mapRend)
mapComp.setPaperSize(250,250)
mapComp.setPlotStyle(QgsComposition.Print)
x, y = 0, 0
w, h = mapComp.paperWidth(), mapComp.paperHeight()
composerMap = QgsComposerMap(mapComp, x, y, w, h)
composerMap.zoomToExtent(bound)
mapComp.addItem(composerMap)
#mapComp.exportAsPDF(outPDF)
mapRend.setLayerSet(layerList)
mapRend.setExtent(bound)
dpmm = dpmm = mapComp.printResolution() / 25.4
mapImage = QImage(QSize(int(dpmm*w),int(dpmm*h)), QImage.Format_ARGB32)
mapImage.setDotsPerMeterX(dpmm * 1000)
mapImage.setDotsPerMeterY(dpmm * 1000)
mapPaint = QPainter()
mapPaint.begin(mapImage)
mapRend.render(mapPaint)
mapComp.renderPage(mapPaint,0)
mapPaint.end()
mapCanv.mapCanvasRefreshed.connect(custFunc)
#mapImage.save(outfile,"png")
QGIS ana penceresinde neye benziyor (üzerinde görüntülenen rastgele bir raster haritası var):

Daha fazla bilgi için, Windows 7'de QGIS 2.18.7 kullanıyorum
mapCanv.mapCanvasRefreshed.connect(custFunc)ile mapCanv.renderComplete.connect(custFunc)?
layerP .commitChanges()). Her ne kadar sadece görüntüyü kaydettiğinizden eminim ki neden yardımcı olması gerektiğini anlamıyorum. Aksi takdirde umarım diğerleri tavsiye :)
commitChanges()ama maalesef şans yok. Önerin için teşekkürler.
