First things first

  1. Crie um diretório de trabalho na raiz do seu computador. Evite muitos subdiretórios.
  2. Instale o programa R software, depois o RStudio e finalmente o Rtools 4.3 e Rtools 4.4.
  3. É necessário também depois instalar e carregar os seguintes pacotes do CRAN: , instale o jsonlite, curl, robis, rgbif, paleobioDB, devtools, tidyverse, readr, terra, taxsize, sf e string.

Para instalar o taxsize, carregue o pacote devtools e digite install_github('ropensci/taxize') porque esse pacote só está disponível no github atualmente.

Para usar o gbif, você precisará ter uma conta de usuário GBIF. Isso normalmente não levará muito tempo para ser realizado, mas é importante fazer! Vá para a aba de registro no canto superior direito da página inicial do GBIF e crie sua própria conta. O GBIF só permite - até onde eu saiba - três downloads por dia, pois muito tráfego de download em uma única conta fará com que o servidor responda desfavoravelmente.

Tutorial 1A atualizado e tutorial 1B atualizado para baixar dados do GBIF e fazer uma limpeza básica nos registros obtidos
Antes de começar, vale à pena dar uma olhada no site do GBIF e usar seus recursos de pesquisa para explorar a disponibilidade dos dados. Procure por algumas espécies ou grupos que considere interessantes e observe a distribuição delas no mapa integrado. Além disso, examine uma única ocorrência e observe o número de campos diferentes disponíveis para um usuário: alguns deles podem ser muito relevantes para sua limpeza de dados! Dê uma olhada também na documentação do API do GBIF. Como a API estrutura solicitaçoes como URLs?
  1. Navegue até a seção Registry e expanda a guia GET /dataset;
  2. clique em Try It Out e encontre o código de país de duas letras no menu suspenso do país;
  3. clique em Execute> e veja uma URL terminando em country=CODE em Request URL;
  4. cole essa URL em uma nova página da web e estará vendo uma lista formatada em JSON de conjunto de dados em GBIF para aquele país;
  5. repita o processo para a API de ocorrência usando o campo gbifld, porque essa estrutura baseada em JSON é a base para acesso de dados pela API. Podemos fazer isso no R diretamente também. Use sua própria URL se quiser abaixo.

library(jsonlite) # Para carregar o pacote

occ <- fromJSON("https://api.gbif.org/v1/occurrence/1258202889") # baixar um único pedido JSON do GBIF

