cbn-alpin / sinp-paca-tickets

Tickets concernant le projet de migration vers GeoNature de silene.eu.
1 stars 0 forks source link

[GeoNature] Format téléchargement "Observations" #70

Open jpm-cbna opened 3 years ago

jpm-cbna commented 3 years ago

La synthèse permet d'exporter les données liées aux observations. Le paramètre de config [SYNTHESE] > EXPORT_COLUMNS permet de lister les champs disponibles dans la vue gn_synthese.v_synthese_for_export qui seront utilisés pour exporter les données correspondantes.

Il faut à terme configurer l'export pour qu'il inclut tous les champs de la Synthese possédant des données.

Les champs actuellement exportés:

EXPORT_COLUMNS = [ 
        "uuid_perm_sinp",
        "uuid_perm_grp_sinp",
        "jdd_nom",
        "jdd_uuid",
        "niveau_validation",
        "validateur",
        "observateurs",
        "cd_nom",
        "nom_cite",
        "nombre_min",
        "nombre_max",
        "date_debut",
        "date_fin",
        "x_centroid_4326",
        "y_centroid_4326",
        "geometrie_wkt_4326",
    ]

Les champs disponibles pour l'export :

# Champs à afficher dans l'export 
    # Voir les noms des champs de la ``vue gn_synthese.v_synthese_for_export``
    EXPORT_COLUMNS   = [
        "date_debut",
        "date_fin",
        "heure_debut",
        "heure_fin",
        "cd_nom",
        "cd_ref",
        "nom_valide",
        "nom_vernaculaire",
        "nom_cite",
        "regne",
        "group1_inpn",
        "group2_inpn",
        "classe",
        "ordre",
        "famille",
        "rang_taxo",
        "nombre_min",
        "nombre_max",
        "alti_min",
        "alti_max",
        "prof_min",
        "prof_max",
        "observateurs",
        "determinateur",
        "communes",
        "x_centroid_4326",
        "y_centroid_4326",
        "geometrie_wkt_4326",
        "nom_lieu",
        "comment_releve",
        "comment_occurrence",
        "validateur",
        "niveau_validation",
        "date_validation",
        "comment_validation",
        "preuve_numerique_url",
        "preuve_non_numerique",
        "jdd_nom",
        "jdd_uuid",
        "jdd_id",
        "ca_nom",
        "ca_uuid",
        "ca_id",
        "cd_habref",
        "cd_habitat",
        "nom_habitat",
        "precision_geographique",
        "nature_objet_geo",
        "type_regroupement",
        "methode_regroupement",
        "technique_observation",
        "biologique_statut",
        "etat_biologique",
        "biogeographique_statut",
        "naturalite",
        "preuve_existante",
        "niveau_precision_diffusion",
        "stade_vie",
        "sexe",
        "objet_denombrement",
        "type_denombrement",
        "niveau_sensibilite",
        "statut_observation",
        "floutage_dee",
        "statut_source",
        "type_info_geo",
        "methode_determination",
        "comportement",
        "reference_biblio",
        "id_synthese",
        "id_origine",
        "uuid_perm_sinp",
        "uuid_perm_grp_sinp",
        "date_creation",
        "date_modification"
    ]
juliedelauge commented 3 years ago

Voici un fichier avec les champs que l'export et téléchargement de données d'observation doit contenir. L'objectif est:

  1. de partager le maximum d'information sur la données;
  2. qu'il soit compréhensible par l'utilisateur.

Ceci est d'autant plus important si l'utilisateur est contraint par l'interface (carto et liste) dans l'accès à l'information.

Dans ce fichier Excel:

En vert: les colonnes à ajouter qui sont disponibles. En rouge: des infos à ajouter mais qui ne semblent pas être dans la liste, ou que je n’ai pas identifié dedans. Pour la plupart, ces informations ont été jugées indispensables par les utilisateurs. A concerter.

J’ai essayé de faire le parallèle avec la liste des champs disponibles.

jpm-cbna commented 3 years ago

Concernant les champs disponibles dans les téléchargements de la Synthse (= Observations), je propose pour le départ de ne proposer que le stricte nécessaire. Les performances risquant de ne pas être au rendez vous, je propose de mettre dans un premier temps ceci:

    EXPORT_COLUMNS = [
        "uuid_perm_sinp",
        "uuid_perm_grp_sinp",
        "jdd_nom",
        "jdd_uuid",
        "niveau_validation",
        "validateur",
        "observateurs",
        "cd_nom",
        "nom_cite",
        "nombre_min",
        "nombre_max",
        "date_debut",
        "heure_debut",
        "date_fin",
        "heure_fin",
        "geojson_4326",
        "precision_geographique",
        "niveau_precision_diffusion",
    ]
juliedelauge commented 3 years ago

· Préférer le nom valide et le cd_ref à la place de "cd_nom", "nom_cite",

gkapfer commented 3 years ago

Dans prochaine mise à jour, ajouter + renommer certains champs. A discuter tous ensemble car certains champs disponibles aujourd'hui sont peu clairs et il manque beaucoup de champs très utilisés pour la faune (ça doit être le cas pour la flore aussi j'imagine).

jpm-cbna commented 3 years ago

Au 22 juillet 2021, les champs utilisés pour l'export sont:

    EXPORT_COLUMNS = [ 
        "uuid_perm_sinp",
        "uuid_perm_grp_sinp",
        "ca_nom",
        "jdd_nom",
        "jdd_uuid",
        "niveau_validation",
        "validateur",
        "observateurs",
        "cd_ref",
        "nom_valide",
        "nombre_min",
        "nombre_max",
        "date_debut",
        "date_fin",
        "geojson_4326",
        "precision_geographique",
        "niveau_precision_diffusion",
    ]
