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
)
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)
}
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
)
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)
Usamos mapview para ver el polígono sobre un mapa
base.
mapview(CHIshp)
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.
```