1. Introduccion

Este es el segundo R Markdown Notebook para el curso Geomatica Basica 2022. Ilustra cómo hacer mapas temáticos que muestren la participación municipal de los dos grupos de cultivos más importantes para el departamento del Casanare, los cuales son en primer lugar el grupo de los cereales y en segunda instancia el grupo de las oleaginosas. Se usan como fuente principal los archivos csv guardados en la libreta EVA, así como un shapefile de municipios obtenido en clase.

2. Set up

En este paso, se instalan y cargan las bibliotecas R requeridas.

#install.packages('tidyverse')
#install.packages('sf')

Se corren las librerias previamente instaladas

library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.3.6      ✔ purrr   0.3.4 
## ✔ tibble  3.1.8      ✔ dplyr   1.0.10
## ✔ tidyr   1.2.1      ✔ stringr 1.4.1 
## ✔ readr   2.1.2      ✔ forcats 0.5.2 
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
library(sf)
## Linking to GEOS 3.9.1, GDAL 3.4.3, PROJ 7.2.1; sf_use_s2() is TRUE

3. Leer archivos relacionadas con municipios, cultivos y ciudades

Como ya se ha mencionado se trabajara el departamento del Casanare Para iniciar se debe chequear que se tengan los siguientes archivos: -Municipios -Ciudades -Archivos obtenidos durante el desarrollo del Notebook N°1 relacionados a los grupos de cultivos mas importantes del departamento

Además, es necesario tener un archivo con las principales ciudades de Colombia. Puede descargarlo desde este enlace

Se iniciara enumerando los archivos de los cuales se va a disponer:

list.files()
##  [1] "BORRADOR.html"              "BORRADOR.nb.html"          
##  [3] "BORRADOR.Rmd"               "casanare_cereales_2021.csv"
##  [5] "casanare_oleag_2021.csv"    "EVA2020_Casanare.html"     
##  [7] "EVA2020_Casanare.nb.html"   "EVA2020_Casanare.Rmd"      
##  [9] "inputs"                     "MapasCasanare.html"        
## [11] "MapasCasanare.nb.html"      "MapasCasanare.Rmd"         
## [13] "MapasCasanare_files"        "rsconnect"

Ahora se enumeran los archivos previamente guardados en la carpeta inputs

list.files('./inputs')
##  [1] "BaseEVA_Agrícola2021.xlsx" "casanare_oleag_2021.csv"  
##  [3] "CIUDADES.csv"              "COLOMBIACITIES.csv"       
##  [5] "EVA2021.xlsx"              "MCasanare.geojson"        
##  [7] "munic_cereales.dbf"        "munic_cereales.prj"       
##  [9] "munic_cereales.shp"        "munic_cereales.shx"       
## [11] "munic_oleag.dbf"           "munic_oleag.prj"          
## [13] "munic_oleag.shp"           "munic_oleag.shx"

Se lee el archivo geojson previamente descargado que contiene los municipios de Casanare

municipios = st_read('./inputs/MCasanare.geojson')
## Reading layer `MCasanare' from data source 
##   `C:\Users\USER\OneDrive\Documentos\GEOMATICA\GB\P5\inputs\MCasanare.geojson' 
##   using driver `GeoJSON'
## Simple feature collection with 19 features and 12 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -73.07777 ymin: 4.287476 xmax: -69.83591 ymax: 6.346111
## Geodetic CRS:  MAGNA-SIRGAS

Se obtiene la tabla que relaciona los municipios de Casanare que tienen produccion del grupo de cereales y se clasifican teniendo en cuenta el criterio de mayor produccion

(cereales = read_csv("casanare_cereales_2021.csv",show_col_types = FALSE))

Aqui se visualizan los municipios del departamento

(municipios =  st_read('./inputs/MCasanare.geojson'))
## Reading layer `MCasanare' from data source 
##   `C:\Users\USER\OneDrive\Documentos\GEOMATICA\GB\P5\inputs\MCasanare.geojson' 
##   using driver `GeoJSON'
## Simple feature collection with 19 features and 12 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -73.07777 ymin: 4.287476 xmax: -69.83591 ymax: 6.346111
## Geodetic CRS:  MAGNA-SIRGAS

