Descarga de registros de presencia de especies de animales

Introducción

Este documento, elaborado con el sistema de publicación técnica y científica Quarto, detalla el proceso de descarga de registros de presencia de especies agrupados por la Infraestructura Mundial de Información en Biodiversidad (GBIF). Las especies de los registros están contenidas en una lista. El documento combina texto con salidas generadas por el lenguaje de programación R. Como parte de la implementación del procesamiento en R, se utilizó el paquete rgbif para acceder los servicios web de la interfaz de programación de aplicaciones (API) de la Infraestructura Mundial de Información en Biodiversidad (GBIF) y utilizar los servicios de descarga de datos del portal de datos de GBIF.

El código fuente de este documento está disponible en https://github.com/biodatacr/mapas-psa-biodiversidad-2024/blob/main/src/data/descarga-registros-presencia-especies-animales.qmd.

Definición de parámetros generales

Para comenzar, se definieron algunos parámetros generales del procesamiento en R.

Código para la definición de parámetros generales
# Archivo con la lista original de especies
ARCHIVO_LISTA_ESPECIES <- 
  here("data", "processed", "lista-final-especies-animales.csv")

# Archivo con los registros de presencia de especies descargados
# NOTA: Luego de la ejecución de este documento, este archivo debe comprimirse, 
# por ser muy grande para albergarse en GH. Debe descomprimirse antes de
# ejecutar el documento de generación del mapa de riqueza de especies y una vez
# finalizada la ejecución, debe comprimirse de nuevo.
ARCHIVO_REGISTROS_PRESENCIA_ESPECIES <- 
  here("data", "processed", "registros-presencia-especies-animales.csv")

# Directorio de archivos de registros de presencia comprimidos descargados
# NOTA: Los archivos descargados pueden ser muy grandes para alojarse en GH.
# Se probó con tamaños de bloque más pequeños (ej. 50 especies), pero aún asi se
# generan archivos ZIP > 100 GB, probablemente porque hay especies con
# muchos registros de presencia.
# Como medida temporal, estos ZIP se respaldan en otra ubicación 
# y se borran de DIRECTORIO_ARCHIVOS_DESCARGADOS.
DIRECTORIO_ARCHIVOS_DESCARGADOS <-
  here("data", "interim", "downloaded-occurrences-animals")

# Cantidad de llaves de taxones por bloque de descarga
TAMANIO_BLOQUE_DESCARGA <- 650

# Tema de la lista (para usar en los nombres de archivos de descargas)
TEMA_REGISTROS_PRESENCIA_ESPECIES <- "animales"

Las rutas especificadas para los archivos se basan en la estructura de directorios para proyectos de ciencia de datos propuesta por la iniciativa Cookiecutter Data Science.

Carga de la lista de especies

Carga de la lista

Archivo con la lista de especies

/home/rstudio/data/processed/lista-final-especies-animales.csv

El archivo se cargó en un cuadro de datos (data frame) de R, para su procesamiento.

Código para la carga de la lista
# Carga de la lista de especies
lista_especies <- read_csv(ARCHIVO_LISTA_ESPECIES) 

Visualización de la lista de especies

Lista de especies

Código para la visualización de la lista
# Visualización de la lista original de especies
lista_especies |>
  arrange(scientificName) |>
  datatable(
    rownames = FALSE,
    extensions = c("Buttons"),
    options = list(
      searchHighlight = TRUE,
      pageLength = 5,
      language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/Spanish.json'),
      dom = 'Bfrtlip',
      buttons = list(
        list(extend='copy', text='Copiar'),
        list(extend='print', text='Imprimir'),
        list(
          extend = 'collection',
          buttons = list(
            list(
              extend='csv', 
              title=paste("Lista de especies de", TEMA_REGISTROS_PRESENCIA_ESPECIES),
              text='CSV'
            ),
            list(
              extend='excel', 
              title=paste("Lista de especies de", TEMA_REGISTROS_PRESENCIA_ESPECIES),
              text='Excel'
            ),
            list(
              extend='pdf', 
              title=paste("Lista de especies de", TEMA_REGISTROS_PRESENCIA_ESPECIES),
              text='PDF'
            )
          ), 
          text = 'Descargar'
        )
      )
    )
  )
