La caña de azúcar (Saccharum officinarum) constituye uno de los cultivos tropicales de mayor importancia económica a escala mundial debido a su relevancia en la producción de azúcar, bioetanol y derivados agroindustriales. Su distribución espacial depende principalmente de variables climáticas como temperatura, precipitación y estacionalidad.
Los Sistemas de Información Geográfica (SIG) y las técnicas de análisis espacial permiten integrar información ambiental global para modelar regiones potencialmente aptas para el desarrollo agrícola. En particular, los modelos de aptitud climática permiten identificar zonas óptimas mediante umbrales agroclimáticos, mientras que los modelos de similitud ambiental permiten detectar regiones análogas respecto a territorios altamente productivos.
En este estudio se desarrolla un análisis espacial multicriterio utilizando datos climáticos globales WorldClim v2.1 y procesamiento raster en R para:
Modelar la aptitud climática y la similitud ambiental global para el cultivo de caña de azúcar mediante técnicas de análisis espacial y procesamiento raster en R.
Los Sistemas de Información Geográfica (SIG) permiten capturar, almacenar, procesar y representar información espacial. En estudios agroclimáticos, los SIG facilitan el análisis integrado de variables ambientales mediante estructuras raster y vectoriales.
Los datos raster representan superficies continuas mediante celdas regulares. WorldClim v2.1 proporciona variables BIOCLIM derivadas de interpolaciones climáticas globales de alta resolución espacial.
La aptitud climática representa el grado en que una región cumple condiciones óptimas para el desarrollo agrícola. Para la caña de azúcar, las variables más relevantes incluyen:
La similitud climática permite identificar regiones ambientalmente análogas respecto a un sitio de referencia. Este enfoque resulta útil para:
options(timeout = 1200)
Sys.setenv(RETICULATE_PYTHON = "")
# evita que R intente usar Python (esto era tu error)
library(terra)
library(sf)
library(geodata)
library(dplyr)
library(tidyr)
library(ggplot2)
library(viridis)
library(rnaturalearth)
library(rnaturalearthdata)
library(ggspatial)
library(scales)
library(tidyterra)
theme_set(theme_minimal(base_size = 13))
terra::terraOptions(memfrac = 0.8, tempdir = tempdir())
world <- ne_countries(scale = "medium", returnclass = "sf")
Se utilizaron datos climáticos globales WorldClim v2.1 con resolución espacial de 10 minutos (~18 km).
Variables utilizadas:
BIO1 → Temperatura media anual. BIO5 → Temperatura máxima del mes más cálido. BIO6 → Temperatura mínima del mes más frío. BIO12 → Precipitación anual. BIO15 → Estacionalidad de precipitación.
# Crear carpeta si no existe
if (!dir.exists("data")) dir.create("data")
# Descargar SOLO UNA VEZ
clim <- geodata::worldclim_global(
var = "bio",
res = 10,
path = "data"
)
# Variables
bio1 <- clim[[1]]
bio5 <- clim[[5]]
bio6 <- clim[[6]]
bio12 <- clim[[12]]
bio15 <- clim[[15]]
# Escala correcta
tmean <- bio1 / 10
tmax <- bio5 / 10
tmin <- bio6 / 10
prec <- bio12
pest <- bio15
La variable BIO1 se encuentra almacenada multiplicada por 10, por lo cual es necesario corregir su escala.
# Preparación climática
tmean <- bio1 / 10
tmax <- bio5 / 10
tmin <- bio6 / 10
prec <- bio12
pest <- bio15
ggplot() +
geom_spatraster(data = tmean) +
scale_fill_viridis_c(
option = "C",
name = "°C",
na.value = "white"
) +
labs(
title = "Temperatura media anual global",
subtitle = "WorldClim v2.1"
) +
theme(
legend.position = "right"
)
## <SpatRaster> resampled to 5e+05 cells.
ggplot() +
geom_spatraster(data = prec) +
scale_fill_viridis_c(
option = "D",
name = "mm",
trans = "sqrt",
na.value = "white"
) +
labs(
title = "Precipitación anual global",
subtitle = "WorldClim v2.1"
)
## <SpatRaster> resampled to 5e+05 cells.
La aptitud climática se modeló mediante un enfoque multicriterio ponderado considerando: - Temperatura media anual. - Precipitación anual. - Estacionalidad climática.
temp_score <- terra::classify(
tmean,
rcl = matrix(c(
-Inf, 18, 0,
18, 22.5, 50,
22.5, 28, 100,
28, 32, 50,
32, Inf, 0
), ncol = 3, byrow = TRUE)
)
prec_score <- classify(
prec,
rcl = matrix(c(
-Inf, 1000, 0,
1000, 1500, 50,
1500, 3500, 100,
3500, 4500, 50,
4500, Inf, 0
),
ncol = 3,
byrow = TRUE)
)
est_score <- classify(
pest,
rcl = matrix(c(
-Inf, 40, 100,
40, 70, 70,
70, Inf, 20
),
ncol = 3,
byrow = TRUE)
)
Se implementó un modelo ponderado:
aptitud <- (
temp_score * 0.4 +
prec_score * 0.4 +
est_score * 0.2
)
names(aptitud) <- "Aptitud"
world <- ne_countries(
scale = "medium",
returnclass = "sf"
)
ggplot() +
geom_spatraster(data = aptitud) +
scale_fill_viridis_c(
option = "B",
limits = c(0,100),
name = "Índice"
) +
geom_sf(
data = world,
fill = NA,
color = "gray40",
linewidth = 0.2
) +
labs(
title = "Aptitud climática global para caña de azúcar",
subtitle = "Modelo multicriterio ponderado"
) +
annotation_scale(location = "bl") +
annotation_north_arrow(location = "tr") +
theme(
plot.title = element_text(face = "bold", size = 16),
legend.position = "right"
)
## <SpatRaster> resampled to 5e+05 cells.
## Scale on map varies by more than 10%, scale bar may be inaccurate
Los países seleccionados fueron:
paises <- world %>%
filter(admin %in% c(
"Brazil",
"India",
"Colombia"
))
par(mfrow = c(1,3))
for(i in 1:nrow(paises)){
pais_vect <- vect(paises[i,])
apt_crop <- crop(aptitud, pais_vect)
apt_mask <- mask(apt_crop, pais_vect)
plot(
apt_mask,
main = paises$admin[i],
col = viridis(100),
axes = FALSE
)
plot(
st_geometry(paises[i,]),
add = TRUE,
border = "black",
lwd = 0.5
)
}
par(mfrow = c(1,1))
El Valle del Cauca representa una de las regiones agroindustriales más importantes de América Latina para la producción de caña de azúcar.
Se seleccionaron municipios representativos del corredor azucarero:
valle <- data.frame(
municipio = c("Cali","Palmira","Florida","Pradera","Candelaria","Buga","Tulua"),
lon = c(-76.53,-76.30,-76.24,-76.17,-76.35,-76.30,-76.20),
lat = c(3.45,3.53,3.32,3.42,3.41,3.90,4.08)
)
valle_sf <- sf::st_as_sf(valle, coords = c("lon","lat"), crs = 4326)
valle_vect <- terra::vect(valle_sf)
# Buffer 20 km (en metros → proyectar primero)
valle_proj <- terra::project(valle_vect, "EPSG:3857")
valle_buffer <- terra::buffer(valle_proj, width = 20000)
valle_buffer_wgs84 <- terra::project(valle_buffer, "EPSG:4326")
colombia <- world %>%
filter(admin == "Colombia")
ggplot() +
# Base política del país
geom_sf(
data = colombia,
fill = "gray95",
color = "gray50",
linewidth = 0.3
) +
# Zona de influencia (BUFFER)
geom_sf(
data = valle_buffer_wgs84,
fill = "darkgreen",
alpha = 0.25,
color = "darkgreen"
) +
# Municipios (puntos)
geom_sf(
data = valle_sf,
aes(color = municipio),
size = 3
) +
# Zoom espacial correcto
coord_sf(
xlim = c(-78, -75),
ylim = c(2, 5),
expand = FALSE
) +
# Escala y norte
ggspatial::annotation_scale(location = "bl", width_hint = 0.3) +
ggspatial::annotation_north_arrow(
location = "tr",
style = ggspatial::north_arrow_fancy_orienteering
) +
labs(
title = "Zona de influencia cañera del Valle del Cauca",
subtitle = "Municipios representativos + área de influencia agroindustrial (buffer 20 km)",
color = "Municipio"
) +
theme_minimal(base_size = 13) +
theme(
legend.position = "right",
plot.title = element_text(face = "bold")
)
# Convertir sf → SpatVector (si no lo hiciste antes)
valle_vect <- terra::vect(valle_sf)
names(tmean) <- "tmean"
names(prec) <- "prec"
clima_valle <- terra::extract(
c(tmean, prec),
valle_vect,
df = TRUE
)
clima_valle <- cbind(valle, clima_valle[, -1])
names(clima_valle)[4:5] <- c("temperatura", "precipitacion")
# Renombrar columnas de forma segura
colnames(clima_valle)[(ncol(clima_valle)-1):ncol(clima_valle)] <- c(
"temperatura",
"precipitacion"
)
# Resultado
clima_valle
Se utilizaron variables mensuales WorldClim para generar climatologías mensuales de temperatura y precipitación.
temp_month <- worldclim_global(
var = "tavg",
res = 10,
path = "data"
)
prec_month <- worldclim_global(
var = "prec",
res = 10,
path = "data"
)
temp_series <- terra::extract(
temp_month,
valle_vect
)
prec_series <- terra::extract(
prec_month,
valle_vect
)
temp_df <- data.frame(
mes = factor(
month.abb,
levels = month.abb
)
)
for(i in 1:nrow(valle)){
temp_df[[valle$municipio[i]]] <-
as.numeric(temp_series[i,-1]) / 10
}
temp_long <- pivot_longer(
temp_df,
-mes,
names_to = "municipio",
values_to = "temperatura"
)
ggplot(
temp_long,
aes(
x = mes,
y = temperatura,
color = municipio,
group = municipio
)
) +
geom_line(linewidth = 1.2) +
geom_point(size = 2) +
scale_y_continuous(
labels = label_number(suffix = " °C")
) +
scale_color_viridis_d() +
labs(
title = "Climatología mensual de temperatura",
subtitle = "Municipios cañeros del Valle del Cauca",
x = "Mes",
y = "Temperatura"
) +
theme(
legend.position = "bottom"
)
prec_df <- data.frame(
mes = factor(
month.abb,
levels = month.abb
)
)
for(i in 1:nrow(valle)){
prec_df[[valle$municipio[i]]] <-
as.numeric(prec_series[i,-1])
}
prec_long <- pivot_longer(
prec_df,
-mes,
names_to = "municipio",
values_to = "precipitacion"
)
ggplot(
prec_long,
aes(
x = mes,
y = precipitacion,
color = municipio,
group = municipio
)
) +
geom_line(linewidth = 1.2) +
geom_point(size = 2) +
scale_color_viridis_d() +
scale_y_continuous(
labels = comma
) +
labs(
title = "Climatología mensual de precipitación",
subtitle = "Municipios cañeros del Valle del Cauca",
x = "Mes",
y = "Precipitación (mm)"
) +
theme(
legend.position = "bottom"
)
La similitud climática permite identificar regiones ambientales análogas respecto a una zona de referencia. En estudios agroclimáticos, este enfoque es ampliamente utilizado para detectar áreas con condiciones potencialmente equivalentes para el desarrollo de cultivos.
A diferencia del modelo de aptitud climática, que clasifica regiones mediante umbrales fijos, el modelo de similitud climática representa gradientes continuos de proximidad ambiental. Esto permite comparar regiones del mundo con condiciones similares al Valle del Cauca, una de las zonas con mayor productividad cañera de Colombia.
En este estudio se utiliza una aproximación basada en distancia euclidiana estandarizada. Para ello, las variables climáticas globales son normalizadas mediante puntajes Z, permitiendo comparar variables con distintas unidades y escalas.
Posteriormente, se calcula la distancia climática entre cada celda raster global y el clima promedio observado en los municipios de referencia del Valle del Cauca.
Las regiones con valores bajos de distancia representan condiciones climáticas más similares al Valle del Cauca, mientras que valores altos indican menor similitud ambiental.
Debido a que la temperatura y la precipitación poseen unidades y rangos diferentes, es necesario realizar un proceso de estandarización estadística previo al cálculo de similitud climática.
La normalización mediante puntajes Z permite expresar cada variable en términos de desviaciones estándar respecto a la media global:
\[ Z = \frac{X - \mu}{\sigma} \]
donde:
Este procedimiento evita que variables con magnitudes mayores dominen el cálculo de distancia climática.
En el presente estudio se estandarizaron:
# Estadísticos globales de temperatura
t_stats <- global(
tmean,
c("mean", "sd"),
na.rm = TRUE
)
# Estadísticos globales de precipitación
p_stats <- global(
prec,
c("mean", "sd"),
na.rm = TRUE
)
# Media y desviación estándar
t_mean <- t_stats[1,1]
t_sd <- t_stats[1,2]
p_mean <- p_stats[1,1]
p_sd <- p_stats[1,2]
# Validación estadística
stopifnot(t_sd > 0)
stopifnot(p_sd > 0)
# Estandarización Z-score
t_z <- (tmean - t_mean) / t_sd
p_z <- (prec - p_mean) / p_sd
ref_temp <- mean(
clima_valle$temperatura,
na.rm = TRUE
)
ref_prec <- mean(
clima_valle$precipitacion,
na.rm = TRUE
)
ref_tz <- (
ref_temp - t_stats[1,1]
) / t_stats[1,2]
ref_pz <- (
ref_prec - p_stats[1,1]
) / p_stats[1,2]
distancia <- sqrt(
(t_z - ref_tz)^2 +
(p_z - ref_pz)^2
)
ggplot() +
geom_spatraster(data = distancia) +
scale_fill_viridis_c(
option = "A",
direction = -1,
name = "Distancia"
) +
geom_sf(
data = world,
fill = NA,
color = "gray50",
linewidth = 0.2
) +
labs(
title = "Similitud climática global respecto al Valle del Cauca",
subtitle = "Distancia euclidiana estandarizada"
) +
annotation_scale(location = "bl") +
annotation_north_arrow(location = "tr")
## <SpatRaster> resampled to 5e+05 cells.
## Scale on map varies by more than 10%, scale bar may be inaccurate
El modelo multicriterio de aptitud climática permite identificar regiones óptimas mediante criterios agroclimáticos ponderados.
En contraste, el modelo de similitud climática permite identificar gradientes continuos de analogía ambiental respecto al Valle del Cauca.
El enfoque multicriterio es más útil para delimitación agrícola, mientras que la similitud climática resulta más adecuada para estudios comparativos y transferencia tecnológica entre regiones.
Los resultados evidencian que las regiones tropicales húmedas presentan las condiciones climáticas más favorables para el cultivo de caña de azúcar.
Brasil, India y Colombia presentan extensas superficies con alta aptitud climática debido a:
estabilidad térmica, elevada precipitación, baja estacionalidad climática.
El Valle del Cauca presenta condiciones ambientales altamente favorables y comparables con otras regiones productoras del mundo.
Sin embargo, este estudio presenta algunas limitaciones:
no se incorporaron variables edáficas, no se incluyeron pendientes, no se consideró disponibilidad hídrica, no se incluyó manejo agrícola.
Por tanto, los resultados representan aptitud climática potencial y no productividad real.
Fick, S. E., & Hijmans, R. J. (2017). WorldClim 2: New 1-km spatial resolution climate surfaces for global land areas. International Journal of Climatology, 37(12), 4302–4315. https://doi.org/10.1002/joc.5086
Hijmans, R. J. (2024). terra: Spatial Data Analysis. R package version 1.8-x. https://CRAN.R-project.org/package=terra
Moraga, P. (2023). Spatial Statistics for Data Science: Theory and Practice with R. Chapman and Hall/CRC.
Pebesma, E. (2024). sf: Simple Features for R. R package version 1.0-x. https://CRAN.R-project.org/package=sf
WorldClim Version 2.1. (2024). Global climate data. https://www.worldclim.org/
Food and Agriculture Organization of the United Nations (FAO). (2020). Agroclimatic requirements for sugarcane production.