PnX-SI / GeoNature

Application de saisie et de synthèse des observations faune et flore
GNU General Public License v3.0
104 stars 102 forks source link

Calcul automatique sensibilité des données #284

Closed camillemonchicourt closed 4 years ago

camillemonchicourt commented 7 years ago

La définition de la sensibilité des données est défini par un Groupe de travail du SINP qui a travaillé sur un guide méthodologique : http://www.naturefrance.fr/actions/groupe-de-travail-donnees-sensibles

Celui-ci a aussi abouti à la mise en place d'une liste des espèces sensibles au niveau national, de leur contexte de sensibilité et de leur niveau de diffusion (disponible sur la même page).

Cette liste nationale peut être complétée au niveau régional comme c'est le cas en Languedoc-Roussillon : http://www.naturefrance.fr/languedoc-roussillon/referentiel-des-donnees-sensibles

Nous prévoyons donc d'intégrer un mécanisme qui permettra de qualifier la sensibilité d'une observation automatiquement dans la BDD. Par défaut les critères seront basés sur la liste nationale, mais chaque structure pourra y intégrer aussi les critères régionaux ainsi que d'éventuels critères locaux/spécifiques.

PREMIÈRE RÉFLEXION/PROPOSITION DE DÉCLINAISON TECHNIQUE :

sensibilite-geonature

Chaque taxon a un ou plusieurs jeux de règles =1-n enregistrement(s) dans une table des règles de sensibilité (la règle générale sera 1 règle par taxon mais si plusieurs périodes peuvent concerner un même taxon, il faudra créer autant de règles que de périodes pour ce taxon). Chaque règle est représentée par un ou plusieurs champs dans cette table. A chaque règle correspond un niveau. Chaque règle peut tourner indépendamment.

Les règles temporelles et spatiales sont totalement automatisables à la création de l’occurrence. La règle temporelle de durée doit être relancée régulièrement sur les données sensibles pour voir si la sensibilité a expiré. Les règles attributaires peuvent ou non êtres rattachées à une ou des nomenclatures. De ce fait leur définition n’est pas totalement automatisable. Si plusieurs règles concernent un même taxon (plusieurs périodes par exemple), il faudra définir un ordre d’exécution pour ne pas qu’elles s’annulent mutuellement…

Pour gérer les interventions manuelles à opérer sur les occurrences, en plus du niveau de sensibilité, il y a lieu de stocker si l’attribution de la sensibilité s’est fait manuellement ou automatiquement ainsi que le statut de la sensibilité (sensibilité valide = on n’y revient pas, sensibilité à valider = nécessite une intervention humaine).

############################################################################

Ci-dessous une proposition d'intégration des règles de sensibilité dans la BDD. Il est branché sur :

Pour le moment, je n'ai pas géré les critères car c'est encore flou et j’attends d'avoir le modèle de la "nouvelle synthèse" finalisée.

mcs-sensibilite

Fonction :

get_sensitivity_niv_preci(
    my_id_obs varchar, 
    my_date_obs date,
    my_cd_ref int, 
    my_geom geometry,
    my_criterias varchar[]
)

Permet de calculer le niveau de sensibilité d’une donnée.

PB :

camillemonchicourt commented 6 years ago

@amandine-sahl a avancé sur le mécanisme de calcul automatique de la sensibilité d'une observation : https://github.com/PnX-SI/GeoNature/blob/sensitivity/data/core/sensitivity.sql

Et sa prise en compte au niveau de GeoNature-atlas : https://github.com/PnEcrins/GeoNature-atlas/commit/37b2c4ddf142d58bd202a3461f8147b227544301

camillemonchicourt commented 6 years ago

Pour la sensibilité il faut importer les données dans la BDD de GeoNature.

Les données national + LR et le script d'import de ces données : http://geonature.fr/data/inpn/sensitivity/

Puis lancer le calcul manuellement :

----- MAJ des données de la synthese

