IMPORT NIVEAU 1

Dans cet exemple, nous allons importer un fichier CSV (ou SHP) d’observations dans la base de données de GeoNature, pour ensuite intégrer ces données dans la synthèse de GeoNature.

On utilisera le fichier d’exemple https://github.com/PnX-SI/Ressources-techniques/blob/master/GeoNature/V2/import-basique/01-observations-faune-2008-2010.csv.

Importer la donnée source dans la BDD avec QGIS

PS : Si vous utilisez un CSV, vous pouvez aussi utiliser la fonction gn_imports.load_csv_file.

1. Connecter la BDD dans QGIS :

  • QGIS

  • PostGIS / Clic droit / New connection

  • Nom / Hôte (IP) / Base de données (geonaturedb) / Authentification de base (utilisateur / mot de passe)

  • Parcourir les tables géométriques

Si vous devez ouvrir les connexions externes à votre BDD, voir la documentation https://github.com/PnEcrins/GeoNature-atlas/blob/master/docs/installation.rst#acc%C3%A9der-%C3%A0-votre-bdd

2. Importer le fichier dans la BDD :

  • Ouvrir SHP ou CSV dans QGIS

  • Bases de données / Gestionnaire de base de données

  • Sélectionner la BDD et son schéma

  • Importer une couche/un fichier

  • Choisir la couche à importer et définir le nom de table de destination

Créer les métadonnées

1. Ajouter une source (si elle n’existe pas déjà)

En l’ajoutant manuellement dans la table gn_synthese.t_sources ou en SQL :

INSERT INTO gn_synthese.t_sources(name_source, desc_source)
VALUES
('Historique', 'Données historiques intégrées manuellement dans la BDD')

2. Ajouter un jeu de données (si il n’existe pas déja)

Avec l’admin de GeoNature, dans la BDD avec pgAdmin ou en SQL. Et avant ça un CA si il n’en existe pas déjà un auquel associer le JDD.

INSERT INTO gn_meta.t_datasets(id_acquisition_framework, dataset_name, dataset_shortname, dataset_desc, id_nomenclature_data_type, keywords, marine_domain, terrestrial_domain, active)
VALUES
(1, 'Données Faune 2008-2010', 'Faune 2008-2010', 'Données faune du PNE entre 2008 et 2010', 326, 'Faune, PNE', FALSE, TRUE, TRUE)

Pour retrouver les valeurs d’un type de nomenclature, vous pouvez utiliser les vues qui les rendent plus lisibles. Par exemple ici ref_nomenclatures.v_data_typ. Ou bien l’Admin des nomenclatures disponible dans GeoNature.

Il est aussi possible d’utiliser les codes des nomenclatures pour retrouver leurs id (ceci étant variables d’une instance à l’autre), en utilisant la fonction ref_nomenclatures.get_id_nomenclature.

Insertion des données dans la Synthèse

INSERT INTO gn_synthese.synthese(
unique_id_sinp,
id_source,
id_dataset,
id_nomenclature_obs_technique,
count_min,
count_max,
cd_nom,
nom_cite,
altitude_min,
altitude_max,
the_geom_4326,
the_geom_point,
the_geom_local,
date_min,
date_max,
observers,
comments,
last_action
)
 SELECT
      uuid_generate_v4(), -- Attention, ne générez un UUID_SINP pour chaque obs que si vous êtes surs qu'elles n'en ont pas déjà un
      2 AS id_source,
      3 AS id_dataset,
      CASE
        WHEN critere = 'Vu' THEN (select ref_nomenclatures.get_id_nomenclature('METH_OBS','0'))
        WHEN critere = 'Entendu' THEN (select ref_nomenclatures.get_id_nomenclature('METH_OBS','1'))
        ELSE (gn_synthese.get_default_nomenclature_value('METH_OBS'))
      END AS id_nomenclature_obs_meth,
      effectif::integer,
      effectif::integer,
      cd_nom::integer,
      taxon_latin,
      altitude::integer, -- On pourrait calculer les valeurs manquantes avec la fonction ref_geo.fct_get_altitude_intersection
      altitude::integer,
      ST_SetSRID(ST_MakePoint("x_WGS84"::numeric, "y_WGS84"::numeric),4326) AS the_geom_4326,
      ST_Centroid(ST_SetSRID(ST_MakePoint("x_WGS84"::numeric, "y_WGS84"::numeric),4326)) AS the_geom_point,
      ST_Transform(ST_SetSRID(ST_MakePoint("x_WGS84"::numeric, "y_WGS84"::numeric),4326),2154) AS the_geom_local,
      dateobs::date,
      dateobs::date,
      observateurs,
      remarques,
      'I' AS last_action -- code de la dernière action effectuée: Valeurs possibiles 'I': insert, 'U': update
 FROM gn_imports.obs_faune_2008_2010
 ORDER BY dateobs
