Een serie kaarten genereren

[Ga voor een aangepaste versie naar dit artikel.]

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. De stappen worden beschreven voor Windows, maar het moet niet zo moeilijk zijn om voor Linux een vergelijkbaar script te ontwikkelen.

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 batch-bestand 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 het batch-bestand 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 batch-bestand

Het batch-bestand waarmee je projecten en snapshots op basis van je sjabloon kunt maken bestaat uit drie 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 instellingen voor QGIS. Controleer of OSGEO4W_ROOT naar de juiste map op jouw systeem verwijst. Het derde 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. een extern programma gebruikt om overal in het nieuwe projectbestand ‘@REPLACEFIELD@’ te vervangen door de veldnaam;
    3. QGIS gestart om een snapshot van het project te maken (als PNG-file) en direct weer afgesloten;
    4. de PNGW-file die ook is aangemaakt verwijderd (wis deze opdracht uit het batch-bestand als je de PNGW-bestanden wilt behouden).

Klik op het volgende plaatje om de inhoud van een voorbeeld van een batch-bestand in tekstformaat te bekijken. Kopieer de inhoud in een teksteditor (Kladblok, WordPad), pas het aan je wensen aan, sla het op en zorg dat de bestandextensie ‘.bat’ wordt.

Stap 4: Voer batch-bestand uit

Voer je nieuwe batch-bestand uit door dubbel klikken vanuit de Windows Verkenner. Bekijk het verloop in het commandovenster en let op eventuele foutmeldingen. Open de snapshot-map om het resultaat te bekijken. Als je de miniatuurweergave selecteert, krijg je een snelle impressie van de gegenereerde kaarten.

Beperkingen

Er zijn helaas problemen met de snapshot-functie in de nieuwste versie van QGIS (1.8.0). In dit artikel wordt per kaart slechts één veld gevarieerd. Voor taart- of staafdiagrammen zouden zowel het sjabloon als het batch-bestand complexer worden. Download ZIP-bestand met volledig voorbeeld

