De cara a la GBS

Author

Florencia Grattarola

Published

July 23, 2025

¿Cuál es la planta y el animal más registrado por departamento?

Librerías

Code
library(httr)
library(jsonlite)
library(knitr)
library(sf)
sf_use_s2(FALSE)
library(tmap)
tmap_mode('view')
library(tidyverse)  

options(knitr.kable.NA = '') 
options(scipen=999)

Función para la extracción de datos

Code
getTwoTaxaPerState <- function(place_ids, preferred_place_id){
  
  # preferred_place_id 7259 for common name = Uruguay
  
  twoTaxaPerState <- tibble(place_id = numeric(),
                            taxon_name = character(),
                            iconic_taxon_name = character(),
                            common_name = character(),
                            observations_place = numeric(),
                            observations_iNat = numeric())
  
  api <- 'https://api.inaturalist.org/v1/observations/species_counts'
  page <- '&page=1&per_page=10'
  
  for(place_id in place_ids) {
    for(taxon_id in c(1, 47126)){ # Animalia, Plantae
      
      call_url_obs <- str_glue('{api}?verifiable=true&place_id={place_id}&rank=species&taxon_id={taxon_id}&locale=es&preferred_place_id={preferred_place_id}&include_ancestors=false')
      
      get_json_call_observations <- GET(url = call_url_obs) %>%
        content(as = "text") %>% fromJSON(flatten = TRUE)
      
      results <- as_tibble(get_json_call_observations$results) %>%
        slice_head(n=1)
      
      taxaPerState_i <- tibble(place_id = place_id,
                               kingdom = ifelse(taxon_id == 1, 'Animalia', 'Plantae'),
                               taxon_name = results$taxon.name,
                               iconic_taxon_name = results$taxon.iconic_taxon_name,
                               common_name = results$taxon.preferred_common_name,
                               observations_place = results$count,
                               observations_iNat = results$taxon.observations_count)
      
      twoTaxaPerState <- rbind(twoTaxaPerState, taxaPerState_i)
    }
  }
  return(twoTaxaPerState)
}
getPhotoFromiNat <- function(species_list, place_id, license){
  
  species_photos <- tibble(taxon_name = character(),
                           taxon_id = numeric(),
                           observation_url = character(),
                           photo_url = character())

  api <- 'https://api.inaturalist.org/v1/observations'
  page <- '&page=1&per_page=10'
  
  for(species_name in species_list){
    
    call_url <- str_glue('{api}?photo_license={license}&place_id={place_id}&q={species_name}&order=desc&order_by=votes{page}')
    
    get_json_call <- GET(url = URLencode(call_url)) %>%
      content(as = "text") %>% fromJSON(flatten = TRUE)
    
    results <- as_tibble(get_json_call$results) %>%
      slice_head(n=1)

    species_photos_i <- tibble(taxon_name = species_name,
                               taxon_id = results$taxon.id,
                               user_login = results$user.login,
                               observation_url = str_replace(results$uri,
                                                             'inaturalist.org',
                                                             'naturalista.uy'),
                               photo_url = results$photos)
    
    species_photos <- rbind(species_photos, species_photos_i)
  }
  
  species_photos <- species_photos %>% 
    unnest_wider(photo_url, names_sep = "_") %>% 
    unnest_wider(col=c(photo_url_license_code, photo_url_url), names_sep = "_") %>%
    select(-c(photo_url_id, photo_url_attribution, 
              photo_url_flags, photo_url_moderator_actions,
              photo_url_hidden, photo_url_original_dimensions.width, 
              photo_url_original_dimensions.height)) %>% 
    relocate(starts_with('photo_url_url'), 
             .before = starts_with('photo_url_license')) %>% 
    rename_with(~ str_replace(.x, 'photo_url_url_', 'photo_url_'), 
                starts_with('photo_url_url_')) %>% 
    rename_with(~ str_replace(.x, 'photo_url_license', 'photo_license'), 
                starts_with('photo_url_license'))
  
  return(species_photos)
}

Extracción de datos