Cantidad de registros en la lista de especies

617

Descarga de los registros de presencia

Los registros de presencia de especies se descargaron, como archivos CSV comprimidos en formato ZIP, del portal de datos de GBIF en bloques de 650 especies.

Código para la descarga de los registros de presencia
# Llaves (en GBIF) de los taxones (sinónimos o nombres aceptados)
# de la lista de especies
# llaves_taxones <- 
#   lista_especies |>
#   pull(usageKey)

# Llaves (en GBIF) de los taxones (SOLO nombres aceptados)
# de la lista de especies
# Al usar las llaves de los nombres aceptados, se incluyen los sinónimos también
llaves_taxones <- 
  lista_especies |>
  filter(!is.na(speciesKey)) |>
  pull(speciesKey)

# Para pruebas
# llaves_taxones <- llaves_taxones[1:1000]

# Cantidad de llaves de taxones
cantidad_llaves_taxones <- length(llaves_taxones)

# Cantidad de bloques de descarga
cantidad_bloques_descarga <- 
  ceiling(cantidad_llaves_taxones / TAMANIO_BLOQUE_DESCARGA)

# Solicitudes de descarga y descarga de los archivos en formato ZIP
for(i in 1:cantidad_bloques_descarga) {
  # Primer y último índice de la lista de especies
  # para el bloque de descarga
  inicio <- ((i - 1) * TAMANIO_BLOQUE_DESCARGA) + 1
  fin <- min(i * TAMANIO_BLOQUE_DESCARGA, cantidad_llaves_taxones)
  
  # Para seguimiento de la descarga
  print(paste("Bloque de descarga de las llaves:", inicio, "-", fin))

  # Solicitud de descarga al API de GBIF
  solicitud <-
    occ_download(
      pred_in("taxonKey", llaves_taxones[inicio:fin]),
      pred("country", "CR"),
      pred("hasCoordinate", TRUE),
      pred("hasGeospatialIssue", FALSE),
      format = "SIMPLE_CSV"
    )
  
  # Metadatos de la solicitud de descarga
  metadatos <- occ_download_meta(solicitud)
  
  # Espera de la descarga
  while(metadatos$status != "SUCCEEDED") {
    Sys.sleep(60) # Esperar 60 segundos antes de volver a comprobar el estado
    metadatos <- occ_download_meta(solicitud)
  }
  
  # Descarga del archivo
  occ_download_get(
    key = solicitud, 
    path = DIRECTORIO_ARCHIVOS_DESCARGADOS, 
    overwrite = TRUE
  )
}
[1] "Bloque de descarga de las llaves: 1 - 617"
Download file size: 521.9 MB
On disk at /home/rstudio/data/interim/downloaded-occurrences-animals/0174412-240321170329656.zip

Unificación de los registros de presencia descargados

Los archivos CSV contenidos en los archivos ZIP se unificaron en un único archivo CSV.

Unificación de los registros de presencia

Código para la unificación de los registros de presencia
# Lista de archivos ZIP descargados
archivos_zip <- list.files(
  path = DIRECTORIO_ARCHIVOS_DESCARGADOS, 
  pattern = "*.zip"
)

# Data frame para registros de presencia unificados
registros_presencia_unificados <- NULL

