6 votos

¿Cómo actualizar la vista compositor de impresión de QGIS usando Python?

Estoy tratando de automatizar la impresión de mapas basados en clasificaciones de atributo diferentes en Python QGIS. Todo está bien salvo cuando abro la imagen impresa, las etiquetas son borrosas. Manualmente, lo puedo solucionar este problema haciendo clic en el botón "Actualizar vista" en la ventana de impresión compositor, pero no encuentro la manera correcta de actualizar automáticamente el mapa en el compositor de impresión basado en la API de QGIS. Aquí está imprimiendo parte de este código:

def printMyMap(canvas, field, itemp):
    canvas.refresh()
    mapRenderer = canvas.mapRenderer()
    c = QgsComposition(mapRenderer)
    myFile = 'C:/Users/User1/'+itemp
    myTemplateFile = file(myFile, 'rt')
    myTemplateContent = myTemplateFile.read()
    myTemplateFile.close()
    myDocument = QDomDocument()
    myDocument.setContent(myTemplateContent)
    c.loadFromTemplate(myDocument)

    #Map
    cmaps =  c.composerMapItems()
    cmaps[0].updateCachedImage()
    cmaps[1].updateCachedImage()

    #Legend Titles
    #legend = c.getComposerItemById("3")
    #legend.setTitle(ltitle)

    #Show Composer
    #iface.actionPrintComposer().trigger()
    composerList=iface.activeComposers()
    composerView=composerList[composerList.index(max(composerList))]
    composer = composerView.composerWindow()
    composer.show()

    #Save out
    dpi = c.printResolution()
    dpmm = dpi / 25.4
    width = int(dpmm * c.paperWidth())
    height = int(dpmm * c.paperHeight())

    image = QImage(QSize(width, height), QImage.Format_ARGB32)
    image.setDotsPerMeterX(dpmm * 1000)
    image.setDotsPerMeterY(dpmm * 1000)
    image.fill(0)

    imagePainter = QPainter(image)
    sourceArea = QRectF(0, 0, c.paperWidth(), c.paperHeight())
    targetArea = QRectF(0, 0, width, height)
    c.render(imagePainter, targetArea, sourceArea)
    imagePainter.end()
    image.save("F:/Maps/"+field+".png", "png")

2voto

John Feminella Puntos 123

Estás muy cerca - tiene que cambiar:

sourceArea = QRectF(0, 0, c.paperWidth(), c.paperHeight())
targetArea = QRectF(0, 0, width, height)
c.render(imagePainter, targetArea, sourceArea)

Para

c.renderPage( imagePainter, 0 )

Como el renderPage método automáticamente controla mucho de la configuración de salida.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X