Preparativos

Carga de los paquetes

library(sf)
library(leaflet)
library(leaflet.extras)
library(leafem)
library(dplyr)

Carga de los datos

# Carga de la capa de cantones
cantones <-
  st_read(
    "https://raw.githubusercontent.com/gf0604-procesamientodatosgeograficos/2021i-datos/main/ign/delimitacion-territorial-administrativa/cr_cantones_simp_wgs84.geojson",
    quiet = TRUE
  )

# Carga de la capa de provincias
provincias <-
  st_read(
    "https://raw.githubusercontent.com/gf0604-procesamientodatosgeograficos/2021i-datos/main/ign/delimitacion-territorial-administrativa/cr_provincias_simp_wgs84.geojson",
    quiet = TRUE
  )

# Carga de los datos de primates
primates <-
  st_read(
    "https://raw.githubusercontent.com/gf0604-procesamientodatosgeograficos/2021i-datos/main/gbif/primates-cr-registros.csv",
    options = c(
      "X_POSSIBLE_NAMES=decimalLongitude",
      "Y_POSSIBLE_NAMES=decimalLatitude"
    ),
    quiet = TRUE
  )

# Asignación del sistema de coordenadas
st_crs(primates) = 4326

Limpieza

primates <-
  primates %>%
  mutate(coordinateUncertaintyInMeters = as.numeric(coordinateUncertaintyInMeters)) %>%
  mutate(eventDate = as.Date(eventDate, "%Y-%m-%d"))
cat("Cantidad original de registros: ", nrow(primates))
## Cantidad original de registros:  4509
# Descartar registros con alta incertidumbre en la ubicación
primates <-
  primates %>%
  filter(!is.na(coordinateUncertaintyInMeters) & coordinateUncertaintyInMeters <= 1000)

cat("Cantidad de registros después de descartar los de alta incertidumbre en la ubicación: ", nrow(primates))
## Cantidad de registros después de descartar los de alta incertidumbre en la ubicación:  2444
# Agregar columnas de provincia y de cantón
primates <-
  primates %>%
  st_join(cantones["provincia"]) %>%
  st_join(cantones["canton"])

# Descartar registros con provincia = NA
primates <-
  primates %>%
  filter(!is.na(provincia))

cat("Cantidad de registros después de descartar los que no tienen provincia: ", nrow(primates))
## Cantidad de registros después de descartar los que no tienen provincia:  2387

Procesamiento y visualización

Mapa de cantidad de registros por provincia

# Creación de conjunto de datos con la cantidad de registros por provincia
provincias_registros <-
  provincias %>%
  st_join(primates) %>%
  group_by(provincia.x) %>%
  summarize(registros = n_distinct(gbifID, na.rm = TRUE)) %>%
  rename(provincia = provincia.x)
# Mapa

# Paleta de colores
colores_registros <-
  colorNumeric(palette = "YlGnBu",
               domain = provincias_registros$registros,
               na.color = "transparent")

# Mapa Leaflet
leaflet() %>%
  addTiles(group = "OSM") %>%
  addPolygons(
    data = provincias_registros,
    fillColor = ~ colores_registros(provincias_registros$registros),
    fillOpacity = 0.7,
    stroke = TRUE,
    color = "black",
    weight = 1,
    popup = paste(
      paste(
        "<strong>Provincia:</strong>",
        provincias_registros$provincia
      ),
      paste(
        "<strong>Cantidad de registros:</strong>",
        provincias_registros$registros
        
      ),
      sep = '<br/>'
    ),
    group = "Provincias - registros"
  ) %>%
  addCircleMarkers(
    data = primates,
    stroke = F,
    radius = 2,
    fillColor = 'black',
    fillOpacity = 1,
    popup = paste(
      primates$species,
      primates$provincia,
      primates$canton,
      primates$eventDate,
      paste0("<a href='", primates$occurrenceID, "'>Más información</a>"),
      sep = '<br/>'
    ),
    clusterOptions = markerClusterOptions(),
    group = "Registros de primates"
  ) %>%  
  addLayersControl(baseGroups = c("OSM"),
                   overlayGroups = c("Provincias - registros", "Registros de primates")) %>%
  addLegend(
    position = "bottomleft",
    pal = colores_registros,
    values = provincias_registros$registros,
    group = "Provincias - registros",
    title = "Cantidad de registros"
  )

Mapa de cantidad de especies por provincia

# Creación de conjunto de datos con la cantidad de especies por provincia
provincias_especies <-
  provincias %>%
  st_join(primates) %>%
  group_by(provincia.x) %>%
  summarize(especies = n_distinct(species, na.rm = TRUE)) %>%
  rename(provincia = provincia.x)
# Mapa

# Paleta de colores
colores_especies <-
  colorNumeric(palette = "YlOrRd",
               domain = provincias_especies$especies,
               na.color = "transparent")