Listar los archivos que existen en el directorio de trabajo:

list.files()
##  [1] "BORRADOR.html"              "BORRADOR.nb.html"          
##  [3] "BORRADOR.Rmd"               "casanare_cereales_2021.csv"
##  [5] "casanare_oleag_2021.csv"    "EVA2020_Casanare.html"     
##  [7] "EVA2020_Casanare.nb.html"   "EVA2020_Casanare.Rmd"      
##  [9] "inputs"                     "MapasCasanare.html"        
## [11] "MapasCasanare.nb.html"      "MapasCasanare.Rmd"         
## [13] "MapasCasanare_files"        "rsconnect"

Se observan los archivos existentes, incluyendo los municipios de Colombia.

Para leer el archivo de ciudades de Colombia, que está delimitado por puntos y comas, se usa el siguiente código:

(cities = read_delim("./inputs/CIUDADES.csv",col_names = FALSE,delim = ';', show_col_types = FALSE))

Mediante este codigo se logra seleccionar las columnas x3 y x4 que corresponden a latitud y longitud

#cities %>% 
 # select(X3, X4) %>% 
 # mutate(across(X3:X4, as.numeric))

A la anterior seleccion se le denomina como “cities” y aqui se corre

#cities

Ahora se convierten los datos en objetos simples

# Convert data frame to simple feature object
sf.cities <-  st_as_sf(x = cities, 
                        coords = c("X4", "X3"))

Se visualizan los datos como objetos simples

sf.cities
#st_crs(municipios) 

Se agrega el CRS usando el código EPSG

st_crs(sf.cities) <- 4686

4. Datos relevantes para el departamento del Casanare

Como solo nos interesa el departamento del Casanare, se debe crear una unión espacial:

# find points within polygons
sf.cities.joined <- st_join(sf.cities, municipios, join = st_covered_by)

Se visualiza la union espacial

sf.cities.joined

Ahora se seleccionan las filas cuyos DPTO_CCDGO se corresponden

casanare.cities = dplyr::filter(sf.cities.joined, DPTO_CCDGO=='85')

Se visualizan las filas seleccionadas

casanare.cities

5. Mapa de Casanare con el grupo de cultivo mas importante: Cereales

A partir de este punto se empezara a estructurar un mapa del departamento para el grupo de cereales Se deben instalar las librerias

# run the following lines from the command window:
#install.packages("tmap")
#install.packages("ggplot2")
#install.packages("classInt")
library(tmap)

Se intalan las siguientes librerias haciendo enfasis en la libreria tmap, la cual nos permitira la visualizacion del mapa trabajado

library(ggplot2)
library(ggrepel)
library(classInt)
library(dplyr)
library(sf)
library(ggplot2)
library(tmap)

Nuestra próxima tarea es unir el objeto de estadísticas a los objetos espaciales para tener los datos relevantes en un solo objeto.

Para poder realizar la unión, necesitamos una clave compartida, es decir, un atributo común. En este caso, lo tenemos en ambos objetos. Sin embargo, sus tipos de datos son diferentes.

class(cereales$COD_MUN)
## [1] "numeric"
class(municipios$MPIO_CDPMP)
## [1] "character"

Se debe arreglar “COD_MUN” a una caracter

cereales$COD_MUN = as.character(cereales$COD_MUN)

Se visualiza los dos objetos como caracteres

cereales

Se visualiza municipios

municipios

Ahora se realiza una union entre municipios y cereales teniendo en cuenta los codigos de los municipios que deben corresponder

munic_cereales = dplyr::left_join(municipios, cereales, by = c("MPIO_CDPMP" = "COD_MUN"))

Se visualiza la anterior union

munic_cereales
#sf::st_write(munic_cereales, "./inputs/munic_cereales.shp")
#(otros_mun_cereales = sf::st_read("./inputs/munic_cereales.shp"))

Mediante este codigo se puede personalizar el color de los poligonos y el numero de intervalos en los que se clasificara la produccion del departamento

