procedures:recuperation_et_integration_de_donnees_depuis_le_gbif

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
procedures:recuperation_et_integration_de_donnees_depuis_le_gbif [2026/02/02 14:06] dmaillardprocedures:recuperation_et_integration_de_donnees_depuis_le_gbif [2026/02/03 07:59] (Version actuelle) dmaillard
Ligne 73: Ligne 73:
   }   }
   }   }
 +
 +Autres configurations :   
 +  * [[Configuration Musée des Confluences]]
 +  * [[Configuration Observations.org]]
  
  
Ligne 155: Ligne 159:
   );   );
  
 +==== Étape intermédiaire iNaturalist ====
 +iNaturalist génère des uuid pour ses observations, exportables depuis la plateforme pour des faibles volumes de données, mais non traités/restitués par le GBIF. iNaturalist invite cependant à télécharger les données depuis le GBIF et non pas leur plateforme en direct pour des questions de performance de leur infrastructure... 
  
 +Le choix du Pôle invertébrés est donc : 
 +  * de récupérer les occurrences de taxons depuis le GBIF pour partager les mêmes scripts avec d'autres jeux de données, et pour ne pas dépasser les capacités de service de iNaturalist
 +  * de récupérer les identifiants de données iNaturalist
 +  * de récupérer uniquement les uuid de ces données sur l'API v2 de iNaturalist (pas optimal, mais moindre mal), afin de ne pas générer de nouveaux uuid à ces données
 +
 +Les identifiants des données iNaturalist récupérées auprès du GBIF sont isolés : 
 +
 +  SELECT id_synthese, digital_proof, REPLACE(replace(digital_proof, 'https://www.inaturalist.org/observations/',''), 'http://www.inaturalist.org/observations/','') AS id_inaturalist FROM gn_synthese.synthese s 
 +  JOIN taxonomie.taxref t ON t.cd_nom=s.cd_nom 
 +  WHERE id_dataset=3125; 
 +
 +Ces id_inaturalist sont ensuite utilisés dans R, avec le script suivant, pour récupérer les uuids des données dans iNaturalist, et pouvoir les réimporter dans la synthèse ensuite. 
 +
 +  fetch_inat_uuid <- function(
 +    df,
 +    id_col = "id_inaturalist",
 +    uri_col = "url",
 +    uuid_col = "uuid",
 +    batch_size = 50,
 +    sleep_sec = 1
 +  ) {
 +  
 +  library(httr)
 +  library(jsonlite)
 +  library(progress)
 +  
 +  # typer les id_inaturalist en integer
 +  df[[id_col]] <- as.integer(trimws(df[[id_col]]))
 +  
 +  if (!uuid_col %in% names(df)) {
 +    df[[uuid_col]] <- NA_character_
 +  }
 +  
 +  if (!uri_col %in% names(df)) {
 +    df[[uri_col]] <- NA_character_
 +  }
 +  
 +  ids_to_fetch <- df[[id_col]][is.na(df[[uuid_col]])]
 +  
 +  batches <- split(ids_to_fetch, ceiling(seq_along(ids_to_fetch) / batch_size))
 +  
 +  pb <- progress_bar$new(
 +    format = "  :bar :percent | batch :current/:total | ETA: :eta",
 +    total = length(batches),
 +    clear = FALSE,
 +    width = 60
 +  )
 +  
 +  for (batch_ids in batches) {
 +    
 +    res <- try(
 +      GET(
 +        "https://api.inaturalist.org/v2/observations",
 +        query = list(
 +          id = paste(batch_ids, collapse = ","),
 +          fields="id,uri,uuid",
 +          per_page = length(batch_ids)
 +        ),
 +        user_agent("inat-uuid-fetcher/1.0 (contact: donovan.maillard@flavia-ape.fr)")
 +      ),
 +      silent = TRUE
 +    )
 +    
 +    if (!inherits(res, "response") || status_code(res) != 200) {
 +      pb$tick()
 +      Sys.sleep(sleep_sec * 2)
 +      next
 +    }
 +    
 +    json <- fromJSON(
 +      content(res, as = "text", encoding = "UTF-8"),
 +      flatten = TRUE
 +    )
 +    
 +    if (length(json$results) > 0) {
 +      uuids <- setNames(
 +        json$results$uuid,
 +        as.integer(json$results$id)
 +      )
 +      
 +      uris <- setNames(
 +        json$results$uri,
 +        as.integer(json$results$id)
 +      )
 +      
 +      idx <- match(as.integer(names(uuids)), df[[id_col]])
 +      df[[uuid_col]][idx] <- uuids
 +      
 +      idx <- match(as.integer(names(uris)), df[[id_col]])
 +      df[[uri_col]][idx] <- uris
 +    }
 +    
 +    pb$tick()
 +    Sys.sleep(sleep_sec)
 +  }
 +  
 +  return(df)
 +  }
 +
 +
 +
 +  inaturalist_uuids <- fetch_inat_uuid(
 +    inaturalist_ids,
 +    id_col   = "id_inaturalist",
 +    uuid_col = "uuid",
 +    batch_size = 50,
 +    sleep_sec = 1
 +  )
 +  
 +Ces résultats sont ensuite exportés de R, importés dans la base de données postgresql dans une table pinv_gbif.cor_uuid_inaturalist, puis pourront être conservés dans la synthèse à l'étape suivante. 
 +  
 ==== Postgresql : Insérer ou actualiser les données en synthèse ==== ==== Postgresql : Insérer ou actualiser les données en synthèse ====
  
  • procedures/recuperation_et_integration_de_donnees_depuis_le_gbif.1770041170.txt.gz
  • Dernière modification : 2026/02/02 14:06
  • de dmaillard