jpm-cbna commented 3 years ago

À tester avec la nouvelle config ci-dessous et la suppression du champ "communes" dans la vue d'export:

    EXPORT_COLUMNS = [ 
        "uuid_perm_sinp",
        "uuid_perm_grp_sinp",
        "ca_nom", --> SUPPRIMER
        "jdd_nom",
        "jdd_uuid",
        "niveau_validation",
        "validateur",
        "observateurs",
        "determinateurs", --> AJOUTER
        "cd_ref",
        "nom_valide",
        "nom_vernaculaire", --> AJOUTER
        "regne", --> AJOUTER (supprimable pour gagner en perf)
        "classe", --> AJOUTER (supprimable pour gagner en perf)
        "ordre", --> AJOUTER (supprimable pour gagner en perf)
        "famille", --> AJOUTER (supprimable pour gagner en perf)
        "nombre_min",
        "nombre_max", --> GARDER
        "date_debut",
        "date_fin", --> SUPPRIMER
        "geojson_4326",
        "x_centroid_4326", --> AJOUTER (si pas de problème avec le floutage)
        "y_centroid_4326", --> AJOUTER (si pas de problème avec le floutage)
        "precision_geographique",
        "niveau_precision_diffusion", --> SUPPRIMER
        "nature_objet_geo", --> AJOUTER
        "alti_min", --> AJOUTER
        "technique_observation", --> AJOUTER (supprimable pour gagner en perf)
        "stade_vie", --> AJOUTER (supprimable pour gagner en perf)
        "biologique_statut", --> AJOUTER (supprimable pour gagner en perf)
        "sexe", --> AJOUTER (supprimable pour gagner en perf)
        "comportement",  --> AJOUTER (supprimable pour gagner en perf)
        "statut_source",  --> AJOUTER (supprimable pour gagner en perf)
        "reference_biblio",  --> AJOUTER (supprimable pour gagner en perf)
    ]

Ordre de préférence de suppression des champs si problème perf ci-dessous. Supprimer les champs nomenclature en tenant compte du niveau de remplissage du champ dans la base:

Problème par rapport au floutage

Amélioration des performances

Autres points

Principe du test

  1. [x] Mesurer le temps d'un export actuel
  2. [x] Vérifier la possibilité d'utiliser les champs X et Y géo avec le floutage
  3. [x] Modifier la vue "gn_synthese.v_synthese_for_export" pour supprimer le champs "communes" et sa sous-requête
  4. [x] Faire la modif sur la config du serveur
  5. [x] Lancer la mise à jour de la configuration de GeoNature
  6. [x] Mesurer le temps de l'export suite à la mise à jour
  7. [x] Si trop long supprimer des champs dans la config et tester à nouveau
gkapfer commented 2 years ago

Bilan des échanges derniers : "date_fin", --> A garder

Pourquoi le champ commune ne peux pas être indiqué? On a pas de floutage au département donc cette info peut être renseignée.

A quoi correspond : "x_centroid_4326", et "y_centroid_4326", Si cela peut renvoyer à une donnée précise, est-ce qu'on aura pas le même souci qu'avec l'info sur le Lieu-dit / comment_occurrence ou comment_releve

precision_localisation : est-il possible de pourvoir avoir des correspondances et d'indiquer en toutes lettre "Commune" Lieu-dit" ou "Précis"?

Besoin de la réponse sur le changement de nom des champs

A suivre

jpm-cbna commented 2 years ago

Pourquoi le champ commune ne peux pas être indiqué? On a pas de floutage au département donc cette info peut être renseignée.

Ok, si nous pouvons l'indiqué systématiquement, je peux faire un test pour le récupérer. Mais je crains que cela ralentisse fortement le téléchargement. Je vais faire un test.

A quoi correspond : "x_centroid_4326", et "y_centroid_4326", Si cela peut renvoyer à une donnée précise, est-ce qu'on aura pas le même souci qu'avec l'info sur le Lieu-dit / comment_occurrence ou comment_releve

Cela correspond au X et au Y du centroïde de la géométrie du champ "geojson_4326". J'ai déjà codé la possibilité de récupérer cette info en tenant compte du floutage. Mais il faut que je teste que cela fonctionne bien. Je ne garantie donc pas que cela fonctionne bien et surtout de façon performante. Cela risque de ralentir le téléchargement. Je vais faire un test.

precision_localisation : est-il possible de pourvoir avoir des correspondances et d'indiquer en toutes lettre "Commune" Lieu-dit" ou "Précis"?

Le champ "precision_localisation" contient un nombre de mètre correspondant normalement au rayon moyen en mètre de la géométrie de l'observation (si c'est un polygone) ou à la précision moyenne de l'outil utilisé pour déterminer le point de l'observation (carte, GPS). Du coup, je peux envisager d'établir une correspondance. Par exemple, de 0 à 10m => "précis", de 11m à 100m => "lieudit", 101m et plus => "Commune"... Dans ce cas là, il faut me fournir les correspondances pour tester.

Besoin de la réponse sur le changement de nom des champs

Camille me confirme que le changement de nom est possible: http://docs.geonature.fr/admin-manual.html#module-synthese Merci de me transmettre la correspondance. Je vais poster ci-dessous la nouvelle config et le SQL de la vue d'export correspondant à tous ces changements. Vous pouvez vous baser sur les noms des champs du paramètre "EXPORT_COLUMNS" pour m'indiquer la correspondance avec le nouveau nom des champs à fournir. Notez bien que si le nom fait plus de 10 caractères, il sera tronqués dans le fichier shapefile.

