Archives de l’auteur : Mathieu

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')

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

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) :

https://forum.getodk.org/t/odk-to-collect-species-and-habitats-localities-as-pressure-and-threats-to-ecosystems/26332/4?u=mathieubossaert

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

Capture d’écran du 2021-03-18 16-50-05

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.
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

Screenshot_2021-03-15-16-23-51

Suivi des paramètres physico-chimiques des lagunes : un formualire de terrain avec ODK

Installation et configuration d’ODK Collect

Installation

Depuis le « playstore » d’Android ou depuis l’APK mise à disposition sur le site du projet :

https://github.com/getodk/collect/releases

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é fourni

paramètres
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écharger.

Il nous faut maintenant renseigner les données d’identification qui permettront de vous identifier dans le formulaire, de vous proposer vos lagunes et vos stations de suivis et de vous attribuer vos données dans la base de données.

Attention, l’adresse email doit bien être renseignée en minuscules.

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.

C’est parti !

Écran n°1 : identité et date

Le premier écran reprend vos informations d’identité, renseignées lors de l’initialisation de l’appareil, et vous présente la date du jour.

L’adresse email doit bien être renseignée en minuscules (attention notamment à la première lettre que les correcteurs ont tendance à mettre en majuscule).

Écran n°2

Voulez vous saisir les informations relatives à la météo ?

Renseignement des données météo du jour et de la veille

Choix du cadre de suivi

Choix de la lagune puis de la station

La station est-elle en eau ?

Si oui on saisira ensuite les mesures effectuées.

Des alertes apparaissent si vous tentez de saisir des valeurs en dehors des plages de valeurs « autorisées »

Suppression d’une valeur

Pour effacer une réponse, appuyer longtemps dessus :

Une fois renseignées les valeurs pour la station en cours, il vous sera proposé d’ajouter une nouvelle station ou non. Soit vous serez ramené au choix du cadre, soit à la fin du formulaire que vous pourrez finaliser et enregistrer.

Revenir sur vos mesures

En cliquant sur la flèche inclinée en haut de l’écran

Vous pouvez ainsi revenir sur chacun de vos enregistrements

De même tout au long de la session vous pouvez forcer l’enregistrement des données en cours de saisie en cliquant sur la disquette de la barre d’outils.

Envoi des données au serveur

Les versions récentes d’ODK envoient automatiquement les formulaires finalisés au serveur « Central » quand une connexion est détectée.

QGIS – Utiliser des photos comme symbole

Les versions récentes de QGIS permettent d’utiliser des photos comme symbole de point.
Nous allons voir ici comment afficher sur une carte les photos don les chemins sont stockés dans la table attributaire.
Nous utiliserons la couche **points_obs_pressions_menaces_jalons** du service WFS du CEN

Attention, si vous ne réglez pas les échelles auxquelles doit s’afficher la couche, toutes les images seront téléchargées, ce qui peut-être très très lourd, faire planter QGIS et impacter la bande passante !
Nous allons donc limiter l’échelle à partir de laquelle qgis affichera la couche :
1 : nous choisissons la couche concernée
2 : nous activons la fenêtre **rendu** symbolisée par un pinceau-brosse
3 : nous définissons que la symbologie sera rendue (affichée) entre le 1/1 et le 1/150000ème

Nous pourrions en plus définir une symbologie pour toutes les échelles inférieures au 1/150000 qui représenterait par exemple un appareil photo.

Nous pouvons maintenant régler la symbologie pour faire apparaître les photos prises sur le terrain.

1 : Choix de la couche dont on veut modifier la symbologie (elle est déjà sélectionnée normalement)
2 : Le type de symbole à choisir est **Symbole image raster**
3 : Pour le chemin de l’image, nous utiliserons un champ de la table
4 et 5 : C’est le champ  **photo** qui contient l’url de l’image sur le serveur

Voilà le rendu final, à améliorer en utulisant des règles de symbologies liées à l’échelle de la carte par exemple :

 

Générer une premiere page de synthese d’un document pdf

Pour l’archivage de nos documents fonciers nous souhaitons standardiser leur stockage sur le réseau ainsi que rendre facile une lecture synthétique du document.

Pour cela nous allons générer une première page contenant le texte synthétique en pdf, la fusionner avec le document initial et produire le document final.

convert -extent 2100x2970 -background white -fill black -pointsize 80  -font Sawasdee \
label:' contrat n° 554 \ndate signature : 2016/09/28\nsignataire : Commune Douzens & ONF & CENLR
\ntype contrat : Conv. Part. Gestion\nduree : 5 ans\ntacite conduction : oui ' -bordercolor white -border 10 couv.pdf

pdfjam --outfile out.pdf --paper a4paper test4.pdf

pdftk couv_a4.pdf 11_Douzens_Convention\ gestion_Douzens_CEN_ONF.pdf cat output 554_douzens_onf_cenlr_CPG_5ans_rt.pdf

Du json pour structurer nos observations

WITH data AS (
SELECT 10312 AS id_obs, 'tetrax tetrax' as espece, 'mathieu' as observateur, '{"mâles": 12, "femelles": 3, "oeufs": 7}'::jsonb AS effectif
UNION
SELECT 15021 AS id_obs, 'zerynthia rumina' as espece, 'paul' as observateur, '{"mâles": 3, "immatures": 3, "larves": 7}'::jsonb AS effectif
UNION
SELECT 15897 AS id_obs, 'tetrax tetrax' as espece, 'paul' as observateur, '{"mâles": 4, "immatures": 15}'::jsonb AS effectif
)
/* les données qui contiennent des obs de mâles */
--SELECT id_obs, observateur, effectif->'larves' AS nb_larves, effectif->'mâles' AS nb_males from data --WHERE effectif ? 'larves'
/* les effectifs des différents objets observés (mâles, femelle, immature, oeufs) en colonne */
--SELECT id_obs, observateur, effectif, (effectif->>'larves')::integer AS nb_larves, (effectif->>'mâles')::integer AS nb_males, (effectif->>'femelles')::integer AS nb_femelles, (effectif->>'oeufs')::integer AS nb_oeufs from data --WHERE effectif ? 'larves'
/* des agrégations */
SELECT count(id_obs), espece, string_agg(DISTINCT observateur,',' ORDER BY observateur), sum((effectif->>'larves')::integer) AS nb_larves, sum((effectif->>'mâles')::integer) AS nb_males from data GROUP BY espece --WHERE effectif ? 'larves'