wiki:RHT PATE

Version 38 (modified by cedric, 13 years ago) (diff)

--

back to first page..

calcul des mortalités à la dévalaison

Sauvegarde et restauration des données de modèle dans la base

voir Model Results pour le script de sauvegarde à partir du fichier d'échange (en bas)

creation de méthodes R et d'une page "main" de lancement

  • source:trunk/EDARHT/main_rht_result.R fonction de lancement
  • source:trunk/EDARHT/BaseEdaRHTmodel.R modification ajout d'une méthode loaddb(mod_id) pour charger depuis la base
  • livraison du package stacomirtools et modification du init.R (chez Céline OK)
  • modification de la méthode predict pour intégrer les changements de la méthode fn_pred_set, OK les chargements depuis la base et les prédictions donnent le même résultat
  • source:trunk/EDARHT/BaseEdaRHTriversegmentspate.r
    • pour cette classe il y aura des affichages graphiques, creation d'un shape pour affichage dans R, j'utilise le chemin donné par shpwd du xml....
      E:\workspace\EDAdata\dataEDAccm\shape>pgsql2shp -f "rhtvs2" -h localhost -p 5432
       -u postgres -P postgres -g the_geom -r -k eda2.0_RHT "select id_drain, the_geom
       from rht.rhtvs2"
      
    • bon ben quand on passe par un lien ODBC, il y a des antislashes qui virent. Donc passer par R ne règle pas le problème. Donc il faut que je réussisse en sql. Ci dessous c'est fait.

fonction sql de recherche du bv amont

-- D'abord un essai qui marche
select cast(unnest(vecteurchemin) as integer) as id_drain 
        from (SELECT regexp_split_to_array(ltree2text(chemin),E'\\.+') as vecteurchemin from rht.rhtvs2 where chemin ~ '*.20211.*') as sub 
EXCEPT  select cast(unnest(vecteurchemin) as integer) as id_drain 
        from ( select regexp_split_to_array(ltree2text(chemin),E'\\.+') as vecteurchemin from rht.rhtvs2 where id_drain=20211) as sub
EXCEPT select 20211;

-- Ensuite la fonction qui ne marchait pas le E'\\.+' devient un E''\\\\.+''
DROP TYPE IF EXISTS id_drain;
CREATE TYPE id_drain as (id_drain int);
-- je sors le create table de la fonction pour gagner du temps... Attention à bien le lancer sinon ça plantera
DROP TABLE IF EXISTS rht.upstream_riversegments;
CREATE TABLE rht.upstream_riversegments(id_drain integer);
DROP  FUNCTION IF EXISTS rht.upstream_segments(id_ numeric);
CREATE OR REPLACE FUNCTION rht.upstream_segments(id_ numeric) RETURNS setof int AS $$
        DECLARE
        id_drain id_drain%ROWTYPE;
        BEGIN
        -- filling a new table with the results from a catchment
        delete from rht.upstream_riversegments;
        EXECUTE 'insert into rht.upstream_riversegments (select cast(unnest(vecteurchemin) as integer) as id_drain 
        from (SELECT regexp_split_to_array(ltree2text(chemin),E''\\\\.+'') as vecteurchemin from rht.rhtvs2 where chemin ~ ''*.'||id_||'.*'') as sub 
        EXCEPT  select cast(unnest(vecteurchemin) as integer) as id_drain 
        from ( select regexp_split_to_array(ltree2text(chemin),E''\\\\.+'') as vecteurchemin from rht.rhtvs2 where id_drain='||id_||') as sub
        EXCEPT select '||id_||' order by id_drain)';
        
        for id_drain in select * from rht.upstream_riversegments loop
                id_drain.id_drain=CAST(id_drain.id_drain AS int8);
                return next id_drain.id_drain;
                end loop;
                return; 
        END;
$$
LANGUAGE 'plpgsql' ;
COMMENT ON FUNCTION rht.upstream_segments(id_drain_ numeric) IS 'function using btree to calculate upstream riversegments';
-- pour lancer la fonction
select  rht.upstream_segments(20211); --734ms
  • TODO
    • Encapsuler la récupération des segments amont dans une méthode de classe
    • encapsuler le chargement du fichier des barrages dans une méthode de classe
    • vérifier les segments amont par le développement d'une méthode d'affichage graphique sous R
    • dans le main, passer les résultats RHT au niveau du data de la classe pate...
    • parcourir les segments amont et stocker les mortalités dans un array nrow(rht) 3 (types de mortalite) 353 (ouvrages dans la base)
    • Calculer la population amont au niveau d'un ouvrage en appelant les effectifs au lieu de la densité

Récupération du noeud mer

-- récupération de l'ancètre : rappel il n'y a pas d'index GiST possible, ça fait planter le serveur. On utilise le premier élément de l'array qui est retourné.
select vecteurchemin[1] from (
        select regexp_split_to_array(ltree2text(chemin),E'\\.+') vecteurchemin from rht.rhtvs2 where id_drain=20211) sub

DROP  FUNCTION IF EXISTS rht.sea_riversegment(id_ numeric);
CREATE OR REPLACE FUNCTION rht.sea_riversegment(id_ numeric) RETURNS int AS $$
        DECLARE id_drain int;
        BEGIN
        execute 'select vecteurchemin[1] from (
        select regexp_split_to_array(ltree2text(chemin),E''\\\\.+'') vecteurchemin from rht.rhtvs2 where id_drain='||id_||') sub' into id_drain;
        RETURN id_drain;
        END;
$$
LANGUAGE 'plpgsql' ;
COMMENT ON FUNCTION rht.sea_riversegment(id_drain_ numeric) IS 'function using btree to calculate sea riversegments';
select rht.sea_riversegment(20211);