jpm-cbna commented 2 years ago

Voici le code de la vue de l'export et le paramètre de config actuellement utilisé (au 30 juillet 2021):

Le script SQL de mise à jour de la vue:

BEGIN;

DROP VIEW gn_synthese.v_synthese_for_export ;

CREATE OR REPLACE VIEW gn_synthese.v_synthese_for_export
AS SELECT s.id_synthese,
    s.unique_id_sinp AS uuid_perm_sinp,
    s.unique_id_sinp_grp AS uuid_perm_grp_sinp,
    af.acquisition_framework_name AS ca_nom,
    d.id_dataset AS jdd_id,
    d.unique_dataset_id AS jdd_uuid,
    d.dataset_name AS jdd_nom,
    n21.label_default AS niveau_validation,
    s.validator AS validateur,
    s.observers AS observateurs,
    t.cd_ref,
    t.nom_valide,
    s.count_min AS nombre_min,
    s.count_max AS nombre_max,
    s.date_min::date AS date_debut,
    s.date_max::date AS date_fin,
    st_asgeojson(s.the_geom_4326) AS geojson_4326,
    st_asgeojson(s.the_geom_local) AS geojson_local,
    s."precision" AS precision_geographique,
    n9.label_default AS niveau_precision_diffusion,
    s.id_digitiser,
    s.id_nomenclature_sensitivity,
    s.id_nomenclature_diffusion_level
   FROM gn_synthese.synthese s
     JOIN taxonomie.taxref t ON t.cd_nom = s.cd_nom
     JOIN gn_meta.t_datasets d ON d.id_dataset = s.id_dataset
     JOIN gn_meta.t_acquisition_frameworks af ON d.id_acquisition_framework = af.id_acquisition_framework
     LEFT JOIN ref_nomenclatures.t_nomenclatures n9 ON s.id_nomenclature_diffusion_level = n9.id_nomenclature
     LEFT JOIN ref_nomenclatures.t_nomenclatures n21 ON s.id_nomenclature_valid_status = n21.id_nomenclature;

COMMIT;

Le paramètre de config:

    EXPORT_COLUMNS = [ 
        "uuid_perm_sinp",
        "uuid_perm_grp_sinp",
        "ca_nom",
        "jdd_nom",
        "jdd_uuid",
        "niveau_validation",
        "validateur",
        "observateurs",
        "cd_ref",
        "nom_valide",
        "nombre_min",
        "nombre_max",
        "date_debut",
        "date_fin",
        "geojson_4326",
        "precision_geographique",
        "niveau_precision_diffusion",
    ]
jpm-cbna commented 2 years ago

La vue et le paramètre correspondant pour les futures modifications envisagées sur les téléchargements de la Synthese:

Le script SQL de mise à jour de la vue:

BEGIN;

DROP VIEW gn_synthese.v_synthese_for_export ;

CREATE OR REPLACE VIEW gn_synthese.v_synthese_for_export AS
    SELECT s.id_synthese,
        s.unique_id_sinp AS uuid_perm_sinp,
        s.unique_id_sinp_grp AS uuid_perm_grp_sinp,
        d.dataset_name AS jdd_nom,
        d.unique_dataset_id AS jdd_uuid,
        n21.label_default AS niveau_validation,
        s.validator AS validateur,
        s.observers AS observateurs,
        s.determiner AS determinateur,
        t.cd_ref,
        t.nom_valide,
        t.nom_vern as nom_vernaculaire,
        t.regne AS regne,
        t.classe AS classe,
        t.ordre AS ordre,
        t.famille AS famille,
        s.count_min AS nombre_min,
        s.count_max AS nombre_max,
        s.date_min::date AS date_debut,
        s.date_max::date AS date_fin,
        public.st_asgeojson(s.the_geom_4326) AS geojson_4326,-- Use for SHP export and data blurring
        st_x(st_transform(st_centroid(s.the_geom_point), 4326)) AS x_centroid_4326,
        st_y(st_transform(st_centroid(s.the_geom_point), 4326)) AS y_centroid_4326,
        s."precision" AS precision_geographique,
        n1.label_default AS nature_objet_geo,
        communes AS communes,
        s.altitude_min AS alti_min,
        n3.label_default AS technique_observation,
        n10.label_default AS stade_vie,
        n5.label_default AS biologique_statut,
        n11.label_default AS sexe,
        n20.label_default AS comportement,
        n17.label_default AS statut_source,
        s.reference_biblio AS reference_biblio,
        -- Fields use in internal
        d.id_dataset AS jdd_id, -- Use for CRUVED
        s.id_digitiser AS id_digitiser, -- Use for CRUVED
        public.ST_asgeojson(s.the_geom_local) AS geojson_local,-- Use for SHP export
        s.id_nomenclature_sensitivity, -- Use for data blurring
        s.id_nomenclature_diffusion_level -- Use for data blurring
    FROM gn_synthese.synthese AS s
        JOIN taxonomie.taxref AS t ON t.cd_nom = s.cd_nom
        JOIN gn_meta.t_datasets AS d ON d.id_dataset = s.id_dataset
        LEFT JOIN LATERAL (
            SELECT id_synthese, string_agg(DISTINCT concat(a_1.area_name, ' (', a_1.area_code, ')'), ', '::text) AS communes
            FROM gn_synthese.cor_area_synthese cas
                JOIN ref_geo.l_areas a_1 ON cas.id_area = a_1.id_area
                JOIN ref_geo.bib_areas_types ta ON ta.id_type = a_1.id_type AND ta.type_code ='COM'
            WHERE cas.id_synthese = s.id_synthese
            GROUP BY id_synthese 
        ) sa ON true
        LEFT JOIN ref_nomenclatures.t_nomenclatures AS n1 ON s.id_nomenclature_geo_object_nature = n1.id_nomenclature
        LEFT JOIN ref_nomenclatures.t_nomenclatures AS n3 ON s.id_nomenclature_obs_technique = n3.id_nomenclature
        LEFT JOIN ref_nomenclatures.t_nomenclatures AS n5 ON s.id_nomenclature_bio_status = n5.id_nomenclature
        LEFT JOIN ref_nomenclatures.t_nomenclatures AS n10 ON s.id_nomenclature_life_stage = n10.id_nomenclature
        LEFT JOIN ref_nomenclatures.t_nomenclatures AS n11 ON s.id_nomenclature_sex = n11.id_nomenclature
        LEFT JOIN ref_nomenclatures.t_nomenclatures AS n17 ON s.id_nomenclature_source_status = n17.id_nomenclature
        LEFT JOIN ref_nomenclatures.t_nomenclatures AS n20 ON s.id_nomenclature_behaviour = n20.id_nomenclature
        LEFT JOIN ref_nomenclatures.t_nomenclatures AS n21 ON s.id_nomenclature_valid_status = n21.id_nomenclature ;

