1. Porqué este cuaderno?

En este cuaderno se ilustrará la cartografía temática en el departamento de Cesar, será elaborado en RStudioCloud.

2. Cartografía Temática

Un mapa es un medio visual de comunicación en el que se recoge y luego se transmite información geográfica. Cuando se elabora un mapa se debe conocer muy bien el propósito del mapa y el usuario para elegir de forma acertada los elementos del mismo.

La cartografía temática se centra en la representación de un tema concreto de cualquier tema y se compone de dos partes diferenciadas : un capa especifica que contiene la información principal del mapa representando la variable espacial y un mapa base que se usa para ayudar a los elementos de la componente temática a transmitir mejor la información que contienen.

2.1 Mapas de símbolos proporcionales

Un mapa de símbolos proporcionales representa variables cuantitativas a través de símbolos cuyo tamaño esta en relación con el valor a representar de dicha variable. Se debe elegir un buen tamaño para el simbolo ya que esta es la manera en la que se transmite la información al usuario

Es importante para facilitar la correcta interpretación de un mapa de símbolos graduados el mostrar en la leyenda la relación entre los distintos tamaños de los símbolos y sus valores.

2.2 Mapas de puntos

Los mapas de puntos se emplean especialmente para la representación de variables que representen algún tipo de cantidad, tales como la población, el gasto medio por persona o la producción de un determinado cultivo. Estas cantidades se representan mediante la repetición de puntos, en numero proporcional a su magnitud. Tres son los aspectos que deben tenerse en cuenta a la hora de elaborar un mapa de puntos: el valor de cada punto (es decir, cuántas unidades de la variable representa cada punto), su tamaño y su posición.

2.3 Mapas de Isolineas

Un mapa de isolíneas está formado por un conjunto de líneas, cada una de las cuales une puntos que presentan el mismo valor de la variable, son usados para la representación de información cuantitativa, en particular cuando se trata de variables continuas.El caso más típico de mapa de isolíneas son las curvas de nivel que aparecen el un mapa topográfico, indicando la elevación del terreno.

2.4 Mapas de Coropletas

Los mapas de coropletas son utilizados muy habitualmente para representar la información geográfica en un SIG, en estos se tiene una serie de áreas definidas, cada una de las cuales posee un valor de una variable que afecta a todo el área y es el que se representa por medio de alguna variable visual.

3. Datos

Vamos a usar datos de las necesidades insatisfechas NBI tomados del Censo Nacional de Poblacion y vivienda del año 2018 y que son disponibles en el Geoportal del DANE y tambien podremos observar muchos mapas tematicos en el portal de DANE si das click en este link.

Estos datos estan en una tabla de excel(xlsx), pero contiene información de todos los municipios de Colombia así que antes de trabajar con ellos los depuramos dejando solamente los pertenecientes al departamento de Cesar y cambiamos los nombres de las columnas para lograr que la lectura del archivo en R sea sencilla.

4. Pasos previos

Para empezar limpiaremos la memoria.

rm(list=ls())

Con el siguiente código instalaremossolamente los paquetes necesarios pero que aun no estan instalados.

list.of.packages <- c("tidyverse", "rgeos", "sf", "raster", "cartography", "SpatialPosition")
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)

Se procede a cargar las librerias

library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.0     v purrr   0.3.3
## v tibble  2.1.3     v dplyr   0.8.4
## v tidyr   1.0.2     v stringr 1.4.0
## v readr   1.3.1     v forcats 0.5.0
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(ggplot2)
library(knitr)
library(readxl)
library(rgeos)
## Loading required package: sp
## rgeos version: 0.5-2, (SVN revision 621)
##  GEOS runtime version: 3.6.1-CAPI-1.10.1 
##  Linking to sp version: 1.4-1 
##  Polygon checking: TRUE
library(raster)
## 
## Attaching package: 'raster'
## The following object is masked from 'package:dplyr':
## 
##     select
## The following object is masked from 'package:tidyr':
## 
##     extract
library(sf)
## Linking to GEOS 3.6.1, GDAL 2.2.3, PROJ 4.9.3
library(cartography)
library(SpatialPosition)

