Réaliser une carte interactive avec GoGoCarto et Grist

Bonjour à toustes,

Celles et ceux d’entre vous qui ont assisté au club utilisateurs Grist du 25 novembre se rappellent peut-être de la présentation qu’ont fait mes collègues d’Open Source Politics d’une carte interactive que nous avons réalisée pour l’association A+ c’est mieux !. Cette carte s’appuie notamment sur Grist, et nous allons détailler ici comment construire votre propre carte sur le même principe.

L’outil qui servira ici à afficher la carte s’appelle GoGoCarto. Il récupérera les données de votre tableau Grist qui doit contenir au moins une latitude et une longitude pour chaque lieu à cartographier (le géocodage et l’obtention de ces coordonnées ne font pas l’objet de ce tutoriel).

Méthode 1 : connecter directement GoGoCarto à Grist (données ouvertes)

Cette méthode est la plus simple à mettre en place, mais nécessite d’ouvrir un l’accès public en lecture seule à votre document Grist. Elle est donc adaptée à un jeu de données ouvertes, mais pour les autres cas, faites preuve de prudence et envisagez la seconde méthode décrite ci-dessous.

  • Une fois l’accès public accordé, copiez l’URL de base pour ce document (page « Paramètres » > « API » > « ID du Document »)
  • Dans la page d’administration de GoGoCarto, ouvrez « Données / Import » > « Import Dynamique »
  • Cliquez sur « Ajouter », et collez l’URL de base précédemment copiée dans le champ « Ou URL vers une API JSON »
  • Vous devez ensuite suffixer cette URL avec /tables/IdentifiantDeTable/records, « IdentifiantDeTable » correspondant au tableau qui contient vos latitudes et longitudes (vous trouverez cet identifiant dans la page « Données source » de Grist)
  • Ouvrez l’onglet « Modifiez les données en exécutant du code » et collez la ligne suivante dans le bloc PHP : $data = $data['elements'];
  • Cliquez sur « Sauvegarder » et n’oubliez pas de remplir la table de correspondance des champs dans l’onglet « Transformer les données à importer »

Merci à @Wunderbarcarole de m’avoir suggéré cette méthode !

Méthode 2 : connecter GoGoCarto à Grist via n8n (accès sécurisé)

Si votre document Grist n’a pas vocation à être accessible au public, il vaut mieux que GoGoCarto s’y connecte par un accès sécurisé ; or, cela n’est pas possible directement. Il faudra donc utiliser n8n pour fournir cet accès sécurisé et faire le lien entre Grist et GoGoCarto :

Créer le workflow n8n

Téléchargez ce fichier JSON pour ensuite l’importer dans n8n et initialiser le workflow.

Voici à quoi il doit ressembler :

Tout d’abord, un webhook fait office de point d’entrée de la donnée. C’est là que se trouve l’URL que vous devrez renseigner dans GoGoCarto pour faire dialoguer ces outils entre eux (cf. étapes suivantes) :

  • HTTP Method = GET
  • Authentication = None
  • Respond = When Last Node Finishes (le webhook renverra automatiquement la donnée produite par le dernier nœud exécuté)
  • Response Data = First Entry JSON
  • Cliquez sur « Add Option » et ajoutez Response Content-Type = application/json

L’étape suivante du workflow est un nœud Action in a app > Grist dans lequel vous allez préciser le tableau qui contient les données à cartographier :

  • Pour créer les identifiants (credentials) nécessaires à la connexion, renseignez la clé API disponible dans les paramètres de votre compte Grist
  • Operation = Get Many rows
  • vous devez renseigner le docID du document Grist contenant le tableau (disponible via Grist dans la page « Paramètres », section « API ») et le Table ID du tableau (page « Données source »)
  • Activez l’interrupteur « Return All »
  • Vous pouvez ajouter un filtre sur une colonne pour ne récupérer qu’une partie des données du tableau, comme vous le feriez dans Grist. Vous pourrez ainsi filtrer les données sur une colonne de validation (à créer au préalable dans le tableau Grist) et vous assurer que les données non validées ne transitent pas vers GoGoCarto.