COMMIT;

Le paramètre de config:

EXPORT_COLUMNS = [
        "uuid_perm_sinp",
        "uuid_perm_grp_sinp",
        "jdd_nom",
        "jdd_uuid",
        "niveau_validation",
        "validateur",
        "observateurs",
        "determinateur",
        "cd_ref",
        "nom_valide",
        "nom_vernaculaire",
        "regne",
        "classe",
        "ordre",
        "famille",
        "nombre_min",
        "nombre_max",
        "date_debut",
        "date_fin",
        "geojson_4326",
        "x_centroid_4326",
        "y_centroid_4326",
        "precision_geographique",
        "nature_objet_geo",
        "communes",
        "alti_min",
        "technique_observation",
        "stade_vie",
        "biologique_statut",
        "sexe",
        "comportement",
        "statut_sourcestatut_source",
        "reference_biblio",
    ]

Afin de pouvoir prendre en compte les champs "x_centroid_4326" et "y_centroid_4326" dans l'export, il est nécessaire de mettre à jour le code du fichier geonature/backend/geonature/core/gn_synthese/routes.py en ajoutant les entrées ci-dessous au paramètre geom_fields de la classe DataBlurring:

  {
      "output_field": 'x_centroid_4326',
      "compute": "x",
  },
  {
      "output_field": 'y_centroid_4326',
      "compute": "y",
  },

WARNING : vérifier si pour X et Y nous devons utiliser the_geom_point ou the_geom_4326.

jpm-cbna commented 2 years ago

Test en local sur copie de la base de production du 27 juillet. Machine hébergeant la base de données Postgresql 12 sur un disque SSD NVME.

Export 28 561 observations

Utilisateur n'ayant aucune permission, Quercus pubescens sur toute la région.

Export 43 047 observations

Utilisateur n'ayant aucune permission, Quercus pubescens + Vanessa cardui sur toute la région.

Export 100 000 observations

Utilisateur n'ayant aucune permission, communes de Gap + Vallouise-Pelvoux.

juliedelauge commented 2 years ago

Je me suis penchée sur ces questions la semaine dernière mais je me suis heurtée en l’absence de Géraldine au fait de ne pas revenir sur des choix déjà réalisés, j’attends donc son retour pour vous faire un point précis.

Concernant la mention des communes dans les exports et téléchargement, est-ce que la solution pourrait être de mettre cette information en base de données pour que ce champs ne soit pas calculé ?

Je pose cette question car c’est ainsi que nous traitons les données dans silene_Admin avec des tests de cohérence qui script l’info envoyée par le producteur (commune/x_occurence/y_occurence) donc le travail est fait de notre côté.

gkapfer commented 2 years ago

Voici une proposition commencée (nous avons indiqué les champs non prioritaires pour la faune à ce stade, les éléments à modifier et les propositions de champs à ajouter).

DROP VIEW gn_synthese.v_synthese_for_export ;

CREATE OR REPLACE VIEW gn_synthese.v_synthese_for_export AS SELECT s.id_synthese,

    s.unique_id_sinp AS uuid_perm_sinp,
    s.unique_id_sinp_grp AS uuid_perm_grp_sinp,
    d.dataset_name AS jdd_nom,
    d.unique_dataset_id AS jdd_uuid,
    n21.label_default AS niveau_validation **Non prioritaire pour le moment (pour la faune en tous cas)**
    s.validator AS validateur  **Non prioritaire pour le moment (pour la faune en tous cas)**
    s.observers AS observateurs,
    s.determiner AS determinateur **Non prioritaire pour le moment** 
    t.cd_ref,
    t.nom_valide,
    t.nom_vern as nom_vernaculaire,
    t.regne AS regne **Non prioritaire pour le moment** 
    t.classe AS classe,
    t.ordre AS ordre,
    t.famille AS famille, **Non prioritaire pour le moment** 
    s.count_min AS nombre_min,
    s.count_max AS nombre_max,
    s.date_min::date AS date_debut,
    s.date_max::date AS date_fin,
    public.st_asgeojson(s.the_geom_4326) AS geojson_4326,-- Use for SHP export and data blurring **Inexpoitable pour les personnes qui utilisent le csv. Pour les utilisateurs du .shp peuvent obtenir le X et Y dans un tableur par ajout de colonne et calcul.**
    s."precision" AS precision_geographique **Pour la Faune : 25 = précis ; 250 = Lieu-dit ; rien = communal ; Il faudra prévoir le cas pour futur mailles INPN (5x5 et 10x10)… Pour la flore ?**

    n1.label_default AS nature_objet_geo  **Pour la faune = Non prioritaire, à supprimer ? D’ailleurs, erreurs à corriger dans la future mise à jour : Donnée précise = St ; le reste = In**
    s.altitude_min AS alti_min,
    n3.label_default AS technique_observation,
    n10.label_default AS stade_vie,
    n5.label_default AS biologique_statut **remplacer par statut_biologique**
    n11.label_default AS sexe,
    n20.label_default AS comportement,
    n17.label_default AS statut_source  **remplacer par type_source**
    s.reference_biblio AS reference_biblio  **Non prioritaire pour le moment **

