23 avr 2015

Ce billet de blog est dédié à la présentation d'un plugin nommé "Interactive Map tracking", développé par  Lionel Atty (IGN, SIDT) et Rémi Cura (IGN, THALES). La rédaction de ce billet a également été réalisée par Lionel et Rémi.

Avant lecture de ce billet, nous vous invitons à visualiser la vidéo ci-dessous mettant en avant les fonctionnalités du plugin "Interactive Map tracking". Pour faire bref, ce plugin s'articule autour de deux grandes fonctionnalités que nous allons présenter dans la suite du billet :

  1. - Faciliter la saisie et la vérification de données dans QGIS en mode multi-utilisateurs
  2. - Les fonctions avancées de PostGIS: les triggers

Le plugin est disponible dans le dépôt de plugin QGIS sous le nom "Interactive Map Tracking" ou à l’adresse suivante: http://remi-c.github.io/interactive_map_tracking/.

Objectif #1 du plugin: Faciliter la saisie et la vérification de données en mode multi-utilisateurs dans QGIS.

Concrètement ce plugin est née avec l'envie de faciliter la saisie de données géographiques en mode multi-utilisateurs dans QGIS, en bref vous faciliter la vie et rendre le travail plus agréable. Pour bien comprendre notre plugin, précisons que lorsque nous saisissons/vérifions des données géographiques, nous sommes confrontés à deux grands types de problème:

  1. Quelles sont les zones qui ont déjà été saisies/vérifiées par un opérateur?
  2. Comment gérer le mode multi-utilisateurs de manière efficiente?

 Concentrons-nous tout d'abord sur le problème numéro 1:

Lorsque nous effectuons de la vérification de saisie de données géographiques, il n'est pas évident d'identifier facilement les zones, que nous avons déjà effectuées. Pourtant cette information est primordiale pour travailler de manière organisé et efficace.
Par exemple, imaginons que vous commenciez à vérifier vos données géographiques, puis que vous alliez  prendre un café au bout de deux heures, histoire de reposer vos yeux! À votre retour, il n'est pas forcément évident que vous vous souveniez des zones que vous avez déjà traitées.
Pour faire face à ce problème, nous avons développé le plugin QGIS Interactive Map Tracking.  L’idée est assez simple, le plugin va enregistrer en continu la couverture géographique de votre viewer QGIS. Typiquement, si vous êtes en train de visualiser une zone géographique en particulier depuis votre fenêtre QGIS, celle-ci va être enregistrée grâce au plugin. Nous appelons cela du tracking de caméra. La Figure 1 illustre ce tracking, matérialisé par le rectangle vert correspondant à l’emprise géographique que l’utilisateur avait sur son écran avant de passer à une échelle plus petite (dézoomer).

Figure 1

Au fur et à mesure que l'utilisateur se déplace, les nouvelles zones géographiques visualisées sont enregistrées. La série de rectangles verts illustrée par la Figure 2.

Figure 2

Il est important de préciser que le plugin enregistre uniquement les zones visualisées correspondant à l'échelle minimum indiquée par l'utilisateur. Cette échelle minimum est directement paramétrable dans les préférences du plugin. Cette option est importante pour permettre aux utilisateurs d'avoir une vue d’ensemble, sans que cela ajoute de rectangle de suivi dans le tracking.

Outre le fait d'enregistrer la position de la caméra de QGIS, le plugin enregistre également l'heure et le nom de l’utilisateur. Cette option permet notamment de symboliser les rectangles d'emprise avec des propagations de couleurs, afin de savoir dans quel ordre la saisie a été faite. La Figure 3 illustre un dégradé du bleu au rouge, cela signifie que l’utilisateur a saisi d'abord la partie droite de l'écran puis s'est déplacé vers la partie gauche de l'écran.


Figure 3

Grâce à cette symbolisation, on identifie en un coup d’œil, où l'utilisateur a déjà travaillé, et surtout ce qu’il reste à faire. À noter que ces informations sont stockées dans une couche vecteur QGIS paramétrée directement dans les préférences du plugin. Cette couche vecteur peut être de différents formats (shapefile, postgis, ...) en revanche elle devra de type polygoniale et contenir les champs suivants:

  1. Intitulé du champ: user_id & type: text
  2. Intitulé du champ: w_time & type: text

