R/load_bdd_to_R_ch.R

#' @title Chargement des fichiers COOP depuis la base de donnees et mise en forme pour le calcul de donnees
#'
#' @description Cette fonction charge les tables au format pret pour l'utilisation des fonctions du package, directement a partir de la Base de donnees
#'
#' @param disp nom complet (lib_disp) des sites qui seront charges, au format "'SITEA', 'SITEB'"                   
#' @param nom, nom de l'utilisateur dans la base de donnees GIS Coop
#' @param mdp, mot de passe de l'utilisateur
#' @param serveur, nom du serveur ("postgres-national.jouy.inra.fr" pour l'INRA, bddcalcedoine.onf.fr pour l'ONF)
#' @return une liste de data.frame:
#' - unite : data.frame correspondant a Placette mais avec une ligne par unite de suivi (placette ou sous-placette)
#' - mesure : data.frame correspondant a Mesure (campagnes) mais avec une ligne par unite de suivi (placette ou sous-placette) 
#' - mesure2 : data.frame avec une ligne par placette ou sous-placette et inventaire (plusieurs lignes possible par campagne) 
#' - arbre : data.frame correspondant a Arbre mais avec uniquement les circonferences et les suivis sur liste 
#' - arbre_echantillon : data.frame reprenant tous les arbres echantillons 1, 2 ou 3 (placette, bandelette et sous-placette)
#' - inventaire_somme : data.frame correspondant a Inventaire_liste mais en regroupant les effectifs des bandelettes d'une meme placette  
#' - surface_somme : data.frame correspondant a ss_unite_surface mais en regroupant les surfaces des bandelettes d'une meme placette
#'
#' @author Ingrid Seynave et Quentin Girard
#' @references Protocole Coop chene... document d Ingrid et Claudine 
#'
#' @seealso  dico.ch, load_onf_ch, load_bdd_to_xls_ch
#' @examples
#' # A venir
#'
#' @keywords function
#'
#' @include coopR-package.R
#' @family coopR
#' @import DBI
#' @import RPostgreSQL
#' @import doBy
#' @import plyr
#' @export


