Insérer un champ de date automatiquement mis à jour dans QGIS

Posted on dim. 05 février 2017 in Software


Update du 06/08/2018

J’ai découvert qu’il existe une fonction dédiée parmi celles proposées par QGIS… Je ne sais pas depuis quand elle est là, mais il est donc inutile d’utiliser la solution proposée en deuxième partie. Je la laisse pour référence, ça permet de voir comment on peut définir des fonctions personnalisées à appeler ensuite dans QGIS.

Lorsque j’édite une carte avec QGIS, une des informations que j’indique toujours est la date de réalisation. Pour que celle-ci puisse être mise à jour automatiquement, il est possible de combiner deux fonctions mises à disposition par QGIS : date_format et now. date_format prend deux paramètres : la date et le format dans laquelle elle doit être affichée. Cette date, c’est now qui va nous la donner. Concernant le format, le mieux est de lire la documentation donnée par QGIS dans la description de la fonction, car celle-ci utilise une nomenclature propre à Qt.

date_format(now(), 'MM/yyyy')

Ancienne version

Il est possible d’utiliser tout un tas de variables et fonctions pré-définies pour remplir des champs de texte dans QGIS, que ce soit dans le composeur d’impression, dans l’outil d’étiquetage… Une des informations récurrentes que j’ajoute à mes cartes est la date d’édition. Pour la garder automatiquement à jour, il est possible de créer une fonction Python renvoyant la date actuelle.

[Champ de date personnalisée dans QGIS avec Python](http://www.jmagnin.fr/wp-content/uploads/2017/02/qgis_insert_date.pdf)

Insérer une date dans un champ de texte

Insérer la date du jour dans un champ – sans toutefois afficher l’heure – avec les fonctions incluses dans QGIS est assez pénible. Vous devez en effet combiner quatre fonctions dans la fonction concat (sans vous tromper si possible).

from qgis.core import *
from qgis.gui import *
from datetime import date

@qgsfunction(args='auto', group='Custom')
def curdate(feature, parent):
    ajd = date.today()
    return ajd.strftime('%d/%m/%Y')

C’est un début, mais le format es figé. Nous ne pouvons pas afficher « 14 juillet 2016 » au lieu de « 14/07/2016 », ni faire d’autres adaptations sans éditer la fonction. Nous pouvons améliorer cette fonction en lui faisant accepter en premier paramètre le format de date à adopter.

from qgis.core import *
from qgis.gui import *
from datetime import date

@qgsfunction(args='auto', group='Custom')
def curdate(formatDate, feature, parent):
    ajd = date.today()
    if formatDate is '':
        formatDate = '%d/%m/%Y' # Format par défaut
    return ajd.strftime(formatDate)

Pour utiliser cette fonction, il suffit de l’appeler en lui passant le format de date en paramètre.