5. Leyendo NBI DATA

Con la libreria read_excel, R puede acceder a archivos que estan en excel en el computador.

nbi <- read_excel("C:/Users/Usuario/Documents/sexta matricula/Geomatica/CESAR/nbi1_Cesar.xlsx")

Ya conocemos la función head, que nos permite visualizar las seis primeras filas del archivo

head(nbi)

Vamos a usar la función pipe para conocer en que municipios se encuentra la mayor y la menor proporción de miseria en el departamento de Cesar.

nbi %>% 
    slice(which.max(Miseria)) -> max_mis

max_mis
nbi %>% 
    slice(which.min(Miseria)) -> min_mis

min_mis

Pueblo Bello resulta ser el Municipio con la tasa de miseria mas alta,este está ubicado e la Sierra Nevada de Santa Marta y la gran mayoria de su población son indígenas Arhuacos,por lo contario San Alberto presenta la mas baja tasa de miseria, este municipio colinda con Santander.

Con la funcion arrange se ordenan las filas de un data frame en función de los valores de una o más columnas. En la siguiente linea de código ordenaremos en forma descendente los datos segun la tasa de miseria

nbi %>% 
  arrange(desc(Miseria))  -> desc_mis

desc_mis

6. Joining NBI data to municipalities

Vamos a usar lalibreria sf para leer un archivo .shp ,con mas información del departamento del Cesar

munic <- st_read("C:/Users/Usuario/Documents/20_CESAR/ADMINISTRATIVO/MGN_MPIO_POLITICO.shp")
## Reading layer `MGN_MPIO_POLITICO' from data source `C:\Users\Usuario\Documents\20_CESAR\ADMINISTRATIVO\MGN_MPIO_POLITICO.shp' using driver `ESRI Shapefile'
## Simple feature collection with 25 features and 9 fields
## geometry type:  POLYGON
## dimension:      XY
## bbox:           xmin: -74.13916 ymin: 7.67435 xmax: -72.88575 ymax: 10.86767
## CRS:            4326
munic

Revisamos el atributo

head(munic$MPIO_NAREA)
## [1]  877.6508  637.9028  586.2015 1376.4446 1114.4804  915.1712

Con el siguiente codigo ordenamos en forma descente los municipios por su área. Encontrando que Valledupar, su capital,es el municipio que posee la mayor extensión.

munic %>% 
  arrange(desc(MPIO_NAREA))  -> desc_area

desc_area
munic1 <- separate(munic, MPIO_CCDGO, c("MPIO", "CCDGO"),sep = "20")

Vamos a relaizarun join y primeros nos aseguramos que se tengan las mismas caracteristicas.

class(munic1$CCDGO)
## [1] "character"
class(nbi$CODIGO)
## [1] "character"
nbi_munic = left_join(munic1, nbi, by= c("CCDGO"="CODIGO"))
nbi_munic

Con la función dplyr::select se pueden seleccionar las columnas que se deseen del data frame.

nbi_munic %>%
  dplyr::select(MPIO_CNMBR, CCDGO, Miseria)  ->  check_nbi_munic

head(check_nbi_munic)

Reproyectaremos los municipios del departamento.

nbi_munic_new <- st_transform(nbi_munic, crs = 3116)

7. Ejemplos de mapas temáticos

Usaremos el paquete cartography package para obtener mapas temáticos. Este paquete usa la funcionalidades sf o sp

###7.1 OSM y simbolos proporcionales