Code
place_ids_departamento <- tibble(departamento = 
                     c('Artigas', 'Salto', 'Rivera',
                       'Tacuarembó', 'Paysandú', 
                       'Cerro Largo', 'Río Negro', 'Durazno', 
                       'Treinta y Tres', 'Soriano', 
                       'Florida', 'Flores', 'Rocha', 
                       'Lavalleja', 'Colonia', 'San José',
                       'Maldonado', 'Canelones', 'Montevideo'),
                   place_id = c(12409, 12421, 12418, 12424, 
                                12417, 12411, 12419, 12412, 
                                12425, 12423, 7534, 12413, 
                                12420, 12414, 8007, 12422, 
                                12415, 12410, 12416))

  
dos_taxa_por_depto <- getTwoTaxaPerState(place_ids = place_ids_departamento$place_id, 
                                         preferred_place_id = 7259)

dos_taxa_por_depto <- left_join(place_ids_departamento,
                                dos_taxa_por_depto)

dos_taxa_por_depto_fotos <- getPhotoFromiNat(species_list = unique(dos_taxa_por_depto$taxon_name),
                 place_id  = 7259,
                 license =  'cc-by')

dos_taxa_por_depto <- left_join(dos_taxa_por_depto,
                                dos_taxa_por_depto_fotos)

dos_taxa_por_depto %>% 
  select(departamento, kingdom, iconic_taxon_name,
         taxon_name, common_name, observations_place,
         observation_url, photo_url_1) %>% 
  mutate(photo_url_1 = '') %>% 
  rename(Departamento = departamento, 
         Reino = kingdom, 
         Grupo = iconic_taxon_name,
         Especie = taxon_name, 
         `Nombre común` = common_name, 
         `N observaciones` = observations_place,
         URL = observation_url,
         Imagen = photo_url_1) %>% 
  kableExtra::kable() %>% 
  kableExtra::column_spec(7, link = dos_taxa_por_depto$observation_url) %>%
  kableExtra::column_spec(8, image = kableExtra::spec_image(dos_taxa_por_depto$photo_url_1, 280, 200))