# Mapa Leaflet
leaflet() %>%
  addTiles(group = "OSM") %>%
  addPolygons(
    data = provincias_especies,
    fillColor = ~ colores_especies(provincias_especies$especies),
    fillOpacity = 0.7,
    stroke = TRUE,
    color = "black",
    weight = 1,
    popup = paste(
      paste(
        "<strong>Provincia:</strong>",
        provincias_especies$provincia
      ),
      paste(
        "<strong>Cantidad de especies:</strong>",
        provincias_especies$especies
        
      ),
      sep = '<br/>'
    ),
    group = "Provincias - especies"
  ) %>%
  addCircleMarkers(
    data = primates,
    stroke = F,
    radius = 2,
    fillColor = 'black',
    fillOpacity = 1,
    popup = paste(
      primates$species,
      primates$provincia,
      primates$canton,
      primates$eventDate,
      paste0("<a href='", primates$occurrenceID, "'>Más información</a>"),
      sep = '<br/>'
    ),
    clusterOptions = markerClusterOptions(),
    group = "Registros de primates"
  ) %>%  
  addLayersControl(baseGroups = c("OSM"),
                   overlayGroups = c("Provincias - especies", "Registros de primates")) %>%
  addLegend(
    position = "bottomleft",
    pal = colores_especies,
    values = provincias_especies$especies,
    group = "Provincias - especies",
    title = "Cantidad de especies"
  )

Mapa de cantidad de especies por cantón

# Creación de conjunto de datos con la cantidad de especies por cantón
cantones_especies <-
  cantones %>%
  st_join(primates) %>%
  group_by(canton.x) %>%
  summarize(especies = n_distinct(species, na.rm = TRUE)) %>%
  rename(canton = canton.x)
# Mapa

# Paleta de colores
colores_especies <-
  colorNumeric(palette = "YlOrRd",
               domain = cantones_especies$especies,
               na.color = "transparent")

# Mapa Leaflet
leaflet() %>%
  addTiles(group = "OSM") %>%
  addPolygons(
    data = cantones_especies,
    fillColor = ~ colores_especies(cantones_especies$especies),
    fillOpacity = 0.7,
    stroke = TRUE,
    color = "black",
    weight = 1,
    popup = paste(
      paste(
        "<strong>Cantón:</strong>",
        cantones_especies$canton
      ),
      paste(
        "<strong>Cantidad de especies:</strong>",
        cantones_especies$especies
        
      ),
      sep = '<br/>'
    ),
    group = "Cantones - especies"
  ) %>%
  addCircleMarkers(
    data = primates,
    stroke = F,
    radius = 2,
    fillColor = 'black',
    fillOpacity = 1,
    popup = paste(
      primates$species,
      primates$provincia,
      primates$canton,
      primates$eventDate,
      paste0("<a href='", primates$occurrenceID, "'>Más información</a>"),
      sep = '<br/>'
    ),
    clusterOptions = markerClusterOptions(),
    group = "Registros de primates"
  ) %>%  
  addLayersControl(baseGroups = c("OSM"),
                   overlayGroups = c("Cantones - especies", "Registros de primates")) %>%
  addLegend(
    position = "bottomleft",
    pal = colores_especies,
    values = cantones_especies$especies,
    group = "Cantones - especies",
    title = "Cantidad de especies"
  )

Mapa de calor de registros

# Mapa Leaflet
leaflet() %>%
  addTiles(group = "OSM") %>%
  addProviderTiles(providers$CartoDB.DarkMatter, group = "CartoDB.DarkMatter") %>%
  addHeatmap(
    data = primates,
    lng = ~decimalLongitude,
    lat = ~decimalLatitude,
    radius = 10,
    blur = 20,
    group = "Mapa de calor"
  ) %>%
  addCircleMarkers(
    data = primates,
    stroke = F,
    radius = 2,
    fillColor = 'black',
    fillOpacity = 1,
    popup = paste(
      primates$species,
      primates$provincia,
      primates$canton,
      primates$eventDate,
      paste0("<a href='", primates$occurrenceID, "'>Más información</a>"),
      sep = '<br/>'
    ),
    clusterOptions = markerClusterOptions(),
    group = "Registros de primates"
  ) %>%  
  addLayersControl(baseGroups = c("CartoDB.DarkMatter", "OSM"),
                   overlayGroups = c("Mapa de calor", "Registros de primates"))

Mapa con controles de búsqueda en OSM, botón de reinicio y coordenadas

# Mapa Leaflet
leaflet() %>%
  addTiles(group = "OSM") %>%
  addCircleMarkers(
    data = primates,
    stroke = F,
    radius = 2,
    fillColor = 'black',
    fillOpacity = 1,
    popup = paste(
      primates$species,
      primates$provincia,
      primates$canton,
      primates$eventDate,
      paste0("<a href='", primates$occurrenceID, "'>Más información</a>"),
      sep = '<br/>'
    ),
    clusterOptions = markerClusterOptions(),
    group = "Registros de primates"
  ) %>%
  addLayersControl(baseGroups = c("OSM"),
                   overlayGroups = c("Registros de primates")) %>%
  addResetMapButton() %>%
  addSearchOSM() %>%
  addMouseCoordinates() %>%
  addScaleBar(position = "bottomleft", options = scaleBarOptions(imperial = FALSE)) %>%
  addMiniMap(position = "bottomleft")