AJOUTER : code_source ou id_source AS Fournisseur (référentiel à faire)

**Il faudrait ajouter les champs suivants : ils seront vidés par les administrateurs de données avant transfert vers GN tant que les DS ne sont pas traitées. AJOUTER : « Commentaire_relevé » AJOUTER : « Commentaire_taxon » AJOUTER : Place name AS « nom_lieu » Pour « nom_lieu » : l’administrateur de données renseignera le nom de la commune à minima ou « commune – lieu-dit » si le lieu-dit est précisé : Cela permet d’avoir aussi la commune renseignée manuellement (et plus calculée).

QUID des deux champs X et Y : peut-on les remplir automatiquement lors des MAJ ?

Les champs suivants ne sont pas indispensables aujourd’hui mais à prévoir quand les données publiques et sensibles seront traitées. Niveau_precision_diffusion à venir : pour le moment il est indiqué « Maille ». A terme il faudra faire figurer « flouté » ou « non flouté » Niveau_sensibilité : à venir**

jpm-cbna commented 2 years ago

Champs à supprimer:

Changement de nom:

Ajouter les champs (voir commentaire précédent):

Ajouter les champs suivant uniquement lorsque le traitement des données et la mise à jour faite dans la base (voir commentaire précédent):

Discussion nécessaire sur les champs:

juliedelauge commented 2 years ago
okristo commented 2 years ago

Deux points à trancher :

lvahe commented 2 years ago

Petit retour d'expérience concernant l'utilisation du X Y : lors des formations Végétal local que nous pouvons donner, les personnes nous demandent souvent comment récupérer les coordonnées X Y.

Il s'agit d'un public qui n'est pas forcément utilisateur des SIG type MapInfo mais qui utilise plus facilement les plateformes des SINP régionaux. Ces personnes n'ont donc pas toujours la possibilité de passer par les SIG pour récupérer les X Y et les cherchent directement sur Silene.

Par contre, je ne saurais pas dire si cela concerne des dizaines ou des centaines de personnes. Mais ce retour est fréquent.

okristo commented 2 years ago

Merci Lucile pour ce retour. J'avais eu les mêmes échos mais sans comprendre réellement comment ils utilisent le X Y (pour le rentrer directement dans un GPS de terrain?) Sais-tu comment ils l'utilisent ?

lvahe commented 2 years ago

Oui, je pense qu'ils doivent rentrer les coordonnées dans un GPS ou peut-être sur des outils comme Géoportail. La question a été posée suffisamment souvent pour ne pas être anodine je pense.

gkapfer commented 2 years ago

Oui effectivement, je pense que le X et Y est utile en direct pour plusieurs utilisations et éviter de passer par un SIG (pour ceux qui savent le faire…)

j’en oublie sans doute…

juliedelauge commented 2 years ago

Idem en faune

gkapfer commented 2 years ago

Deux points à trancher :

* le X Y est-il indispensable sachant qu'il est possible d'importer un csv ou un shp dans un SIG et d'ouvrir la couche en se basant sur le champ geojson ? Dans quel cas l'utilisateur utilise-t-il directement le X Y depuis le csv ?

Donc oui :) voir échanges ci-avant.

