Introducción

Para identificar las zonas donde es factible un cultivo próspero de caña de azúcar, se realiza un análisis de las condiciones climáticas, en particular de la temperatura y la precipitación, para asegurar que se encuentren dentro de los rangos óptimos para el crecimiento de la planta.

En este proceso, se cargaron archivos .tif, se identificaron los rangos climáticos adecuados, se discriminaron los países óptimos, y finalmente se localizaron regiones con condiciones climáticas similares a las del Valle del Cauca, una región donde el cultivo de caña de azúcar ha demostrado ser exitoso.

Carga de Archivos .tif

En esta etapa, se realiza la integración de datos climáticos a través de archivos en formato .tif, los cuales contienen información geoespacial detallada sobre temperatura y precipitación en distintas regiones. Estos archivos permiten visualizar y analizar las condiciones ambientales con alta precisión y a escala geográfica. La carga de archivos .tif es fundamental, ya que proporciona los datos necesarios para identificar zonas con características climáticas favorables para el cultivo de caña de azúcar.

temp_files <- list.files(path = ruta, pattern = "wc2.1_10m_tavg_\\d{2}\\.tif$", full.names = TRUE)
precip_files <- list.files(path = ruta, pattern = "wc2.1_10m_prec_\\d{2}\\.tif$", full.names = TRUE)
global_shape <- st_read(shapefile_path)
## Reading layer `ne_10m_admin_0_countries' from data source 
##   `C:\Users\vicod\Documents\Maestria\mapas\shapefile countries\ne_10m_admin_0_countries.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 258 features and 168 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -180 ymin: -90 xmax: 180 ymax: 83.6341
## Geodetic CRS:  WGS 84

Creación de Rasters a partir de Archivos .tif A partir de los archivos .tif cargados, se generan rasters, que son representaciones de datos espaciales en una cuadrícula de celdas o píxeles. Cada celda en el raster contiene valores específicos de variables climáticas, como temperatura y precipitación, correspondientes a un área geográfica particular. La creación de rasters permite analizar y comparar estas variables de manera continua y detallada en el territorio.

temp_stack <- rast(temp_files)
precip_stack <- rast(precip_files)

Una vez cargados los archivos raster, se procede a graficar los datos correspondientes a uno de los meses disponibles. Esta visualización permite verificar los rangos de escala de las variables climáticas contenidas en el mapa, como temperatura y precipitación, para asegurarse de que se ajusten a los valores esperados.

Temperatura

plot(temp_stack[[1]])

Precipitación

plot(precip_stack[[1]])

Definición de Rangos Climáticos Óptimos para el Cultivo de Caña de Azúcar

En esta fase, se establecen los rangos climáticos ideales de temperatura y precipitación necesarios para que el cultivo de caña de azúcar prospere. A partir de estudios agronómicos, se ha determinado que la caña de azúcar presenta un crecimiento óptimo en temperaturas entre 22.5°C y 28°C y en zonas con una precipitación mensual entre 125 mm y 290 mm en promedio.

El primer mapa presentado muestra la capa binaria de los puntos óptimos según los rangos de temperatura para el mes de octubre.

temp_stack_bin = (temp_stack>=22.5) & (temp_stack<=28)
plot(temp_stack_bin[[10]])

El segundo mapa presentado muestra la capa binaria de los puntos óptimos según los rangos de precipitación para el mes de noviembre.

precip_stack_bin = (precip_stack>=125) & (precip_stack<=290)
plot(precip_stack_bin[[11]])

Finalmente, se presenta el mapa que combina todos las dos condicones (temperatura y precipitación) mediante una compuerta AND, lo cual garantiza que ambas se cumplan identificando los territorios óptimos para el cultivo de caña de azúcar.

optimo = precip_stack_bin & temp_stack_bin
plot(optimo)

En este punto, se realiza la suma de los valores binarios (1 y 0) para identificar, a lo largo del año, cuáles territorios presentan una mayor cantidad de meses óptimos para el cultivo de caña de azúcar. Los colores cálidos, como el rojo y el amarillo, indican las áreas más favorables, mientras que los colores fríos, como el verde y el azul, representan zonas menos óptimas.

optimo_suma <- sum(optimo, na.rm = TRUE)
colores <- colorRampPalette(c("blue", "green", "yellow", "red"))(13)
plot(optimo_suma, main="Número de Meses con Condiciones Óptimas para Caña de Azúcar", col=colores, breaks=0:12)

