1. Cargar paquetes necesarios

Usamos pacman para instalar/cargar automáticamente los paquetes requeridos.

require(pacman)
## Cargando paquete requerido: pacman
pacman::p_load(
  rio,        # Importación de datos
  tidyverse,  # Manipulación de datos
  mapview,    # Visualización interactiva
  sf          # Manejo de objetos espaciales
)

2. Definir la función buffer_shp()

Esta función genera un buffer colectivo alrededor de un conjunto de coordenadas.

#-----------------------------------------------------------
# buffer_shp():
#   Genera un buffer único que cubre todas las coordenadas
#   de un data frame, con margen de k km.
#
# Args:
#   df: data frame con columnas lon y lat
#   k: radio del buffer en kilómetros
#   crs_utm: EPSG del CRS proyectado (por defecto Chicago: 32616)
#
# Return:
#   Un objeto sf (polígono) en WGS84
#-----------------------------------------------------------

buffer_shp <- function(df, k, crs_utm = 32616) {
  
  require(sf)
  require(dplyr)
  
  # Validación mínima
  if(!all(c("lon", "lat") %in% names(df))) {
    stop("El data frame debe contener columnas 'lon' y 'lat'.")
  }
  
  # Crear puntos sf en WGS84
  pts <- st_as_sf(df, coords = c("lon", "lat"), crs = 4326)
  
  # Transformar al CRS UTM elegido
  pts_proj <- st_transform(pts, crs_utm)
  
  # Unir todos los puntos en una sola geometría (dissolve)
  pts_union <- st_union(pts_proj)
  
  # Crear buffer colectivo (k km → k*1000 m)
  buf_proj <- st_buffer(pts_union, dist = k * 1000)
  
  # Volver a WGS84 para exportación y visualización
  buf_wgs84 <- st_transform(buf_proj, 4326)
  
  return(buf_wgs84)
}

3. Importar datos de coordenadas

Cargamos el archivo CSV con las coordenadas de ocurrencias.

df <- rio::import('datos/datos_originales/SciurusLatLongScores_feb2026New.csv')

# Seleccionar y renombrar columnas
dflatlon <- df %>% 
  dplyr::select(LATITUDE, LONGITUDE) %>% 
  rename(
    lat = LATITUDE,
    lon = LONGITUDE
  )

4. Generar el buffer a partir de las coordenadas

Aplicamos la función para generar un buffer de 3 km usando CRS UTM 32616.

CHIshp <- buffer_shp(dflatlon, k = 3, crs_utm = 32616)

# Visualizar estructura
class(CHIshp)
## [1] "sfc_MULTIPOLYGON" "sfc"
# Visualización rápida base R
plot(CHIshp)


5. Visualización interactiva del buffer

Usamos mapview para ver el polígono sobre un mapa base.

mapview(CHIshp)

6. Exportar el buffer como Shapefile

Creamos la carpeta de salida (si no existe) y exportamos el shapefile.

# Crear carpeta si no existe
dir.create("resultados/shp_noePoint", recursive = TRUE)
## Warning in dir.create("resultados/shp_noePoint", recursive = TRUE):
## 'resultados\shp_noePoint' already exists
# Exportar shapefile
st_write(
  CHIshp,
  "resultados/shp_noePoint/buffer_output.shp",
  delete_dsn = TRUE
)
## Deleting source `resultados/shp_noePoint/buffer_output.shp' using driver `ESRI Shapefile'
## Writing layer `buffer_output' to data source 
##   `resultados/shp_noePoint/buffer_output.shp' using driver `ESRI Shapefile'
## Writing 1 features with 0 fields and geometry type Multi Polygon.

7. Conclusiones

```