Tôi đang cố gắng viết một kịch bản sẽ lưu kết xuất một vài lớp bằng trình soạn thảo bản đồ. Vấn đề tôi gặp phải là tập lệnh lưu trước khi qgis hoàn thành kết xuất tất cả các lớp.
Dựa trên một số câu trả lời khác ( 1 , 2 , 3 ), tôi đã cố gắng sử dụng iface.mapCanvas.mapCanvasRefreshed.connect()
và đặt lưu ảnh bên trong một chức năng, nhưng tôi vẫn gặp phải cùng một vấn đề - hình ảnh không bao gồm tất cả các lớp.
Mã mà tôi đang sử dụng, cũng như hình ảnh của cửa sổ chính và kết xuất đồ họa trông như thế nào được liệt kê bên dưới.
Tôi đã nhận thấy rằng nếu tôi mở cửa sổ giao diện điều khiển và bỏ ghi chú ba print layerList
dòng, chương trình sẽ đợi kết xuất hoàn tất trước khi lưu hình ảnh. Tôi không chắc chắn nếu điều này là do thời gian xử lý tăng lên, hoặc nếu nó đang thay đổi cách chương trình thực thi.
Làm thế nào để tôi thực hiện đúng điều này để tất cả các lớp được bao gồm trong hình ảnh?
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")
Nó trông như thế nào trong cửa sổ chính của QGIS (có một bản đồ raster ngẫu nhiên mà nó đang được hiển thị trên):
Để biết thêm thông tin, tôi đang sử dụng QGIS 2.18.7 trên Windows 7
mapCanv.mapCanvasRefreshed.connect(custFunc)
bằng mapCanv.renderComplete.connect(custFunc)
?
layerP .commitChanges()
). Mặc dù tôi không hiểu tại sao nó lại hữu ích vì bạn chỉ lưu hình ảnh nhưng đáng để thử. Nếu không thì hy vọng người khác có thể khuyên :)
commitChanges()
, nhưng không may, tiếc. Cám ơn vì sự gợi ý.