UPDATE gn_synthese.synthese SET id_nomenclature_sensitivity = r
FROM (
        SELECT id_synthese as id, gn_synthese.get_id_nomenclature_sensitivity(id_synthese::varchar, date_min::date, cd_ref, the_geom_local, NULL::varchar[]) r
        FROM gn_synthese.synthese s
        JOIN taxonomie.taxref t
        ON s.cd_nom = t.cd_nom
        WHERE id_nomenclature_sensitivity IS NULL
) a
WHERE a.id = id_synthese;

WITH niv_prec AS (
        SELECT ref_nomenclatures.get_id_nomenclature('NIV_PRECIS', t.cd_nomenclature) as id_diff_l, t.id_nomenclature
        FROM  ref_nomenclatures.t_nomenclatures t
        WHERE id_type = ref_nomenclatures.get_id_nomenclature_type('SENSIBILITE')
)
UPDATE  gn_synthese.synthese  SET id_nomenclature_diffusion_level = id_diff_l
FROM niv_prec
WHERE id_nomenclature = id_nomenclature_sensitivity;
camillemonchicourt commented 6 years ago

Pour le moment, ce qui a été fait écrit la sensibilité dans la Synthèse. C'est une solution temporaire pour tester. En effet, on ne doit pas stocker d'info uniquement dans la Synthèse.

Il est donc prévu une solution similaire à celle utilisée pour la Validation, c'est-à-dire stocker la sensibilité des occurrences dans une table transversale dans le schéma gn_commons.

camillemonchicourt commented 5 years ago

Le SINP vient de mettre à jour sa documentation sur la sensibilité, ainsi que la liste des espèces sensibles, intégrant la liste nationale + les listes régionales : http://www.naturefrance.fr/ressources/referentiels/referentiel-de-sensibilite

samuelpriou commented 5 years ago

Intéressant. Pas d'avancée pour la région PACA ?

camillemonchicourt commented 5 years ago

Non, pas de liste en PACA à ma connaissance. Et dans le tableau il n'y a rien qui concerne la région (INSEER93), donc c'est la liste nationale qui s'applique pour PACA.

amandine-sahl commented 5 years ago

MCD_2 Par défaut l'ensemble des règles du SINP sont importées mais par défaut seule les règles nationales sont activées

exemple : SELECT gn_sensitivity.get_id_nomenclature_sensitivity( date_min::date, taxonomie.find_cdref(cd_nom), the_geom_local, ('{"STATUT_BIO": ' || id_nomenclature_bio_status::text || '}')::jsonb ) FROM gn_synthese.synthese
LIMIT 10

PB :

camillemonchicourt commented 5 years ago

J'ai pas très bien compris l'exemple. Il correspond à quoi ?

Même si la nomenclature est bien "Niveau de précision", je renommerai bien la fonction get_sensitivity_level.

amandine-sahl commented 5 years ago

Pour activer les règles SINP pour la région LR il y a un script qui permet de prendre en compte les périmètres de sensibilités spécifiques : https://geonature.fr/data/inpn/sensitivity/sensitivity_enable_lr.sql

camillemonchicourt commented 5 years ago

Synthèse des premiers développements : https://github.com/PnX-SI/GeoNature/compare/d0773c5b954d79c31d3666ad6247a6a955165284...90d8709bad0c6b346e2ef287531f1058d2d38ca0

camillemonchicourt commented 5 years ago

Pour le moment, la structure des tables et l'intégration des règles nationales (+ départementales désactivées par défaut) ainsi que la fonction permettant de calculer la sensibilité d'une occurrence de taxon sont intégrées dans la version 2.1.0.

Par contre, le calcul n'est pas automatisé car la méthode pour cela est à définir.

amandine-sahl commented 5 years ago

! Lors de l'installation ou de la mise à jour de la version 2.1.0, l'import des données des règles nationales et régionales ne fonctionne pas pour des raisons de chemins

camillemonchicourt commented 5 years ago

Ce n'est pas le problème identifié et corrigé ici : https://github.com/PnX-SI/GeoNature/commit/bab3dba6e2259933719de5d0e67dbfd579aa38ae ?

amandine-sahl commented 5 years ago

Effectivement désolée. Par contre ce serait bien d'essayer passer des variables via pgsql -v De façon à éviter de copier les fichiers de faire une commande sed https://docs.postgresql.fr/11/app-psql.html