Para identificar los países que cuentan con las condiciones adecuadas para el cultivo de caña de azúcar, es necesario cargar un archivo shapefile y aplicarlo como una máscara sobre el mapa previamente creado. Esto permite delimitar las áreas de interés y asociar las condiciones climáticas óptimas con los países correspondientes.

Se carga el archivo y se verifica que contenga la información requerida.

plot(global_shape[1])

A continuacion se verifica si el sistema de coordenadas del archivo shapefile (global_shape) coincide con el del raster de temperatura (temp_stack). Si no coinciden, el archivo shapefile se transforma al sistema de coordenadas del raster utilizando la función st_transform(). Esto asegura que ambos conjuntos de datos tengan el mismo sistema de referencia espacial para permitir su análisis conjunto.

if (!st_crs(global_shape) == crs(temp_stack)) {
  global_shape <- st_transform(global_shape, crs(temp_stack))
}

A continuación, se aplica la máscara sobre el archivo shapefile para identificar los países que cumplen con las condiciones climáticas óptimas para el cultivo de caña de azúcar. Se destacan especialmente cuatro países, que se seleccionan para su análisis más detallado. Estos países serán graficados de manera independiente más adelante, lo que permitirá visualizarlos y analizar las zonas óptimas en cada uno, facilitando la comparación de sus condiciones climáticas.

paises_seleccionados <- global_shape
optimo_mascara <- crop(optimo_suma, vect(paises_seleccionados))
plot(optimo_mascara, 
     main="Áreas Óptimas para Cultivo de Caña de Azúcar por pais", 
     col=colores, 
     breaks=0:12) 
plot(st_geometry(paises_seleccionados), add=TRUE, border="black", lwd=1)

Se seleccionan Brasil, Perú y Colombia como países de interés. Luego, se filtran estos países del shapefile (global_shape) y se convierten a un objeto sf. Posteriormente, se aplica una máscara al mapa de condiciones óptimas (optimo_mascara) para aislar las áreas de estos países utilizando las funciones crop() y mask().

paises_interes <- c("Brazil", "Peru", "Colombia")
paises_seleccionados <- global_shape %>%
  filter(NAME %in% paises_interes)
paises_seleccionados_sf <- st_as_sf(paises_seleccionados)
optimo_crop <- crop(optimo_mascara, vect(paises_seleccionados))
optimo_mascara_paises <- mask(optimo_crop, vect(paises_seleccionados))
optimo_df <- as.data.frame(optimo_mascara_paises, xy = TRUE, na.rm = TRUE)
names(optimo_df)[3] <- "layer"  
ggplot() +
  geom_raster(data = optimo_df, aes(x = x, y = y, fill = layer)) +
  geom_sf(data = paises_seleccionados_sf, fill = NA, color = "black") +
  scale_fill_gradientn(colors = colores, na.value = "transparent", name = "Meses Óptimos") +
  labs(title = "Áreas Óptimas para Cultivo de Caña de Azúcar en Países Seleccionados") +
  theme_minimal() +
  theme(
    legend.position = "right",
    plot.title = element_text(hjust = 0.5)
  )

Posteriormente, se realiza el mismo procedimiento para la República Democrática del Congo, la cual también muestra valores prometedores.

paises_interes <- c("Dem. Rep. Congo")
paises_seleccionados <- global_shape %>%
  filter(NAME %in% paises_interes)
paises_seleccionados_sf <- st_as_sf(paises_seleccionados)
optimo_crop <- crop(optimo_mascara, vect(paises_seleccionados))
optimo_mascara_paises <- mask(optimo_crop, vect(paises_seleccionados))
optimo_df <- as.data.frame(optimo_mascara_paises, xy = TRUE, na.rm = TRUE)
names(optimo_df)[3] <- "layer"
ggplot() +
  geom_raster(data = optimo_df, aes(x = x, y = y, fill = layer)) +
  geom_sf(data = paises_seleccionados_sf, fill = NA, color = "black") +
  scale_fill_gradientn(colors = colores, na.value = "transparent", name = "Meses Óptimos") +
  labs(title = "Áreas Óptimas para Cultivo de Caña de Azúcar en Países Seleccionados") +
  theme_minimal() +
  theme(
    legend.position = "right",
    plot.title = element_text(hjust = 0.5)
  )

Seleccion de puntos y similitud

Como siguiente ejercicio, se seleccionan tres puntos al azar en la región del Valle del Cauca, representados por las siguientes coordenadas. Luego, se realizan series de tiempo para identificar los cambios en temperatura y precipitación de estos puntos a lo largo del año:

  • 3.717613735446518, -76.40034096776617
  • 4.001345464494109, -76.16666318823805
  • 4.513056324179002, -75.97392524841074