#install.packages("osmdata")
library(osmdata)
## Data (c) OpenStreetMap contributors, ODbL 1.0. https://www.openstreetmap.org/copyright
mun.osm <- getTiles(
x = nbi_munic_new, 
type = "OpenStreetMap", 
zoom = 6,
cachedir = TRUE,
crop = FALSE
)
# establecer margenes
opar <- par(mar = c(0,0,2,0))
# plotear osm
tilesLayer(x = mun.osm)
# plotear losbordes de los municipios 
plot(st_geometry(nbi_munic_new), col = NA, border = "red", add=TRUE)
# plotear la tasa de miseria en Cesar
propSymbolsLayer(
  x = nbi_munic_new, 
  var = "Miseria", 
  inches = 0.10, 
  col = "lightblue",
  legend.pos = "topright",  
  legend.title.txt = "Misery"
)
# uso de layout
layoutLayer(title = " Tasa de Miseria en Cesar",
            sources = "Fuente: DANE, 2018\n© OpenStreetMap",
            author = " Angelica Martinez ",
            frame = TRUE, north = FALSE, tabtitle = TRUE)
# flecha indicadora de norte
north(pos = "topleft")

Nosotros ya hemos visto en las tablas que en Pueblo Bello hay una alta tasa de miseria,y esta información la reflejmos ahora en el mapa ya que el punto que tiene el diametro mas grande es el que está ubicado en este municipio.

###7.2 MAPA DE COROPLETAS

Los mapas de corpletas varian de acuerdo a una variable cuantitativa, en ese caso seguimos observando la variable de Miseria. Para ello usamos la funcion choroLayer(), en la que laintensidad del color es la que nos va a mostrar la intensidad de la caracteristica.

# Margenes
opar <- par(mar = c(0,0,1.2,0))
# color del  background
par(bg="grey90")
# plotear municipios 
plot(st_geometry(nbi_munic_new), col = NA, border = NA, bg = "#aadaff")


# plotear tasa de Hacinamiento
choroLayer(
  x = nbi_munic_new, 
  var = "Hacinamiento",
  method = "geom",
  nclass=6,
  col = carto.pal(pal1 = "green.pal", n1 = 6),
  border = "white", 
  lwd = 0.5,
  legend.pos = "topleft", 
  legend.title.txt = "Miseria",
  add = TRUE
) 
# layout
layoutLayer(title = "Distribución  del hacinamiento en Cesar", 
            sources = "Fuente: DANE, 2018",
            author = "Angelica Mrtinez", 
            frame = TRUE, north = TRUE, tabtitle = TRUE, col="black") 

# north arrow
#north(pos = "topright")

Podemos ver que el municipio de Pueblo Bello que es elque presenta la tasa mas alta de hacinamiento esta en color verde oscuro,mientras Aguachica esta en color muy tenue mostrando que la tasa de hacinamieno alli es menor.

7.3 Símbolos proporcionales

nbi_munic_2 <- dplyr::mutate(nbi_munic_new, poverty = ifelse(Miseria > 20, "Extreme",                ifelse(Hacinamiento > 5, "High", "Intermediate")))
head(nbi_munic_2)
library(sf)
library(cartography)
# establecer margenes
opar <- par(mar = c(0,0,1.2,0))
# Plotear los municipios
plot(st_geometry(nbi_munic_2), col="antiquewhite", border="grey", bg = "aliceblue", 
     lwd = 0.5)
# Plotear con coropletas
propSymbolsTypoLayer(
  x = nbi_munic_2, 
  var = "NBI", 
  inches = 0.2,
  symbols = "square",
  border = "white",
  lwd = .5,
  legend.var.pos = "topleftt", 
  legend.var.title.txt = "Miseria",
  var2 = "poverty",
  legend.var2.values.order = c("Extreme","Intermediate", "High" ),
  col = carto.pal(pal1 = "blue.pal", n1 = 3),
  legend.var2.pos = "topright", 
  legend.var2.title.txt = "Nivel miseria"
) 
# layout
layoutLayer(title="Distribution NBI en Cesar", 
            author = "Angélica Martinez", 
            sources = "Source: DANE, 2018", 
            scale = 1, tabtitle = TRUE, frame = TRUE)
# north arrow
north(pos = "topleft")

par(opar)

7.4 Mapas Label

library(sf)
library(cartography)
# Estableciendo margenes  
opar <- par(mar = c(0,0,1.2,0))
# estableciendo color de  background
par(bg="grey25")
# plot municipios
plot(st_geometry(nbi_munic_2), col = "orange", border = "darkseagreen4", 
     bg = "grey75", lwd = 0.5)
