db.silva.inrae.fr/db_biljou_param - db_biljou_param on db.silva.inrae.fr
Previous topic Chapter index Next topic

Function: ps_extraction_complete

 

 

Schema

public

 

Owner

albenard

 

Descriptions

Fonction d'extraction des informations de toutes les sources à utiliser pour la création de fichier météo et paramètre en entrée du modèle biljou

 

Options

Option

Value

Returns

text

Language

plpgsql

Parameters

mode_emprise text

table_tmp text

source_meteo text

source_sol text

source_altitude text

table_result text

source_peuplement text = NULL::text

system_geo_emprise text = NULL::text

nom_geometrie_emprise text = NULL::text

tolerance integer = 5

 

Definition

CREATE OR REPLACE FUNCTION public.ps_extraction_complete (
 mode_emprise text,
 table_tmp text,
 source_meteo text,
 source_sol text,
 source_altitude text,
 table_result text,
 source_peuplement text = NULL::text,
 system_geo_emprise text = NULL::text,
 nom_geometrie_emprise text = NULL::text,
 tolerance integer = 5
)
RETURNS text LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
PARALLEL UNSAFE
COST
100
AS
$span$

-- Auteur : Alain Benard
-- Date de mise à jour : 09/02/2022 - Purge du code ou commentaire de parties inutiles.
-- Date de mise à jour : 07/09/2021 (prise en compte des optimisations liées notamment à l'appel de ps_extraction_source et à l'ordre des instructions)
-- Cette fonction s'appuie sur une table préalalablement remplie et complétée par la procédure ps_initialise_emprise. Elle construit une table résultat qui contiendra
-- les identifiants de maille (toutes sources) pour la construction des fichiers météo et paramètres nécessaires au fonctionnement du modèle biljou.
-- Elle vérifie que la table issue de la phase précédente existe bien, et pour chacune des sources valide que la source est correcte et récupère les informations de géométrie de cette source
-- (table contenant le raster et srid du raster ou bien les vecteurs).
-- Elle alimente les colonnes latitude et longitude de la table résultat.
-- Pour le mode XY : Elle récupère le code srid correspondant au X et Y puis alimente la table résultat en analysant la valeur du pixel ou vecteur dans lequel se situe chaque point X,Y
-- avec éventuellement une transformation (reprojection) si le srid des x,y est différent de celui de la source

-- Pour le mode MAILLE_COMPLETE :
-- Pour le mode MAILLE_PARTIELLE :
--
--
-- paramètres :
-- mode_emprise : 3 modes de choix pour sélectionner l'emmprise :
-- L'opérateur fournit un fichier avec des X et Y en indiquant le système de géoréférencement. (XY)
-- L'opérateur indique une géométrie (voir table tr_geometrie_geo de la base db_biljou_param) avec 2 possibilités :
-- L'ensemble des coordonnées de la géométrie (id_maille) est à prendre en compte (MAILLE_COMPLETE)
-- L'utilisateur fournit en plus un fichier comportant uniquement le id_maille concernés (MAILLE_PARTIELLE)login de l'utilisateur à créer

-- table_tmp : nom de la table préalablement créée par l'appelant et contenant les données des fichiers utilisateurs le cas échéant  (X;Y ou id_maille)
-- source_meteo : Nom de la source météo à analyser (champ src_nom de la table t_source_src)
-- source_sol : Nom de la source sol à analyser (champ src_nom de la table t_source_src)
-- source_altitude : Nom de la source altitude à analyser (champ src_nom de la table t_source_src)
-- source_peuplement : Nom de la source peuplement à analyser (champ src_nom de la table t_source_src)
-- source_altitude : Nom de la source altitude à analyser (champ src_nom de la table t_source_src) supprimé le 21/04/2020
-- table_result : nom de la table qui contiendra les résultats
-- system_geo_emprise : Système de géoréférencement si l'utilisateur a fourni un fichier X;Y
-- nom_geometrie_emprise : Dans les 2 derniers cas d'usage la fonction doit connaître la géométrie choisie (champ geo_nom de la table tr_geometrie_geo)