#3.717613735446518, -76.40034096776617
#4.001345464494109, -76.16666318823805
#4.513056324179002, -75.97392524841074

puntos_valle_cauca <- data.frame(
  id = c("Punto 1", "Punto 2", "Punto 3"),
  lon = c(-76.40034096776617, -76.16666318823805, -75.97392524841074),
  lat = c(3.717613735446518, 4.001345464494109, 4.513056324179002)
)
puntos_sf <- vect(puntos_valle_cauca, geom = c("lon", "lat"), crs = crs(temp_stack))
temp_values <- terra::extract(temp_stack, puntos_sf, ID = TRUE)
precip_values <- terra::extract(precip_stack, puntos_sf, ID = TRUE)

#cambio de nombres 
colnames(temp_values) <- c("ID", paste0("Temp_Mes_", 1:12))
colnames(precip_values) <- c("ID", paste0("Prec_Mes_", 1:12))

#combinacion de temperatura y precip
clima_data <- cbind(puntos_valle_cauca, temp_values[,-1], precip_values[,-1])

# formato long
temp_long <- clima_data %>%
  select(id, starts_with("Temp")) %>%
  pivot_longer(
    cols = starts_with("Temp"),
    names_to = "Mes",
    values_to = "Temperatura"
  ) %>%
  mutate(Mes = as.numeric(gsub("Temp_Mes_", "", Mes)))

# Convertir datos de precipitación a formato largo
precip_long <- clima_data %>%
  select(id, starts_with("Prec")) %>%
  pivot_longer(
    cols = starts_with("Prec"),
    names_to = "Mes",
    values_to = "Precipitacion"
  ) %>%
  mutate(Mes = as.numeric(gsub("Prec_Mes_", "", Mes)))

La serie de tiempo para la temperatura se presenta en el siguiente gráfico, donde se pueden observar algunas variaciones para cada punto elegido.

#  series de temperatura
ggplot(temp_long, aes(x = Mes, y = Temperatura, color = id)) +
  geom_line(size = 1) +
  geom_point() +
  labs(
    title = "Serie de Tiempo de Temperatura en Puntos Seleccionados",
    x = "Mes",
    y = "Temperatura (°C)",
    color = "Punto"
  ) +
  theme_minimal()

Por otro lado, los valores de precipitación no varían tanto entre los puntos seleccionados.

# Graficar series de precipitación
ggplot(precip_long, aes(x = Mes, y = Precipitacion, color = id)) +
  geom_line(size = 1) +
  geom_point() +
  labs(
    title = "Serie de Tiempo de Precipitación en Puntos Seleccionados",
    x = "Mes",
    y = "Precipitación (mm)",
    color = "Punto"
  ) +
  theme_minimal()

Distancias Euclidianas

Ahora se realiza, se realiza un análisis de las distancias euclidianas para identificar la similitud climática entre diferentes ubicaciones.

  1. Normalización de Datos: Primero, se normalizan los datos de temperatura (temp_stack) y precipitación (precip_stack) usando la función scale(), lo que ajusta estos datos para que tengan una media de 0 y una desviación estándar de 1.

  2. Cálculo de Promedios Anuales: Luego, se calculan los promedios anuales de temperatura y precipitación para cada punto en clima_data, utilizando las columnas correspondientes de 4 a 15 para la temperatura y de 16 a 27 para la precipitación.

  3. Normalización de los Promedios Anuales: Los promedios anuales de temperatura y precipitación se normalizan de la misma forma que los datos originales, usando scale().

  4. Cálculo de la Distancia Euclidiana: Se calcula la distancia euclidiana entre cada punto del clima (Temp_Anual_Norm y Prec_Anual_Norm) y cada celda del raster normalizado de temperatura y precipitación. Para cada punto en clima_data, se calculan las diferencias cuadradas entre los valores normalizados y luego se suman para obtener la distancia euclidiana.

  5. Generación de Mapas de Similitud: Para cada punto, se guarda la distancia euclidiana en una lista llamada similarity_maps, que contiene los mapas de similitud para cada ubicación.

  6. Escala de Colores: Finalmente, se define una escala de colores que va de azul a rojo usando colorRampPalette(), lo que permite representar visualmente las diferencias en las distancias euclidianas en los mapas de similitud.

Este proceso permite visualizar y comparar las distancias climáticas entre las ubicaciones seleccionadas y las áreas del raster, facilitando la identificación de regiones con características climáticas similares.