# plot NBI
choroLayer(
  x = nbi_munic_new, 
  var = "NBI",
  method = "geom",
  nclass=5,
  col = carto.pal(pal1 = "orange.pal", n1 = 5),
  border = "white", 
  lwd = 0.5,
  legend.pos = "topright", 
  legend.title.txt = "NBI",
  add = TRUE
) 
# plot labels
labelLayer(
  x = nbi_munic_2, 
  txt = "MUNICIPIO", 
  col= "white", 
  cex = 0.4, 
  font = 4,
  halo = TRUE, 
  bg = "grey25", 
  r = 0.1, 
  overlap = FALSE, 
  show.lines = FALSE
)
# map layout
layoutLayer(
  title = "Municipios de Cesar", 
  sources = "Source: DANE, 2018",  
  author = "Angelica Martinez", 
  frame = TRUE,
  north = TRUE, 
  tabtitle = TRUE, 
  theme = "taupe.pal"
) 

par(opar)

7.5 MAPAS ISOPLETAS

cultivos2018 <- read_excel("C:/Users/Usuario/Documents/sexta matricula/Geomatica/EVA_CESAR2018.xlsx")
head(cultivos2018) 

En el departamento del Cesar uno de los cultivos mas importantes es el café.

cultivos2018 %>%
  filter(CULTIVO == "CAFE") -> cafe2018
cafe2018
cafe_2018 <-separate(cafe2018, COD_MUN, c("COD", "MUN"),sep = "20")
cafe2018$TEMP <-  as.character(cafe_2018$MUN)
#cafe2018$MPIO_CCDGO <- as.factor(paste(0, cafe2018$TEMP, sep=""))
cafe_2018
munic1
class(munic1$CCDGO)
## [1] "character"
cafe_munic = left_join(munic1, cafe_2018, by= c("CCDGO"="MUN"))
cafe_munic
rep_cafe <- st_transform(cafe_munic, crs = 3116)
# set margins
opar <- par(mar = c(0,0,1.2,0))
# plot municipalities (only the backgroung color is plotted)
plot(st_geometry(rep_cafe), col = NA, border = "black", bg = "grey75")
# plot isopleth map
smoothLayer(
  x = rep_cafe, 
  var = 'Produccion',
  typefct = "exponential",
  span = 25000,
  beta = 2,
  nclass = 3,
  col = carto.pal(pal1 = 'orange.pal', n1 = 10),
  border = "grey",
  lwd = 0.1, 
  mask = rep_cafe, 
  legend.values.rnd = -3,
  legend.title.txt = "Production",
  legend.pos = "topright", 
  add=TRUE)
# annotation on the map
text(x = 65000, y = 120000, cex = 0.6, adj = 0, font = 3,  labels = 
       "Distance function:\n- type = exponential\n- beta = 2\n- span = 20 km")
# layout
layoutLayer(title = "Produccion de café en Cesar",
            sources = "Fuente: DANE y MADR, 2018",
            author = "Angelica Martinez",
            frame = FALSE, north = FALSE, tabtitle = TRUE, 
            theme = "green.pal")
# north arrow
north(pos = "topleft")

### 8 Guardar un mapa en nuestro equipo

png("C:/Users/Usuario/Documents/sexta matricula/Geomatica/cafe7_2018.png", width = 2048, height = 1526)
# establecer margenes
opar <- par(mar = c(0,0,5,5))
# Plotear  municipios
plot(st_geometry(rep_cafe), col="turquoise", border="darkseagreen4",  
     bg = "white", lwd = 0.6)
# Plotear simbolos con coropletas
propSymbolsChoroLayer(x = rep_cafe, var = "Produccion", var2 = "Rendimiento",
                      col = carto.pal(pal1 = "wine.pal", n1 = 3,
                                      pal2 = "pink.pal", n2 = 3),
                      inches = 0.8, method = "q6",
                      border = "grey50", lwd = 1,
                      legend.title.cex = 1.5,
                      legend.values.cex = 1.0,
                      legend.var.pos = "right", 
                      legend.var2.pos = "left",
                      legend.var2.values.rnd = 2,
                      legend.var2.title.txt = "Rendimiento\n(Ton/Ha)",
                      legend.var.title.txt = "Produccion Café en 2018",
                      legend.var.style = "e")
