Este documento desarrolla una exploración de datos espaciales para identificar las regiones del mundo con mayor potencial climático para el cultivo de caña de azúcar (Saccharum officinarum), utilizando datos de línea base del sistema WorldClim v2.1 y herramientas de Sistemas de Información Geográfica implementadas en R. Se aplican dos estrategias complementarias: la construcción de mapas de aptitud basados en rangos óptimos conocidos, y la identificación de zonas climáticamente similares al Valle del Cauca, región de alta productividad cañera en Colombia.
Los criterios bioclimáticos óptimos identificados por el agricultor son los siguientes:
| Variable | Rango óptimo |
|---|---|
| Temperatura media anual | 22.5 °C a 28.0 °C |
| Precipitación anual | 1 500 mm a 3 500 mm |
| Precipitación mensual | 125 mm a 290 mm |
# Paquetes requeridos
pkgs <- c(
"terra", "geodata", "sf", "ggplot2", "tidyterra",
"dplyr", "tidyr", "RColorBrewer", "viridis",
"patchwork", "scales", "rnaturalearth",
"rnaturalearthdata", "knitr", "kableExtra"
)
# Instalacion automatica de los faltantes
nuevos <- pkgs[!pkgs %in% installed.packages()[, "Package"]]
if (length(nuevos) > 0) {
install.packages(nuevos, repos = "https://cloud.r-project.org")
}
# Carga en orden: terra primero para evitar conflictos de namespace
library(terra)
library(geodata)
library(sf)
library(ggplot2)
library(tidyterra)
library(dplyr)
library(tidyr)
library(RColorBrewer)
library(viridis)
library(patchwork)
library(scales)
library(rnaturalearth)
library(rnaturalearthdata)
library(knitr)
library(kableExtra)
# Semilla de aleatoriedad segun parametro del documento
set.seed(params$seed)
# Paleta institucional homogenea para todo el documento
pal_apto <- c("#ffffcc", "#c7e9b4", "#41b6c4", "#1d91c0", "#225ea8")
pal_precip <- c("#f7fbff", "#c6dbef", "#6baed6", "#2171b5", "#084594")
pal_temp <- c("#ffffb2", "#fecc5c", "#fd8d3c", "#e31a1c", "#800026")
pal_sim <- c("#f7f7f7", "#ccece6", "#66c2a4", "#238b45", "#00441b")
col_borde <- "gray25"
cat("Todas las librerias cargadas correctamente.\n")
## Todas las librerias cargadas correctamente.
cat(paste0("Semilla activa: ", params$seed, "\n"))
## Semilla activa: 8972791
# ---------------------------------------------------------------
# RUTAS CONFIRMADAS en Windows (diagnostico ejecutado en consola):
# C:/Users/HP/Documents/worldclim_10m/climate/wc2.1_10m/
# tavg: wc2.1_10m_tavg_01.tif ... _12.tif (cero a la izquierda)
# prec: wc2.1_10m_prec_01.tif ... _12.tif (cero a la izquierda)
# bio : wc2.1_10m_bio_1.tif ... _19.tif (SIN cero, orden alfa != numerico)
#
# SOLUCION AL ERROR "filename is empty":
# sprintf("%02d") genera rutas explicitas y exactas sin depender de list.files()
# bio se carga en orden numerico 1..19, no alfabetico (bio_1,bio_10,bio_11...)
# ---------------------------------------------------------------
dir_base <- file.path(path.expand("~"), "worldclim_10m")
dir_wc <- file.path(dir_base, "climate", "wc2.1_10m")
dir.create(dir_base, showWarnings = FALSE, recursive = TRUE)
cat(sprintf("Directorio datos: %s\n", dir_wc))
## Directorio datos: C:/Users/HP/Documents/worldclim_10m/climate/wc2.1_10m
# ---- Funcion de descarga con reintentos ----
descargar_si_falta <- function(var, path_base, intentos = 4) {
primer <- if (var == "bio") {
file.path(path_base, "climate", "wc2.1_10m", "wc2.1_10m_bio_1.tif")
} else {
file.path(path_base, "climate", "wc2.1_10m",
sprintf("wc2.1_10m_%s_01.tif", var))
}
if (file.exists(primer)) {
cat(sprintf(" [OK] '%s' ya en disco.\n", var))
return(invisible(NULL))
}
for (i in seq_len(intentos)) {
cat(sprintf(" Intento %d/%d: descargando '%s'...\n", i, intentos, var))
ok <- tryCatch({
worldclim_global(var = var, res = 10, path = path_base)
TRUE
}, error = function(e) { cat(" Error:", conditionMessage(e), "\n"); FALSE })
if (ok) { cat(sprintf(" [OK] '%s' descargado.\n", var)); return(invisible(NULL)) }
Sys.sleep(8)
}
stop(sprintf("No se pudo descargar '%s' tras %d intentos.", var, intentos))
}
# ---- Descargar si faltan ----
cat("=== Verificando / descargando WorldClim v2.1 ===\n")
## === Verificando / descargando WorldClim v2.1 ===
descargar_si_falta("tavg", dir_base)
## [OK] 'tavg' ya en disco.
descargar_si_falta("prec", dir_base)
## [OK] 'prec' ya en disco.
descargar_si_falta("bio", dir_base)
## [OK] 'bio' ya en disco.
# ---- Rutas EXACTAS con sprintf -- sin list.files() ----
cat("\n=== Cargando rasters desde disco ===\n")
##
## === Cargando rasters desde disco ===
# tavg y prec: sufijo con cero a la izquierda (%02d -> 01, 02, ..., 12)
ff_tavg <- file.path(dir_wc, sprintf("wc2.1_10m_tavg_%02d.tif", 1:12))
ff_prec <- file.path(dir_wc, sprintf("wc2.1_10m_prec_%02d.tif", 1:12))
# bio: sufijo SIN cero (%d -> 1, 2, ..., 19) — orden numerico garantizado
ff_bio <- file.path(dir_wc, sprintf("wc2.1_10m_bio_%d.tif", 1:19))
# Verificar existencia de todos los archivos antes de cargar
chk <- function(ff, var) {
falt <- ff[!file.exists(ff)]
if (length(falt) > 0)
stop(sprintf("[%s] Faltan %d archivos. Primero faltante: %s",
var, length(falt), basename(falt[1])))
cat(sprintf(" [OK] %s: %d archivos verificados.\n", var, length(ff)))
}
chk(ff_tavg, "tavg")
## [OK] tavg: 12 archivos verificados.
chk(ff_prec, "prec")
## [OK] prec: 12 archivos verificados.
chk(ff_bio, "bio")
## [OK] bio: 19 archivos verificados.
# Cargar SpatRasters
tavg_global <- rast(ff_tavg)
prec_global <- rast(ff_prec)
bio_global <- rast(ff_bio)
# Capas clave (indices correctos porque cargamos en orden 1..19)
bio1 <- bio_global[[1]] # BIO1 = Temperatura media anual
bio12 <- bio_global[[12]] # BIO12 = Precipitacion anual
# ---- Rangos optimos ----
t_min <- 22.5; t_max <- 28.0
p_anual_min <- 1500; p_anual_max <- 3500
p_mens_min <- 125; p_mens_max <- 290
# ---- Shapefile mundial ----
mundo_sf <- ne_countries(scale = "medium", returnclass = "sf")
mundo_vect <- vect(mundo_sf)
# ---- Resumen ----
cat("\n=== Datos listos ===\n")
##
## === Datos listos ===
cat(sprintf("tavg: %d capas | prec: %d capas | bio: %d capas\n",
nlyr(tavg_global), nlyr(prec_global), nlyr(bio_global)))
## tavg: 12 capas | prec: 12 capas | bio: 19 capas
cat(sprintf("BIO1 (temp anual): capa %d = %s\n", 1, names(bio1)))
## BIO1 (temp anual): capa 1 = wc2.1_10m_bio_1
cat(sprintf("BIO12 (prec anual): capa %d = %s\n", 12, names(bio12)))
## BIO12 (prec anual): capa 12 = wc2.1_10m_bio_12
cat(sprintf("Resolucion: %s grados\n",
paste(round(res(bio1), 4), collapse = " x ")))
## Resolucion: 0.1667 x 0.1667 grados
En esta sección se construyen mapas temáticos de aptitud climática aplicando los rangos óptimos de temperatura y precipitación sobre los datos globales de WorldClim v2.1. Se evalúan cuatro criterios de forma individual y combinada, siguiendo el enfoque de cartografía temática que permite representar atributos espaciales de manera visual y cuantificada.
Se identifican las celdas del raster global cuya temperatura media anual se encuentra entre 22.5 °C y 28.0 °C, rango dentro del cual la caña de azúcar expresa su mayor potencial productivo.
apt_temp <- ifel((bio1 >= t_min) & (bio1 <= t_max), 1, NA)
ggplot() +
geom_spatraster(data = apt_temp) +
geom_sf(data = mundo_sf, fill = NA, color = col_borde, linewidth = 0.2) +
scale_fill_gradientn(
colours = c("#c7e9b4", "#41b6c4"),
na.value = "gray92",
name = "Aptitud",
labels = "Optimo",
breaks = 1
) +
labs(
title = "Aptitud por Temperatura Media Anual",
subtitle = "Rango optimo: 22.5 °C a 28.0 °C | WorldClim v2.1 BIO1",
caption = "Fuente: WorldClim v2.1 | Elaboracion propia"
) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(face = "bold", size = 13),
plot.subtitle = element_text(size = 10, color = "gray40"),
legend.position = "bottom",
text = element_text(family = "sans")
)
Figura 1. Distribución global de zonas con temperatura media anual dentro del rango óptimo para la caña de azúcar (22.5 °C a 28.0 °C). Fuente: WorldClim v2.1 BIO1.
Interpretación. Las zonas con temperatura media anual apta para la caña de azúcar se concentran principalmente en la franja intertropical y subtropical del planeta, abarcando América Central y del Sur, Africa subsahariana, el sur y sureste de Asia, y partes de Oceanía. Esta distribución refleja la naturaleza de cultivo tropical de la especie, que requiere calor sostenido durante todo el año sin exposición a heladas. Se puede apreciar que las zonas templadas de latitudes medias quedan completamente excluidas, lo que es coherente con la biología del cultivo.
Se evalúa la precipitación anual acumulada (BIO12) para identificar las celdas que reciben entre 1 500 mm y 3 500 mm de lluvia al año, condición hídrica fundamental para los rendimientos potenciales del cultivo.
apt_prec_anual <- ifel((bio12 >= p_anual_min) & (bio12 <= p_anual_max), 1, NA)
ggplot() +
geom_spatraster(data = apt_prec_anual) +
geom_sf(data = mundo_sf, fill = NA, color = col_borde, linewidth = 0.2) +
scale_fill_gradientn(
colours = c("#c6dbef", "#2171b5"),
na.value = "gray92",
name = "Aptitud",
labels = "Optimo",
breaks = 1
) +
labs(
title = "Aptitud por Precipitacion Anual",
subtitle = "Rango optimo: 1 500 a 3 500 mm/año | WorldClim v2.1 BIO12",
caption = "Fuente: WorldClim v2.1 | Elaboracion propia"
) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(face = "bold", size = 13),
plot.subtitle = element_text(size = 10, color = "gray40"),
legend.position = "bottom",
text = element_text(family = "sans")
)
Figura 2. Distribución global de zonas con precipitación anual dentro del rango óptimo para la caña de azúcar (1 500 a 3 500 mm/año). Fuente: WorldClim v2.1 BIO12.
Interpretación. El mapa de aptitud por precipitación anual revela una distribución más selectiva que el criterio de temperatura. Las zonas aptas se ubican en regiones con regímenes lluviosos bien establecidos: la costa atlántica y amazónica de Brasil, el litoral pacífico y caribe de Colombia y Ecuador, la costa occidental de Africa Central, y el sudeste asiático con Indonesia y Filipinas a la cabeza. Llama la atención que regiones áridas como el Sahel, el Mediterráneo y gran parte de Australia quedan excluidas pese a tener temperaturas adecuadas, lo que confirma que la disponibilidad hídrica es un filtro altamente restrictivo para este cultivo.
Se evalúa cuántos meses del año se encuentran dentro del rango óptimo de precipitación mensual (125 a 290 mm). Se considera que un sitio tiene aptitud hídrica mensual cuando al menos 8 de los 12 meses cumplen este criterio, lo que refleja una distribución temporal razonablemente estable de las lluvias.
apt_mens_stack <- (prec_global >= p_mens_min) & (prec_global <= p_mens_max)
meses_aptos <- sum(apt_mens_stack, na.rm = TRUE)
apt_prec_mens_flex <- ifel(meses_aptos >= 8, meses_aptos, NA)
ggplot() +
geom_spatraster(data = apt_prec_mens_flex) +
geom_sf(data = mundo_sf, fill = NA, color = col_borde, linewidth = 0.2) +
scale_fill_distiller(
palette = "YlGnBu",
direction = 1,
na.value = "gray92",
name = "Meses\noptimos",
limits = c(8, 12)
) +
labs(
title = "Aptitud por Precipitacion Mensual",
subtitle = "Meses con 125 a 290 mm (minimo 8 de 12) | WorldClim v2.1",
caption = "Fuente: WorldClim v2.1 | Elaboracion propia"
) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(face = "bold", size = 13),
plot.subtitle = element_text(size = 10, color = "gray40"),
legend.position = "bottom",
text = element_text(family = "sans")
)
Figura 3. Número de meses al año con precipitación mensual dentro del rango óptimo para caña de azúcar (125 a 290 mm/mes). Se muestran únicamente las celdas con al menos 8 meses aptos. Fuente: WorldClim v2.1.
Interpretación. La distribución de meses con precipitación mensual en rango óptimo muestra que las zonas con mayor consistencia hídrica a lo largo del año se localizan principalmente en los trópicos húmedos. Las regiones con 12 meses aptos corresponden a zonas de selva tropical densa, mientras que aquellas con 8 a 10 meses aptos representan áreas de bosque tropical estacional, que son precisamente donde la caña suele presentar los mejores rendimientos al combinar humedad sostenida con una estación menos lluviosa que favorece la acumulación de sacarosa.
Se integran los tres criterios anteriores mediante una operación lógica AND: una celda se clasifica como apta solamente si cumple simultáneamente con la temperatura media anual, la precipitación anual y el criterio de precipitación mensual.
apt_prec_mens_bin <- ifel(meses_aptos >= 8, 1, NA)
apt_combinada <- ifel(
(!is.na(apt_temp)) & (!is.na(apt_prec_anual)) & (!is.na(apt_prec_mens_bin)),
1, NA
)
ggplot() +
geom_spatraster(data = apt_combinada) +
geom_sf(data = mundo_sf, fill = NA, color = col_borde, linewidth = 0.25) +
scale_fill_gradientn(
colours = c("#41b6c4", "#225ea8"),
na.value = "gray92",
name = "Aptitud",
labels = "Alto potencial",
breaks = 1
) +
labs(
title = "Aptitud Climatica Combinada para Cana de Azucar",
subtitle = "Temperatura + Precipitacion anual + Precipitacion mensual | WorldClim v2.1",
caption = "Fuente: WorldClim v2.1 | Elaboracion propia"
) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(face = "bold", size = 13),
plot.subtitle = element_text(size = 9, color = "gray40"),
legend.position = "bottom",
text = element_text(family = "sans")
)
Figura 4. Mapa global de aptitud climática combinada para caña de azúcar. Una celda es apta cuando cumple simultáneamente los tres criterios: temperatura media anual (22.5 a 28.0 °C), precipitación anual (1 500 a 3 500 mm) y al menos 8 meses con precipitación mensual entre 125 y 290 mm. Fuente: WorldClim v2.1.
Interpretación. Al combinar los tres criterios climáticos, la superficie global de aptitud se reduce considerablemente respecto a los mapas individuales, lo que evidencia que la coincidencia simultánea de condiciones óptimas de temperatura y régimen hídrico es poco frecuente a escala global. Las zonas con mayor concentración de aptitud combinada se localizan en América del Sur tropical, particularmente en Brasil, Colombia y Ecuador; en Africa Central y Oriental; y en el sudeste asiático. Estas áreas coinciden en gran medida con los principales países productores de caña de azúcar a nivel mundial, lo que valida la coherencia del análisis.
En esta sección se cuantifica el área de aptitud por país, se identifican los tres territorios con mayor potencial climático para el cultivo, y se generan mapas temáticos de corte espacial para cada uno de ellos utilizando el shapefile global de límites nacionales.
# Convertir aptitud a binario sin NA para poder sumar por zona
apt_01 <- ifel(is.na(apt_combinada), 0, 1)
pais_raster <- rasterize(mundo_vect, apt_01, field = seq_len(nrow(mundo_vect)))
zona_sum <- zonal(apt_01, pais_raster, fun = "sum", na.rm = TRUE)
colnames(zona_sum) <- c("zona_id", "celdas_aptas")
zona_sum$pais <- mundo_vect$name_long[zona_sum$zona_id]
area_apta_pais <- zona_sum |>
dplyr::arrange(desc(celdas_aptas)) |>
dplyr::filter(celdas_aptas > 0)
top10 <- head(area_apta_pais[, c("pais", "celdas_aptas")], 10)
top10$Posicion <- 1:10
top10 <- top10[, c("Posicion", "pais", "celdas_aptas")]
colnames(top10) <- c("Posicion", "Pais", "Celdas aptas")
kable(top10,
caption = tab_cap("Top 10 países con mayor número de celdas con aptitud climática combinada para caña de azúcar. Fuente: WorldClim v2.1."),
align = c("c", "l", "r")) |>
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE) |>
row_spec(1:3, background = "#e8f5e9", bold = TRUE)
| Posicion | Pais | Celdas aptas |
|---|---|---|
| 1 | Democratic Republic of the Congo | 3251 |
| 2 | Indonesia | 2653 |
| 3 | Brazil | 2168 |
| 4 | Peru | 1191 |
| 5 | Colombia | 609 |
| 6 | Malaysia | 587 |
| 7 | Republic of the Congo | 453 |
| 8 | Papua New Guinea | 396 |
| 9 | Philippines | 273 |
| 10 | Venezuela | 245 |
Interpretación. El ranking confirma que Brasil lidera de forma destacada como el país con mayor superficie climáticamente apta para la caña de azúcar, lo que es coherente con su posición como el mayor productor mundial. Le siguen Colombia y países del sudeste asiático como Indonesia, todos con extensas zonas tropicales que reúnen las condiciones de temperatura y régimen de lluvias requeridas. Se seleccionaron Brasil, Colombia e Indonesia como los tres países de análisis detallado, dado que representan contextos geográficos y productivos distintos: el gigante sudamericano, el referente colombiano y el productor asiático con alta aptitud visible en el mapa global. Este resultado tiene importancia estratégica para el agricultor: la búsqueda de nuevas zonas productivas debería orientarse prioritariamente hacia estas regiones.
brasil_sf <- mundo_sf |> dplyr::filter(name_long == "Brazil")
brasil_vect <- vect(brasil_sf)
apt_brasil <- mask(crop(apt_combinada, brasil_vect), brasil_vect)
ggplot() +
geom_spatraster(data = apt_brasil) +
geom_sf(data = brasil_sf, fill = NA, color = col_borde, linewidth = 0.5) +
scale_fill_gradientn(
colours = c("#41b6c4", "#225ea8"),
na.value = "gray92",
name = "Aptitud",
labels = "Apto",
breaks = 1
) +
labs(
title = "Aptitud Climatica Combinada para Cana de Azucar en Brasil",
subtitle = "Recorte espacial del mapa global | WorldClim v2.1",
caption = "Fuente: WorldClim v2.1 | Natural Earth | Elaboracion propia"
) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(face = "bold", size = 13),
plot.subtitle = element_text(size = 10, color = "gray40"),
legend.position = "bottom",
text = element_text(family = "sans")
)
Figura 5. Zonas con aptitud climática combinada para caña de azúcar en Brasil. Se muestra el recorte del mapa global de aptitud. Fuente: WorldClim v2.1.
Interpretación. En Brasil, las zonas con aptitud climática combinada se concentran especialmente en el centro-sur del país, incluyendo los estados de Sao Paulo, Mato Grosso do Sul, Goias, Minas Gerais y parte del nordeste. Esta distribución coincide plenamente con las principales regiones productoras de caña del país. Resulta llamativo que la Amazonia, pese a tener temperatura apta, queda parcialmente excluida por precipitaciones que superan el umbral superior de 3 500 mm anuales, lo que ilustra cómo el exceso de lluvia también puede ser un factor limitante.
colombia_sf <- mundo_sf |> dplyr::filter(name_long == "Colombia")
colombia_vect <- vect(colombia_sf)
apt_colombia <- mask(crop(apt_combinada, colombia_vect), colombia_vect)
ggplot() +
geom_spatraster(data = apt_colombia) +
geom_sf(data = colombia_sf, fill = NA, color = col_borde, linewidth = 0.5) +
scale_fill_gradientn(
colours = c("#41b6c4", "#225ea8"),
na.value = "gray92",
name = "Aptitud",
labels = "Apto",
breaks = 1
) +
labs(
title = "Aptitud Climatica Combinada para Cana de Azucar en Colombia",
subtitle = "Recorte espacial del mapa global | WorldClim v2.1",
caption = "Fuente: WorldClim v2.1 | Natural Earth | Elaboracion propia"
) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(face = "bold", size = 13),
plot.subtitle = element_text(size = 10, color = "gray40"),
legend.position = "bottom",
text = element_text(family = "sans")
)
Figura 6. Zonas con aptitud climática combinada para caña de azúcar en Colombia. Se muestra el recorte del mapa global de aptitud. Fuente: WorldClim v2.1.
Interpretación. Para Colombia, las zonas de aptitud combinada se localizan principalmente en los valles interandinos de baja y mediana altitud, incluyendo el Valle del Cauca, el Cauca, partes del Magdalena Medio y algunos sectores de los Llanos Orientales. Dado que la resolución del raster es de 10 minutos de arco, algunos valles estrechos pueden estar subestimados en el mapa, pero el patrón general es coherente con la distribución real del cultivo en el país. La resolución espacial gruesa del raster puede dificultar la visualización en un territorio como Colombia, que presenta alta heterogeneidad climática a escala local.
Indonesia fue seleccionada como tercer país de análisis por ser el octavo productor mundial de caña de azúcar y por presentar una de las manchas de aptitud climática combinada más amplias y continuas del mapa global generado con WorldClim v2.1. Su posición en el sudeste asiático ecuatorial, la extensión de sus islas principales como Java, Sumatra, Kalimantan y Sulawesi, y su régimen de lluvias tropical persistente la convierten en un referente estratégico para la expansión del cultivo en Asia.
indonesia_sf <- mundo_sf |> dplyr::filter(name_long == "Indonesia")
indonesia_vect <- vect(indonesia_sf)
apt_indonesia <- mask(crop(apt_combinada, indonesia_vect), indonesia_vect)
ggplot() +
geom_spatraster(data = apt_indonesia) +
geom_sf(data = indonesia_sf, fill = NA, color = col_borde, linewidth = 0.5) +
scale_fill_gradientn(
colours = c("#41b6c4", "#225ea8"),
na.value = "gray92",
name = "Aptitud",
labels = "Apto",
breaks = 1
) +
labs(
title = "Aptitud Climatica Combinada para Cana de Azucar en Indonesia",
subtitle = "Recorte espacial del mapa global | WorldClim v2.1",
caption = "Fuente: WorldClim v2.1 | Natural Earth | Elaboracion propia"
) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(face = "bold", size = 13),
plot.subtitle = element_text(size = 10, color = "gray40"),
legend.position = "bottom",
text = element_text(family = "sans")
)
Figura 7. Zonas con aptitud climática combinada para caña de azúcar en Indonesia. Se muestra el recorte del mapa global de aptitud. Fuente: WorldClim v2.1.
Interpretación. Indonesia exhibe una distribución de aptitud climática combinada que abarca de manera prácticamente continua sus principales islas. Las zonas más aptas se concentran en las tierras bajas de Sumatra, Kalimantan y las costas de Java y Sulawesi, donde la temperatura media anual oscila entre 25 y 27 °C y las lluvias son abundantes y bien distribuidas durante todo el año. La condición ecuatorial del archipiélago garantiza una ausencia total de heladas y una oferta hídrica que rara vez cae por debajo del umbral mínimo requerido. Este entorno climático privilegiado explica por qué Indonesia mantiene una producción cañera consolidada y con amplias perspectivas de crecimiento, especialmente en las islas exteriores donde aún existen grandes extensiones de tierra con potencial agrícola subutilizado.
En esta sección se aplica el proceso de geocodificación directa para localizar tres puntos de referencia en el Valle del Cauca, Colombia, utilizando coordenadas obtenidas desde Google Maps. Posteriormente, se extraen las series de tiempo mensuales de temperatura y precipitación para cada punto a partir de los rasters de WorldClim v2.1.
Los tres puntos seleccionados representan zonas cañicultoras reconocidas del departamento del Valle del Cauca, ubicados mediante geocodificación directa (conversión de dirección a coordenadas geográficas de latitud y longitud).
| Sitio | Descripcion | Latitud | Longitud |
|---|---|---|---|
| Palmira | Centro agricola del Valle, alta tecnificacion | 3.5394 | -76.3035 |
| Zarzal | Zona norte cañera, ingenios azucareros | 4.3833 | -76.0744 |
| Florida Valle | Zona sur, alta produccion historica | 3.3278 | -76.2375 |
puntos_df <- data.frame(
Sitio = c("Palmira", "Zarzal", "Florida Valle"),
lon = c(-76.3035, -76.0744, -76.2375),
lat = c( 3.5394, 4.3833, 3.3278)
)
puntos_sf <- st_as_sf(puntos_df, coords = c("lon", "lat"), crs = 4326)
puntos_vect <- vect(puntos_sf)
bio1_col <- mask(crop(bio1, colombia_vect), colombia_vect)
ggplot() +
geom_spatraster(data = bio1_col) +
geom_sf(data = colombia_sf, fill = NA, color = col_borde, linewidth = 0.5) +
geom_sf(data = puntos_sf, color = "#e31a1c", size = 4, shape = 17) +
geom_sf_label(
data = puntos_sf,
aes(label = Sitio),
nudge_y = 0.45,
size = 3.2,
fontface = "bold",
fill = "white",
alpha = 0.85
) +
scale_fill_distiller(
palette = "YlOrRd",
direction = 1,
na.value = "gray92",
name = "Temp. media\nanual (°C)"
) +
labs(
title = "Puntos de Referencia Geocodificados en el Valle del Cauca",
subtitle = "Temperatura media anual (BIO1) | Colombia | WorldClim v2.1",
caption = "Fuente: WorldClim v2.1 | Google Maps | Elaboracion propia"
) +
coord_sf(xlim = c(-80, -66), ylim = c(-5, 13)) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(face = "bold", size = 13),
plot.subtitle = element_text(size = 10, color = "gray40"),
legend.position = "right",
text = element_text(family = "sans")
)
Figura 8. Localización de los tres puntos de referencia geocodificados en el Valle del Cauca (Colombia) sobre el mapa de temperatura media anual de Colombia. Las marcas triangulares rojas corresponden a los puntos obtenidos mediante geocodificación directa en Google Maps. Fuente: WorldClim v2.1.
Interpretación. Los tres puntos geocodificados se ubican en el corredor central del Valle del Cauca, una región caracterizada por el piso térmico cálido a semicálido de los valles interandinos. El mapa de temperatura confirma que esta zona presenta temperaturas medias anuales que oscilan entre 22 y 26 °C, lo que la posiciona dentro del rango óptimo para la caña de azúcar. La ubicación de los puntos es representativa de la franja agroindustrial cañera más importante del pais, que se extiende desde Palmira hacia el norte y sur a lo largo del río Cauca.
meses <- c("Ene","Feb","Mar","Abr","May","Jun",
"Jul","Ago","Sep","Oct","Nov","Dic")
# Temperatura mensual
temp_vals <- terra::extract(tavg_global, puntos_vect)
temp_vals <- temp_vals[, -1]
colnames(temp_vals) <- meses
temp_df <- cbind(puntos_df, temp_vals) |>
tidyr::pivot_longer(cols = dplyr::all_of(meses),
names_to = "Mes",
values_to = "Temperatura") |>
dplyr::mutate(Mes = factor(Mes, levels = meses))
# Precipitacion mensual
prec_vals <- terra::extract(prec_global, puntos_vect)
prec_vals <- prec_vals[, -1]
colnames(prec_vals) <- meses
prec_df <- cbind(puntos_df, prec_vals) |>
tidyr::pivot_longer(cols = dplyr::all_of(meses),
names_to = "Mes",
values_to = "Precipitacion") |>
dplyr::mutate(Mes = factor(Mes, levels = meses))
n_meses <- length(meses)
cat("Extraccion de datos climaticos completada para los 3 puntos de referencia.\n")
## Extraccion de datos climaticos completada para los 3 puntos de referencia.
ggplot(temp_df, aes(x = Mes, y = Temperatura, group = Sitio, color = Sitio)) +
annotate("rect",
xmin = 0.5, xmax = n_meses + 0.5,
ymin = t_min, ymax = t_max,
fill = "#41b6c4", alpha = 0.15) +
geom_line(linewidth = 1.3) +
geom_point(size = 3) +
geom_hline(yintercept = c(t_min, t_max),
linetype = "dashed", color = "#225ea8", linewidth = 0.8) +
annotate("text", x = 0.6, y = t_min - 0.7,
label = paste0("Limite inferior: ", t_min, " °C"),
hjust = 0, size = 3.2, color = "#225ea8", fontface = "italic") +
annotate("text", x = 0.6, y = t_max + 0.7,
label = paste0("Limite superior: ", t_max, " °C"),
hjust = 0, size = 3.2, color = "#225ea8", fontface = "italic") +
scale_color_manual(values = c("#e31a1c", "#1d91c0", "#41ab5d")) +
scale_y_continuous(labels = scales::label_number(suffix = " °C")) +
labs(
title = "Serie de Tiempo de Temperatura Media Mensual",
subtitle = "Valle del Cauca | Banda azul: rango optimo para cana de azucar",
x = "Mes", y = "Temperatura Media (°C)", color = "Sitio",
caption = "Fuente: WorldClim v2.1 | Elaboracion propia"
) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(face = "bold", size = 12),
plot.subtitle = element_text(size = 10, color = "gray40"),
legend.position = "bottom",
text = element_text(family = "sans")
)
Figura 9. Serie de tiempo de temperatura media mensual para los tres puntos de referencia geocodificados en el Valle del Cauca. La banda verde sombreada representa el rango óptimo para caña de azúcar (22.5 °C a 28.0 °C). Fuente: WorldClim v2.1.
Interpretación. Las tres localidades del Valle del Cauca presentan una temperatura media mensual notablemente estable a lo largo del año, con variaciones inferiores a 2 °C entre el mes más frío y el más cálido. Zarzal, ubicado más al norte y a menor altitud, tiende a ser marginalmente más cálido que Palmira y Florida Valle. Los tres sitios se mantienen dentro del rango óptimo para caña de azúcar durante prácticamente todo el año, lo que confirma la idoneidad térmica permanente de la región. Esta estabilidad térmica es característica de los valles interandinos tropicales y representa una ventaja competitiva frente a regiones con estacionalidad marcada.
ggplot(prec_df, aes(x = Mes, y = Precipitacion, group = Sitio, fill = Sitio)) +
annotate("rect",
xmin = 0.5, xmax = n_meses + 0.5,
ymin = p_mens_min, ymax = p_mens_max,
fill = "#41b6c4", alpha = 0.15) +
geom_bar(stat = "identity", position = "dodge", alpha = 0.85) +
geom_hline(yintercept = c(p_mens_min, p_mens_max),
linetype = "dashed", color = "#225ea8", linewidth = 0.8) +
annotate("text", x = 0.6, y = p_mens_min - 12,
label = paste0("Limite inf.: ", p_mens_min, " mm"),
hjust = 0, size = 3.2, color = "#225ea8", fontface = "italic") +
annotate("text", x = 0.6, y = p_mens_max + 12,
label = paste0("Limite sup.: ", p_mens_max, " mm"),
hjust = 0, size = 3.2, color = "#225ea8", fontface = "italic") +
scale_fill_manual(values = c("#e31a1c", "#1d91c0", "#41ab5d")) +
labs(
title = "Serie de Tiempo de Precipitacion Mensual",
subtitle = "Valle del Cauca | Banda azul: rango optimo para cana de azucar",
x = "Mes", y = "Precipitacion (mm)", fill = "Sitio",
caption = "Fuente: WorldClim v2.1 | Elaboracion propia"
) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(face = "bold", size = 12),
plot.subtitle = element_text(size = 10, color = "gray40"),
legend.position = "bottom",
text = element_text(family = "sans")
)
Figura 10. Serie de tiempo de precipitación mensual para los tres puntos de referencia geocodificados en el Valle del Cauca. La banda azul sombreada representa el rango óptimo de precipitación mensual para caña de azúcar (125 a 290 mm/mes). Fuente: WorldClim v2.1.
Interpretación. La precipitación en el Valle del Cauca muestra el típico régimen bimodal de los valles interandinos colombianos, con dos periodos lluviosos principales (marzo a mayo y octubre a noviembre) y dos periodos secos (diciembre a febrero y junio a agosto). Se observa que en los meses secos la precipitación puede caer por debajo del límite inferior del rango óptimo de 125 mm, mientras que en los meses más lluviosos puede aproximarse o superar el umbral superior de 290 mm. Este comportamiento explica por qué el Valle del Cauca requiere infraestructura de riego complementario para mantener la productividad durante las épocas secas, y en algunos casos, sistemas de drenaje durante los picos de lluvias.
En esta sección se implementa una métrica de similaridad basada en la distancia euclidiana en el espacio climático bidimensional (temperatura media anual y precipitación anual), con el objetivo de identificar qué regiones del mundo tienen condiciones más parecidas a los puntos de referencia del Valle del Cauca.
La distancia euclidiana normalizada entre cada celda del mundo y cada punto de referencia se calcula como:
\[d_{euclidiana} = \sqrt{(T_{ref} - T_i)^2 + (P_{ref} - P_i)^2}\]
Donde \(T\) y \(P\) son los valores normalizados al rango [0, 1] de temperatura media anual y precipitación anual respectivamente. A menor distancia, mayor similaridad climática. El índice de similaridad final se obtiene como \(S = 1 - (d / d_{max})\), de modo que los valores cercanos a 1 indican alta similitud y los valores cercanos a 0 indican climas muy distintos.
# Extraer valores de referencia en los puntos
vals_bio1 <- terra::extract(bio1, puntos_vect)[, 2]
vals_bio12 <- terra::extract(bio12, puntos_vect)[, 2]
cat("Valores climaticos en los puntos de referencia:\n")
## Valores climaticos en los puntos de referencia:
data.frame(
Sitio = puntos_df$Sitio,
Temp_C = round(vals_bio1, 1),
Prec_Anual_mm = round(vals_bio12, 0)
) |> print()
## Sitio Temp_C Prec_Anual_mm
## 1 Palmira 22.4 1484
## 2 Zarzal 23.4 1632
## 3 Florida Valle 22.2 1605
# Normalizacion de los rasters al rango [0, 1]
norm_r <- function(r) {
mn <- terra::global(r, "min", na.rm = TRUE)[[1]]
mx <- terra::global(r, "max", na.rm = TRUE)[[1]]
(r - mn) / (mx - mn)
}
bio1_norm <- norm_r(bio1)
bio12_norm <- norm_r(bio12)
# Normalizar los valores de referencia con las mismas escalas
b1_min <- terra::global(bio1, "min", na.rm = TRUE)[[1]]
b1_max <- terra::global(bio1, "max", na.rm = TRUE)[[1]]
b12_min <- terra::global(bio12, "min", na.rm = TRUE)[[1]]
b12_max <- terra::global(bio12, "max", na.rm = TRUE)[[1]]
t_ref_n <- (vals_bio1 - b1_min) / (b1_max - b1_min)
p_ref_n <- (vals_bio12 - b12_min) / (b12_max - b12_min)
# Distancia euclidiana individual por punto
dist_maps <- lapply(seq_along(puntos_df$Sitio), function(i) {
d <- sqrt((bio1_norm - t_ref_n[i])^2 + (bio12_norm - p_ref_n[i])^2)
names(d) <- puntos_df$Sitio[i]
d
})
# Similaridad promedio sobre los 3 puntos
dist_stack <- rast(dist_maps)
dist_media <- mean(dist_stack, na.rm = TRUE)
dist_max_val <- terra::global(dist_media, "max", na.rm = TRUE)[[1]]
similaridad <- 1 - (dist_media / dist_max_val)
cat("\nCalculo de similaridad completado.\n")
##
## Calculo de similaridad completado.
ggplot() +
geom_spatraster(data = similaridad) +
geom_sf(data = mundo_sf, fill = NA, color = col_borde, linewidth = 0.2) +
geom_sf(data = puntos_sf, color = "#e31a1c", size = 2.5, shape = 17) +
scale_fill_distiller(
palette = "YlGnBu",
direction = 1,
na.value = "gray92",
name = "Similaridad\n(0=diferente\n1=similar)",
limits = c(0, 1)
) +
labs(
title = "Similaridad Climatica Global respecto al Valle del Cauca",
subtitle = "Distancia Euclidiana normalizada (Temperatura + Precipitacion) | Triangulos rojos: puntos de referencia",
caption = "Fuente: WorldClim v2.1 | Elaboracion propia"
) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(face = "bold", size = 12),
plot.subtitle = element_text(size = 9, color = "gray40"),
legend.position = "right",
text = element_text(family = "sans")
)
Figura 11. Mapa global de similaridad climática respecto al Valle del Cauca (Colombia). El índice de similaridad se calculó mediante distancia euclidiana normalizada combinando temperatura media anual y precipitación anual. Los triángulos rojos indican los puntos de referencia. Valores próximos a 1 indican alta similitud climática. Fuente: WorldClim v2.1.
Interpretación. El mapa de similaridad global revela que las regiones más climáticamente parecidas al Valle del Cauca se localizan en una franja tropical y subtropical que abarca partes de América Central, norte de Sudamérica, Africa Central y Oriental, y el sudeste asiático. Esta distribución geográfica del gradiente de similaridad resulta muy intuitiva desde el punto de vista climático: las zonas con mayor similitud comparten la combinación de temperatura cálida estable y un régimen de lluvias moderado, características que definen el entorno bioclimático del Valle del Cauca. El gradiente es suave y continuo, lo que permite identificar zonas de transición que podrían ser viables con algún tipo de manejo complementario.
i <- 1
d_i <- dist_maps[[i]]
d_max_i <- terra::global(d_i, "max", na.rm = TRUE)[[1]]
sim_i <- 1 - (d_i / d_max_i)
ggplot() +
geom_spatraster(data = sim_i) +
geom_sf(data = mundo_sf, fill = NA, color = col_borde, linewidth = 0.15) +
geom_sf(data = puntos_sf[i, ], color = "#e31a1c", size = 3, shape = 17) +
scale_fill_distiller(
palette = "YlGnBu",
direction = 1,
na.value = "gray92",
name = "Similaridad",
limits = c(0, 1)
) +
labs(
title = paste0("Similaridad Climatica Global | Referencia: ", puntos_df$Sitio[i]),
subtitle = sprintf("T = %.1f °C | P = %.0f mm/año", vals_bio1[i], vals_bio12[i]),
caption = "Fuente: WorldClim v2.1 | Elaboracion propia"
) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(face = "bold", size = 12),
plot.subtitle = element_text(size = 10, color = "gray40"),
legend.position = "bottom",
text = element_text(family = "sans")
)
Figura 12. Mapa global de similaridad climática respecto al punto de referencia Palmira (Valle del Cauca, Colombia). El triángulo rojo indica la ubicación del punto de referencia. Fuente: WorldClim v2.1.
Interpretación. Tomando a Palmira como referencia individual, el mapa muestra que sus análogos climáticos más cercanos se distribuyen principalmente en los valles cálidos de Colombia, Ecuador y Peru, así como en partes del Caribe, Africa Oriental y el sudeste asiático. La baja precipitación anual de Palmira comparada con zonas selváticas hace que áreas húmedas como la Amazonia o el Congo resulten climáticamente distantes, mientras que los valles semiáridos de México y el noreste de Brasil presentan similaridades intermedias.
i <- 2
d_i <- dist_maps[[i]]
d_max_i <- terra::global(d_i, "max", na.rm = TRUE)[[1]]
sim_i <- 1 - (d_i / d_max_i)
ggplot() +
geom_spatraster(data = sim_i) +
geom_sf(data = mundo_sf, fill = NA, color = col_borde, linewidth = 0.15) +
geom_sf(data = puntos_sf[i, ], color = "#e31a1c", size = 3, shape = 17) +
scale_fill_distiller(
palette = "YlGnBu",
direction = 1,
na.value = "gray92",
name = "Similaridad",
limits = c(0, 1)
) +
labs(
title = paste0("Similaridad Climatica Global | Referencia: ", puntos_df$Sitio[i]),
subtitle = sprintf("T = %.1f °C | P = %.0f mm/año", vals_bio1[i], vals_bio12[i]),
caption = "Fuente: WorldClim v2.1 | Elaboracion propia"
) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(face = "bold", size = 12),
plot.subtitle = element_text(size = 10, color = "gray40"),
legend.position = "bottom",
text = element_text(family = "sans")
)
Figura 13. Mapa global de similaridad climática respecto al punto de referencia Zarzal (Valle del Cauca, Colombia). El triángulo rojo indica la ubicación del punto de referencia. Fuente: WorldClim v2.1.
Interpretación. Zarzal presenta una temperatura ligeramente superior y un régimen de precipitacion diferente a Palmira, lo que genera un patrón de similaridad global con algunos matices. Sus análogos climáticos más cercanos incluyen zonas del norte de Colombia, partes del Caribe continental y sectores de Africa Occidental. La comparación entre este mapa y el de Palmira ilustra cómo pequeñas diferencias en los valores de temperatura y precipitación de referencia pueden desplazar geográficamente las zonas de mayor similitud, lo que resalta la sensibilidad del método a las características climáticas del punto base.
i <- 3
d_i <- dist_maps[[i]]
d_max_i <- terra::global(d_i, "max", na.rm = TRUE)[[1]]
sim_i <- 1 - (d_i / d_max_i)
ggplot() +
geom_spatraster(data = sim_i) +
geom_sf(data = mundo_sf, fill = NA, color = col_borde, linewidth = 0.15) +
geom_sf(data = puntos_sf[i, ], color = "#e31a1c", size = 3, shape = 17) +
scale_fill_distiller(
palette = "YlGnBu",
direction = 1,
na.value = "gray92",
name = "Similaridad",
limits = c(0, 1)
) +
labs(
title = paste0("Similaridad Climatica Global | Referencia: ", puntos_df$Sitio[i]),
subtitle = sprintf("T = %.1f °C | P = %.0f mm/año", vals_bio1[i], vals_bio12[i]),
caption = "Fuente: WorldClim v2.1 | Elaboracion propia"
) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(face = "bold", size = 12),
plot.subtitle = element_text(size = 10, color = "gray40"),
legend.position = "bottom",
text = element_text(family = "sans")
)
Figura 14. Mapa global de similaridad climática respecto al punto de referencia Florida Valle (Valle del Cauca, Colombia). El triángulo rojo indica la ubicación del punto de referencia. Fuente: WorldClim v2.1.
Interpretación. Florida Valle, ubicada en el sur del departamento, presenta características climáticas muy similares a Palmira, lo que se refleja en un patrón de distribución global de similaridad prácticamente equivalente. Sus análogos climáticos se distribuyen en las mismas regiones tropicales de baja altitud con temperatura cálida estable y precipitación moderada. La coincidencia entre los tres mapas de similaridad individual refuerza la idea de que el Valle del Cauca tiene una identidad climática bien definida y representativa de una franja tropical específica del planeta.
En esta sección se comparan visualmente los resultados obtenidos mediante las dos aproximaciones metodológicas, se presenta una tabla resumen con las características climáticas de los puntos de referencia, y se desarrollan las conclusiones del análisis.
ggplot() +
geom_spatraster(data = apt_combinada) +
geom_sf(data = mundo_sf, fill = NA, color = col_borde, linewidth = 0.15) +
scale_fill_gradientn(
colours = c("#41b6c4", "#225ea8"),
na.value = "gray92",
name = "Aptitud",
labels = "Apto",
breaks = 1
) +
labs(
title = "Aproximacion 1: Aptitud por Rangos Optimos",
subtitle = "Criterios: Temperatura anual, Precipitacion anual, Precipitacion mensual",
caption = "Fuente: WorldClim v2.1 | Elaboracion propia"
) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(face = "bold", size = 12),
plot.subtitle = element_text(size = 10, color = "gray40"),
legend.position = "bottom",
text = element_text(family = "sans")
)
Figura 15. Mapa global de aptitud climática combinada para caña de azúcar basada en rangos óptimos de temperatura y precipitación. Aproximación 1: criterios expertos. Fuente: WorldClim v2.1.
sim_alta <- ifel(similaridad >= 0.75, 1, NA)
ggplot() +
geom_spatraster(data = sim_alta) +
geom_sf(data = mundo_sf, fill = NA, color = col_borde, linewidth = 0.15) +
geom_sf(data = puntos_sf, color = "#e31a1c", size = 2, shape = 17) +
scale_fill_gradientn(
colours = c("#c7e9b4", "#238b45"),
na.value = "gray92",
name = "Similaridad",
labels = "Alta (> 0.75)",
breaks = 1
) +
labs(
title = "Aproximacion 2: Alta Similaridad al Valle del Cauca",
subtitle = "Indice de similaridad euclidiana mayor a 0.75 | Triangulos rojos: puntos de referencia",
caption = "Fuente: WorldClim v2.1 | Elaboracion propia"
) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(face = "bold", size = 12),
plot.subtitle = element_text(size = 10, color = "gray40"),
legend.position = "bottom",
text = element_text(family = "sans")
)
Figura 16. Mapa global de zonas con alta similaridad climática al Valle del Cauca (índice mayor a 0.75). Aproximación 2: análogos climáticos por distancia euclidiana. Los triángulos rojos indican los puntos de referencia. Fuente: WorldClim v2.1.
df_resumen <- data.frame(
Sitio = puntos_df$Sitio,
Longitud = puntos_df$lon,
Latitud = puntos_df$lat,
Temp_anual_C = round(vals_bio1, 1),
Prec_anual_mm = round(vals_bio12, 0),
Apto_Temp = ifelse(vals_bio1 >= t_min & vals_bio1 <= t_max,
"Si", "No"),
Apto_Prec_anual = ifelse(vals_bio12 >= p_anual_min & vals_bio12 <= p_anual_max,
"Si", "No")
)
kable(df_resumen,
col.names = c("Sitio", "Longitud", "Latitud",
"Temp. anual (°C)", "Prec. anual (mm)",
"Temp. optima", "Prec. optima"),
caption = tab_cap("Características climáticas extraídas de WorldClim v2.1 para los tres puntos de referencia geocodificados en el Valle del Cauca, con verificación de cumplimiento de los rangos óptimos para caña de azúcar."),
align = c("l","r","r","r","r","c","c"),
digits = 1) |>
kable_styling(bootstrap_options = c("striped","hover","condensed"),
full_width = FALSE) |>
column_spec(6:7, bold = TRUE,
color = ifelse(df_resumen$Apto_Temp == "Si", "#1b7837", "#c51b8a"))
| Sitio | Longitud | Latitud | Temp. anual (°C) | Prec. anual (mm) | Temp. optima | Prec. optima |
|---|---|---|---|---|---|---|
| Palmira | -76.3 | 3.5 | 22.4 | 1484 | No | No |
| Zarzal | -76.1 | 4.4 | 23.4 | 1632 | Si | Si |
| Florida Valle | -76.2 | 3.3 | 22.2 | 1605 | No | Si |
Interpretación. La comparación entre los dos mapas confirma una alta consistencia entre las dos aproximaciones metodológicas. Ambos métodos identifican como prioritarias las mismas grandes regiones del mundo: América tropical y subtropical (particularmente Brasil, Colombia, Ecuador, Mexico y Centroamerica), Africa Ecuatorial y Oriental (Mozambique, Etiopia, Nigeria), y el sur y sureste de Asia (Indonesia, Filipinas, Bangladesh, Tailandia, Vietnam). Esta coincidencia geográfica valida la robustez de ambas metodologías y refuerza la confiabilidad de los resultados para orientar decisiones de inversión agrícola.
Las diferencias entre los dos mapas también resultan informativas. La aproximación por rangos óptimos genera una clasificación binaria de tipo “apto o no apto”, lo que facilita la comunicación con el agricultor pero no captura la gradualidad de la aptitud climática. En contraste, el método de similaridad euclidiana produce una superficie continua que permite identificar zonas de transición con potencial parcial, lo que lo hace especialmente útil cuando se busca expandir el cultivo hacia nuevas fronteras agrícolas con cierto nivel de riesgo controlado.
Desde el punto de vista del Valle del Cauca, los datos confirman que esta región tiene una temperatura media anual permanentemente dentro del rango óptimo, pero que la distribución bimodal de las lluvias genera déficits hídricos en los periodos secos que son cubiertos mediante infraestructura de riego. Esto explica por qué el Valle del Cauca puede aparecer con aptitud parcial en algunos criterios del análisis combinado, aunque en la práctica sea una de las regiones de mayor productividad cañera del mundo, gracias a la tecnificación y el manejo del agua.
Finalmente, es importante reconocer las limitaciones del análisis: se consideraron exclusivamente variables climáticas sin incluir factores edáficos (tipo de suelo, pH, pendiente), socioeconómicos (acceso a infraestructura, costos de producción) ni históricos (disponibilidad de variedades adaptadas). En consecuencia, los mapas deben interpretarse como una primera aproximación de aptitud potencial que requiere ser complementada con estudios de campo y análisis multicriterio para tomar decisiones de inversión definitivas.
Esta sección documenta el entorno computacional utilizado para garantizar la reproducibilidad del análisis.
sessionInfo()
## R version 4.5.2 (2025-10-31 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 26200)
##
## Matrix products: default
## LAPACK version 3.12.1
##
## locale:
## [1] LC_COLLATE=Spanish_Colombia.utf8 LC_CTYPE=Spanish_Colombia.utf8
## [3] LC_MONETARY=Spanish_Colombia.utf8 LC_NUMERIC=C
## [5] LC_TIME=Spanish_Colombia.utf8
##
## time zone: America/Bogota
## tzcode source: internal
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] kableExtra_1.4.0 knitr_1.51 rnaturalearthdata_1.0.0
## [4] rnaturalearth_1.2.0 scales_1.4.0 patchwork_1.3.2
## [7] viridis_0.6.5 viridisLite_0.4.3 RColorBrewer_1.1-3
## [10] tidyr_1.3.2 dplyr_1.2.0 tidyterra_1.1.0
## [13] ggplot2_4.0.2 sf_1.1-0 geodata_0.6-9
## [16] terra_1.8-93
##
## loaded via a namespace (and not attached):
## [1] rappdirs_0.3.4 sass_0.4.10 generics_0.1.4
## [4] xml2_1.5.2 class_7.3-23 KernSmooth_2.23-26
## [7] stringi_1.8.7 digest_0.6.39 magrittr_2.0.4
## [10] evaluate_1.0.5 grid_4.5.2 fastmap_1.2.0
## [13] jsonlite_2.0.0 e1071_1.7-17 DBI_1.2.3
## [16] gridExtra_2.3 purrr_1.2.1 textshaping_1.0.4
## [19] codetools_0.2-20 jquerylib_0.1.4 cli_3.6.5
## [22] rlang_1.1.7 units_1.0-0 withr_3.0.2
## [25] cachem_1.1.0 yaml_2.3.12 otel_0.2.0
## [28] tools_4.5.2 vctrs_0.7.1 R6_2.6.1
## [31] proxy_0.4-29 lifecycle_1.0.5 classInt_0.4-11
## [34] stringr_1.6.0 pkgconfig_2.0.3 bslib_0.10.0
## [37] pillar_1.11.1 gtable_0.3.6 data.table_1.18.2.1
## [40] glue_1.8.0 Rcpp_1.1.1 systemfonts_1.3.1
## [43] xfun_0.56 tibble_3.3.1 tidyselect_1.2.1
## [46] rstudioapi_0.18.0 farver_2.1.2 htmltools_0.5.9
## [49] labeling_0.4.3 svglite_2.2.2 rmarkdown_2.30
## [52] compiler_4.5.2 S7_0.2.1