Serie kaarten maken met Python script

Soms wil je een serie vergelijkbare thematische kaarten maken. Het enige verschil is het dataveld dat wordt gebruikt om gebieden in te kleuren of symbolen met variabele omvang te tonen. Klasse-indelingen en maximale symboolgrootte zijn hetzelfde. Voor grote aantallen kaarten is het vervelend om in QGIS steeds dezelfde handelingen te herhalen. Bovendien maak je snel fouten als je niet goed oplet. Dit artikel legt uit hoe het maken van grote series kaarten kan worden geautomatiseerd met behulp van een Python script. Alle bestanden die nodig zijn om deze methode uit te proberen zijn beschikbaar in een ZIP-bestand. Dit is een aangepaste versie van een eerder artikel. Deze nieuwe methode werkt beter en sneller dan de vorige en werkt hetzelfde voor Windows en Linux.

Procedure

  1. Maak een QGIS-project met een kaart die je als model wilt gebruiken voor de andere kaarten.
  2. Maak een sjabloon op basis van dit project.
  3. Prepareer een Python script met de opdrachten die nodig zijn om de kaarten te produceren, en alle benodigde specificaties, zoals de velden om weer te geven en het sjabloon dat moet worden gebruikt.
  4. Voer vanuit QGIS het Python script uit om een serie QGIS-projecten te genereren op basis van het sjabloon en van die projecten snapshots te maken.

Stap 1: Maak QGIS-project

Maak een QGIS-project dat als model kan dienen voor een serie kaarten. Het voorbeeld op de volgende afbeelding bestaat uit drie lagen: een shapefile met gebieden en twee puntenlagen gebaseerd op tekstbestanden, geimporteerd met de ‘Toevoegen tekengescheiden kaartlaag’ plugin. De eerste puntenlaag bevat de gegevens voor elke regio. De tweede puntenlaag bestaat slechts uit één punt, gelegen in de linkerbovenhoek van het kaartgebied. Hiermee wordt een uniek kenmerk op elke kaart gezet. Je kunt deze laag ook weglaten als je wilt. Sla het project op en onthoud de veldnaam die je hebt gebruikt (in dit geval ‘cr94421’).

Stap 2: Maak sjabloon

Maak een kopie van het qgs-bestand dat je in de vorige stap hebt gemaakt en noem het bijvoorbeeld ‘Sjabloon1.qgs’. Open deze kopie met Kladblok of WordPad en zoek naar de veldnaam (in dit geval ‘cr94421’). Vervang deze veldnaam door een nieuwe tekenreeks zoals ‘@REPLACEFIELD@’. Doe dat niet met automatisch zoeken en vervangen. Niet alle verwijzingen naar het veld moeten worden vervangen. Hoeveel vermeldingen je vindt, hangt af van de complexiteit van je kaart. Als je kaart zowel cirkels als datalabels bevat, komt de veldnaam meerdere keren voor in het projectbestand.

Stap 3: Prepareer Python script

Het Python script waarmee je projecten en snapshots op basis van je sjabloon kunt maken bestaat uit twee delen. Het eerste deel bevat de specificaties voor de kaarten die je wilt genereren:

  1. de naam van je sjabloon;
  2. het achtervoegsel dat achter de namen van project- en snapshot-bestanden kan worden gezet (mag ook leeg blijven);
  3. de datavelden om te gebruiken;
  4. de map waar de snapshots moeten komen.

Het tweede deel bevat de opdrachten om projecten en snapshots mee te genereren. Eerst wordt de snapshot-map aangemaakt, als deze nog niet bestaat. Dan wordt voor elk van de eerder genoemde velden:

    1. een kopie van het sjabloon gemaakt, met een naam gebaseerd op de veldnaam en het (optionele) achtervoegsel;
    2. overal in het nieuwe projectbestand ‘@REPLACEFIELD@’ vervangen door de veldnaam;
    3. een snapshot van het project gemaakt (als PNG-file);
    4. de PNGw-file die ook is aangemaakt verwijderd (schakel deze opdracht uit in het script-bestand als je de PNGw-bestanden wilt behouden).

Bewerk het bestand projectsnapshots.py uit het ZIP-bestand met een tekst editor (Kladblok, WordPad), pas het aan je wensen aan en sla het op.

Stap 4: Voer Python script uit

Start QGIS en open de Python Console (via het Plugins-menu). Start het script met een opdracht als: “execfile(‘C:/QGIS/Projects/PythonSnapshots/projectsnapshots.py’)”. Open daarna de snapshot-map om het resultaat te bekijken. Als je de miniatuurweergave selecteert, krijg je een snelle impressie van de gegenereerde kaarten.

Download

Download ZIP-bestand met volledig voorbeeld

Join the Conversation

13 Comments

  1. Dear Sake ,
    I tested the .py file under window 7 and QGIS 1.8.
    I changed the path in the python file like this: “C:/Users/aquesnel/Documents/GIS DataBase/Sake_Wagenaar_Python/”
    I abtained all files. But the size of files are smaller than yours
    But I can’t open the .qgs file with QGIS
    An error message appeared : Impossible to start the program qwt5.dll is missing: try to install again the qgis program to correct the problem

    1. The result of my first script is very dependent on the area displayed on the map canvas before the script is executed. That may explain the smaller images (but not the very large width). Try to zoom in to the layer extent before starting the script. I’m working on a new version of the script that is less sensitive to the extent of the map canvas before execution.
      I never got the error message you wrote about. The file qwt5.dll is a standard part of the QGIS installation. I don’t know a solution (maybe you can find a solution on http://gis.stackexchange.com). You shouldn’t try to open one of the generated project files from the ‘projects’ folder (move them one level up first, otherwise QGIS will crash).

    1. I can’t see the project file you wrote about on your server (I don’t see files, only the content of the HTML file).

  2. To see my project files ==> http://quesnela.free.fr/Python/projects
    I will take more time in september for finding a solution on http://gis.stackexchange.com).
    It’s work!! OK ==>To open one of the generated project files from the ‘projects’ folder (move
    them one level up first).
    With your new ZIP file containing a new version of the script.py and qgs-files (I can open both of them) .
    I got smaller maps again!
    Then I zoom the template layer before starting .py file and It’s work!!
    Thank you very much!
    Anne Q

  3. Dear Sake,
    I am working on the new versions of psql (9.3) postgis (2.1.0) and Qgis (Dufour-2.0.1).
    I am testing again your files inside the Dufour Qgis Version
    In order to build my own file: “MapTitles” with its attributes like in your example: toelichting, geometrie, cr94421, …
    How do you find, or determine coordinates of the label point geometrie (1500 624500) ?
    then i will add a new text layer in my project to display the label “cr94421”
    Thank you
    Anne Q

    1. You can find the coordinates for your titles by pointing with the mouse on the map canvas. On the status bar below the map canvas, you can see the coordinates change while you move the mouse.

  4. I can reproduce the Python script, under Qgis (Dufour-2.0.1), a chorepleth map in my exemple.
    But with the Generate series of maps with Python script, how can we display a legend of the map (without the composer module), because you need legend for interpretation of maps.
    Best Regards
    Anne Q

    1. I don’t know how to generate a legend with Python. Some time ago, I wrote a Windows program to create legends in SVG format. I refer to the article on this site. Inkscape can be used for the final touch.

Leave a comment

Your email address will not be published. Required fields are marked *