-- déclaration des variables de traitements

DECLARE
   requete text; -- Variable permettant de stocker le code SQL de requêtes à exécuter.
status boolean; -- Booléen permettant de tester si une exécution a retourné vrai ou faux
epsg_emprise integer;
table_raster text;
resultat_extraction text; -- Variable pour stocker le résultat de l'appel de ps_extraction_source

BEGIN

-- Vérification existence table_tmp
 select into status ps_existe_table_temporaire(table_tmp);
 if status = false then
return
'Erreur : la table temporaire' || table_tmp || ' est inexistante.';
 end if;


-- Suppression éventuelle de la table résultat d'un précédent traitement (à renforcer car il pourrait s'agir d'une table permanente : vérif coté temporaire préalable) :
requete = 'drop table if exists ' || table_result || ';' ;
execute requete;

-- Préparation de la table résultat.
requete = 'create temporary table ' || table_result || '
(cle varchar(16)
,x double precision,
y double precision,
id_maille_emprise int,
id_maille_meteo int,
id_maille_sol int,
id_maille_altitude int,
id_maille_peuplement int,
latitude double precision,
longitude double precision);'
;
execute requete;
 CASE -- Traitement spécifique à chaque mode de traitement
     WHEN mode_emprise = 'XY' THEN
-- Vérification existence systeme géoréférencement et récupération SRID.
select sri_code_epsg into epsg_emprise from tr_srid_sri where sri_nom = system_geo_emprise;
if epsg_emprise is null then
return
'Erreur : le système de géoréférencement ' || system_geo_emprise || ' est inexistant dans la base de données.';
end if;
-- Mise en place des X,Y et cle dans la table resultat
requete = 'insert into ' || table_result || ' (cle,x,y)
select cle,x,y from '
|| table_tmp || ';';
execute requete;

-- Index sur X,Y de la table resultat.
requete = 'create index x_btr_xy_' || table_result || ' on ' || table_result || ' using btree (x,y);';
execute requete;

-- Alimentation table resultat avec informations peuplement
-- A réaliser en premier car les données peuplement ne sont disonibles que sur une partie du territoire
-- ce qui va réduire le nombre de points à traiter notamment pour les autres données (sol,météo ...)

raise notice 'peuplement';
if source_peuplement is not null then
requete = 'select ps_extraction_source(' || quote_literal(mode_emprise) || ','
|| quote_literal(source_peuplement) || ','
|| '''peuplement''' || ','
|| quote_literal(table_result) || ','
|| epsg_emprise || ','
|| quote_literal('non concerne')  || ',' -- problème avec valeur null
|| quote_literal('')  || ');';
execute requete into resultat_extraction;
raise notice 'resultat = % ', resultat_extraction;
else
raise notice 'pas de peuplement';
end if;

if resultat_extraction <> 'ok' then
return
resultat_extraction;
end if;

-- Alimentation table resultat avec informations sol
raise notice 'sol';
if source_peuplement is not null then
requete = 'select ps_extraction_source(' || quote_literal(mode_emprise) || ','
|| quote_literal(source_sol) || ','
|| '''sol''' || ','
|| quote_literal(table_result) || ','
|| epsg_emprise || ','
|| quote_literal('non concerne')  || ',' -- problème avec valeur null
|| quote_literal('id_maille_peuplement')  || ');';
else
requete = 'select ps_extraction_source(' || quote_literal(mode_emprise) || ','
|| quote_literal(source_sol) || ','
|| '''sol''' || ','
|| quote_literal(table_result) || ','
|| epsg_emprise || ','
|| quote_literal('non concerne')  || ',' -- problème avec valeur null
|| quote_literal('')  || ');';
end if;
execute requete into resultat_extraction;
raise notice 'resultat = % ', resultat_extraction;

if resultat_extraction <> 'ok' then
return
resultat_extraction;
end if;