Par exemple, vous pouvez simplement créer un fichier shapefile avec ces attributs, l’ajouter à votre projet QGIS, et c'est parti vous pouvez commencer à tracker !

Passons désormais au problème numéro 2:

Saisir et/ ou vérifier des données géographiques sont des tâches particulièrement ingrates notamment si on est seul à le faire! Le plugin propose de simplifier la gestion des tâches de saisie en mode multi-utilisateurs. Pour cela, il s'appuie sur une couche de tracking de type PostGIS. Cette couche doit contenir les mêmes champs que dans le cas simple utilisateur précédemment évoqué:

  1. Intitulé du champ: user_id & type: text
  2. Intitulé du champ: w_time & type: text

Grâce à cette option, lorsque plusieurs utilisateurs font de la saisie en simultané, le plugin va enregistrer les positions géographiques de leur caméra respective. En plus du temps passé par zone, le plugin enregistre également le nom d’utilisateur. Grâce à ces options, il est possible de symboliser les positions des caméras en fonction des noms d’utilisateurs. La Figure 4 illustre la saisie de différents utilisateurs à travers les deux couleurs vertes (ne tenez pas compte des arrondis des rectangles pour le moment).

Figure 4

L’idée est similaire à celle proposée par Framapad, pour l'édition collaborative de document. Par ailleurs cette option permet à l'opérateur de saisie d'identifier où sont les autres utilisateurs sur la carte!  La Figure 5 illustre une situation à 3 utilisateurs, nous avons ajouté leurs noms pour faciliter la compréhension.

Figure 5

En résumé, le plugin améliore considérablement les conditions pour la saisie de données géographiques en mode multi-utilisateurs, permettant d'identifier:

  • les zones qui ont déjà été traitées par les autres opérateurs
  • les zones où les autres utilisateurs sont en train de travailler

Le plugin permet donc d’être plus efficace dans le travail de saisie ou de vérification collaborative, et surtout de ne pas retraitée une zone déjà saisie ou vérifiée par un autre opérateur.

Pour aller plus loin :

Nous proposons d’aller plus loin, en utilisant des fonctionnalités avancées de PostGIS. En effet, dans ce que nous venons de présenter, c’est à l’utilisateur de bien faire attention à ne pas aller sur une zone déjà traitée. Hors un utilisateur distrait pourrait ne pas faire attention et retraiter des zones déjà traitées.
Afin d'éviter cette situation, il est possible de créer des vues PostGIS qui vont automatiquement afficher des messages d’alerte dans deux cas particuliers, lorsque:

  • Un même utilisateur revisite une zone qu’il avait déjà traitée, il y a plus de 5 minutes (exemple de message : « attention, c’est déjà fait, il ne faut pas refaire le travail à cet endroit », Figure 6)
  • Deux utilisateurs différents sont en train de faire la même chose au même moment (« attention, vous êtes en train de faire le même travail », Figure 7)
Figure 6
Figure 7

Enfin, vous avez surement remarqué que les rectangles de saisie possèdent des angles arrondis. Nous considérons que lors d'une tâche de saisie, les utilisateurs ne saisissent pas les objets se trouvant dans les coins de son écran. En effet, dans ce cas de figure l’utilisateur aura plutôt tendance à déplacer sa caméra pour mieux centrer l’objet à saisir. Cela est fait à travers un trigger PostGIS, qui arrondi automatiquement les angles.

Il est possible d'aller encore plus loin, et introduire un côté "FUN" à la saisie de données géographiques, oui oui on ne croirait pas, mais c'est possible. Il est prouvé qu’une tache est plus agréable quand elle est présentée comme un jeu. L’idée est simple, on va créer une grille sur la zone que l'on souhaite saisir, par défaut toutes les cellules sont coloriées en rouge. Lorsqu’un utilisateur survole une partie de la grille, celles-ci se colorient en bleu.

