আমি এমন একটি স্ক্রিপ্ট লেখার চেষ্টা করছি যা মানচিত্রের রচয়িতা ব্যবহার করে কয়েকটি স্তরকে রেন্ডারিং সাশ্রয় করবে। আমি যে সমস্যার মুখোমুখি হচ্ছি তা হ'ল Qgis সমস্ত স্তরকে রেন্ডারিং শেষ করার আগে স্ক্রিপ্টটি সংরক্ষণ করে।
অন্যান্য বেশ কয়েকটি উত্তরের উপর ভিত্তি করে ( 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")
কিউজিআইএস মূল উইন্ডোতে এটি দেখতে কেমন দেখাচ্ছে (এটিতে প্রদর্শিত হচ্ছে একটি এলোমেলো রাস্টার মানচিত্র):
আরও তথ্য হিসাবে, আমি উইন্ডোজ 7 এ কিউজিআইএস 2.18.7 ব্যবহার করছি .7
mapCanv.mapCanvasRefreshed.connect(custFunc)
সাথে প্রতিস্থাপনের চেষ্টা করবেন mapCanv.renderComplete.connect(custFunc)
?
layerP .commitChanges()
) যদিও আমি দেখতে পাচ্ছি না কেন এটি কেন সাহায্য করবে কারণ আপনি কেবল চিত্রটি সংরক্ষণ করছেন তবে আমার অনুধাবনের চেষ্টা worth অন্যথায় আশা করি অন্যরা পরামর্শ দিতে পারেন :)
commitChanges()
, কিন্তু ভাগ্য নেই। পরামর্শের জন্য ধন্যবাদ.