-- Alimentation table resultat avec informations meteo
raise notice 'meteo';
requete = 'select ps_extraction_source(' || quote_literal(mode_emprise) || ','
|| quote_literal(source_meteo) || ','
|| '''meteo''' || ','
|| quote_literal(table_result) || ','
|| epsg_emprise || ','
|| quote_literal('non concerne')  || ',' -- problème avec valeur null
|| quote_literal('id_maille_sol')  || ');';
execute requete into resultat_extraction;
raise notice 'resultat = % ', resultat_extraction;

if resultat_extraction <> 'ok' then
return
resultat_extraction;
end if;

-- Alimentation table resultat avec informations altitude
raise notice 'altitude';
requete = 'select ps_extraction_source(' || quote_literal(mode_emprise) || ','
|| quote_literal(source_altitude) || ','
|| '''altitude''' || ','
|| quote_literal(table_result) || ','
|| epsg_emprise || ','
|| quote_literal('non concerne')  || ',' -- problème avec valeur null
|| quote_literal('id_maille_meteo')  || ');';
execute requete into resultat_extraction;
raise notice 'resultat = % ', resultat_extraction;

if resultat_extraction <> 'ok' then
return
resultat_extraction;
end if;

-- Alimentation des colonnes latitudes et longitudes
if epsg_emprise <> 4326 then
requete = 'update ' || table_result || '
set longitude = st_x(st_transform(st_setsrid(st_point(x,y),'
|| epsg_emprise|| '),4326)),
latitude  = st_y(st_transform(st_setsrid(st_point(x,y),'
|| epsg_emprise|| '),4326));';
execute requete;
else -- les x et y sont déjà les latitudes et longitudes
requete = 'update ' || table_result || '
set latitude  = y,
longitude = x;'
;
execute requete;
end if;
  
   WHEN (mode_emprise = 'MAILLE_COMPLETE') or (mode_emprise = 'MAILLE_PARTIELLE' )  THEN
--Vérification de l'existence de la géométrie
-- select geo_table into table_raster from tr_geometrie_geo where geo_nom = nom_geometrie_emprise;
-- if table_raster is null then
-- return 'Erreur : la géométrie ' || nom_geometrie_emprise || ' est inexistante dans la base de données.';
-- end if;
--Vérification existence table_raster
-- select into status ps_existe_table('public',table_raster);
-- if status = false then
-- return 'Erreur : la table ' || table_raster || ' référencée dans la géométrie ' || nom_geometrie_emprise || ' est inexistante.';
-- end if;

-- Récupération code epsg du raster.
       -- requete = 'select st_srid(rast) from ' || table_raster || ';';
       --   execute requete into epsg_emprise ;
-- Normalement il devrait y avoir une analyse pour savoir quelle est la maille la plus fine entre celle de l'emprise et celle de la source météo. Non implémenté au 22/07

return 'Le mode maille (complete ou partielle) n''est pas implémenté actuellement dans ce traitement';

 else
         return
'Erreur : le paramètre mode_emprise doit prendre une des 3 valeurs XY, MAILLE_COMPLETE ou MAILLE_PARTIELLE';
 END CASE;
 
 --requete = 'create table z_debug as (select * from ' || table_result || ');';
 --execute requete;
--  RAISE NOTICE 'Creation du compte - % ',req;


 return 'ok' ;

EXCEPTION
WHEN
OTHERS THEN
raise notice
'% % - %', sqlstate, sqlerrm,requete;
return 'erreur ' || requete || ' - ' || sqlerrm;
END;
$span$;

COMMENT ON FUNCTION public.ps_extraction_complete(mode_emprise text, table_tmp text, source_meteo text, source_sol text, source_altitude text, table_result text, source_peuplement text, system_geo_emprise text, nom_geometrie_emprise text, tolerance integer)
IS 'Fonction d''extraction des informations de toutes les sources à utiliser pour la création de fichier météo et paramètre en entrée du modèle biljou';

This file was generated with SQL Manager for PostgreSQL (www.pgsqlmanager.com) at 07/12/2018 13:23
Previous topic Chapter index Next topic