Le nœud suivant est de type Data Transformation > Edit Fields : c’est la couche de normalisation. Grâce à lui, chaque colonne provenant de Grist sera renommée, typée, et éventuellement convertie (texte, booléen, liste, coordonnées, etc.) pour correspondre exactement à la structure attendue par GoGoCarto. Paramétrez ce nœud en fonction du modèle de données que vous voulez définir.

Le nœud final est Data Transformation > Aggregate, qui regroupe toutes les lignes transformées en un seul tableau, lequel est envoyé à GoGoCarto par le webhook :

  • Aggregate = All Item Data (Into a Single List)
  • Put Output in Field = Data
  • Include = All Fields

Connecter GoGoCarto au n8n

  • Dans la page d’administration de GoGoCarto, ouvrez « Données / Import » > « Import Dynamique »
  • Dans l’onglet « Général », précisez bien " Type de la source = API JSON" ainsi que l’adresse du webhook (cf. étapes précédentes) dans « URL de l’API JSON »
  • Sur ce même onglet, vérifiez la fréquence de mise à jour des données

Une fois ces réglages sauvegardés, vous n’avez plus rien à faire : GoGoCarto enverra automatiquement la requête GET via n8n pour remplir votre carte avec les données de votre Grist.

7 « J'aime »

Beau travail @ailepet :fire: !

1 « J'aime »

Bonjour,
Pourquoi utiliser n8n ? L’alimentation de la gogocarto peut se faire en direct, je ne comprends pas bien le besoin de l’intermédiaire…
Bien cordialement,

Carole

Bonjour Carole,
À ma connaissance, la seule façon d’importer des données Grist directement dans GoGoCarto, sans intermédiaire, est d’exporter un fichier CSV dans Grist avant de l’importer dans GoGoCarto. Mais ce faisant, vous devrez répéter cette opération manuellement après une modification du document Grist si vous voulez que cette modification se répercute sur la carte. L’intérêt d’utiliser n8n ici est de permettre une synchronisation automatique de la carte GoGoCarto avec les informations contenues dans le document Grist.
Mais peut-être qu’il existe une autre approche qui m’échappe ?

Bonjour Laurent,
Alors, ne connaissant pas n8n au début, j’avais simplement connecté dans l’import dynamique l’API de grist


Je fais une maj quotidienne et ca fonctionne toujours. Après, je ne fais qu’alimenter la carte, je n’ai pas testé la partie alimentation du Grist.
Cordialement,

Carole

Voilà qui est intéressant. J’ai fait des essais de mon côté (avec une URL qui se termine par /tables/NomDeMaTable/records) et GoGoCarto ne semble pas comprendre sa structure de données : l’onglet " Table de correspondance des champs" ne trouve pas les champs à traiter. C’est aussi l’utilité du n8n dans ce tutoriel : le workflow inclut une étape de normalisation des données pour s’assurer que GoGoCarto les interprète correctement. Du coup, je suis curieux de savoir comment vous y parvenez de votre côté.

Quand vous dites « je ne fais qu’alimenter la carte », en quoi ça consiste exactement ? Quand vous voulez ajouter une nouvelle adresse à afficher sur la carte, vous modifiez bien le document Grist pour ajouter une nouvelle ligne à votre table « TableRecap » ?

Bonjour Laurent,
Sur la page Editer de l’import dynamique, j’ai l’onglet « Modifier les données en executant du code ». Là, je saisis un tout petit script : <?php
$data = $data[‹ records ›]; qui me permet de lire la structure de mon flux. Les explications données sur la page sont très claires pour le faire sans forcément connaître le code.
Oui, j’alimente bien mon Grist pour chaque nouvelle adresse à afficher sur la carte, mais je ne récupère pas en automatique les infos ajoutées directement sur la carte pour alimenter mon Grist.
Je n’ai pas encore n8n connecté sur ma base :slight_smile: donc avec les moyens du bord
Bonne journée,
Carole

1 « J'aime »

Bonjour Carole,

En effet, cette possibilité de parser les données JSON via du PHP m’avait échappé ! Je vais éditer mon message pour y ajouter cette possibilité. Merci pour cet éclairage !

1 « J'aime »

Bonjour,
J’essaie de relié mon Grist à Gogocarte : je suis bloquée
voici mon code qu’est-ce que je saisie exactement dans le code php merci pour ton aide