Posts tonen met het label plot. Alle posts tonen
Posts tonen met het label plot. Alle posts tonen

woensdag 6 december 2023

QGIS; Automatische pagina-grootte bij Atlas Printcomposer

 

Het maken van een atlas in QGIS kan op twee manieren. Bij de eerste voeg je zelf de vereiste pagina's toe. Hiermee ben je flexibel in grootte en oriëntatie. Het vraagt wel handwerk en we willen graag zo veel mogelijk geautomatiseerd doen.
Dit kan via de tweede manier door QGIS zelf de atlas aan te laten maken. Door middel van een bedekkingslaag worden de pagina's opgemaakt met allen dezelfde layout. Handig, maar dit betekent ook dat elke pagina dezelfde maat en oriëntatie heeft.

Gelukkig kan dit door Data-bepaalde Overrides veranderen.

Na een uitgebreide speurtocht op Internet kon ik nog niet iets vinden wat de papierformaten zou aanpassen aan de grootte van de polygonen in de bedekkingslaag.
Dus moest ik zelf gaan puzzelen.

Hieronder de manier welke ik heb gebruikt om hierbij te komen.

Allereerst heb je natuurlijk een bedekkingslaag nodig. In dit voorbeeld gebruik in de provincies van Nederland.

Maak een nieuwe layout, genereer een Atlas met in dit geval de provincies als bedekkignslaag.


Ga daarna naar Item-eigenschappen en ga naar bewerken bij Data-bepaalde override achter 'Grootte'.

Hierbij vul je de volgende CASE/WHEN expressie in:

CASE
WHEN
bounds_height(@atlas_geometry)< 61970
THEN
'A4'
WHEN
bounds_height(@atlas_geometry)> 61970
AND
bounds_height(@atlas_geometry)< 67201
THEN
'A3'
WHEN
bounds_height(@atlas_geometry)> 67201
AND
bounds_height(@atlas_geometry)< 80603
THEN
'A2'
WHEN
bounds_height(@atlas_geometry)> 80603
AND
bounds_height(@atlas_geometry)< 92109
THEN
'A1'
ELSE
'A0'
END

De waarden die in bovenstaande expressie ingevuld zijn, zijn niet random. Dit zijn de waarden die uit de expressie round(bounds_height($geometry),0) komen.
Deze expressie heb ik ingevuld in het 'Label-veld' bij het opmaakmenu. Hierdoor zijn de provincies gelabeld met de maximale hoogte van hun bounding box, afgerond op hele getallen.

Bij 'Oriëntatie' vul je bij Data-bepaalde overrides de expressie

if ((bounds_height(@atlas_geometry) > bounds_width(@atlas_geometry)), 'portrait' , 'landscape')

in.

Hiermee zal QGIS zelf bepalen, aan de hand van de vorm van de provincies, of de pagina liggend of staand moet komen te staan.

Op dit moment draait de pagina wel mee, maar de kaart niet. Om deze mee te laten draaien, zal de 'Breedte' en 'Hoogte' van de kaart ook via Databepaalde overrides gestuurd moeten worden.

Vul bij 'Breedte' de expressie in:

if( "orient" = 'Landscape' , @layout_pageheight , @layout_pagewidth ) - '50'

Vul bij 'Hoogte' de expressie in:

if( "orient" = 'Landscape' , @layout_pagewidth , @layout_pageheight ) - '5'

De negatieve waarden achter deze expressies geven een marge rondom de kaart. De -50 geeft zo marge om een stempel of overzichtskaart te plaatsen.
Wanneer nu door de pagina's gelopen wordt, zal deze verspringen in maat en oriëntatie.
Bij het plaatsen van gegevens aan de rechterkant of de onderkant moet er nog wel iets gebeuren aan de plaatsingsgegevens.
Omdat het pagina-formaat en de oriëntatie verspringen, kunnen er gegevens buiten de kaart vallen.


Dit kan door bij 'Positie en grootte' de Databepaalde overrides aan te passen.
Hiervoor moet bij 'X' de expressie

@layout_pagewidth

En bij 'Y' de expressie

@layout_pageheight

gebruikt worden.
Belangrijk is wel om het referentiepunt in de rechter benedenhoek te zetten.


Om gegevens halverwege de pagina te plaatsen, boven het hier gebruikte logo bijvoorbeeld, kan de expressie bij 'Y' er als volgt uitzien:

@layout_pageheight -60

Om marge te houden van de rand van het papier, is de expressie bij 'X'

@layout_pagewidth -5

 

De schaal van de verschillende prints is nu niet gelijk aan elkaar. Dit kan aangepast worden door een vaste schaal in te stellen via de 'Data-bepaalde Override' bij 'Schaal' op de juiste waarde te zetten. Kies hiervoor een waarde waarop de data die gepresenteerd dient te worden goed uitkomt. In dit voorbeeld gebruik ik de schaal 1:7000.

De 'CASE/WHEN' expressie wordt nu:

CASE
WHEN
bounds_height(@atlas_geometry)< (21*'70')
THEN
'A4'
WHEN
bounds_height(@atlas_geometry) > (21*'70')
AND
bounds_height(@atlas_geometry) < (29*'70')
THEN
'A3'
WHEN
bounds_height(@atlas_geometry)> (29*'70')
AND
bounds_height(@atlas_geometry)< (42*'70')
THEN
'A2'
WHEN
bounds_height(@atlas_geometry)> (42*'70')
AND
bounds_height(@atlas_geometry)< (59*'70')
THEN
'A1'
ELSE
'A0'
END

De waarden 21, 29, 42 en 59 zijn de maten in centimeters van de papiermaten A4, A3, A2 en A1. (A0 wordt gegeven wanneer de maat 59cm overschreden wordt). De '70' komt uit de gebruikte schaal/100.

Sommige polygonen zijn zo onhandig gepositioneerd dat ze net niet passen. Vaak kan een lichte rotatie dan uitkomst brengen. (Let wel op, vergeet de Noordpijl niet!).

Dit kan door bij de 'Data-bepaalde override' achter 'Kaartrotatie' aan te passen naar:

CASE
WHEN
(bounds_width(@atlas_geometry)/'7') >  @layout_pagewidth
THEN
'30'
ELSE
'0'
END

In dit voorbeeld is gekozen voor een rotatie van 30 graden. Deze kan natuurlijk naar wens worden aangepast.

Hopelijk heeft deze uitleg iemands werk een stuk eenvoudiger gemaakt.
Er zullen vast wel andere manieren zijn die hetzelfde bereiken. Deze mogen altijd gedeeld worden!
Ik sta altijd open om nieuwe mogelijkheden te leren.

AI in Social Media

  De zusjes Emily en Fiona Pellegrini hebben samen 245.000 volgers op Instagram, ze zijn de nieuwe influencer-zusjes. In drie maanden tij...