En este documento se presenta el ejercicio correspondiente a la exploración de datos espaciales a partir de datos de precipitación y temperatura. Para esto, este documento se buscará explorar la aptitud de regiones para cultivos de caña de azúcar. Se toman como puntos de referencia de temperatura media de 20 a 30° C y precipitación de 1.000 a 2.700 mm. Esto tomado de la siguiente fuente: https://repository.agrosavia.co/bitstream/handle/20.500.12324/19649/26487_13040.pdf?sequence=1&isAllowed=y
Para el desarrollo del taller, el primer paso es cargar las librerías y datos que serán utilizadas para el ejercicio:
require(raster)
## Loading required package: raster
## Loading required package: sp
## The legacy packages maptools, rgdal, and rgeos, underpinning the sp package,
## which was just loaded, will retire in October 2023.
## Please refer to R-spatial evolution reports for details, especially
## https://r-spatial.org/r/2023/05/15/evolution4.html.
## It may be desirable to make the sf package available;
## package maintainers should consider adding sf to Suggests:.
## The sp package is now running under evolution status 2
## (status 2 uses the sf package in place of rgdal)
require(rgdal)
## Loading required package: rgdal
## Please note that rgdal will be retired during October 2023,
## plan transition to sf/stars/terra functions using GDAL and PROJ
## at your earliest convenience.
## See https://r-spatial.org/r/2023/05/15/evolution4.html and https://github.com/r-spatial/evolution
## rgdal: version: 1.6-7, (SVN revision 1203)
## Geospatial Data Abstraction Library extensions to R successfully loaded
## Loaded GDAL runtime: GDAL 3.5.3, released 2022/10/21
## Path to GDAL shared files: /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library/rgdal/gdal
## GDAL does not use iconv for recoding strings.
## GDAL binary built with GEOS: TRUE
## Loaded PROJ runtime: Rel. 9.1.0, September 1st, 2022, [PJ_VERSION: 910]
## Path to PROJ shared files: /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library/rgdal/proj
## PROJ CDN enabled: FALSE
## Linking to sp version:1.6-1
## To mute warnings of possible GDAL/OSR exportToProj4() degradation,
## use options("rgdal_show_exportToProj4_warnings"="none") before loading sp or rgdal.
require(sp)
require(rasterVis)
## Loading required package: rasterVis
## Loading required package: lattice
library(RColorBrewer)
library(lattice)
require(leaflet)
## Loading required package: leaflet
Ahora se cargan los archivos que se utilizaran para precipitación y temperatura. Estos serán sobre los que se realizarán los análisis. Adicionalmente, se les aplica el nombre del mes a cada uno de los archivos.
temperatura=list.files("~/Desktop/wc2.1_10m_tavg (5)/",full.names = T)
temp=stack(temperatura)
names(temp)=month.name
precipitacion=list.files("~/Desktop/wc2.1_10m_prec (1)/", full.names = TRUE)
prec=stack(precipitacion)
names(prec)=month.name
mapamundi= shapefile('~/Desktop/Mapa_paises_mundo.shp/')
Ya con los archivos y librerías cargadas, se procede a hacer una visualización de los mapas por cada uno de los meses. Primero se presenta temperatura y luego precipitación.
levelplot(temp, par.settings = BuRdTheme, main = "Temperatura por mes")
num_colores <- 100
mi_paleta <- colorRampPalette(brewer.pal(num_colores, "YlGnBu"))
## Warning in brewer.pal(num_colores, "YlGnBu"): n too large, allowed maximum for palette YlGnBu is 9
## Returning the palette you asked for with that many colors
limites_escala <- seq(0, 1300, length.out = num_colores + 1)
levelplot(prec, col.regions = mi_paleta(num_colores), at = limites_escala, main = "Precipitación por mes")
En esta sección se realiza la visualización de los mapas filtrando los datos por los rangos establecidos. Para temperatura, se toma como rango 20-30 grados promedio. Adicionalmente, se ajusta para que el dato sea presentado como porcentaje:
rangotemp=temp>=20 & temp<=30
levelplot(rangotemp,par.settings=BuRdTheme, main="Lugares con rango de temperatura ideal")
temp_opt=sum(rangotemp)
indtemp=temp_opt/12*100
levelplot(indtemp, par.settings=BuRdTheme, main="Lugares con temperatura ideal por porcentaje de meses en el año")
Ahora se realiza para precipitación
rangoprec=prec>=83.33 & prec<=225
levelplot(rangoprec, main="Lugares con rango de precipitación ideal")
prec_opt=sum(rangoprec)
indprec=prec_opt/12*100
levelplot(indprec,main="Lugares con precipitación ideal por porcentaje de meses en el año")
Ahora en este punto, se procede a realizar el filtro para que solo se visualice aquellos lugares en donde el 70% del año cumplen las condiciones de temperatura y luego precipitación.
lugares_ex=which(indtemp[]<50)
indtemp[lugares_ex]=NA
levelplot(indtemp, main="Lugares que al menos el 50% de los meses tienen la temperatura ideal" )
Ahora, se presenta el de precipitación:
lugares_ex2=which(indprec[]<50)
indprec[lugares_ex2]=NA
levelplot(indprec, main="Lugares que al menos el 50% de los meses tienen la precipitación ideal")
Para finalizar con esta sección, se realiza el cruce en los lugares que coinciden con las condiciones de temperatura y precipitación.
regionesoptimas= (indtemp+indprec)/2
plot(mapamundi, main="Lugares del mundo con las condiciones óptimas para el cultivo de caña")
plot(regionesoptimas, add=T, col="yellow")
Lo que permite observar el mapa es que en estas condiciones, los lugares idóneos se encuentran en Latinoamérica y el Caribe, África y Asia. Es donde mayor concentración de puntos hay.
Para esta sección, se identificaron 2 puntos en el Valle del Cauca para poder analizar cómo varía la precipicación y temperatura en estos lugares.
A continuación, se selecciona aleatoriamente el punto en Valle del Cauca para anlizar sus datos. Iniciamos con la selección del punto:
leaflet() %>% addTiles() %>% addCircleMarkers(lng =-76.470 ,lat = 3.22)
Luego se extraen del punto los datos de temperatura y precipitación
punto1 <- data.frame(longitude = c(-76.470), latitude = c(3.22))
temp_punto1=as.data.frame(extract(temp,punto1))
prec_punto1= as.data.frame(extract(prec,punto1))
print(temp_punto1)
## January February March April May June July August September
## 1 23.75625 23.87875 23.98225 23.7345 23.6785 23.662 23.962 24.12825 23.93375
## October November December
## 1 23.46325 23.27725 23.40075
print(prec_punto1)
## January February March April May June July August September October November
## 1 110 131 155 216 184 100 53 71 117 221 188
## December
## 1 138
Ahora se procede a realizar la serie de tiempo de precipitación y temperatura para el punto. Iniciemos con este último:
seriepunto1temp=ts(as.numeric(temp_punto1[1,]))
plot(seriepunto1temp, main= "Temperatura por mes", col="green")
Lo que muestra este gráfico es que el punto 1, se encuentra dentro de los rangos establecidos. Lo que muestra que para este caso, por temperatura es un lugar óptimo. Ahora miremos el caso de precipitación:
seriepunto1prec=ts(as.numeric(prec_punto1[1,]))
plot(seriepunto1prec, main= "Precipitación por mes", col="blue")
Para el caso de precipitación, sin embargo, lo que muestra el gráfico, como se puede observar a su vez en la tabla impresa previamente, es que durante todos los meses se logra la precipitación ideal, con excepción de julio y agosto.
Ahora se procede a la selección del segundo punto de forma aleatoria y se realizará la misma validación:
leaflet() %>% addTiles() %>% addCircleMarkers(lng =-76.60 ,lat = 3.13)
Ahora se extraen los datos del punto 2:
punto2 <- data.frame(longitude = c(-75.60), latitude = c(3.24))
temp_punto2=as.data.frame(extract(temp,punto2))
prec_punto2= as.data.frame(extract(prec,punto2))
print(temp_punto2)
## January February March April May June July August
## 1 20.96625 21.15875 21.25825 20.981 21.09825 21.12125 21.39425 21.70675
## September October November December
## 1 21.52175 20.849 20.60225 20.70725
print(prec_punto2)
## January February March April May June July August September October November
## 1 128 143 180 204 184 97 57 71 118 261 233
## December
## 1 163
seriepunto2temp=ts(as.numeric(temp_punto2[1,]))
plot(seriepunto2temp, main= "Temperatura por mes", col="green")
Lo que muestra este gráfico es que el punto 2, se encuentra dentro de los rangos establecidos, aunque más baja y cerca al rango, lo que implicaría inicialmente que no es tan óptimo que el punto 1. Pero para esto miremos el caso de precipitación:
seriepunto2prec=ts(as.numeric(prec_punto2[1,]))
plot(seriepunto2prec, main= "Precipitación por mes", col="blue")
Para el caso de precipitación, pasa lo mismo que en el punto 1 y es que durante todos los meses se logra la precipitación ideal, con excepción de julio y agosto.
Lo que muestran los análisis exploratorios es que pareciera ser más ideal el punto 1 que el 2 en tanto la temperatura se encuentra mejor ubicada dentro del rango sugerido. Sin embargo, ambos parecen ser lugares aptos para el cultivo de caña que deben ser validados con otros análisis más rigurosos.
Para finalizar se realizan los análisis de similidaridad de los puntos que fueron identificados.
Ahora para el punto 1 buscaremos los puntos similares por temperatura y precipitación. Iniciemos con temperatura:
simpunto1temp=sqrt(sum((temp-as.numeric(temp_punto1))^2))
levelplot(simpunto1temp, main="Similaridad con el punto 1 en temperatura")
Ahora precipitación:
simpunto1prec=sqrt(sum((prec-as.numeric(temp_punto1))^2))
levelplot(simpunto1prec,par.settings=BTCTheme, main="Similaridad con el punto 1 en precipitación")
Ahora procederemos con la intersección de los puntos:
simpunto1temp_filtro<-simpunto1temp
simpunto1temp_filtro[(simpunto1temp_filtro >30)] <- NA
simpunto1prec_filtro<-simpunto1prec
simpunto1prec_filtro[(simpunto1prec_filtro >225)] <- NA
punto1interseccion<-simpunto1temp_filtro & simpunto1prec_filtro
plot(mapamundi)
plot(punto1interseccion,add=T, col="green",legend=FALSE)
Ahora vamos con el punto 2. Temperatura:
simpunto2temp=sqrt(sum((temp-as.numeric(temp_punto2))^2))
levelplot(simpunto2temp, main="Similaridad con el punto 2 en temperatura")
Precipitación:
simpunto2prec=sqrt(sum((prec-as.numeric(temp_punto2))^2))
levelplot(simpunto2prec,par.settings=BTCTheme, main="Similaridad con el punto 2 en precipitación")
Para finalizar, se realiza la intersección:
simpunto2temp_filtro<-simpunto2temp
simpunto2temp_filtro[(simpunto2temp_filtro >30)] <- NA
simpunto2prec_filtro<-simpunto2prec
simpunto2prec_filtro[(simpunto2prec_filtro >225)] <- NA
punto2interseccion<-simpunto2temp_filtro & simpunto2prec_filtro
plot(mapamundi)
plot(punto2interseccion,add=T, col="pink",legend=FALSE)
Como se había indicado en la sección anterior, por el hecho de que son muy similares los dos puntos, la característica de lo que arroja este análisis de similaridad es cercano. Por lo que arroja resultados parecidos.