Departamento Reino Grupo Especie Nombre común N observaciones URL Imagen
Artigas Animalia Amphibia Rhinella diptycha Cururú 35 https://www.naturalista.uy/observations/192809014
Artigas Plantae Plantae Myrcia selloi Cambuí 19 https://www.naturalista.uy/observations/139880873
Salto Animalia Aves Rhea americana Ñandú 45 https://www.naturalista.uy/observations/196953351
Salto Plantae Plantae Parodia mammulosa 23 https://www.naturalista.uy/observations/193116458
Rivera Animalia Aves Hirundinea ferruginea Viudita colorada 16 https://www.naturalista.uy/observations/264568608
Rivera Plantae Plantae Aloysia gratissima Vara dulce 12 https://www.naturalista.uy/observations/264102350
Tacuarembó Animalia Aves Theristicus caudatus Bandurria baya 35 https://www.naturalista.uy/observations/108657606
Tacuarembó Plantae Plantae Lithraea molleoides chichita 21 https://www.naturalista.uy/observations/191840390
Paysandú Animalia Aves Sporophila cinnamomea Capuchino corona gris 24 https://www.naturalista.uy/observations/104898265
Paysandú Plantae Plantae Butia yatay Palmera yatay 23 https://www.naturalista.uy/observations/203461200
Cerro Largo Animalia Amphibia Boana pulchella Ranita del zarzal 50 https://www.naturalista.uy/observations/36323790
Cerro Largo Plantae Plantae Parodia erinaceus 51 https://www.naturalista.uy/observations/276534175
Río Negro Animalia Mammalia Axis axis Axis 38 https://www.naturalista.uy/observations/248297709
Río Negro Plantae Plantae Geoffroea decorticans Chañar 27 https://www.naturalista.uy/observations/203924577
Durazno Animalia Aves Paroaria coronata Cardenal copete rojo 10 https://www.naturalista.uy/observations/170642751
Durazno Plantae Plantae Echium plantagineum Viborera 7 https://www.naturalista.uy/observations/106017904
Treinta y Tres Animalia Aves Sporophila palustris Capuchino pecho blanco 19 https://www.naturalista.uy/observations/169177445
Treinta y Tres Plantae Plantae Radlkoferotoma cistifolium 23 https://www.naturalista.uy/observations/147293154
Soriano Animalia Amphibia Boana pulchella Ranita del zarzal 79 https://www.naturalista.uy/observations/36323790
Soriano Plantae Plantae Vachellia caven Espinillo 11 https://www.naturalista.uy/observations/245327426
Florida Animalia Aves Geranoaetus melanoleucus Águila mora 26 https://www.naturalista.uy/observations/190576580
Florida Plantae Plantae Glandularia peruviana margarita punzó 12 https://www.naturalista.uy/observations/60470439
Flores Animalia Aves Paroaria coronata Cardenal copete rojo 27 https://www.naturalista.uy/observations/170642751
Flores Plantae Plantae Schinus longifolia Molle 19 https://www.naturalista.uy/observations/245927978
Rocha Animalia Aves Spheniscus magellanicus Pingüino de Magallanes 181 https://www.naturalista.uy/observations/229745150
Rocha Plantae Plantae Stevia satureiifolia 87 https://www.naturalista.uy/observations/106247762
Lavalleja Animalia Reptilia Salvator merianae Lagarto Overo 43 https://www.naturalista.uy/observations/65443175
Lavalleja Plantae Plantae Parodia erinaceus 26 https://www.naturalista.uy/observations/276534175
Colonia Animalia Aves Furnarius rufus Hornero 70 https://www.naturalista.uy/observations/62363056
Colonia Plantae Plantae Erythrina crista-galli Ceibo 64 https://www.naturalista.uy/observations/64559085
San José Animalia Aves Hymenops perspicillatus Pico de plata 35 https://www.naturalista.uy/observations/272512696
San José Plantae Plantae Schinus longifolia Molle 31 https://www.naturalista.uy/observations/245927978
Maldonado Animalia Aves Larus dominicanus Gaviota cocinera 218 http://www.naturalista.uy/observations/87239
Maldonado Plantae Plantae Parodia erinaceus 232 https://www.naturalista.uy/observations/276534175
Canelones Animalia Insecta Harmonia axyridis Catarina asiática 120 https://www.naturalista.uy/observations/118261158
Canelones Plantae Plantae Carpobrotus edulis Garra de León 96 https://www.naturalista.uy/observations/198304124
Montevideo Animalia Aves Furnarius rufus Hornero 169 https://www.naturalista.uy/observations/62363056
Montevideo Plantae Plantae Senecio crassiflorus 156 https://www.naturalista.uy/observations/193761839

Mapeo de resultados

Code
uruguay <- geodata::gadm(country = 'UY', 
                         level = 1, path = 'data/') %>%
  st_as_sf() %>% st_cast()

planta_por_depto <- left_join(uruguay %>%
                                select(departamento=NAME_1),
                              dos_taxa_por_depto %>%
                                filter(kingdom=='Plantae'))

animal_por_depto <- left_join(uruguay %>%
                                select(departamento=NAME_1),
                              dos_taxa_por_depto %>%
                                filter(kingdom=='Animalia'))

palete <- colorRampPalette(RColorBrewer::brewer.pal(10, 'Paired'))( 19 ) ## (n)

Planta más registrada por departamento

Code
tm_shape(planta_por_depto %>%
           select(Departamento = departamento, 
                  Grupo = iconic_taxon_name,
                  Especie = taxon_name, 
                  `Nombre común` = common_name,
                  `N observaciones` = observations_place)) + 
  tm_polygons(fill = 'Especie', 
              fill.scale  = tm_scale_categorical(values=palete),
              fill.legend = tm_legend_hide()) +
  tm_text('Especie', fontfamily = 'monospace',
          options = opt_tm_text(remove_overlap = TRUE)) 

Animal más registrados por departamento

Code
tm_shape(animal_por_depto %>%
           select(Departamento = departamento, 
                  Grupo = iconic_taxon_name,
                  Especie = taxon_name, 
                  `Nombre común` = common_name,
                  `N observaciones` = observations_place)) + 
  tm_polygons(fill = 'Especie', 
              fill.scale  = tm_scale_categorical(values=palete),
              fill.legend = tm_legend_hide()) +
  tm_text('Especie', fontfamily = 'monospace',
          options = opt_tm_text(remove_overlap = TRUE))