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.