* Précision : les champs precision_geographique et nature_objet_geo (à condition qu'il soit bien rempli) renseignent de manière pertinente sur la précision de la donnée. **Nous proposons de les conserver** et d'améliorer leur remplissage pour les prochaines mises à jour. Pour les données flore du CBNA, precision_geographique correspond à la précision du GPS pour un pointage précis ou au rayon moyen de la commune quand la donnée est à la commune (et une estimation de la précision basée sur les infos de localisation quand on a une précision infra communale, pas de précision pré-définie comme c'est le cas pour la faune)

Ok pour nature_objet_geo (on comprend que ce soit plus important pour la flore !) Pour precision_geographique nous souhaitons que les chiffres soient remplacés par Précis/Lieu-dit/Commune via un tableau de correspondance (qui pourra reprendre vos calculs si vous voulez) si le format peut être du texte.

okristo commented 2 years ago

On propose de mettre en production le nouveau format d'export incluant le X Y. Pour le champ precision_geographique, on vous propose d'en reparler rapidement entre les 3 administrateurs de données et de le faire évoluer dans un 2nd temps. Est-ce que c'est ok pour vous ?

gkapfer commented 2 years ago

Bonjour,

Oui, ok si ça se fait vite après coup, ça marche 😊 On est bon pour le reste au niveau de l’export ?

Je suis toujours en attente pour ces histoires de statut (surtout pour l’aspect articles à prendre en compte).

Donc si j’ai bien compris :

okristo commented 2 years ago

Oui sur le reste de l'export, c'est ok. je reprends et mets à jour les éléments listés plus haut par JPM :

Champs à supprimer:

  • niveau_validation
  • validateur
  • determinateur
  • regne
  • famille
  • reference_biblio

Changement de nom:

  • biologique_statut devient statut_biologique
  • statut_source devient type_source

Ajouter les champs (voir commentaire précédent):

  • fournisseur

Ajouter les champs suivant uniquement lorsque le traitement des données et la mise à jour faite dans la base (voir commentaire précédent):

  • commentaire_releve
  • commentaire_occurence
  • nom_lieu
  • niveau_sensibilite
  • niveau_precision_diffusion

Après discussion, on conserve les champs:

  • geojson_4326
  • x_centroid_4326
  • y_centroid_4326
  • precision_geographique (discussion à prévoir rapidement entre les deux CBN et le CEN)
  • nature_objet_geo (discussion à prévoir rapidement entre les deux CBN et le CEN)

Pour la MAJ des données : on attend votre feu vert suite au rapport de corrections envoyé par Jean-Pascal à Paul

jpm-cbna commented 2 years ago

La vue et le paramètre correspondant aux modifications proposées dans le commentaire précédent:

Le script SQL de mise à jour de la vue:

BEGIN;

DROP VIEW gn_synthese.v_synthese_for_export ;

CREATE OR REPLACE VIEW gn_synthese.v_synthese_for_export AS
    SELECT s.id_synthese,
        s.unique_id_sinp AS uuid_perm_sinp,
        s.unique_id_sinp_grp AS uuid_perm_grp_sinp,
        sd.dataset_name AS jdd_nom,
        sd.unique_dataset_id AS jdd_uuid,
        sd.organisms AS fournisseur,
        s.observers AS observateurs,
        t.cd_ref,
        t.nom_valide,
        t.nom_vern as nom_vernaculaire,
        t.classe AS classe,
        t.ordre AS ordre,
        s.count_min AS nombre_min,
        s.count_max AS nombre_max,
        s.date_min::date AS date_debut,
        s.date_max::date AS date_fin,
        public.st_asgeojson(s.the_geom_4326) AS geojson_4326,-- Use for SHP export and data blurring
        st_x(st_transform(st_centroid(s.the_geom_point), 4326)) AS x_centroid_4326,
        st_y(st_transform(st_centroid(s.the_geom_point), 4326)) AS y_centroid_4326,
        s."precision" AS precision_geographique,
        n1.label_default AS nature_objet_geo,
        communes AS communes,
        s.altitude_min AS alti_min,
        n3.label_default AS technique_observation,
        n10.label_default AS stade_vie,
        n5.label_default AS statut_biologique,
        n11.label_default AS sexe,
        n20.label_default AS comportement,
        n17.label_default AS type_source,
        -- Fields use in internal
        sd.id_dataset AS jdd_id, -- Use for CRUVED
        s.id_digitiser AS id_digitiser, -- Use for CRUVED
        public.ST_asgeojson(s.the_geom_local) AS geojson_local,-- Use for SHP export
        s.id_nomenclature_sensitivity, -- Use for data blurring
        s.id_nomenclature_diffusion_level -- Use for data blurring
    FROM gn_synthese.synthese AS s
        JOIN taxonomie.taxref AS t ON t.cd_nom = s.cd_nom
        LEFT JOIN LATERAL (
            SELECT
                id_synthese,
                string_agg(DISTINCT concat(a_1.area_name, ' (', a_1.area_code, ')'), ', '::text) AS communes
            FROM gn_synthese.cor_area_synthese AS cas
                JOIN ref_geo.l_areas AS a_1
                    ON cas.id_area = a_1.id_area
                JOIN ref_geo.bib_areas_types AS ta
                    ON ta.id_type = a_1.id_type AND ta.type_code ='COM'
            WHERE cas.id_synthese = s.id_synthese
            GROUP BY id_synthese
        ) AS sa ON true
        LEFT JOIN LATERAL (
            SELECT
                td.id_dataset,
                td.dataset_name,
                td.unique_dataset_id,
                string_agg(DISTINCT bo.nom_organisme, ', '::text) AS organisms
            FROM gn_meta.t_datasets AS td
                LEFT JOIN gn_meta.cor_dataset_actor AS cad
                    ON (
                        cad.id_dataset = td.id_dataset
                        AND (
                            cad.id_nomenclature_actor_role = ref_nomenclatures.get_id_nomenclature('ROLE_ACTEUR'::character varying, '5'::character varying)
                            OR cad.id_nomenclature_actor_role = ref_nomenclatures.get_id_nomenclature('ROLE_ACTEUR'::character varying, '6'::character varying)
                        )
                    )
                LEFT JOIN utilisateurs.bib_organismes bo
                    ON bo.id_organisme = cad.id_organism
            WHERE td.id_dataset = s.id_dataset
            GROUP BY td.id_dataset
        ) AS sd ON true
        LEFT JOIN ref_nomenclatures.t_nomenclatures AS n1 ON s.id_nomenclature_geo_object_nature = n1.id_nomenclature
        LEFT JOIN ref_nomenclatures.t_nomenclatures AS n3 ON s.id_nomenclature_obs_technique = n3.id_nomenclature
        LEFT JOIN ref_nomenclatures.t_nomenclatures AS n5 ON s.id_nomenclature_bio_status = n5.id_nomenclature
        LEFT JOIN ref_nomenclatures.t_nomenclatures AS n10 ON s.id_nomenclature_life_stage = n10.id_nomenclature
        LEFT JOIN ref_nomenclatures.t_nomenclatures AS n11 ON s.id_nomenclature_sex = n11.id_nomenclature
        LEFT JOIN ref_nomenclatures.t_nomenclatures AS n17 ON s.id_nomenclature_source_status = n17.id_nomenclature
        LEFT JOIN ref_nomenclatures.t_nomenclatures AS n20 ON s.id_nomenclature_behaviour = n20.id_nomenclature ;

COMMIT;

Le paramètre de config:

EXPORT_COLUMNS = [
        "uuid_perm_sinp",
        "uuid_perm_grp_sinp",
        "jdd_nom",
        "jdd_uuid",
        "fournisseur",
        "observateurs",
        "cd_ref",
        "nom_valide",
        "nom_vernaculaire",
        "classe",
        "ordre",
        "nombre_min",
        "nombre_max",
        "date_debut",
        "date_fin",
        "geojson_4326",
        "x_centroid_4326",
        "y_centroid_4326",
        "precision_geographique",
        "nature_objet_geo",
        "communes",
        "alti_min",
        "technique_observation",
        "stade_vie",
        "statut_biologique",
        "sexe",
        "comportement",
        "type_source",
    ]

Afin de pouvoir prendre en compte les champs "x_centroid_4326" et "y_centroid_4326" dans l'export, il est nécessaire de mettre à jour le code du fichier geonature/backend/geonature/core/gn_synthese/routes.py en ajoutant les entrées ci-dessous au paramètre geom_fields de la classe DataBlurring:

  {
      "output_field": 'x_centroid_4326',
      "compute": "x",
  },
  {
      "output_field": 'y_centroid_4326',
      "compute": "y",
  },
okristo commented 2 years ago

Évolutions à prévoir pour les informations relatives à la précision de l'information :

gkapfer commented 2 years ago

Suite à échanges avec utilisateurs entomologistes, il sera nécessaire d'ajouter la colonne Famille... Pour les ordres avec beaucoup de familles : impossible de faire des tris pour classer les espèces Passer par les paramètres avancés = impossible aussi car trop de familles...

okristo commented 2 years ago

Validé en réunion technique du 27/01 : Ajouter un champ "additionnal_data" pouvant prendre les valeurs "donnée confidentielle" / "donnée non confidentielle" Donnée confidentielle = donnée privée dont niveau diffusion est différent de 5 ou donnée sensible dont valeur de sensibilité est différent de 0. Champ confidential, nommé confidentialité dans les exports Ajouter (JPM) ce format dans le WIKI sur le modèle de ce qui a été fait pour "communeInseeCode" et "departementInseeCode" Ajouter ce champ dans les exports Ajouter également dans les exports le champ niveau_sensibilite

lpojgc commented 2 years ago

suite à notreé change de cet aprem, j'ajoute le besoin du champ statut_observation pour détecter les données d'absence

jpm-cbna commented 2 years ago

Note : l'ordre d'affichage des colonnes dans le fichier CSV dépend de l'ordre des colonnes dans la vue et non de l'ordre des champ dans le paramètre de config...

Le script SQL de mise à jour de la vue:

BEGIN;

DROP VIEW gn_synthese.v_synthese_for_export ;

CREATE OR REPLACE VIEW gn_synthese.v_synthese_for_export AS
    SELECT s.id_synthese,
        s.unique_id_sinp AS uuid_perm_sinp,
        s.unique_id_sinp_grp AS uuid_perm_grp_sinp,
        sd.dataset_name AS jdd_nom,
        sd.unique_dataset_id AS jdd_uuid,
        sd.organisms AS fournisseur,
        s.observers AS observateurs,
        t.cd_ref,
        t.nom_valide,
        t.nom_vern AS nom_vernaculaire,
        t.classe AS classe,
        t.famille AS famille,
        t.ordre AS ordre,
        s.count_min AS nombre_min,
        s.count_max AS nombre_max,
        s.date_min::date AS date_debut,
        s.date_max::date AS date_fin,
        st_asgeojson(s.the_geom_4326) AS geojson_4326, -- Use for SHP export and data blurring
        st_x(st_transform(st_centroid(s.the_geom_point), 4326)) AS x_centroid_4326,
        st_y(st_transform(st_centroid(s.the_geom_point), 4326)) AS y_centroid_4326,
        s."precision" AS precision_geographique,
        sa.communes,
        s.altitude_min AS alti_min,
        n3.label_default AS technique_observation,
        n10.label_default AS stade_vie,
        n5.label_default AS statut_biologique,
        n11.label_default AS sexe,
        n20.label_default AS comportement,
        n17.label_default AS type_source,
        s.additional_data ->> 'precisionLabel' AS type_precision,
        CASE 
            WHEN ns.cd_nomenclature = '0' THEN 'donnée non sensible' 
            WHEN s.id_nomenclature_sensitivity IS NULL THEN '' 
            ELSE 'donnée sensible' 
        END AS sensibilite,
        CASE
            WHEN s.additional_data ->> 'confidential' = 'true' THEN 'donnée confidentielle'
            ELSE 'donnée non confidentielle'
        END AS confidentialite,
        -- Fields use in internal
        sd.id_dataset AS jdd_id, -- Use for CRUVED
        s.id_digitiser AS id_digitiser, -- Use for CRUVED
        st_asgeojson(s.the_geom_local) AS geojson_local, -- Use for SHP export
        s.id_nomenclature_sensitivity, -- Use for data blurring
        s.id_nomenclature_diffusion_level -- Use for data blurring
    FROM gn_synthese.synthese AS s
        JOIN taxonomie.taxref t ON t.cd_nom = s.cd_nom
        LEFT JOIN LATERAL ( 
            SELECT
                cas.id_synthese,
                string_agg(DISTINCT concat(a_1.area_name, ' (', a_1.area_code, ')'), ', '::text) AS communes
            FROM gn_synthese.cor_area_synthese AS cas
                JOIN ref_geo.l_areas AS a_1 
                    ON cas.id_area = a_1.id_area
                JOIN ref_geo.bib_areas_types AS ta 
                    ON ta.id_type = a_1.id_type AND ta.type_code::text = 'COM'::text
            WHERE cas.id_synthese = s.id_synthese
            GROUP BY cas.id_synthese
        ) AS sa ON true
        LEFT JOIN LATERAL (
            SELECT 
                td.id_dataset,
                td.dataset_name,
                td.unique_dataset_id,
                string_agg(DISTINCT bo.nom_organisme::text, ', '::text) AS organisms
            FROM gn_meta.t_datasets AS td
                 LEFT JOIN gn_meta.cor_dataset_actor cad 
                    ON (
                        cad.id_dataset = td.id_dataset 
                        AND (
                            cad.id_nomenclature_actor_role = ref_nomenclatures.get_id_nomenclature('ROLE_ACTEUR'::character varying, '5'::character varying) 
                            OR cad.id_nomenclature_actor_role = ref_nomenclatures.get_id_nomenclature('ROLE_ACTEUR'::character varying, '6'::character varying)
                        )
                    )
                 LEFT JOIN utilisateurs.bib_organismes bo 
                    ON bo.id_organisme = cad.id_organism
            WHERE td.id_dataset = s.id_dataset
            GROUP BY td.id_dataset
        ) sd ON true
        LEFT JOIN ref_nomenclatures.t_nomenclatures AS n3 ON s.id_nomenclature_obs_technique = n3.id_nomenclature
        LEFT JOIN ref_nomenclatures.t_nomenclatures AS n5 ON s.id_nomenclature_bio_status = n5.id_nomenclature
        LEFT JOIN ref_nomenclatures.t_nomenclatures AS n10 ON s.id_nomenclature_life_stage = n10.id_nomenclature
        LEFT JOIN ref_nomenclatures.t_nomenclatures AS n11 ON s.id_nomenclature_sex = n11.id_nomenclature
        LEFT JOIN ref_nomenclatures.t_nomenclatures AS n17 ON s.id_nomenclature_source_status = n17.id_nomenclature
        LEFT JOIN ref_nomenclatures.t_nomenclatures AS n20 ON s.id_nomenclature_behaviour = n20.id_nomenclature
        LEFT JOIN ref_nomenclatures.t_nomenclatures AS ns ON s.id_nomenclature_sensitivity = ns.id_nomenclature ; 

COMMIT;

Le paramètre de config:

EXPORT_COLUMNS = [
        "uuid_perm_sinp",
        "uuid_perm_grp_sinp",
        "jdd_nom",
        "jdd_uuid",
        "fournisseur",
        "observateurs",
        "cd_ref",
        "nom_valide",
        "nom_vernaculaire",
        "classe",
        "famille",
        "ordre",
        "nombre_min",
        "nombre_max",
        "date_debut",
        "date_fin",
        "geojson_4326",
        "x_centroid_4326",
        "y_centroid_4326",
        "precision_geographique",
        "communes",
        "alti_min",
        "technique_observation",
        "stade_vie",
        "statut_biologique",
        "sexe",
        "comportement",
        "type_source",
        "type_precision",
        "sensibilite",
        "confidentialite",
    ]
helenechauvin commented 1 year ago

Je relance le sujet à propos de 2 champs exportés : commune et observateurs. A quel point cela impacterait le temps d'export si on scindait la commune du code insee qui sont actuellement concaténés. Idem pour les observateurs.

jpm-cbna commented 1 year ago

Difficile à dire avant de tester. Pour les communes cela devrait aller car je concatène les valeurs. Pour les observateurs, cela va engendrer un ralentissement supplémentaire car le champ observateur n'est pas divisé à l'origine. Il faut donc ajouter un traitement supplémentaire. En outre, cela risque de rajouter beaucoup de colonnes vide si une observations à plusieurs observateurs et les autres noms... Je ne comprends pas bien l'intérêt de séparer les observateurs dans des colonnes. Quel type de traitement est effectué dessus ?

helenechauvin commented 1 year ago

Ok, on peut laisser le champ observateurs tel quel alors (c'est juste que pour les intégrer dans Silene Admin on scinde les observateurs et d'après ce que je comprends, on les reconcatène quand on les envoie dans Silene. Donc, je vais voir pour ce point là en interne). Par contre, pour la commune ça serait très pratique de la scinder du code insee.

lvahe commented 1 year ago

Demande formulée par un utilisateur (Jacques Bry) : ajouter le champ "nom_cité" dans les champs exportables pour permettre un recoupement plus aisé espèces/sous-espèces/cd_ref/nom_cité. Besoin : disposer d'un tableau qui reprend, pour chaque observation : UUID_perm et nom_cité. @helenechauvin as-tu déjà eu ce genre de demande ? Est-ce une demande isolée ?

helenechauvin commented 1 year ago

@lvahe non je n'ai pas encore eu ce genre de demande. Du coup si c'est juste une demande isolée, je ne suis pas certaine de la pertinence de l'ajouter aux champs exportables?