D’abord, il faut définir la zone sur laquelle vous souhaitez effectuer des saisies. Grâce aux triggers de PostGIS, il est possible de définir une couche qui va automatiquement créer une grille hexagonale lorsqu’on saisit un polygone dans celle-ci. La figure 8 illustre une situation où l’utilisateur trace le polygone vert, et cela crée automatiquement la grille hexagonale rouge.

Figure 8

Lorsque l’utilisateur effectue une saisie, sa position de caméra est enregistrée, et cela colorie automatiquement les cellules concernées de la grille en bleu. La figure 9 illustre les ovales bleu clair correspondant aux positions de la caméra, et on peut voir la grille hexagonale qui change de couleur (passe de rouge à bleu) sur la figure 10.

Figure 9

On voit du premier coup d’œil les parties qui ont été faite (bleue) et celles qui reste à faire (rouge)! Que le plus rapide gagne!

Figure 10

Objectif #2 du plugin: les triggers (fonctions avancées de PostGIS)

Nous avons dit au début que ce plugin est en fait deux plugin en un. La première partie que nous avons détaillée ci-dessus permet d’enregistrer la position de la caméra d’utilisateurs.

La deuxième partie, complètement indépendante, fonctionne avec des couches PostGIS (uniquement) et permet lorsqu'on édite une couche dans QGIS, les modifications sont gardées en réserve jusqu’à ce qu’on les sauvegarde. C’est seulement à ce moment-là que ces modifications sont vraiment envoyées à la base de données (PostGIS).
Pour expliquer simplement, le plugin désactive le système de cache, et force une synchronisation entre la couche PostGIS manipulée sous QGIS et la base de données (PostGIS). Ce qu'on voit sous QGIS est le reflet immédiat de ce qui est stocké dans la base de données (PostGIS).

Cela nous permet de profiter d’un nouveau monde de possibilités : celui des triggers. Les triggers sont des fonctions qui existent dans les systèmes de base de données. Elles sont associées à une table, et sont exécutées dès que cette table est modifiée. Par exemple, comme nous l'avons expliqué ci-dessus, dès qu’un rectangle de position de caméra est enregistré, le plugin enregistre à la place une version du rectangle sur laquelle on arrondi les angles.

Ce qui est intéressant  c'est que nous pouvons exploiter ce comportement pour faire des interactions puissantes dans QGIS. Par exemple, nous créons une table de polygones adding_grid. Nous ajoutons une triggers qui va créer une grille hexagonale à l’emplacement définie par le polygone de adding_grid. Lorsqu’on ajoute un polygone à cette table, la table de la grille est automatiquement remplie. C’est instantané pour l’utilisateur (figure 11 et 12).

Figure 11
Figure 12

On peut aussi ajouter des triggers qui vont mettre à jour la grille pour qu’elle soit toujours sous ce polygone, même si celui-ci est modifié (Figure 13).

Figure 13

Ainsi, l’utilisateur contrôle un objet compliqué (une grille hexagonale) avec un objet simple (un polygone).

Les triggers délivrent des potentialités techniques vraiment puissantes. La Figure 14 illustre un exemple très avancé de ce qui peut être fait avec les triggers. Une action de l'utilisateur entraîne un ensemble de modifications, de manière instantanée, et complètement transparent pour l'utilisateur. Dans l'exemple ci-dessous, l’utilisateur édite une simple ligne, et cela déclenche le recalcul de toutes les surfaces du modèle de route afin qu’il reste cohérent.


Figure 14

Notre plugin est open source. Par conséquent, nous serions très heureux d’avoir des retours sur:

  • ce que vous faites avec
  • ce que vous souhaiteriez faire avec
  • etc.

Dans tous les cas, si vous avez des idées d’amélioration, constaté des bugs, ou si vous voulez juste laisser un message, vous pouvez le faire à travers le lien suivant : https://github.com/Remi-C/interactive_map_tracking/issues

Lionel & Rémi

 

A propos de l'auteur: 
invite