# plot labels
labelLayer(
  x = rep_cafe, 
   txt = "MPIO_CNMBR", 
  col= "white", 
  cex = 1.0, 
  font = 4,
  halo = FALSE, 
  bg = "white", 
  r = 0.1, 
  overlap = FALSE, 
  show.lines = FALSE)
# layout
layoutLayer(title="Produccion de café en Cesar, 2018",
            author = "Angelica Martinez", 
            sources = "Sources: MADR & DANE, 2018", 
            scale = 100, tabtitle = FALSE, frame = TRUE)
# flecha del norte
north(pos = "topleft")
#
title(main="Produccion Café en Cesar, 2018", cex.main=3,
      sub= "Source: MADR & DANE, 2018", cex.sub=2)
#
graticule = TRUE
#
par(opar)
### cerrar el ploteo
#

dev.off()
## png 
##   2

Entonces se puede grabar el mapa y luego con el suguiente comando traerlo al cuaderno de RStudio.

include_graphics("C:/Users/Usuario/Documents/sexta matricula/Geomatica/cafe7_2018.png")

sessionInfo()
## R version 3.6.3 (2020-02-29)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 18362)
## 
## Matrix products: default
## 
## locale:
## [1] LC_COLLATE=Spanish_Colombia.1252  LC_CTYPE=Spanish_Colombia.1252   
## [3] LC_MONETARY=Spanish_Colombia.1252 LC_NUMERIC=C                     
## [5] LC_TIME=Spanish_Colombia.1252    
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] osmdata_0.1.3         SpatialPosition_2.0.1 cartography_2.4.1    
##  [4] sf_0.9-2              raster_3.0-12         rgeos_0.5-2          
##  [7] sp_1.4-1              readxl_1.3.1          knitr_1.28           
## [10] forcats_0.5.0         stringr_1.4.0         dplyr_0.8.4          
## [13] purrr_0.3.3           readr_1.3.1           tidyr_1.0.2          
## [16] tibble_2.1.3          ggplot2_3.3.0         tidyverse_1.3.0      
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_1.0.3         lubridate_1.7.4    lattice_0.20-38    png_0.1-7         
##  [5] class_7.3-15       assertthat_0.2.1   digest_0.6.25      R6_2.4.1          
##  [9] cellranger_1.1.0   backports_1.1.5    reprex_0.3.0       evaluate_0.14     
## [13] e1071_1.7-3        httr_1.4.1         pillar_1.4.3       rlang_0.4.5       
## [17] curl_4.3           rstudioapi_0.11    rmarkdown_2.1      rgdal_1.4-8       
## [21] munsell_0.5.0      broom_0.5.5        compiler_3.6.3     modelr_0.1.6      
## [25] xfun_0.12          pkgconfig_2.0.3    htmltools_0.4.0    tidyselect_1.0.0  
## [29] codetools_0.2-16   fansi_0.4.1        crayon_1.3.4       dbplyr_1.4.2      
## [33] withr_2.1.2        grid_3.6.3         lwgeom_0.2-3       nlme_3.1-144      
## [37] jsonlite_1.6.1     gtable_0.3.0       lifecycle_0.2.0    DBI_1.1.0         
## [41] magrittr_1.5       units_0.6-5        scales_1.1.0       KernSmooth_2.23-16
## [45] cli_2.0.2          stringi_1.4.6      fs_1.3.2           xml2_1.2.5        
## [49] ellipsis_0.3.0     generics_0.0.2     vctrs_0.2.3        tools_3.6.3       
## [53] glue_1.3.1         hms_0.5.3          slippymath_0.3.1   yaml_2.2.1        
## [57] colorspace_1.4-1   isoband_0.2.0      classInt_0.4-2     rvest_0.3.5       
## [61] haven_2.2.0