temp_stack_norm <- scale(temp_stack)
precip_stack_norm <- scale(precip_stack)
# promedios anuales
clima_data$Temp_Anual <- rowMeans(clima_data[, 4:15], na.rm = TRUE)
clima_data$Prec_Anual <- rowMeans(clima_data[, 16:27], na.rm = TRUE)

# Normalizar  promedios
clima_data$Temp_Anual_Norm <- scale(clima_data$Temp_Anual)
clima_data$Prec_Anual_Norm <- scale(clima_data$Prec_Anual)


# distancias euclidianas 
similarity_maps <- list()
for (i in 1:nrow(clima_data)) {
  
  temp_site_norm <- clima_data$Temp_Anual_Norm[i]
  precip_site_norm <- clima_data$Prec_Anual_Norm[i]
  
  temp_diff <- (temp_stack_norm - temp_site_norm)^2
  precip_diff <- (precip_stack_norm - precip_site_norm)^2
  euclidean_distance <- sqrt(temp_diff + precip_diff)  
  
  similarity_maps[[i]] <- euclidean_distance
}


colores <- colorRampPalette(c("blue", "green", "yellow", "red"))(50)  # Escala de colores

A continuación, se presenta el mapa con las distancias euclidianas para cada uno de los meses, mostrando qué regiones se parecen más o menos en relación con cada uno de los tres puntos seleccionados al azar.

plot(similarity_maps[[1]],
     col = colores
    )

plot(similarity_maps[[2]],
      col = colores
     )

plot(similarity_maps[[3]],
      col = colores)

Al agrupar los datos de todos los meses, se observa que, paradójicamente, los puntos seleccionados no muestran similitud con las áreas identificadas como óptimas en cuanto a las condiciones de climaticas. Esto puede deberse a factores climáticos específicos de los puntos seleccionados, como microclimas o variaciones estacionales que afectan la estabilidad de las condiciones climáticas en dichas áreas. Otra posible causa es el tipo de distancia calculada: la distancia euclidiana considera únicamente la magnitud de las diferencias en temperatura y precipitación, sin tener en cuenta posibles variaciones no lineales o patrones de estacionalidad que podrían influir en la similitud climática real.

Además, el cálculo basado en promedios anuales puede no captar fluctuaciones o anomalías de corto plazo en los puntos de interés, lo que también afecta la comparación con áreas óptimas identificadas para el cultivo.

plot(app(similarity_maps[[1]], sum, na.rm = TRUE),
      main = paste("Mapa de Similaridad -", clima_data$id[1]),
      col = colores,
      legend.args = list(text = "Distancia Euclidiana", side = 3, line = 1))

plot(app(similarity_maps[[2]], sum, na.rm = TRUE),
      main = paste("Mapa de Similaridad -", clima_data$id[2]),
      col = colores,
      legend.args = list(text = "Distancia Euclidiana", side = 3, line = 1))

plot(app(similarity_maps[[3]], sum, na.rm = TRUE),
      main = paste("Mapa de Similaridad -", clima_data$id[3]),
      col = colores,
      legend.args = list(text = "Distancia Euclidiana", side = 3, line = 1))

Conclusiones

A lo largo del análisis, se destaca la importancia de seleccionar cuidadosamente tanto los puntos de comparación como los métodos para medir la similitud climática. Los resultados muestran que, aunque se identificaron ciertas áreas con condiciones climáticas óptimas para el cultivo de caña de azúcar, la elección de puntos de referencia aleatorios puede no reflejar completamente las características de esas zonas ideales. Este hecho subraya la necesidad de definir con precisión los puntos de comparación, preferiblemente en regiones con datos sólidos y representativos de las condiciones climáticas que se desean replicar o analizar.

Asimismo, es fundamental evaluar diferentes tipos de métricas de distancia, más allá de la distancia euclidiana, para capturar patrones no lineales y variaciones estacionales que puedan afectar la similitud climática real entre regiones. En algunos casos, utilizar métricas adicionales, como la distancia de Mahalanobis o métodos basados en correlaciones temporales, podría proporcionar una visión más precisa y ajustada a las características propias de cada área.

En conclusión, para obtener resultados más confiables en la identificación de zonas climáticamente similares, es esencial contar con puntos de comparación bien definidos y explorar varias métricas de distancia. Esto permitirá una evaluación más exhaustiva de las condiciones climáticas óptimas y aumentará la precisión en la identificación de áreas viables para el cultivo.