Présentation d’Open data Kit aux géomaticiens de Biotope et de sa place dans notre système d’information
ODK mise à jour automatique d’un jeu de données externe depuis la base de données.
Contexte
cet article est une traduction de celui-ci, dans lequel vous trouverez les formulaires dont il est question ici.
Comme pour l’article de Florian May publié sur le forum d’ODK, il est question ici de suivi de tortues,
mais en France et sur une espèce d’eau douce, la Cistude d’Europe, Emys Orbicularis.
Même si la tortue Caouanne fait son retour sur nos plages de méditerranée, un suivi tel que celui mis en place en Australie n’est pas encore nécessaire 😉
Pour suivre le populations de cistude, les collègues posent les pièges le premier jours de la semaine, qu’ils relèvent les 3 jours suivants.
Les individus capturés sont marqués (s’ils ne le sont pas déjà) et mesurés. L’ensemble des information est actuellement noté sur une fiche papier.
Au cours du printemps 2022, Vivian Millet, en stage de formation Idgéo a developpé un formulaire dédié à ce protocole.
Au cours des discussions avec les collègues en charge du terrain, ils nous ont expliqué que les pièges changent de place toutes les semaines, et qu’un suivi plus fin de leur emplacement serait utile.
Jusqu’à maintenant, le numéro du piège était reporté sur la fiche de capture. Et les pièges localisés à la main sur une carte.
Nous avons proposé de gérer ce référentiel de pièges dans ODK, et de mettre à jour la liste des pièges mobilisables dans le formualire de capture quand ils sont déplacés.
Nous avons donc développé un formualire dédié à la pose des pièges.
Une fois ce formualire fonctionnel, nous avons voulu adapter ce test et le rendre aussi automatique que possible.
L’idée générale est la suivante :
- si les pièges sont déplacés (= si on utilise le formulaire de pose de pièges)
- alors on met à jour le référnetiel des pièges utilisés dans le formulaire de capture (= on génère ce référentiel avec les nouvelles données et on l’envoi à ODK Central)
- et on met à jour le formulaire (= on publie une nouvelle version)
Mise ne oeuvre
C’est parti !
Nous avons donc développé deux formulaires :
- _CMR_Cistude_pose_pieges_ utilisé pour la pose des pièges
- et _CMR_Cistude_captures_ utilsisé pour le suivi des individus capturés
Toutes les requêtes SQL présentées ci-dessous sont executées dans notre base de données « métier ». Rien n’est exécuté dans la BDD de Central à laquelle nous ne touchons jamais.
Nous utilisons une tâche cron (tous les jours à 22h) qui exécute les requêtes suivantes :
Nous utilisons pour cela les fonctions de central2pg, placées dans le schéma _data_fromcentral schema pour récupéréer les données relatives aux pièges :
SELECT data_from_central.data_from_central_to_pg(
'my_login','my_password','my.central.fdqn',5,
'CMR_Cistude_pose_pieges', -- form ID
'data_from_central', -- schema where to create tables and store data
'point,point_auto' -- columns to ignore in json transformation to database attributes (geojson fields of GeoWidgets)
);
Nous avons créé une vue appelée _cmr_cistude_pose_pieges_sessioncourante qui retourne seulement les pièges posés lors de la dernière sessions (max(date)).
Le resultat de cette vue est copié dans un fichier geojson, dans un endroit accessible en écriture à l’utilisateur postgres. (commande COPY TO…)
Pour le moment, cette requête est executée même s’il n’y a pas de nouveau piège.
Ce geojson est ensuite utilisé par le formualire de capture pour proposer à la personne qui capture les cistudes de choisir le piège visité sur une carte :
-> https://docs.getodk.org/form-question-types/#select-one-from-map-widget
COPY (
WITH places AS (
SELECT id_piege, label, value, geometry
FROM data_from_central.cmr_cistude_pose_pieges_session_courante
)
SELECT
json_build_object(
'type', 'FeatureCollection',
'features', json_agg(ST_AsGeoJSON(t.*)::json)
)
FROM places AS t
) to '/home/postgres/medias_odk/pieges.geojson';
Nous utilisons un numéro de version de formulaire que nous avons souhaité « porteur d’information ».
Il est composé de l’année sur 4 caractères à laquelle nous concaténons le numéro du jour dans l’année (DOY) sur 3 caractères (complété par des 0 à gauche).
concat(extract(YEAR FROM date_max),lpad(extract(DOY FROM date_max)::text,3,’0′))
Nous comparons ensuite la version courante du formulaire avec son « hypothétique » nouvelle version.
Si cette dernière est plus grande que l’actuelle, nous créons un brouillon de formulaire.
Pour cela et pour les autres étapes, nous avons ajouté de nouvelles fonctions à la bibliothèque « central2pg »..
SELECT data_from_central.create_draft('my_login','my_password','my.central.fdqn',5,'CMR_Cistude_captures')
FROM data_from_central.cmr_cistude_pose_pieges_session_courante
WHERE concat(extract(YEAR FROM date_max),lpad(extract(doy FROM date_max)::text,3,'0')) > data_from_central.get_form_version('my_login','my_password','my.central.fdqn',5,'CMR_Cistude_captures')
LIMIT 1;
Une fois le brouillon créé, nous poussons le geojson comme pièce jointe à ce brouillon.
SELECT data_from_central.push_media_to_central('my_login','my_password','my.central.fdqn',5,'CMR_Cistude_captures', '/home/postgres/medias_odk', 'pieges.geojson')
FROM data_from_central.cmr_cistude_pose_pieges_session_courante
WHERE concat(extract(YEAR FROM date_max),lpad(extract(doy FROM date_max)::text,3,'0'))::integer > data_from_central.get_form_version('my_login','my_password','my.central.fdqn',5,'CMR_Cistude_captures')::integer
LIMIT 1;
Et nous publions la nouvelle version 😉
SELECT data_from_central.publish_form_version('my_login','my_password','my.central.fdqn',5,
'CMR_Cistude_captures', concat(extract(YEAR FROM date_max),lpad(extract(doy FROM date_max)::text,3,'0'))::integer )
FROM data_from_central.cmr_cistude_pose_pieges_session_courante
WHERE concat(extract(YEAR FROM date_max),lpad(extract(doy FROM date_max)::text,3,'0')) > data_from_central.get_form_version('my_login','my_password','my.central.fdqn',5,'CMR_Cistude_captures')
LIMIT 1;
Formulaire mobile généraliste 2022
Cette version apporte les améliorations suivantes à la version 2021 :
- passage à TAXREF v15
- Ajout précision si point placé sur une carte : https://forum.cen-occitanie.org/t/odk-formulaire-sicen-demandes-dameliorations/398/10?u=mathieu
- Création d’une simple station pour y ajouter des données plus tard
- Ajout de la mention du site (question si « non mentionné » est sélectionné) / remarque de localisation
- Idem pour étude et protocole si absent de la liste (question si « non mentionné » est sélectionné)
- Ajout déterminateur
- Voir masquage des préférences utilisateur (last_saved ou Coalesce) Si masquage → last_saved ou default Sinon valeurs renseignées.
- Détermination → valeur par défaut (Vu)
- Paramétrage masquage nommage du site
- Déplacement de la question présence / absence du taxon pour supprimer une action (par défaut présence et affichage des questions d’effectif)
- Caractère optionnel de la photo
- paramétrer la précision attendu du GPS
- La mention du site est un texte libre pour éviter la gestion du référentiel des sites
- Ajouts de la saisie des couples nicheurs et poussins pour les oiseaux
- Ajout du récapitulatif des espèces observées à un emplacement
- Ajout de la structure (domaine du mail) pour filtrage futur des études et protocoles
Le formulaire est décrit et disponible ici :
PoleSup 2021
Le support de cours :
Interroger une API depuis PostgreSQL
Mise à jour d’une ancienne fonction plpython.
CREATE EXTENSION IF NOT EXISTS plpython3u;
CREATE OR REPLACE FUNCTION outils.get_api_json_response(
api_url text)
RETURNS json
LANGUAGE 'plpython3u'
COST 100
VOLATILE PARALLEL UNSAFE
AS $BODY$
import urllib.request, ssl
context = ssl._create_unverified_context()
content=urllib.request.urlopen(api_url, context=context);
reponse = content.read().decode('utf-8')
content.close
return reponse
$BODY$;
SELECT outils.get_api_json_response('https://apicarto.ign.fr/api/cadastre/parcelle?code_insee=46263§ion=0A&numero=0692&source_ign=PCI')
Webinaire : « Des outils pour gérer et valoriser vos données d’observations naturalistes » organisé par Natural Solutions
Présentation du SI du Cen Occitanie et de son évolution
Merci à Natural Solutions pour l’organisation de ce webinaire !