breaks <- classIntervals(munic_cereales$max_prod, n = 6, style = 'fisher')
#label breaks
lab_vec <- vector(length = length(breaks$brks)-1)
rounded_breaks <- round(breaks$brks,2)
lab_vec[1] <- paste0('[', rounded_breaks[1],' - ', rounded_breaks[2],']')
for(i in 2:(length(breaks$brks) - 1)){
  lab_vec[i] <- paste0('(',rounded_breaks[i], ' - ', rounded_breaks[i+1], ']')
}

Ahora se empieza a estructurar los intervales de la produccion del cultivo de cereales

munic_cereales <-  munic_cereales %>%
 dplyr::mutate(faktor_class = factor(cut(max_prod, breaks$brks, include.lowest = T), labels = lab_vec))
# change attribute name
munic_cereales$Produccion = munic_cereales$faktor_class
(munic_cereales$mid <- sf::st_centroid(munic_cereales$geometry))
## Geometry set for 19 features 
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: -72.9958 ymin: 4.528296 xmax: -70.86954 ymax: 6.178277
## Geodetic CRS:  MAGNA-SIRGAS
## First 5 geometries:
## POINT (-72.25799 5.242718)
## POINT (-72.5482 5.126111)
## POINT (-72.86609 5.229233)
## POINT (-72.34693 6.178277)
## POINT (-72.21278 4.675762)
LONG = st_coordinates(munic_cereales$mid)[,1]
LAT = st_coordinates(munic_cereales$mid)[,2]
ggplot(data = munic_cereales) +
   geom_sf(aes(fill = Produccion)) +
   geom_label_repel(aes(x = LONG, y = LAT, label = MPIO_CNMBR), 
                    label.padding =     unit(0.05,"lines"),  
                    label.r = unit(0.025, "lines"),
                    label.size = 0.05)

Mapa con el segundo grupo mas importante de cultivos en Casanare, Leguminosas

read_csv("casanare_oleag_2021.csv",show_col_types = FALSE)
(oleag = read_csv("casanare_oleag_2021.csv",show_col_types = FALSE))
oleag
munic_oleag = dplyr::left_join(municipios, cereales, by = c("MPIO_CDPMP" = "COD_MUN"))
munic_oleag
#sf::st_write(munic_oleag, "./inputs/munic_oleag.shp")
breaks <- classIntervals(munic_oleag$max_prod, n = 6, style = 'fisher')
#label breaks
lab_vec <- vector(length = length(breaks$brks)-1)
rounded_breaks <- round(breaks$brks,2)
lab_vec[1] <- paste0('[', rounded_breaks[1],' - ', rounded_breaks[2],']')
for(i in 2:(length(breaks$brks) - 1)){
  lab_vec[i] <- paste0('(',rounded_breaks[i], ' - ', rounded_breaks[i+1], ']')
}
munic_oleag <-  munic_oleag %>%
 dplyr::mutate(faktor_class = factor(cut(max_prod, breaks$brks, include.lowest = T), labels = lab_vec))
# change attribute name
munic_oleag$Produccion = munic_oleag$faktor_class
(munic_oleag$mid <- sf::st_centroid(munic_oleag$geometry))
## Geometry set for 19 features 
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: -72.9958 ymin: 4.528296 xmax: -70.86954 ymax: 6.178277
## Geodetic CRS:  MAGNA-SIRGAS
## First 5 geometries:
## POINT (-72.25799 5.242718)
## POINT (-72.5482 5.126111)
## POINT (-72.86609 5.229233)
## POINT (-72.34693 6.178277)
## POINT (-72.21278 4.675762)
LONG = st_coordinates(munic_oleag$mid)[,1]
LAT = st_coordinates(munic_oleag$mid)[,2]
ggplot(data = munic_oleag) +
   geom_sf(aes(fill = Produccion)) +
   geom_label_repel(aes(x = LONG, y = LAT, label = MPIO_CNMBR), 
                    label.padding =     unit(0.05,"lines"),  
                    label.r = unit(0.025, "lines"),
                    label.size = 0.05)

Mapa dinámico de producción de cereales