;

A creuser pour calculer les altitudes non renseignées :

SELECT id_synthese,
(ref_geo.fct_get_altitude_intersection(the_geom_local)).altitude_min
(ref_geo.fct_get_altitude_intersection(the_geom_local)).altitude_max
FROM gn_synthese.synthese
LIMIT 1000;

Gil propose de rajouter une PK et de faire un lien entre les données de la table importée et celles dans la synthèse avec entity_source_pk_value :

-- Clé primaire
ALTER TABLE gn_imports.obs_faune_2008_2010
   ADD COLUMN gid serial;

ALTER TABLE gn_imports.obs_faune_2008_2010
   ADD CONSTRAINT pk_obs_faune_2008_2010 PRIMARY KEY(gid);

Ajouter le champ entity_source_pk_value dans ton INSERT et gid dans le SELECT.

On pourrait aussi remplir cor_observers_synthese si on le veut et si on a les observateurs présents dans les données, en les faisant correspondre avec leurs id_role.

L’intégration de données dans la Synthèse peut faire apparaitre des nouveaux taxons présents sur le territoire. Si vous souhaitez les proposer à la saisie dans Occtax, il faut les ajouter dans taxonomie.bib_noms puis dans la liste « Saisie Occtax ».

-- Remplir taxonomie.bib_noms avec les nouveaux noms présents dans la synthèse
INSERT INTO taxonomie.bib_noms (cd_nom, cd_ref)
SELECT DISTINCT s.cd_nom, t.cd_ref
FROM gn_synthese.synthese s
JOIN taxonomie.taxref t
ON s.cd_nom = t.cd_nom
WHERE not s.cd_nom IN (SELECT DISTINCT cd_nom FROM taxonomie.bib_noms);

Il faudrait ensuite les ajouter à la liste « Saisie Occtax », pour que ces nouveaux noms soient proposés à la saisie dans le module Occtax de GeoNature.

L’installation de GeoNature intègre les communes de toute la France métropolitaine. Pour alléger la table ref_geo.l_areas, il peut être pertinent de supprimer les communes en dehors du territoire de travail. Par exemple, supprimer toutes les communes en dehors du département.

Pour retrouver le détail de toutes les communes du département Bouches-du-Rhône :

SELECT * FROM ref_geo.l_areas la
JOIN ref_geo.bib_areas_types ba ON ba.id_type = la.id_type
JOIN ref_geo.li_municipalities lm ON lm.id_area = la.id_area
WHERE ba.type_code = 'COM' AND lm.insee_dep = '13'

A utiliser dans une requête de suppression, en gérant les cascades entre les tables.

Insertion depuis un shapefile

L’exercice est similaire si on part depuis un fichier Shape (https://github.com/PnX-SI/Ressources-techniques/blob/master/GeoNature/V2/import-basique/01-observations-faune-2008-2010-SHP.zip)

La seule différence est que la géométrie est calculée lors de l’import de QGIS vers PostGIS.

Ainsi la partie Géométrie de la requête d’insertion dans la Synthèse serait :

ST_Transform(ST_SetSRID(geom,2154),4326 AS the_geom_4326,
ST_Centroid(ST_SetSRID(geom,2154) AS the_geom_point,
geom AS the_geom_local,