camillemonchicourt commented 4 years ago

La partie BDD permettant de stocker les règle et de calculer la sensibilité d'une observation est fonctionnelle depuis la version 2.1.0. Reste à traiter l'automatisation du calcul, le stockage de la géométrie floutée et le floutage des données sensibles en fonction des droits de l'utilisateur. Traités dans des tickets dédiés.

camillemonchicourt commented 4 years ago

Utilisation de la fonction, à affiner (avec la temporalité notamment) :

-- Désactiver trigger de date car sinon cela laisse penser que la donnée a été modifiée
ALTER TABLE gn_synthese.synthese DISABLE TRIGGER tri_meta_dates_change_synthese;

-- On remplit gn_sensitivity.cor_sensitivity_synthese quand on a un UUID (un trigger renseigne ensuite la synthèse à plat)
-- A ne pas faire finalement
-- Car on a retenu le fait de ne pas utiliser ni remplir cette table cor_sensitivity_synthese, mais seulement le champs dans la synthèse. C'est le niveau de diffusion qui peut être modifié manuellement, pas le niveau de sensibilité
WITH data AS (
SELECT DISTINCT s.unique_id_sinp,s.date_min::date,
    taxonomie.find_cdref(s.cd_nom) cd_ref,
    the_geom_local,
    ('{"STATUT_BIO": ' || id_nomenclature_bio_status::text || '}')::jsonb as cr
FROM gn_synthese.synthese s
LEFT OUTER JOIN gn_sensitivity.cor_sensitivity_synthese cs
ON cs.uuid_attached_row = s.unique_id_sinp
WHERE cs.uuid_attached_row IS NULL
    AND NOT unique_id_sinp IS NULL
    AND s.id_nomenclature_sensitivity IS NULL
)
INSERT INTO gn_sensitivity.cor_sensitivity_synthese (uuid_attached_row, id_nomenclature_sensitivity)
SELECT DISTINCT unique_id_sinp , gn_sensitivity.get_id_nomenclature_sensitivity(
    date_min::date,
    cd_ref,
    the_geom_local,
    cr
)
FROM data s;

-- Si on n'a pas de UUID on remplit directement dans le champs à plat dans la Synthèse
-- On a retenu de ne faire que cette méthode, pour toutes les données
UPDATE gn_synthese.synthese  SET id_nomenclature_sensitivity =  gn_sensitivity.get_id_nomenclature_sensitivity(
    date_min::date,
    taxonomie.find_cdref(cd_nom),
    the_geom_local,
    ('{"STATUT_BIO": ' || id_nomenclature_bio_status::text || '}')::jsonb
)
WHERE id_nomenclature_sensitivity IS NULL AND unique_id_sinp IS NULL;

-- Calculer les niveaux de diffusion en fonction de la sensibilité
-- Attention, vérifier les id_nomenclature
-- Et il ne faudrait le faire que si il n'ont pas été renseigné/modifié manuellement
-- Donc que si la valeur automatique est supérieure à la valeur existante
UPDATE gn_synthese.synthese SET id_nomenclature_diffusion_level = 140 WHERE id_nomenclature_sensitivity = 67 AND id_nomenclature_diffusion_level IS NULL;
UPDATE gn_synthese.synthese SET id_nomenclature_diffusion_level = 141 WHERE id_nomenclature_sensitivity = 68 AND id_nomenclature_diffusion_level IS NULL;
UPDATE gn_synthese.synthese SET id_nomenclature_diffusion_level = 142 WHERE id_nomenclature_sensitivity = 69 AND id_nomenclature_diffusion_level IS NULL;
UPDATE gn_synthese.synthese SET id_nomenclature_diffusion_level = 143 WHERE id_nomenclature_sensitivity = 70 AND id_nomenclature_diffusion_level IS NULL;
UPDATE gn_synthese.synthese SET id_nomenclature_diffusion_level = 144 WHERE id_nomenclature_sensitivity = 71 AND id_nomenclature_diffusion_level IS NULL;

-- Réactiver trigger date après calcul
ALTER TABLE gn_synthese.synthese ENABLE TRIGGER tri_meta_dates_change_synthese;