Kaart renderen en afdrukken

De codesnippers op deze pagina hebben de volgende import nodig:

import os

Er zijn over het algemeen twee benaderingen wanneer ingevoerde gegevens zouden moeten worden gerenderd als een kaart: ofwel doe het op de snelle manier met behulp van QgsMapRendererJob of produceer een meer fijn afgestemde uitvoer door de kaart samen te stellen met behulp van de klasse QgsLayout.

Eenvoudig renderen

Het renderen wordt gedaan door een object QgsMapSettings te maken om de opties voor renderen te definiëren, en dan een QgsMapRendererJob te construeren met deze opties. het laatste wordt dan gebruikt om de resulterende afbeelding te maken.

Hier is een voorbeeld:

image_location = os.path.join(QgsProject.instance().homePath(), "render.png")

# e.g. vlayer = iface.activeLayer()
vlayer = QgsProject.instance().mapLayersByName("countries")[0]
options = QgsMapSettings()
options.setLayers([vlayer])
options.setBackgroundColor(QColor(255, 255, 255))
options.setOutputSize(QSize(800, 600))
options.setExtent(vlayer.extent())

render = QgsMapRendererParallelJob(options)

def finished():
    img = render.renderedImage()
    # save the image; e.g. img.save("/Users/myuser/render.png","png")
    img.save(image_location, "png")
    print("saved")

render.finished.connect(finished)

render.start()

Lagen met een verschillend CRS renderen

Als u meer dan één laag hebt en zij hebben een verschillend CRS, zal het eenvoudige voorbeeld hierboven niet werken: om de juiste waarden uit de berekeningen van het bereik te krijgen dient u expliciet het doel-CRS in te stellen.

settings.setLayers(layers)
render.setDestinationCrs(layers[0].crs())

Uitvoer door Afdruklay-out te gebruiken

Afdruklay-out is een zeer handig gereedschap als u een uitgebreidere uitvoer wilt dan de eenvoudige rendering van die welke hierboven is weergegeven. Het is mogelijk complexe lay-outs voor kaarten te maken, bestaande uit weergaven van kaarten, labels, legenda, tabellen en andere elementen die gewoonlijk aanwezig zijn op papieren kaarten. De lay-outs kunnen dan worden geëxporteerd naar PDF, rasterafbeeldingen of direct worden afgedrukt op een printer.

De afdruklay-out bestaat uit een aantal klassen. Zij behoren allemaal tot de bron-bibliotheek. De toepassing QGIS heeft een handige GUI voor het plaatsen van de elementen, hoewel die niet beschikbaar is in de bibliotheek van de GUI. Als u niet bekend bent met het framework Qt Graphics View, dan wordt u aangeraden nu de documentatie te raadplegen, omdat afdruklay-out daarop is gebaseerd.

De centrale klasse van de afdruklay-out is de klasse QgsLayout die is afgeleid van de klasse voor Qt QGraphicsScene. Laten we er een instantie van maken:

p = QgsProject()
layout = QgsLayout(p)
layout.initializeDefaults()

Nu kunnen we verschillende elementen (kaart, label, …) toevoegen aan de lay-out. Al deze objecten worden weergegeven door klassen die erven van de basisklasse QgsLayoutItem.

Hier is een beschrijving van enkele van de belangrijkste items voor lay-out die aan een lay-out kunnen worden toegevoegd.

  • kaart — dit item vertelt de bibliotheken waar de kaart zelf moet worden geplaatst. Hier maken we ene kaart en spreiden die over de gehele grootte van het papier

    map = QgsLayoutItemMap(layout)
    layout.addItem(map)
    
  • label — maakt het weergeven van labels mogelijk. Het is mogelijk het lettertype, de kleur, de uitlijning en marge aan te passen

    label = QgsLayoutItemLabel(layout)
    label.setText("Hello world")
    label.adjustSizeToText()
    layout.addItem(label)
    
  • legenda

    legend = QgsLayoutItemLegend(layout)
    legend.setLinkedMap(map) # map is an instance of QgsLayoutItemMap
    layout.addItem(legend)
    
  • schaalbalk

    item = QgsLayoutItemScaleBar(layout)
    item.setStyle('Numeric') # optionally modify the style
    item.setLinkedMap(map) # map is an instance of QgsLayoutItemMap
    item.applyDefaultSize()
    layout.addItem(item)
    
  • pijl

  • afbeelding

  • basisvorm

  • op knopen gebaseerde vorm

    polygon = QPolygonF()
    polygon.append(QPointF(0.0, 0.0))
    polygon.append(QPointF(100.0, 0.0))
    polygon.append(QPointF(200.0, 100.0))
    polygon.append(QPointF(100.0, 200.0))
    
    polygonItem = QgsLayoutItemPolygon(polygon, layout)
    layout.addItem(polygonItem)
    
    props = {}
    props["color"] = "green"
    props["style"] = "solid"
    props["style_border"] = "solid"
    props["color_border"] = "black"
    props["width_border"] = "10.0"
    props["joinstyle"] = "miter"
    
    symbol = QgsFillSymbol.createSimple(props)
    polygonItem.setSymbol(symbol)
    
  • tabel

Als een item eenmaal is toegevoegd aan de lay-out kan het worden verplaatst en de grootte worden gewijzigd:

item.attemptMove(QgsLayoutPoint(1.4, 1.8, QgsUnitTypes.LayoutCentimeters))
item.attemptResize(QgsLayoutSize(2.8, 2.2, QgsUnitTypes.LayoutCentimeters))

Standaard wordt een kader rondom elk item getekend. U kunt dat als volgt verwijderen:

# for a composer label
label.setFrameEnabled(False)

Naast het handmatig maken van items voor afdruklay-out, heeft QGIS ondersteuning voor sjablonen van afdruklay-out wat in essentie lay-outs zijn met al hun items, opgeslagen als een bestand .qpt (met syntaxis XML).

Als de lay-out eenmaal gereed is (de items van afdruklay-out zijn gemaakt en toegevoegd aan de lay-out), kunnen we doorgaan en een raster- en/of vector-uitvoer produceren.

Lay-out exporteren

De klasse QgsLayoutExporter moet worden gebruikt om een lay-out te exporteren.

base_path = os.path.join(QgsProject.instance().homePath()
pdf_path = os.path.join(base_path, "output.pdf")

exporter = QgsLayoutExporter(layout)
exporter.exportToPdf(pdf_path, QgsLayoutExporter.PdfExportSettings())

Gebruik exportToImage() in het geval dat u wilt exporteren naar een afbeelding in plaats van een bestand PDF.

Een afdrukatlas exporteren

Als u alle pagina’s wilt exporteren van een lay-out die de optie Atlas heeft geconfigureerd en ingeschakeld, dient u de methode atlas() te gebruiken voor het exporteren (QgsLayoutExporter) met enkele kleine aanpassingen. In het volgende voorbeeld worden de pagina’s geëxporteerd naar afbeeldingen PNG:

exporter.exportToImage(layout.atlas(), base_path, 'png', QgsLayoutExporter.ImageExportSettings())

Onthoud dat de uitvoer zal worden opgeslagen in de map voor het basispad, met de expressie voor de bestandsnaam voor de uitvoer die werd geconfigureerd in Atlas.