ODK pour la collecte de données géo dans PostGIS (⅔)
Le second épisode, à lire sur Geotribu entre dans le détail de notre formulaire généraliste :
https://static.geotribu.fr/articles/2021/2021-06-22_odk_postgis_2/

ODK pour la collecte de données géo dans PostGIS (⅓)

Premier article d’une série de 3 sur Geotribu, consacrée à l’utilisation d’ODK avec PostGIS.
Merci à l’équipe pour l’accueil, les conseils, la relecture et les outils mis en place pour la publication.
https://static.geotribu.fr/articles/2021/2021-06-08_odk_postgis_1/
Formulaire mobile généraliste 2021
Suite aux discussions sur le formualire « 2020 » une série d’améliorations ont été apportées au formulaire « Sicen ». Le détail est à voir ici (en anglais) :
Et c’est la version 14 de TAXREF qui est intégrée et que vous retrouverez dans les listes.
Voici donc un tutoriel, sous forme de captures d’écrans, allant de la configuration d’ODK Collect à la fin de la saisie d’une donnée dans le formualire.
Évolution technique d’ODK
Avant de commencer, un (tout petit) peu de contexte technique.
ODK a remplacé le serveur Aggregate par un serveur plus moderne appelé Central. Cela est transparent pour vous mais entraîne quelques changements dans l’usage que vous faites de Collect. La mise à jour des formulaires sur votre téléphone est désormais automatique, tout comme l’envoi des données finalisées au serveur.
Pour ce qui concerne les géomaticiens, Central nous permet de gérer des groupes d’utilisateurs qui accèdent à différents formulaires (Bénévoles, prestataires, partenaires…).
Enfin, un des gros avantages de Central réside dans le fait que les formulaires réalisés pour vos téléphones sont aussi diffusés sous la forme de formulaires web (grâce à Enketo), utilisables eux aussi en mode déconnecté.
Nous pouvons donc désormais utiliser ODK pour lancer des enquêtes web participatives, ou des sondages relatifs à un évènement particulier, en remplacement des framaforms et autres limesurvey.
Revenons à Sicen.
Installation et configuration d’ODK Collect
Installation
Depuis le « playstore » d’Android ou depuis le fichier .apk mis à disposition sur le site du projet : https://github.com/getodk/collect/releases/latest

