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.