Exporter les données d’observation au Format DEE

Pour le congrès de Dunkerque d’octobre 2015 et le travail d’analyse de la contribution des CEN à la connaissance naturaliste, nous avons entrepris de faire remonter les deonnées du réesau au format « DEE » du SINP.

Ce travail nous a permis de consolider prés de 2000000 de données.

Voici la rquête SQL qui nous a peris cette mise en forme depuis la base sicen.

SELECT row_number() OVER (ORDER BY (lpad(saisie_observation.id_obs::text, 7, '0'::text))) AS gid,
	 CASE saisie_observation.determination::text
		 WHEN 'Vu'::text THEN 'te'::text
		 WHEN 'Entendu'::text THEN 'te'::text
		 WHEN 'Indice de présence'::text THEN 'te'::text
		 WHEN 'Cadavre'::text THEN 'te'::text
		 WHEN 'Capture'::text THEN 'te'::text
		 WHEN 'Collection'::text THEN 'Co'::text
		 WHEN 'Littérature'::text THEN 'Li'::text
		 ELSE 'te'::text
	 END AS statutsource,
	 CASE saisie_observation.determination::text
		 WHEN 'Littérature'::text THEN 'à préciser'::text
		 ELSE NULL::text
	 END AS referencebiblio,
	 lpad(lot_donnee.id_lot::text, 4, '0'::text) AS jddid,
	 'SICEN-LR:00-175'::text AS jddcode,
	 lpad(saisie_observation.id_obs::text, 7, '0'::text) AS identifiantorigine,
	 NULL::text AS identifiantpermanent,
	 CASE
		 WHEN lot_donnee.libelle::text ~~* 'bénévolat%'::text THEN 'Pr'::text
		 WHEN saisie_observation.id_etude = ANY (ARRAY[39,
													   51]) THEN 'NSP'::text
		 ELSE 'Ac'::text
	 END AS dspublique,
	 NULL::text AS codeidcnpdispositif,
	 'CEN L-R'::text AS organismestandard,
	 CASE
		 WHEN lower(saisie_observation.type_effectif) = 'absence'::text THEN 'No'::text
		 ELSE 'Pr'::text
	 END AS statutobservation,
	 btrim(concat(saisie_observation.nom_vern, ' / ', saisie_observation.nom_complet), ' / '::text) AS nomcite,
	 saisie_observation.cd_nom::integer AS cdnom,
	 taxref.cd_ref::integer AS cdref,
	 'non'::text AS sensible,
	 COALESCE(saisie_observation.effectif, saisie_observation.effectif_min, 1::bigint)::integer AS denombrementmin,
	 COALESCE(saisie_observation.effectif, saisie_observation.effectif_max)::integer AS denombrementmax,
	 CASE
		 WHEN saisie_observation.type_effectif ~~* ANY (ARRAY['abondance%'::text,
															  'classe%'::text]) THEN 'Es'::text
		 ELSE 'Co'::text
	 END AS typedenombrement,
	 CASE
		 WHEN saisie_observation.type_effectif IS NOT NULL THEN 'In'::text
		 ELSE NULL::text
	 END AS objetdenombrement,
	 CASE
		 WHEN saisie_observation.observateur = '20'::text THEN 'NSP'::text
		 ELSE md.liste_nom_auteur(saisie_observation.observateur, ', '::text)
	 END AS identiteobservateur,
	 CASE md.liste_nom_structure(saisie_observation.structure, ', '::text)
		 WHEN 'Pas de structure'::text THEN 'indépendant'::text
		 ELSE md.liste_nom_structure(saisie_observation.structure, ', '::text)
	 END AS organismeobservateur,
	 'CEN L-R'::text AS organismegestionnairedonnees,
	 CASE
		 WHEN saisie_observation.observateur <> '20'::text THEN md.liste_nom_auteur(saisie_observation.observateur, ', '::text)
		 ELSE NULL::text
	 END AS determinateur,
	 btrim(concat(validateur.nom, ' ', validateur.prenom)) AS validateur,
	 saisie_observation.remarque_obs AS commentaire,
	 COALESCE(saisie_observation.date_obs, saisie_observation.date_debut_obs) AS datedebut,
	 COALESCE(saisie_observation.date_obs, saisie_observation.date_fin_obs) AS datefin,
	 NULL::TIME WITHOUT TIME ZONE AS heuredebut,
	 NULL::TIME WITHOUT TIME ZONE AS heurefin,
	 NULL::date AS datedeterminationobs,
	 saisie_observation.elevation::numeric AS altitudemin,
	 saisie_observation.elevation::numeric AS altitudemax,
	 NULL::numeric AS profondeurmin,
	 NULL::numeric AS profondeurmax,
	 NULL::text AS codehabitat,
	 NULL::text AS refhabitat,
	 st_asgml(saisie_observation.geometrie) AS geometrie,
	 CASE saisie_observation."precision"
		 WHEN 'GPS'::saisie.enum_precision THEN 10
		 WHEN '0 à 10m'::saisie.enum_precision THEN 10
		 WHEN '10 à 100m'::saisie.enum_precision THEN 100
		 WHEN '100 à 500m'::saisie.enum_precision THEN 500
		 ELSE 1000
	 END AS "precision",
	 CASE
		 WHEN st_geometrytype(saisie_observation.geometrie) ~~* '%POINT%'::text THEN 'St'::text
		 WHEN st_geometrytype(saisie_observation.geometrie) ~~* '%POLYGON%'::text
			  OR st_geometrytype(saisie_observation.geometrie) ~~* '%LINE%'::text THEN 'In'::text
		 ELSE 'NSP'::text
	 END AS natureobjetgeo,
	 COALESCE(saisie_observation.code_insee, commune.code_insee::text) AS codecommune,
	 commune.nom AS nomcommune,
	 sites_cen_inpn_2014.id_mnhn::text AS codeen,
	 NULL::text AS typeen,
	 NULL::text AS codemaille,
	 st_x(st_centroid(saisie_observation.geometrie)) AS st_x,
	 st_y(st_centroid(saisie_observation.geometrie)) AS st_y