load_bdd_to_R_ch <- function( 
                            disp = NULL,                                  # lib_disp du(es) dispositif(s) a exporter 
                            nom="ton nom",                                # nom de l'utilisateur dans la base de donnees GIS Coop
                            mdp=NULL,                       # mot de passe de l'utilisateur
                            serveur="postgres-national-priv-4.jouy.inra.fr") {   # ou bddcalcedoine.onf.fr     # adresse du serveur
                                   
  if (is.na(disp)) {
    stop("Vous devez choisir au moins 1 dispositif")
  }
  if (is.na(nom) | is.na(mdp) | is.na(serveur)) {
    stop("Vous devez specifier les parametres de connection a la base de donnees (nom d'utilisateur, mot de passe et adresse du serveur)")
  }
  
  ######## chargement des librairies et connexion a la base de donnees
  
  # connexion a la base de donnees
  drv <- dbDriver("PostgreSQL")
  con <- postgresqlNewConnection(drv=drv,user=nom,password=mdp,host=serveur,dbname="coop", port=54443)
  
  ######## dataframe placette
  query <- paste("SELECT DISTINCT 
              public.dispositif22.lib_disp,
              public.placette22.id_placette as id_unite,
              public.traitement22.co_traitement,
              public.placette22.essence_principale1_id,
              public.placette22.essence_principale2_id,
              public.placette22.surface,
              public.placette22.annee_plant,
              public.placette22.age_plant,
              public.placette22.mois_plant_id,
              public.placette22.an_cernes030,
              public.placette22.mois_cernes030_id,
              public.placette22.nb_cernes030,
              'pl' AS pl_sp
              FROM
              public.dispositif22
              INNER JOIN public.placette22 ON (public.dispositif22.id_dispositif = public.placette22.dispositif_id)
              INNER JOIN public.traitement22 ON (public.placette22.trait1_id = public.traitement22.id_traitement)
              WHERE 
              dispositif22.lib_disp in (",disp,")", sep="")  
  unite_pl <- dbSendQuery(con, query)
  unite_pl <- fetch(unite_pl, -1)
  
  ######## dataframe unite
  query <- paste("SELECT DISTINCT
              public.dispositif22.lib_disp,
              public.placette22.id_placette||'_'||public.ss_placette22.lib_ss_placette as id_unite,
              public.traitement22.co_traitement,
              public.placette22.essence_principale1_id,
              public.placette22.essence_principale2_id,
              public.ss_placette22.surface,
              public.placette22.annee_plant,
              public.placette22.age_plant,
              public.placette22.mois_plant_id,
              public.placette22.an_cernes030,
              public.placette22.mois_cernes030_id,
              public.placette22.nb_cernes030,
              'sp' AS pl_sp
              FROM
              public.placette22
              INNER JOIN public.ss_placette22 on (public.ss_placette22.placette_id = public.placette22.id_placette)
              INNER JOIN public.dispositif22 ON (public.placette22.dispositif_id = public.dispositif22.id_dispositif)
              INNER JOIN public.traitement22 ON (public.placette22.trait1_id = public.traitement22.id_traitement)
              WHERE
              dispositif22.lib_disp in (",disp,")", sep="")
  unite_sp <- dbSendQuery(con, query)
  unite_sp <- fetch(unite_sp, -1)
  
  unite <- rbind.fill(unite_pl, unite_sp)       
  unite$an_naissance <- with(unite, ifelse(is.na(an_cernes030), 
                             calc_veg(annee_plant, mois_plant_id) - age_plant,
                             calc_veg(an_cernes030, mois_cernes030_id) - nb_cernes030)) 
  unite <- subset(unite, select=-c(annee_plant, age_plant, mois_plant_id, mois_plant_id, an_cernes030, mois_cernes030_id, nb_cernes030))
  
  ######## dataframe mesure
  query <- paste("SELECT DISTINCT 
              public.placette22.id_placette as id_unite,
              public.mesure22.no_mesure,
              public.mesure22.an_vegetation,
              public.mesure22.type_suivi_id
              FROM
              public.placette22
              INNER JOIN public.mesure22 ON (public.placette22.id_placette = public.mesure22.placette_id)
              INNER JOIN public.dispositif22 ON (public.placette22.dispositif_id = public.dispositif22.id_dispositif)
              WHERE 
              type_suivi_id in (1, 2, 3, 5, 6, 7, 10) and dispositif22.lib_disp in (",disp,")", sep="")  
  mesure_pl <- dbSendQuery(con, query)
  mesure_pl <- fetch(mesure_pl, -1)
  
  query <- paste("SELECT DISTINCT
              public.placette22.id_placette||'_'||public.ss_placette22.lib_ss_placette as id_unite,
              public.mesure22.no_mesure,
              public.mesure22.an_vegetation,
              public.mesure22.type_suivi_id
              FROM
              public.placette22
              INNER JOIN public.ss_placette22 on (public.ss_placette22.placette_id = public.placette22.id_placette)
              INNER JOIN public.mesure22 ON (public.placette22.id_placette = public.mesure22.placette_id)
              INNER JOIN public.dispositif22 ON (public.placette22.dispositif_id = public.dispositif22.id_dispositif)
              WHERE
              type_suivi_id in (4, 5, 6, 7) AND dispositif22.lib_disp in (",disp,")", sep="")
  mesure_sp <- dbSendQuery(con, query)
  mesure_sp <- fetch(mesure_sp, -1)
  
  mesure <- rbind.fill(mesure_pl, mesure_sp)
  mesure <- merge(mesure, unite[,c("id_unite", "an_naissance")])
  mesure$age <- mesure$an_vegetation - mesure$an_naissance
  mesure <- mesure[, -which(names(mesure) == "an_naissance")]
    
  ######## dataframe arbre
  query <- paste("SELECT DISTINCT
            public.placette22.id_placette as id_unite,
            public.mesure22.no_mesure,
            public.arbre22.no_arb_pl as no_arbre,
            public.arbre22.essence_id,
            public.mesure_echantillon22.co_ech,
            public.mesure_echantillon22.etat_san_id,
            public.mesure_echantillon22.statut_av_id,
            public.mesure_echantillon22.diam_130,
            public.mesure_echantillon22.circonference130,
            public.mesure_echantillon22.eclairci_realise_id
            FROM
            public.dispositif22
            INNER JOIN public.placette22 ON (public.dispositif22.id_dispositif = public.placette22.dispositif_id)
            INNER JOIN public.arbre22 ON (public.placette22.id_placette = public.arbre22.placette_id)
            INNER JOIN public.mesure_echantillon22 ON (public.arbre22.id_arbre = public.mesure_echantillon22.arbre_id)
            INNER JOIN public.mesure22 ON (public.mesure_echantillon22.mesure_id = public.mesure22.id_mesure) AND (public.placette22.id_placette = public.mesure22.placette_id)
            WHERE
            dispositif22.lib_disp in (",disp,")", sep="")
  arbre_pl <- dbSendQuery(con, query)
  arbre_pl <- fetch(arbre_pl, -1)
  
  query <- paste("SELECT DISTINCT
              public.placette22.id_placette||'_'||public.ss_placette22.lib_ss_placette as id_unite,
              public.mesure22.no_mesure,
              public.arbre22.no_arb_sp as no_arbre,
              public.arbre22.essence_id,
              public.mesure_echantillon_sp22.co_ech,
              public.mesure_echantillon_sp22.etat_san_id,
              public.mesure_echantillon_sp22.statut_av_id,
              public.mesure_echantillon_sp22.diam_130,
              public.mesure_echantillon_sp22.circonference130,
              public.mesure_echantillon_sp22.eclairci_realise_id
              FROM
              public.dispositif22
              INNER JOIN public.placette22 ON (public.dispositif22.id_dispositif = public.placette22.dispositif_id)
              INNER JOIN public.ss_placette22 on (public.ss_placette22.placette_id = public.placette22.id_placette)            
              INNER JOIN public.arbre22 ON (public.placette22.id_placette = public.arbre22.placette_id)
              INNER JOIN public.mesure_echantillon_sp22 ON (public.arbre22.id_arbre = public.mesure_echantillon_sp22.arbre_id)
              INNER JOIN public.mesure22 ON (public.mesure_echantillon_sp22.mesure_id = public.mesure22.id_mesure) AND (public.placette22.id_placette = public.mesure22.placette_id)
              WHERE
              dispositif22.lib_disp in (",disp,")", sep="")
  arbre_sp <- dbSendQuery(con, query)
  arbre_sp <- fetch(arbre_sp, -1)
  
  arbre <- rbind.fill(arbre_pl, arbre_sp)
  arbre <- subset(arbre, ! co_ech %in% c(4, 9) & ! etat_san_id %in% c(-3, 3, 4, 5, 9) & statut_av_id != 4)
  arbre$c130 <- with(arbre, ifelse(is.na(circonference130), diam_130 * pi, circonference130))
  arbre <- subset(arbre, select=-c(diam_130, circonference130)) ## comment supprimer la colonne row.names ???
  
  ######## dataframe arbre_echantillon
  query <- paste("SELECT DISTINCT
              public.placette22.id_placette as id_unite,
              public.mesure22.no_mesure,
              public.arbre22.no_arb_pl as no_arbre,
              public.arbre22.essence_id,
              public.mesure_echantillon22.co_ech,
              public.mesure_echantillon22.etat_san_id,
              public.mesure_echantillon22.statut_av_id,
              public.mesure_echantillon22.statut_ap_id,
              public.mesure_echantillon22.diam_130,
              public.mesure_echantillon22.circonference130,
              public.mesure_echantillon22.hauteur_ech,
              public.mesure_echantillon22.ht_pb_s,
              public.mesure_echantillon22.ht_pb_g,
              public.mesure_echantillon22.ht_pb_i,
              public.mesure_echantillon22.ht_pb_v
              FROM
              public.dispositif22
              INNER JOIN public.placette22 ON (public.dispositif22.id_dispositif = public.placette22.dispositif_id)
              INNER JOIN public.arbre22 ON (public.placette22.id_placette = public.arbre22.placette_id)
              INNER JOIN public.mesure_echantillon22 ON (public.arbre22.id_arbre = public.mesure_echantillon22.arbre_id)
              INNER JOIN public.mesure22 ON (public.mesure_echantillon22.mesure_id = public.mesure22.id_mesure) AND (public.placette22.id_placette = public.mesure22.placette_id)
              WHERE
              mesure_echantillon22.co_ech='1' AND dispositif22.lib_disp in(",disp,")
              UNION
              SELECT DISTINCT
              public.placette22.id_placette as id_unite,
              public.mesure22.no_mesure,
              public.arbre22.no_arb_pl as no_arbre,
              public.arbre22.essence_id,
              public.mesure_echantillon22.co_ech,
              public.mesure_echantillon22.etat_san_id,
              public.mesure_echantillon22.statut_av_id,
              public.mesure_echantillon22.statut_ap_id,
              public.mesure_echantillon22.diam_130,
              public.mesure_echantillon22.circonference130,
              public.mesure_echantillon22.hauteur_ech,
              public.mesure_echantillon22.ht_pb_s,
              public.mesure_echantillon22.ht_pb_g,
              public.mesure_echantillon22.ht_pb_i,
              public.mesure_echantillon22.ht_pb_v
              FROM
              public.dispositif22
              INNER JOIN public.placette22 ON (public.dispositif22.id_dispositif = public.placette22.dispositif_id)
              INNER JOIN public.arbre22 ON (public.placette22.id_placette = public.arbre22.placette_id)
              INNER JOIN public.mesure_echantillon22 ON (public.arbre22.id_arbre = public.mesure_echantillon22.arbre_id)
              INNER JOIN public.mesure22 ON (public.mesure_echantillon22.mesure_id = public.mesure22.id_mesure) AND (public.placette22.id_placette = public.mesure22.placette_id)
              WHERE
              mesure_echantillon22.co_ech='2' AND dispositif22.lib_disp in (",disp,")", sep="")
  ech_pl <- dbSendQuery(con, query)
  ech_pl <- fetch(ech_pl, -1)
  
  query <- paste("SELECT DISTINCT
              public.placette22.id_placette||'_'||public.ss_placette22.lib_ss_placette as id_unite,
              public.mesure22.no_mesure,
              public.arbre22.no_arb_sp as no_arbre,
              public.arbre22.essence_id,
              public.mesure_echantillon_sp22.co_ech,
              public.mesure_echantillon_sp22.etat_san_id,
              public.mesure_echantillon_sp22.statut_av_id,
              public.mesure_echantillon_sp22.statut_ap_id,
              public.mesure_echantillon_sp22.diam_130,
              public.mesure_echantillon_sp22.circonference130,
              public.mesure_echantillon_sp22.hauteur_ech,
              public.mesure_echantillon_sp22.ht_pb_s,
              public.mesure_echantillon_sp22.ht_pb_g,
              public.mesure_echantillon_sp22.ht_pb_i,
              public.mesure_echantillon_sp22.ht_pb_v
              FROM
              public.dispositif22
              INNER JOIN public.placette22 ON (public.dispositif22.id_dispositif = public.placette22.dispositif_id)
              INNER JOIN public.ss_placette22 on (public.ss_placette22.placette_id = public.placette22.id_placette)
              INNER JOIN public.arbre22 ON (public.placette22.id_placette = public.arbre22.placette_id)
              INNER JOIN public.mesure_echantillon_sp22 ON (public.arbre22.id_arbre = public.mesure_echantillon_sp22.arbre_id)
              INNER JOIN public.mesure22 ON (public.mesure_echantillon_sp22.mesure_id = public.mesure22.id_mesure) AND (public.placette22.id_placette = public.mesure22.placette_id)
              WHERE
              mesure_echantillon_sp22.co_ech = '1' AND dispositif22.lib_disp in (",disp,")
              UNION
              SELECT DISTINCT
              public.placette22.id_placette||'_'||public.ss_placette22.lib_ss_placette as id_unite,
              public.mesure22.no_mesure,
              public.arbre22.no_arb_sp as no_arbre,
              public.arbre22.essence_id,
              public.mesure_echantillon_sp22.co_ech,
              public.mesure_echantillon_sp22.etat_san_id,
              public.mesure_echantillon_sp22.statut_av_id,
              public.mesure_echantillon_sp22.statut_ap_id,
              public.mesure_echantillon_sp22.diam_130,
              public.mesure_echantillon_sp22.circonference130,
              public.mesure_echantillon_sp22.hauteur_ech,
              public.mesure_echantillon_sp22.ht_pb_s,
              public.mesure_echantillon_sp22.ht_pb_g,
              public.mesure_echantillon_sp22.ht_pb_i,
              public.mesure_echantillon_sp22.ht_pb_v
              FROM
              public.dispositif22
              INNER JOIN public.placette22 ON (public.dispositif22.id_dispositif = public.placette22.dispositif_id)
              INNER JOIN public.arbre22 ON (public.placette22.id_placette = public.arbre22.placette_id)
              INNER JOIN public.ss_placette22 on (public.ss_placette22.placette_id = public.placette22.id_placette)
              INNER JOIN public.mesure_echantillon_sp22 ON (public.arbre22.id_arbre = public.mesure_echantillon_sp22.arbre_id)
              INNER JOIN public.mesure22 ON (public.mesure_echantillon_sp22.mesure_id = public.mesure22.id_mesure) AND (public.placette22.id_placette = public.mesure22.placette_id)
              WHERE
              mesure_echantillon_sp22.co_ech='2' AND dispositif22.lib_disp in (",disp,")", sep="")
  ech_sp <- dbSendQuery(con, query)
  ech_sp <- fetch(ech_sp, -1)
  
  query <- paste("SELECT DISTINCT
              public.placette22.id_placette as id_unite,
              public.mesure22.no_mesure,
              public.arbre22.no_arb_bd as no_arbre,
              public.arbre22.essence_id,
              public.mesure_echantillon_bd22.co_ech,
              public.mesure_echantillon_bd22.etat_san_id,
              public.mesure_echantillon_bd22.statut_av_id,
              public.mesure_echantillon_bd22.statut_ap_id,
              public.mesure_echantillon_bd22.diam_130,
              public.mesure_echantillon_bd22.circonference130,
              public.mesure_echantillon_bd22.hauteur_ech,
              public.mesure_echantillon_bd22.ht_pb_s,
              public.mesure_echantillon_bd22.ht_pb_g,
              public.mesure_echantillon_bd22.ht_pb_i,
              public.mesure_echantillon_bd22.ht_pb_v,
              public.mesure22.type_suivi_id
              FROM
              public.dispositif22
              INNER JOIN public.placette22 ON (public.dispositif22.id_dispositif = public.placette22.dispositif_id)
              INNER JOIN public.arbre22 ON (public.placette22.id_placette = public.arbre22.placette_id)
              INNER JOIN public.mesure_echantillon_bd22 ON (public.arbre22.id_arbre = public.mesure_echantillon_bd22.arbre_id)
              INNER JOIN public.mesure22 ON (public.mesure_echantillon_bd22.mesure_id = public.mesure22.id_mesure) AND (public.placette22.id_placette = public.mesure22.placette_id)
              WHERE
              dispositif22.lib_disp in (",disp,")", sep="")
  ech_bd <- dbSendQuery(con, query)
  ech_bd <- fetch(ech_bd, -1)
  ech_bd <- subset(ech_bd, select = -c(type_suivi_id), (co_ech=='3' & type_suivi_id%in%c(3,7)) | co_ech%in%c('1','2'))
  
  arbre_echantillon <- rbind.fill(ech_pl, ech_sp, ech_bd)
  arbre_echantillon$c130 <- with(arbre_echantillon, ifelse(is.na(circonference130), diam_130 * pi, circonference130))
  arbre_echantillon <- subset(arbre_echantillon, select=-c(diam_130, circonference130))
    
  ######## dataframe inventaire_liste et inventaire_somme
  query <- paste("SELECT DISTINCT
                  public.placette22.id_placette as id_unite,
                  public.mesure22.no_mesure,
                  public.bandelette_surface22.av_ap_id,
                  public.bandelette_surface22.no_inventaire,
                  public.mesure_inventaire22.circ_diam_id,
                  public.mesure_inventaire22.essence_id,
                  public.mesure_inventaire22.borne_inf,
                  public.mesure_inventaire22.borne_sup,
                  public.mesure_inventaire22.effectif
              FROM
                  public.dispositif22
                  INNER JOIN public.placette22 ON (public.dispositif22.id_dispositif = public.placette22.dispositif_id)
                  INNER JOIN public.bandelette22 ON (public.placette22.id_placette = public.bandelette22.placette_id)
                  INNER JOIN public.bandelette_surface22 ON (public.bandelette22.id_bandelette = public.bandelette_surface22.bandelette_id)
                  INNER JOIN public.mesure22 ON (public.bandelette_surface22.mesure_id = public.mesure22.id_mesure)
                  AND (public.placette22.id_placette = public.mesure22.placette_id)
                  INNER JOIN public.mesure_inventaire22 ON (public.bandelette_surface22.id_bandelette_surface = public.mesure_inventaire22.bandelette_surface_id)
              WHERE
              dispositif22.lib_disp in (",disp,")", sep="",
              "ORDER BY id_unite, no_mesure, av_ap_id, no_inventaire, essence_id, borne_inf")
  inventaire_liste <- dbSendQuery(con, query)
  inventaire_liste <- fetch(inventaire_liste, -1)
  
  inventaire_somme <- summaryBy(effectif~id_unite+no_mesure+av_ap_id+no_inventaire+circ_diam_id+essence_id+borne_inf+borne_sup, FUN= function(x) c(sum=sum(x, na.rm=TRUE)), data=inventaire_liste, keep.names=TRUE)                                
  inventaire_somme$c130 <-  with(inventaire_somme, (borne_inf + borne_sup)/2 * ifelse(circ_diam_id == 1, pi, 1))
  inventaire_somme <- subset(inventaire_somme, select=-c(circ_diam_id, borne_inf, borne_sup))
  
  ######## dataframe surface_somme
  query <- paste("SELECT DISTINCT
                  public.placette22.id_placette as id_unite,
                  public.mesure22.no_mesure,
                  public.bandelette_surface22.av_ap_id,
                  public.bandelette_surface22.no_inventaire,
                  public.bandelette_surface22.surface
              FROM
                  public.placette22
                  INNER JOIN public.bandelette22 on (public.bandelette22.placette_id = public.placette22.id_placette)
                  INNER JOIN public.mesure22 ON (public.placette22.id_placette = public.mesure22.placette_id)
                  INNER JOIN public.bandelette_surface22 ON (public.bandelette22.id_bandelette = public.bandelette_surface22.bandelette_id) AND (public.mesure22.id_mesure = public.bandelette_surface22.mesure_id)
                  INNER JOIN public.dispositif22 ON (public.placette22.dispositif_id = public.dispositif22.id_dispositif)
              WHERE
                  dispositif22.lib_disp in (",disp,")", sep="",
              "ORDER BY id_unite, no_mesure, av_ap_id, no_inventaire")
  ss_unite_surface_bd <- dbSendQuery(con, query)
  ss_unite_surface_bd <- fetch(ss_unite_surface_bd, -1)
  
  surface_somme <- summaryBy(surface~id_unite+no_mesure+av_ap_id+no_inventaire, FUN= function(x) c(sum=sum(x, na.rm=TRUE)), data=ss_unite_surface_bd, keep.names=TRUE)
  names(surface_somme)[match("surface",names(surface_somme))] <- "surf_inv"
  
  ######## dataframe mesure2
  # Pour le suivi par bandelette  
  query <- paste("SELECT DISTINCT
                  public.placette22.id_placette as id_unite,
                  public.mesure22.no_mesure,
                  public.mesure22.an_vegetation,
                  public.bandelette_surface22.av_ap_id,
                  public.bandelette_surface22.no_inventaire,
                  public.mesure22.type_suivi_id,
                  'classe' as suivi
              FROM
                  public.dispositif22
                  INNER JOIN public.placette22 ON (public.dispositif22.id_dispositif = public.placette22.dispositif_id)
                  INNER JOIN public.bandelette22 ON (public.placette22.id_placette = public.bandelette22.placette_id)
                  INNER JOIN public.bandelette_surface22 ON (public.bandelette22.id_bandelette = public.bandelette_surface22.bandelette_id)
                  INNER JOIN public.mesure22 ON (public.bandelette_surface22.mesure_id = public.mesure22.id_mesure)
                  AND (public.placette22.id_placette = public.mesure22.placette_id)
                  INNER JOIN public.mesure_inventaire22 ON (public.bandelette_surface22.id_bandelette_surface = public.mesure_inventaire22.bandelette_surface_id)
              WHERE
              dispositif22.lib_disp in (",disp,")", sep="",
              "ORDER BY id_unite, no_mesure, av_ap_id, no_inventaire")
  m2_bd <- dbSendQuery(con, query)
  m2_bd <- fetch(m2_bd, -1)
  m2_bd$suivi <- "classe"
  m2_bd <- merge(m2_bd, surface_somme[, c("id_unite", "no_mesure", "av_ap_id", "no_inventaire", "surf_inv")], all.x=T, all.y=F)
  inventaire <- summaryBy(no_inventaire~id_unite+no_mesure+av_ap_id, FUN= function(x) c(max=max(x, na.rm=TRUE)), data = subset(m2_bd, select=c("id_unite", "no_mesure", "av_ap_id", "no_inventaire")), keep.names=TRUE)
  
  # Pour le suivi par placette  
  query <- paste("SELECT DISTINCT
            public.placette22.id_placette as id_unite,
            public.mesure22.no_mesure,
            public.mesure22.an_vegetation,
            public.mesure22.type_suivi_id,
            sum(public.mesure_echantillon22.eclairci_realise_id) as eclairci
            FROM
            public.dispositif22
            INNER JOIN public.placette22 ON (public.dispositif22.id_dispositif = public.placette22.dispositif_id)
            INNER JOIN public.arbre22 ON (public.placette22.id_placette = public.arbre22.placette_id)
            INNER JOIN public.mesure_echantillon22 ON (public.arbre22.id_arbre = public.mesure_echantillon22.arbre_id)
            INNER JOIN public.mesure22 ON (public.mesure_echantillon22.mesure_id = public.mesure22.id_mesure) AND (public.placette22.id_placette = public.mesure22.placette_id)
            WHERE
            dispositif22.lib_disp in (",disp,")", sep="",
            "GROUP BY id_unite,no_mesure,an_vegetation,type_suivi_id")
  m2_pl <- dbSendQuery(con, query)
  m2_pl <- fetch(m2_pl, -1)
  m2_pl$suivi <- 'liste'
    
  m2_pl_ecl <- m2_pl[m2_pl$eclairci > 0 & ! m2_pl$type_suivi_id %in% c(3,7),]
  m2_pl_ecl_av <- m2_pl_ecl
  m2_pl_ecl_av$av_ap_id <- 1
  m2_pl_ecl_av$no_inventaire <- 1
  m2_pl_ecl_ap <- m2_pl_ecl
  m2_pl_ecl_ap$av_ap_id <- 2
  m2_pl_ecl_ap$no_inventaire <- 1
  m2_pl_0ecl <- m2_pl[m2_pl$eclairci==0 & ! m2_pl$type_suivi_id %in% c(3,7), ]
  m2_pl_0ecl$av_ap_id <- 0
  m2_pl_0ecl$no_inventaire <- 1
  
  #cas des tansitions bandelettes --> placette
  m2_bd_pl <- m2_pl[m2_pl$type_suivi_id%in%c(3,7),]
  m2_bd_pl <- merge(m2_bd_pl, inventaire, all.x=T, all.y=F)
  m2_bd_pl$no_inventaire <- ifelse(m2_bd_pl$av_ap_id %in% c(0,2), m2_bd_pl$no_inventaire + 1, 1)
  m2_bd_pl$av_ap_id <- ifelse(m2_bd_pl$av_ap_id == 0, 0, 2)
  
  # Pour le suivi par sous-placette  
  query <- paste("SELECT DISTINCT
              public.placette22.id_placette||'_'||public.ss_placette22.lib_ss_placette as id_unite,
              public.mesure22.no_mesure,
              public.mesure22.an_vegetation,
              public.mesure22.type_suivi_id,
              sum(public.mesure_echantillon_sp22.eclairci_realise_id) as eclairci
              FROM
              public.dispositif22
              INNER JOIN public.placette22 ON (public.dispositif22.id_dispositif = public.placette22.dispositif_id)
              INNER JOIN public.ss_placette22 on (public.ss_placette22.placette_id = public.placette22.id_placette)            
              INNER JOIN public.arbre22 ON (public.placette22.id_placette = public.arbre22.placette_id)
              INNER JOIN public.mesure_echantillon_sp22 ON (public.arbre22.id_arbre = public.mesure_echantillon_sp22.arbre_id)
              INNER JOIN public.mesure22 ON (public.mesure_echantillon_sp22.mesure_id = public.mesure22.id_mesure) AND (public.placette22.id_placette = public.mesure22.placette_id)
              WHERE
              dispositif22.lib_disp in (",disp,")", sep="",
              "GROUP BY id_unite,no_mesure,an_vegetation,type_suivi_id")
  
  
  m2_sp <- dbSendQuery(con, query)
  m2_sp <- fetch(m2_sp, -1)
  m2_sp$suivi <- 'liste'
  m2_sp$no_inventaire <- 1
  
  m2_sp_ecl <- m2_sp[m2_sp$eclairci > 0 & ! m2_sp$type_suivi_id %in% c(3,7),]
  
  
  m2_sp_ecl_av <- m2_sp_ecl
  if(nrow(m2_sp_ecl) > 0){
    m2_sp_ecl_av$av_ap_id <- 1
    m2_sp_ecl_av$no_inventaire <- 1
    m2_sp_ecl_ap <- m2_sp_ecl
    m2_sp_ecl_ap$av_ap_id <- 2
    m2_sp_ecl_ap$no_inventaire <- 1
  } else {
    
    m2_sp_ecl_av <- data.frame(id_unite=character(), 
                               no_mesure  = integer(),
                               an_vegetation = integer(), 
                               type_suivi_id = integer(), 
                               eclairci=numeric(), 
                               suivi =character(),
                               no_inventaire=numeric()   )
    m2_sp_ecl_ap <- data.frame(id_unite=character(), 
                               no_mesure  = integer(),
                               an_vegetation = integer(), 
                               type_suivi_id = integer(), 
                               eclairci=numeric(), 
                               suivi =character(),
                               no_inventaire=numeric()   )
    
  }
  
  
  m2_sp_0ecl <- m2_sp[m2_sp$eclairci==0 & ! m2_sp$type_suivi_id%in%c(3,7),]
  m2_sp_0ecl$av_ap_id <- 0
  
  mesure2 <- rbind.fill(m2_bd, m2_pl_ecl_av, m2_pl_ecl_ap, m2_pl_0ecl, m2_bd_pl, m2_sp_ecl_av, m2_sp_ecl_ap, m2_sp_0ecl)
  mesure2 <- mesure2[with(mesure2, order(id_unite, no_mesure, av_ap_id, no_inventaire)),]
  mesure2[1, "ordre_inv"] <- 1
  for (val in 2:nrow(mesure2)) {
    mesure2[val, "ordre_inv"]  <- ifelse(mesure2[val, "id_unite"]       == mesure2[val - 1, "id_unite"], mesure2[val - 1, "ordre_inv"] + 1, 1)   
  }                    
  mesure2 <- merge(mesure2, unite[, c("id_unite", "surface")]) 
  mesure2$surf_inv[is.na(mesure2$surf_inv)] <- mesure2$surface[is.na(mesure2$surf_inv)]
  mesure2 <- merge(mesure2, mesure[, c("id_unite", "no_mesure", "age")]) 
  mesure2 <- subset(mesure2, select = -c(type_suivi_id, eclairci, surface))
  
  ############# sortie 
  return(list("unite" = unite, "mesure" = mesure, "arbre" = arbre, "arbre_echantillon" = arbre_echantillon, "surface_somme" = surface_somme,
              "inventaire_somme" =  inventaire_somme, "mesure2" = mesure2))
}  

 # peut-on avoir le cas ou il y a suivi en classse avec no_inventaire=2 puis suivi en liste ???
jprenaud-02/coopR documentation built on May 3, 2019, 7:06 p.m.