Labels y Grid en Map Composer con PyQGIS

En el post anterior hicimos una serie de pruebas para crear una versión gráfica estática (como imagen jpg) del mapa dinámico que se visualiza en el Map Canvas de QGIS utilizando varias clases de PyQGIS. A continuación, haremos una selección del código usado previamente para agilizar la elaboración de labels (a través de una función) y mejorar el aspecto estético de la imagen que se produjo en el post anterior con la Grid.

El código propuesto es el siguiente:

from PyQt4.QtGui import *
from PyQt4.QtCore import *

def label(c, text_name = 'label', size = 12, rot_angle = 0, x_pos = 0, y_pos = 0):

    my_font = QFont('Courier New')
    my_font.setPointSize(size)

    label = QgsComposerLabel(c)
    label.setItemRotation(rot_angle, True)
    label.setFont(QFont(my_font))
    label.setFontColor(QColor('black'))
    label.setFrameOutlineColor(QColor('black'))
    label.setText(text_name)
    label.adjustSizeToText()
    label.setItemPosition(x_pos, y_pos, True)
    label.setFrameEnabled(False)
    c.addItem(label)

def mapComposer():

    layer = QgsVectorLayer("/home/zeito/pyqgis_data/hancock.shp", "hancock", "ogr")

    renderer = layer.rendererV2()
    symbol = renderer.symbol()
    symbol.setColor(QColor('blue'))

    reg = QgsMapLayerRegistry.instance()
    
    reg.addMapLayer(layer)

    layers = reg.mapLayers().keys()
    
    #mr is a QgsMapRenderer object
    mr = iface.mapCanvas().mapRenderer()

    mr.setLayerSet(layers)

    rect = QgsRectangle(layer.extent())

    rect.scale(1.2)

    mr.setExtent(rect)

    #c is a QgsComposition object
    c = QgsComposition(mr)

    c.setPlotStyle(QgsComposition.Print)
    
    #Set Paper Size
    c.setPaperSize(215.9, 279.4) #letter

    w, h = c.paperWidth() * .50, c.paperHeight() * .50

    x = (c.paperWidth() - w) / 2
    y = ((c.paperHeight() - h)) / 2

    #Create an object of QgsComposerMap class
    composerMap = QgsComposerMap(c, x, y, w, h)
    composerMap.setNewExtent(rect)
    composerMap.setFrameEnabled(True)
    composerMap.setBackgroundEnabled(True)
    composerMap.setBackgroundColor(QColor('white'))
    composerMap.setFrameOutlineColor(QColor('black'))
    composerMap.setFrameOutlineWidth(1)
    
    #Parametros de la Grid dentro del composerMap
    composerMap.setGridEnabled(True)
    composerMap.setGridFrameStyle(1)
    composerMap.setGridAnnotationPrecision(2)
    composerMap.setGridIntervalX(0.1)
    composerMap.setGridIntervalY(0.1)
    composerMap.setShowGridAnnotation(True)
    c.addItem(composerMap)

    #default print resolution in 300 dpi
    dpi = c.printResolution()
    c.setPrintResolution(dpi)

    mm_in_inch = 25.4
    dpmm = dpi / mm_in_inch

    width = int(dpmm * c.paperWidth())
    height = int(dpmm * c.paperHeight())

    #Create an object of QFont class
    #Type fonts: "Times", "Courier New", "OldEnglish", "Serif", "Fantasy"
    my_font = QFont('Courier New')
    my_font.setPointSize(24)
   
    #Create objects of QgsComposerLabel class
    label(c, 'latitud (grados)', 24, -90, 70, 180)
    label(c, 'longitud (grados)', 24, 0, 110, 220)
    label(c, 'Hancock', 40, 0, 110, 40)

    #Create an object of QImage class
    image = QImage(QSize(width, height), QImage.Format_ARGB32)
    image.setDotsPerMeterX(dpmm * 1000)
    image.setDotsPerMeterY(dpmm * 1000)
    image.fill(0)

    #Create an object of QPainter class
    imagePainter = QPainter(image)
    imagePainter.rotate(360.0) #same that 0
    sourceArea = QRectF(0, 0, c.paperWidth(), c.paperHeight())
    targetArea = QRectF(0, 0, width, height)
    c.render(imagePainter, targetArea, sourceArea)
    imagePainter.end()
    
    image.save("/home/zeito/Desktop/map.jpg", "jpg")

que produce la imagen *.jpg siguiente (las proporciones no son las de una hoja tamaño carta para mejorar su visualización).

composer1

Esta entrada fue publicada en PyQGIS, QGIS, Software Libre. Guarda el enlace permanente.

3 respuestas a Labels y Grid en Map Composer con PyQGIS

  1. Pingback: Imágenes (logotipos) en Map Composer con PyQGIS | El Blog de José Guerrero

  2. Pingback: Desplegar un objeto de QgsComposerLabel con más de una línea en PyQGIS | El Blog de José Guerrero

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s