FROM saisie.saisie_observation
JOIN inpn.taxref_v8 taxref USING (cd_nom)
JOIN ign_bd_topo.commune ON st_intersects(commune.geometrie, saisie_observation.geometrie)
LEFT JOIN referentiels_divers.sites_cen_inpn_2014 ON st_intersects(sites_cen_inpn_2014.geometrie, saisie_observation.geometrie)
LEFT JOIN md.lot_donnee ON saisie_observation.id_etude = lot_donnee.id_etude
AND saisie_observation.id_protocole = lot_donnee.id_protocole
AND ((CASE
          WHEN st_geometrytype(saisie_observation.geometrie) ~~* '%Point%'::text THEN 'point'::text
          WHEN st_geometrytype(saisie_observation.geometrie) ~~* '%LineString%'::text THEN 'ligne'::text
          WHEN st_geometrytype(saisie_observation.geometrie) ~~* '%Polygon%'::text THEN 'perimetre'::text
          ELSE NULL::text
      END || '_'::text) || CASE saisie_observation.regne
                               WHEN 'Plantae'::text THEN 'espece'::text
                               WHEN 'Animalia'::text THEN 'espece'::text
                               WHEN 'Fungi'::text THEN 'espece'::text
                               WHEN 'Habitat'::text THEN 'habitat'::text
                               ELSE NULL::text
                           END) = lot_donnee.type_donnee::text
LEFT JOIN md.personne validateur ON saisie_observation.validateur = validateur.id_personne
WHERE taxref.cd_nom::text ~ '^[\d+]'::text
  AND (saisie_observation.regne = ANY (ARRAY['Animalia'::text,'Plantae'::text,'Fungi'::text]))
  AND (md.liste_nom_structure(saisie_observation.structure, ', '::text) = ANY (ARRAY['CEN LR'::text,'Pas de structure'::text]))
  AND saisie_observation.cd_nom <> '000000'::text;