A classe do nosso download occ é uma lista. A maioria dos elementos da lista são vetores simples, mas não todos. Para fins demonstrativos, achataremos os elementos não vetoriais, o que nos permite vincular a lista a um data.frame - isso é um conjunto de dados de ocorrência rudimentar.
  1. class(occ)
  2. lapply(occ, class)
  3. occ <- unlist(occ, recursive = F)
  4. as.data.frame(unlist(occ, recursive = F)

Isso foi apenas um exercício ilustrativo, mas mostra que podemos trabalhar com a API de uma maneira muito direta. Se quiséssemos, poderíamos até escrever código para analisar a solicitação JSON em nosso formato data frame amigável no próprio R, embora seja isso que o jsonlite faz.


Agora, para valer, vamos baixar várias ocorrências e conjuntos de dados, usaremos novamente um pacote R personalizado, rgbif.

Lembre-se, você precisa já ter uma conta de usuário GBIF!

library(rgbif) # para carregar o pacote

usr <- "nonono" # nome do usuário

pwd <- "nonono" # senha do usuário

eml <- "nonono.gmail" # email do usuário

Agora, procuramos pelo nosso táxon no GBIF.

tax <- occ_search(scientificName = "Altiphylax") # você pode usar qualquer outro nome

Se tivermos identificado com segurança que nosso táxon tem correspondências no banco de dados, construiremos um predicado de pesquisa para o ID exclusivo associado a esse táxon e, em seguida, enviamos essa solicitação ao banco de dados, especificando que queremos que um arquivo .csv seja baixado.

tpred <- pred("taxonKey", name_backbone("Altiphylax")$usageKey) # predicate and execute

dload <- occ_download(tpred, format = "SIMPLE_CSV", pred("hasCoordinate", TRUE), user = usr, pwd = pwd, email = eml) # Para fazer o download... Pode demorar um pouco dependendo do número de registros!

occ_download_wait(dload) # Essa função pode ser usada para nos dizer quando o download foi finalizado

dload # Examinando os resultados

O que essa função fez foi fazer o servidor GBIF preparar um arquivo para download. Ele contém os detalhes do nosso download preparado, incluindo algumas URLs e DOIs. O DOI é citável em publicações e fornece documentação clara e transparente do que você baixou e quando. Tente colar qualquer um deles no Google. Você verá que ele o levará para uma página GBIF para esse download. Há até um botão de download - se clicarmos com o botão direito e olharmos para a URL do link, veremos a formatação específica da API para um arquivo .zip com nossos dados. Ir para essa URL até baixará o arquivo zip automaticamente.

Podemos ainda obter ocorrências para múltiplas espécies usando os IDs dos táxons. Entretanto, o grupo específico pode não ser parte do arcabouço do GBIF. Nesse caso, podemos obter dados de uma lista de gêneros, espécies etc. De qualquer forma, é uma boa ideia usar os IDs de táxons do GBIF ao invés do nome científico, já que ele incluirá os sinônimos também.
                  ID <- taxize::get_gbifid_("Lethocerus patruelis", method = "backbone") ## get_gbifid_ retornará uma lista
                  ID <- ID %>%
                    bind_rows() %>% # convertida em data frame
                    filter(matchtype == "EXACT" & status == "ACCEPTED") # filtra os dados para os nomes aceitos
                

Podemos também obter IDs de grupos taxonômicos supra-específicos, como famílias.
                  ID_Belos <- taxize::get_gbifid_("Belostomatidae", method="backbone") %>%
                    bind_rows() %>%
                    filter(matchtype == "EXACT" & status == "ACCEPTED")
                

Podemos também obter IDs de uma lista de espécies.
                splist <- read_csv("bombacoideae_specieslist.csv") # espécies em .csv de Bombacoidea 
                gbif_taxon_keys <-
                splist %>%
                pull("accepted_name") %>% # use poucos nomes se for um teste
                taxize::get_gbifid_(method="backbone") %>%
                imap(~ .x %>% mutate(original_sciname = .y)) %>% # coloque os nomes originais no data frame
                bind_rows() %>% # combine todos os data frames em apenas um
                filter(matchtype == "EXACT" & status == "ACCEPTED") %>%
                filter(kingdom == "Plantae") # evite homonímias
                

Frequentemente é desejável obter registros de uma área geográfica específica. Uma opção é fazer o download dos registros que estejam dentro de um polígono específico. O rgbif/GBIF também oferece a opção de fazer isso. Para tanto, é necessário definir um polígono. Isso pode ser feito via Google Earth, e o arquivo obtido é importado em formato .kml ou .shp. Para facilitar, baixe um polígono da Amazônia aqui e coloque no seu diretório de trabalho.
                library(sf); library(terra); library(tidyverse); library(taxize); library(devtools) # carregando os pacotes 
                amz <- st_read("Amazonia.kml") # puxando o arquivo para dentro do R
                plot(amz$geometry) # para verificar se está tudo bem
                amz <- st_as_text(st_as_sfc(amz)) # para transformar num objeto WKT
                
                # pegando a ID da família:
                ID_Belos <- taxize::get_gbifid_("Belostomatidae", method="backbone") %>% 
                    bind_rows() %>%
                    filter(matchtype == "EXACT" & status == "ACCEPTED") # para pegar o ID da família Belostomatidae

                occ_download(pred_in("taxonKey", ID_Belos$usagekey), pred("hasCoordinate", TRUE), pred_within(amz), format = "SIMPLE_CSV",
                    user = usr, pwd = pwd, email = eml) # o argumento pred_within fará o trabalho                  
                

Rotina para fazer o download de ocorrências de fósseis.
              library(paleobioDB); library(readr); library(dplyr) # carregando pacotes 
              
              # Para pegar as ocorrências do Paleobiology DB, estreite sua busca como abaixo:
                dat_tax <- paleobioDB::pbdb_occurrences(base_name = c("Belostomatidae"),
                          vocab = "pbdb", limit = 500, show = c("coords", "phylo", "attr", "loc",
                          "time", "rem", "ident"))
                rownames(dat) <- NULL

              # É possível também pegar registro de uma lista de espécies ou gêneros
                gen_list <- read_csv("bombacoideae_genuslist.csv") # nome do arquivo .csv
                dat_gen <- paleobioDB::pbdb_occurrences(base_name = gen_list$gen, vocab = "pbdb", limit = 500, show = c("coords", "phylo", "attr", "loc", "time", "rem", "ident"))
                
                # combine os dados em um local só:
                dat <- bind_rows(dat_tax, dat_gen)

                # Mas tome cuidado com as homonímias!
                unique(dat$phylum)
                dat <- dat[dat$phylum == "Spermatophyta", ]

                # Visualize Belostomatidae
                pbdb_map(dat_tax)
                pbdb_richness(dat_tax, rank = "species", temporal_extent = c(100, 0)) # mapa de riqueza                

                # grave no arquivo:
                write_csv(dat_tax, "BelosFossil_records.csv")