(cereales = read_csv("casanare_cereales_2021.csv",show_col_types = FALSE))
cereales$COD_MUN = as.character(cereales$COD_MUN)
munic_cereales = dplyr::left_join(municipios, cereales, by = c("MPIO_CDPMP" = "COD_MUN"))
munic_cereales
facet = "max_prod"
cereales_map =  
  tm_shape(munic_cereales) + tm_polygons(facet) + tm_text(text = "MPIO_CDPMP", size = 0.5, fontfamily = "sans") +
  tm_shape(casanare.cities) + tm_symbols(shape = 2, col = "red", size = 0.25) +
  tm_credits("Data source: UPRA (2021)", fontface = "bold") +
  tm_layout(main.title = "Produccion de cereales en 2021",
            main.title.fontface = "bold.italic", 
            legend.title.fontfamily = "monospace") +
  tm_scale_bar(position = c("left", "bottom"))
tmap_mode("view")
## tmap mode set to interactive viewing
#cereales_map

7. Reproducibility

Citar como Lopez, A., 2022.

sessionInfo()
## R version 4.2.1 (2022-06-23 ucrt)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 19044)
## 
## Matrix products: default
## 
## 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    
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] classInt_0.4-8  ggrepel_0.9.1   tmap_3.3-3      sf_1.0-8       
##  [5] forcats_0.5.2   stringr_1.4.1   dplyr_1.0.10    purrr_0.3.4    
##  [9] readr_2.1.2     tidyr_1.2.1     tibble_3.1.8    ggplot2_3.3.6  
## [13] tidyverse_1.3.2
## 
## loaded via a namespace (and not attached):
##  [1] fs_1.5.2            lubridate_1.8.0     bit64_4.0.5        
##  [4] RColorBrewer_1.1-3  httr_1.4.4          tools_4.2.1        
##  [7] backports_1.4.1     bslib_0.4.0         utf8_1.2.2         
## [10] R6_2.5.1            KernSmooth_2.23-20  DBI_1.1.3          
## [13] colorspace_2.0-3    raster_3.6-3        sp_1.5-0           
## [16] withr_2.5.0         tidyselect_1.1.2    leaflet_2.1.1      
## [19] bit_4.0.4           compiler_4.2.1      leafem_0.2.0       
## [22] cli_3.4.0           rvest_1.0.3         xml2_1.3.3         
## [25] sass_0.4.2          scales_1.2.1        proxy_0.4-27       
## [28] digest_0.6.29       rmarkdown_2.16      base64enc_0.1-3    
## [31] dichromat_2.0-0.1   pkgconfig_2.0.3     htmltools_0.5.3    
## [34] highr_0.9           dbplyr_2.2.1        fastmap_1.1.0      
## [37] htmlwidgets_1.5.4   rlang_1.0.5         readxl_1.4.1       
## [40] rstudioapi_0.14     farver_2.1.1        jquerylib_0.1.4    
## [43] generics_0.1.3      jsonlite_1.8.0      crosstalk_1.2.0    
## [46] vroom_1.5.7         googlesheets4_1.0.1 magrittr_2.0.3     
## [49] s2_1.1.0            Rcpp_1.0.9          munsell_0.5.0      
## [52] fansi_1.0.3         abind_1.4-5         terra_1.6-17       
## [55] lifecycle_1.0.2     stringi_1.7.8       leafsync_0.1.0     
## [58] yaml_2.3.5          tmaptools_3.1-1     grid_4.2.1         
## [61] parallel_4.2.1      crayon_1.5.1        lattice_0.20-45    
## [64] haven_2.5.1         stars_0.5-6         hms_1.1.2          
## [67] knitr_1.40          pillar_1.8.1        codetools_0.2-18   
## [70] wk_0.6.0            reprex_2.0.2        XML_3.99-0.11      
## [73] glue_1.6.2          evaluate_0.16       modelr_0.1.9       
## [76] png_0.1-7           vctrs_0.4.1         tzdb_0.3.0         
## [79] cellranger_1.1.0    gtable_0.3.1        assertthat_0.2.1   
## [82] cachem_1.0.6        xfun_0.33           lwgeom_0.2-9       
## [85] broom_1.0.1         e1071_1.7-11        viridisLite_0.4.1  
## [88] class_7.3-20        googledrive_2.0.0   gargle_1.2.1       
## [91] units_0.8-0         ellipsis_0.3.2