Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Calcul automatique sensibilité des données #284

Closed
camillemonchicourt opened this issue Nov 15, 2017 · 16 comments
Closed

Calcul automatique sensibilité des données #284

camillemonchicourt opened this issue Nov 15, 2017 · 16 comments

Comments

@camillemonchicourt
Copy link
Member

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 :

  • les schémas ref_nomenclatures et ref_geo pour la définition des règles de sensibilité
  • synthèse GN1 pour le stockage de la sensibilité

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 :

  • NON prise en compte des critères
  • Non prise en compte d’un taxon ayant deux règles actives (Pas de cas à l’heure aujourd'hui entre le national et le régional LR)
  • Quelle dégradation quand une géométrie intersecte deux mailles, départements, communes ...
@camillemonchicourt camillemonchicourt added this to the V2 milestone Nov 15, 2017
@camillemonchicourt camillemonchicourt modified the milestones: V2, V2 - 2018 - Sprint April Apr 5, 2018
@camillemonchicourt camillemonchicourt modified the milestones: V2 - 2018 - Sprint April, V2 - 2018 - Sprint July Jul 2, 2018
@camillemonchicourt
Copy link
Member Author

@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 : PnX-SI/GeoNature-atlas@37b2c4d

@camillemonchicourt
Copy link
Member Author

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 camillemonchicourt removed this from the V2 - 2018 - Sprint July milestone Oct 18, 2018
@camillemonchicourt
Copy link
Member Author

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
Copy link
Member Author

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
Copy link

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

@camillemonchicourt
Copy link
Member Author

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
Copy link
Contributor

amandine-sahl commented May 16, 2019

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 :

  • Non prise en compte d’un taxon ayant deux règles actives (Pas de cas à l’heure d’aujourd’hui entre le national et le régional LR)
  • Qu’elle dégradation quand une géometrie intersecte deux mailles, département, communes, ...

@camillemonchicourt
Copy link
Member Author

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
Copy link
Contributor

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
Copy link
Member Author

Synthèse des premiers développements : d0773c5...90d8709

  • Création d'un schéma gn_sensitivity
  • Création d'une table gn_sensitivity.t_sensitivity_rules contenant les règles de sensibilité par taxon
  • Certaines règles peuvent éventuellement être conditionnées à une zone dans la table gn_sensitivity.cor_sensitivity_area
  • Certaines règles peuvent aussi être conditionnées à un critère, une nomenclature dans la table gn_sensitivity.cor_sensitivity_criteria
  • Un niveau de dégradation (type de zonage utilisée pour la représentation dégradée) est définie selon le niveau de sensibilité dans la table gn_sensitivity.cor_sensitivity_area_type
  • La fonction gn_sensitivity.get_id_nomenclature_sensitivity permet de calculer la sensibilité d'une observation en passant la date, la géométrie, le cd_ref et les nomenclatures de l'observation
  • La table gn_sensitivity.cor_sensitivity_synthese permet de stocker l'éventuelle sensibilité d'une occurrence présente dans la Synthèse, en lien avec son UUID
  • La liste des règles nationales et régionales de sensibilité SINP sont intégrées dans la table gn_sensitivity.t_sensitivity_rules, mais seules les règles nationales sont activées par défaut. Chacun peut choisir d'activer les règles de sa région en passant leur champs active à TRUE

@camillemonchicourt
Copy link
Member Author

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.

  • Trigger ? Cron ?
  • S'appuyant sur les UUID_SINP (pas toutes les données en dispose) ou sur les ID_SYNTHESE (créé dépendance à la synthèse) ou sur un nouveau champs UUID_GN (champs à ajouter créant de la complexité) ? Voir la discussion similaire sur le module Validation - Données validables ? gn_module_validation#16

@amandine-sahl
Copy link
Contributor

! 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
Copy link
Member Author

Ce n'est pas le problème identifié et corrigé ici : bab3dba
?

@amandine-sahl
Copy link
Contributor

amandine-sahl commented Jun 13, 2019

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
Copy link
Member Author

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
Copy link
Member Author

camillemonchicourt commented Aug 25, 2020

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;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants