Schema
Owner
albenard
Descriptions
Fonction d'extraction des informations météo (id_maille) pour la création de fichier météo en entrée du modèle biljou
Options
Option | Value |
---|---|
Returns |
text |
Language |
|
Parameters |
mode_emprise text table_tmp text source_meteo text table_result text system_geo_emprise text = NULL::text nom_geometrie_emprise text = NULL::text |
Definition
CREATE OR REPLACE FUNCTION public.ps_extraction_meteo (
mode_emprise text,
table_tmp text,
source_meteo text,
table_result text,
system_geo_emprise text = NULL::text,
nom_geometrie_emprise text = NULL::text
)
RETURNS text LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
PARALLEL UNSAFE
COST 100
AS
$span$
-- Auteur : Alain Benard
-- Mises à jour : 01/04/2022 - prise en compte du parametre tolerance lors de l'appel ps_extraction_source
-- 09/09/2021 (prise en compte modification appel ps_extraction_source)
-- 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 météo pour la construction des fichiers météo nécessaires au fonctionnement du modèle biljou.
-- Elle vérifie que la table issue de la phase précédente existe bien, valide que la source météo est correcte et récupère les informations de géométrie de cette source
-- (table contenant le raster et srid du raster)
-- 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 dans lequel se situe chaque point X,Y
-- avec éventuellement une transformation (reprojection) si le srid des x,y et 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)
-- 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;
curs_table refcursor; -- Curseur recevant les informations de la table / requête à analyser
rec_table record; -- Enregistrement contenant la ligne en cours de traitement
table_raster text;
compteur integer;
id_source_meteo integer;
raster_meteo text;
--epsg_meteo integer;
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 bigint,
id_maille_meteo bigint,
id_maille_sol bigint,
id_maille_peuplement bigint,
id_maille_altitude bigint,
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
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('') || ',' -- filtre : inutile pour la météo
|| 0 || ');'; -- tolerance : inutile pour la météo
execute requete into resultat_extraction;
raise notice 'resultat = % ', resultat_extraction;
if resultat_extraction <> 'ok' then
return resultat_extraction;
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;
-- 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_meteo(mode_emprise text, table_tmp text, source_meteo text, table_result text, system_geo_emprise text, nom_geometrie_emprise text)
IS 'Fonction d''extraction des informations météo (id_maille) pour la création de fichier météo 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 |