13 thoughts on “Een serie kaarten genereren”

  1. Tonnes of thanks – it works perfectly.

    I had to modify slightly the batch file to take into account spaces in the path:
    @echo off
    REM This batch file generates a series of QGIS-projects, based on a template. For each project a snapshot is generated.
    REM The program fart.exe is supposed to be in the same folder. Check if the location of qgis.exe is correct for your system.
    REM (Sake Wagenaar, 28 July 2012)

    SETLOCAL

    REM ==============================================================================
    REM CUSTOM DATA:
    REM ==============================================================================
    SET TEMPLATE=Template1.qgs
    SET SUFFIX=_test
    SET FIELDS=cr94421 cr94271 cr94301 cr94272 cr94281 cr94282 cr92513 cr91080 cr95672 cr94312
    SET SUBDIR=.\snapshots
    REM ==============================================================================

    REM ==============================================================================
    REM GENERAL SETTINGS FOR QGIS (from qgis.bat):
    REM ==============================================================================
    SET OSGEO4W_ROOT=C:\Program Files\_Carto\Quantum GIS Wroclaw
    call "%OSGEO4W_ROOT%\bin\o4w_env.bat"
    echo "%OSGEO4W_ROOT%\bin\o4w_env.bat"
    call "%OSGEO4W_ROOT%\apps\grass\grass-6.4.2\etc\env.bat"
    @echo off
    path %PATH%;"%OSGEO4W_ROOT%\apps\qgis\bin";"%OSGEO4W_ROOT%\apps\grass\grass-6.4.2\lib"
    REM ==============================================================================

    REM ==============================================================================
    REM EXECUTION
    REM ==============================================================================
    IF NOT EXIST %SUBDIR% md %SUBDIR%
    for %%f in (%FIELDS%) do (
    echo --------------------------------
    echo PROJECT: %%f%SUFFIX%.qgs
    echo --------------------------------
    copy %TEMPLATE% %%f%SUFFIX%.qgs
    fart -c %%f%SUFFIX%.qgs @REPLACEFIELD@ %%f
    echo SNAPSHOT: %%f%SUFFIX%.png
    start "" /wait "%OSGEO4W_ROOT%\apps\qgis\bin\qgis.exe" --project %%f%SUFFIX%.qgs --snapshot %SUBDIR%\%%f%SUFFIX%.png --width 675 --height 770
    del %SUBDIR%\%%f%SUFFIX%.pngw
    )

    ENDLOCAL

  2. Awesome work, but for some weird reason it stalls on my computer after having opened QGIS and never generates the PNGs… Any idea why??

    Many thanks!

  3. Dear SW,
    I Thank you a lot, I was looking for this type of processes, programs!!!!
    I have to do the same type of work with a html output like e-atlas of maps
    and also i have to add iteration to obtain all maps by qgis-projects at
    time 0, time 1, time 2 and so on with (postgis database ).

    1)My first question: I suppose this process could be program in python?
    why do you prefer program in batch or bash for linux?

    2) Do you have some references about doc, guides that I am looking for ?
    “programming in batch for windows 7″
    and programming in bash for ubuntu?

    3) In windows 7 and XP
    at the moment, I only tested your first program for windows.
    I have installed QGIS-OSGeo4W-1.8.0-2-Setup
    I ve changed some paths that you can read on the .bat snapshotsproject file

    OSGEO4W_ROOT=C:\Program Files (x86)\Quantum GIS Lisboa1.8.0
    call “%OSGEO4W_ROOT%\apps\grass\grass-6.4.3RC2\etc\env.bat”

    I can obtain all projects but without “png” and “pngw files”! the
    snapshot directory is created (after deletting yours that you included in
    the zip file)!

    also, in xp I obtained all projects
    but i obtained error message ” the system can’t find the specified path”
    I tested your program(without png step) and I obtained an error :
    “– project” the system can’t be find

    Can you help me for those last steps of your batch program?

    4) In linux, you wrote that your program didn’t work with the “1.8 qgis”
    version”! and you tested your program under 1.9.0-Master.

    I know that the version 2.0 will be able on september after “FROG 2013 in
    Paris (OsGEO first french colloquium)”, but they said us that all old
    qgis-projects couldn’t work in the new 2.0 version of qgis!

    So I am not sure if the 1.9.0-master is the future new version 2.0 for non
    developer?
    I have work for the moment a lot on ubuntu 12.0 with qgis 1.8, pgadmin,
    postgis etc..

    thank you a lot
    I am going to look for some batch, ms-dos and bash books!
    have a nice week-end
    Anne Quesnel

    1. I was already familiar with DOS/Windows batch files (and to some extent with Linux shell scripts). It would take too much time to learn how to program in Python with the QGIS API. I didn’t use a general guide about batch or script files. I searched on the internet for specific examples. Bash is the same for all Linux distributions. If you are going to write your own batches or scripts, I advise to use a text editor with syntax highlighting (for Windows you could use Notepad++).

      There is a reported bug in the snapshot function of QGIS (the program freezes after opening the project; no snapshot is made). With QGIS 1.8 it only works on my Windows 8 pc (not on my Windows 7 netbook or my Linux system). With the QGIS 1.9-Master it only works on my openSUSE Linux system. This version wil eventually be released as QGIS 2.0.

      The error message you get, can possibly be solved by adding a double quote at the end of the line with the start command. I also use this in a newer version of my Windows batch file (search and replace is now done with sed.exe, already included in the QGIS installation). I don’t expect it to work with Windows 7 (because of the snapshot bug), but I would be interested to know if this works with Windows XP.

      1. Dear Sake,

        I had not a lot time until now today,
        so

        1) In windows 7 and XP
        *I have obtained with your new file.bat the same results with both systems!

        *I can obtain all projects in the subdirectory : projects
        and the index.html file in the subdir “snapshots”.
        but now, I can’t open the obtained project files from this new .bat file
        ==>QGIS met a problem and it has to shutdown the exe(i attached a new qgs
        project giving a crash)

        *but a good point! I can open the template1.qgs without problem for QGIS.exe

        *I always can’t obtain the “png” and “pngw files”

        *In xp there is no more Error message ” the system can’t find the
        specified path”

        I thank you a lot
        Best Regards,
        Anne
        PS what’s your job? profession? training?
        do you have a personal web site?

        1. The problem with the project files generated by my batch file, is that they are moved to a different folder, after the snapshots have been made (or should have). In de project file, the paths to the data files are relative paths, so QGIS can’t find the data. If you move the project files back, you should be able to open them from QGIS. It seems the snapshot function does not work with Windows XP either (like I described here a year ago: http://hub.qgis.org/issues/4076).

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

De volgende HTML tags en attributen zijn toegestaan: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>