Configuration de l’application
Tout d’abord, la connexion au serveur de formulaires (nommé Central) se fait par le scan d’un QRcode qui vous a été ou vous sera fourni
Paramètres

Configurer par QRCode

Une fois le code scanné, votre application est configurée et interroge le serveur pour savoir quels formulaires sont disponibles, et les télécharge.
Identité de l’utilisateur
Il nous faut maintenant renseigner les données d’identification qui permettront de vous faire connaitre une fois pour toutes dans les différents formulaires et de vous attribuer correctement vos données.
→ Veillez à renseigner l’adresse mail en minuscules.


Cartes → Choisir Mapbox

Autres paramètres utiles
De retour sur l’écran des paramètres, vous pourrez modifier :
- la taille de la police qui sera utilisée dans les formulaires
- la manière de naviguer d’un écran à l’autre
- en faisant glisser le doigt sur l’écran de gauche à droite pour avancer et de droite à gauche pour reculer
- en affichant des boutons en bas de l’écran
- en utilisant les deux méthodes
Vous êtes maintenant prêts à saisir votre premier formulaire.
ODKCollect est configuré pour proposer systématiquement les dernières versions des formulaires disponibles sur le serveur.
Saisie de données
Sur la page d’accueil de l’application, cliquons sur Remplir un formulaire
Choisissons Sicen