for(archivo_zip in archivos_zip) {
  # Lectura del archivo CSV
  registros_presencia <- read_tsv(
    file = paste0(DIRECTORIO_ARCHIVOS_DESCARGADOS, "/", archivo_zip),
    show_col_types = FALSE
  )
  
  # Si es el primer archivo, se incluye todo; si no, se excluye la cabecera
  if(is.null(registros_presencia_unificados)) {
    registros_presencia_unificados <- registros_presencia
  } else {
    registros_presencia_unificados <- bind_rows(
      registros_presencia_unificados, 
      registros_presencia
    )
  }
}
Warning: One or more parsing issues, call `problems()` on your data frame for details,
e.g.:
  dat <- vroom(...)
  problems(dat)

Visualización de los registros de presencia

Registros de presencia (muestra de 1000 registros)

Código para la visualización de los registros de presencia
# Visualización de los registros
registros_presencia_unificados |>
  slice_sample(n = 1000, replace = TRUE) |>
  arrange(scientificName) |>
  datatable(
    rownames = FALSE,
    extensions = c("Buttons"),
    options = list(
      searchHighlight = TRUE,
      pageLength = 5,
      language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/Spanish.json'),
      dom = 'Bfrtlip',
      buttons = list(
        list(extend='copy', text='Copiar'),
        list(extend='print', text='Imprimir'),
        list(
          extend = 'collection',
          buttons = list(
            list(
              extend='csv', 
              title=paste("Registros de presencia de especies de", TEMA_REGISTROS_PRESENCIA_ESPECIES),
              text='CSV'
            ),
            list(
              extend='excel', 
              title=paste("Registros de presencia de especies de", TEMA_REGISTROS_PRESENCIA_ESPECIES),
              text='Excel'
            ),
            list(
              extend='pdf', 
              title=paste("Registros de presencia de especies de", TEMA_REGISTROS_PRESENCIA_ESPECIES),
              text='PDF'
            )
          ), 
          text = 'Descargar'
        )
      )
    )
  )
Cantidad de registros de presencia de especies

4283559

Cantidad de especies (nombres aceptados) en los registros de presencia

576

Para control, se muestran las especies de la lista que no tienen registros de presencia.

Lista de especies sin registros de presencia

Código para la visualización de la lista
# Visualización de la lista original de especies
lista_especies |>
  filter(!speciesKey %in% registros_presencia_unificados$speciesKey) |>
  arrange(scientificName) |>
  datatable(
    rownames = FALSE,
    extensions = c("Buttons"),
    options = list(
      searchHighlight = TRUE,
      pageLength = 5,
      language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/Spanish.json'),
      dom = 'Bfrtlip',
      buttons = list(
        list(extend='copy', text='Copiar'),
        list(extend='print', text='Imprimir'),
        list(
          extend = 'collection',
          buttons = list(
            list(
              extend='csv', 
              title=paste("Lista de especies sin registros de presencia de", TEMA_REGISTROS_PRESENCIA_ESPECIES),
              text='CSV'
            ),
            list(
              extend='excel', 
              title=paste("Lista de especies sin registros de presencia de", TEMA_REGISTROS_PRESENCIA_ESPECIES),
              text='Excel'
            ),
            list(
              extend='pdf', 
              title=paste("Lista de especies sin registros de presencia de", TEMA_REGISTROS_PRESENCIA_ESPECIES),
              text='PDF'
            )
          ), 
          text = 'Descargar'
        )
      )
    )
  )
Cantidad de especies (nombres aceptados) que están en la lista de especies y no tienen registros de presencia

41

Cantidad de especies (nombres aceptados) que están en la lista de especies y no tienen registros de presencia

0

Almacenamiento de los registros de presencia

Código para el almacenamiento de los registros de presencia
# Almacenamiento de los registros de presencia
registros_presencia_unificados |> 
  dplyr::select(
    speciesKey, species,
    decimalLongitude, decimalLatitude, coordinateUncertaintyInMeters
  ) |>
  write_csv(ARCHIVO_REGISTROS_PRESENCIA_ESPECIES, na = "")
Archivo con los registros de presencia

/home/rstudio/data/processed/registros-presencia-especies-animales.csv