मैं एक स्क्रिप्ट लिखने का प्रयास कर रहा हूं जो मानचित्र संगीतकार का उपयोग करके कई परतों के प्रतिपादन को बचाएगा। मैं जिस समस्या का सामना कर रहा हूं वह यह है कि क्यूगिस की सभी परतों को प्रस्तुत करने से पहले स्क्रिप्ट बच जाती है।
कई अन्य उत्तरों ( 1 , 2 , 3 ) के आधार पर , मैंने iface.mapCanvas.mapCanvasRefreshed.connect()
एक फ़ंक्शन के अंदर इमेज सेविंग का उपयोग करने और डालने का प्रयास किया है , लेकिन मैं अभी भी एक ही समस्या का सामना कर रहा हूं - छवियों में सभी परतें शामिल नहीं हैं।
कोड जो मैं उपयोग कर रहा हूं, साथ ही मुख्य विंडो और रेंडरिंग की क्या छवियां हैं, नीचे सूचीबद्ध हैं।
मैंने देखा है कि अगर मेरे पास कंसोल विंडो खुली हुई है और तीनों print layerList
लाइनों को अनलॉक्ड करती है , तो यह प्रोग्राम इमेजेज सेव करने से पहले रेंडरिंग खत्म होने का इंतजार करेगा। मुझे यकीन नहीं है कि अगर यह वृद्धि हुई प्रसंस्करण समय के कारण है, या यदि यह बदल रहा है कि कार्यक्रम कैसे निष्पादित होता है।
मैं इसे ठीक से कैसे लागू करूं इसलिए सभी परतें छवि में शामिल हैं?
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 मुख्य विंडो में कैसा दिखता है (इस पर प्रदर्शित किया जा रहा है एक यादृच्छिक रेखापुंज नक्शा है):
अधिक जानकारी के रूप में, मैं विंडोज 7 पर QGIS 2.18.7 का उपयोग कर रहा हूं
mapCanv.mapCanvasRefreshed.connect(custFunc)
साथ बदलने का प्रयास करें mapCanv.renderComplete.connect(custFunc)
?
layerP .commitChanges()
)। हालाँकि मैं यह नहीं देखता कि आपको मदद क्यों करनी चाहिए क्योंकि आप केवल छवि को बचा रहे हैं लेकिन एक कोशिश के लायक है जो मुझे लगता है। अन्यथा उम्मीद है कि अन्य लोग सलाह दे सकते हैं :)
commitChanges()
, लेकिन दुर्भाग्य नहीं। सलाह के लिये धन्यवाद।