Les 3 premiers écrans vous présentent le paramétrage de l’application. A la première utilisation, les fonctionnalités seront toutes activées par défaut. Libre à vous de désactiver celles qui vous semblent provisoirement ou définitivement inutiles.
A l’utilisation suivante, chacune des fonctionnalité sera proposée dans l’état d’activation ou elle était lors de votre dernière utilisation. Vous pourrez là encore valider ou modifier chacun de ce choix.
Les fonctionnalités désactivées ici seront masquées pendant votre utilisation du formulaire.
Écran de paramétrage n°1 → l’identité de l’utilisateur
Les champs sont remplis par défaut avec les valeurs saisies dans les paramètres généraux de l’application (voir début de ce tutoriel)

Écran de paramétrage n°2 → types de géométries créées
- points
- lignes
- polygones

Écran de paramétrage n°3 → Types de données (thématiques) et paramétrage de l’autocomplétion
La dernière question vous permet de choisir le nombre de caractères à saisir dans le recherche des espèces avant de déclencher l’interrogation du référentiel. 3 est le minimum, 7 le maximum (pour permettre l’utilisation du « code taxon » par exemple « ERI RUB »)

Une fois les paramétrages vérifiés et ou modifiés vous pouvez
Choisir l’étude
A terme nous aimerions générer dynamiquement et régulièrement cette liste d’études pour ne faire apparaître que les études en cours et pourquoi pas que celles qui concernent l’utilisateur de l’application

Choisir le protocole
Ici aussi, nous devrions pouvoir limiter la liste des protocoles selon l’étude choisie ou l’utilisateur de l’application.

Une fois ces paramètres de « session » renseignés, nous pouvons commencer la saisie de données proprement dite.
Création d’une localité
Il s’agira d’un point, d’une ligne ou d’un polygone.

Le GPS peux vous aider à dessiner automatiquement lignes et contours, que vous pouvez aussi dessiner à la main sur l’écran.


Saisie d’une ou plusieurs observation à cet endroit
Une fois l’emplacement créé, nous allons pouvoir y créer autant d’observation que nous le souhaitons, de chacun des types d’observations autorisés dans les paramétrages du formulaire. Screenshot_2021-03-15-16-20-591080×1920 124 KB

Commençons par une espèce végétale. Vous pouvez saisir le nom de l’espèce ou son « code » composé des 3 lettres du genre suivies d’un espace et des 3 lettre de l’espèce (ex. ERI RUB).

Propositions des taxons de référence et des synonymes qui correspondent aux lettres tapées
D’abord les taxons de rangs supérieurs puis les espèces et sous espèces.

On peut aussi utiliser un code espèce compose ds 3 premières lettres du Genre et des 3 premières de l’espèce et le cas échéant des 3 premières de la sous-espèce :

Renseignement de l’effectif observé
Pour clarifier la collecte de données d’absence, nous avons ajouté une question explicite :Si le taxon n’a pas été vu, c’est qu’il était recherché et absent. Dans ce cas les questions relatives à la saisie de l’effectif ne seront pas affichée.

Mais si l’espèce a été observée, les écrans suivant (ou leurs homologues pour la Faune sont affichés)
Ici pour les espèces végétales il s’agit d’un effectif par classes d’abondance

Informations sur la « qualité » de la donnée
Notez que l’observation pourra être retrouvée dans la navigation du formulaire, avec l’heure de l’emplacement et l’espèce observée.


Renseignement de détails optionnels, prise de photo



Annotation de la photo
Cela peut être utile pour les photos de site dans le cas d’observations de type pression/menace
Photos mobilisables dans QGIS par la suite


Ajout d’une observation
Si oui on revient à la saisie d’une observation sur l’emplacement courant.

Si non il nous est proposé d’ajouter une nouvelle localité

Si oui on revient à l’ajout d’une localité (point, ligne ou polygone)
Si non, on finalise le formualire en renseignant la présence d’éventuels accompagnateurs
Renseignement des accompagnateurs éventuels


Au fur et à mesure de la saisie, n’hésitez pas à utiliser l’icône de la disquette pour enregistrer le formulaire en cours sur votre téléphone.
Revenir sur des données précédemment saisies :
L’icône représentant une flèche montrant un point permet de naviguer dans les observations déjà saisie pour les vérifier ou les modifier.





Une fois ceci fait on peut aller au bout du formulaire et le marquer comme finalisé.
Finalisation du formulaire
