1. Contenido

This is an R Markdown Notebook, acerca de Cartografía Temática correspondientes al departamento de Nariño, Colombia. Ha sido creado, compilado y publicado desde RStudio. Desarrollado por una estudiante de la Universidad Nacional de Colombia, vinculada al curso de Geomática Básica en la Facultad de Ciencias Agrarias.

2. Cartografía Temática

La cartografía temática se enfoca en temas específicos, por ejemplo la distribución de temperatura o de precipitación en un área. Se diferencian de los mapas topográficos o de referencia porque estos tocan temas muy generales;relieve, vías o hidrografía; tienen un uso múltiple. Por otro lado, los mapas temáticos tienen un propósito especial. Entre los diferentes tipos de mapas temáticos se encuentran:

2.1 Mapa de Cloropletas

Los mapas de coropletas son utilizados muy habitualmente para representar la información geográfica en un SIG. En un mapa de coropletas se tiene una serie de áreas definidas, cada una de las cuales posee un valor de una variable. Este valor de la variable afecta a todo el área y es el que se representa por medio de alguna variable visual, normalmente el color a través de su componente valor. Las zonas definidas por cada área tienen un significado arbitrario, no relacionado con la variable asociada. Muy frecuentemente, se utilizan limites administrativos o de gestión como áreas. Cada área conforma una unidad espacial, y el valor asociado a ella resume la variable dentro de dicho área.

“Mapa de Cloropletas”

“Mapa de Cloropletas”

2.2 Mapa de símbolos proporcionales o graduados

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. Es decir, emplea la variable visual tamaño, que como ya hemos visto es la única que presenta la propiedad cuantitativa. La forma de los distintos símbolos es siempre la misma, y por simplicidad lo más frecuente es utilizar como símbolo base el círculo, aunque puede utilizarse cualquier otro, e incluso símbolos de tipo lineal (barras).

“Mapa de Símbolos proporcionales”

“Mapa de Símbolos proporcionales”

2.3 Mapa de isolíneas o curvas de nivel

Los mapas de isolíneas son unos de los más usados para la representación de información cuantitativa, en particular cuando se trata de variables continuas. Se utiliza habitualmente para representar campos escalares y constituye una forma muy efectiva de incorporar esta información en un mapa, ya que puede combinarse con otros tipos de mapas y de información, debido a que, al representarse únicamente mediante líneas, permite la presencia de otros elementos dentro del mapa sin resultar obstrusiva. Una forma particular de representar las isolíneas mediante color es hacerlo no sobre las líneas, sino sobre las zonas que median entre ellas. Es decir, representar la clase en lugar del límite de clase.

“Mapa de isolíneas”

“Mapa de isolíneas”

2.4 Mapa de puntos

Los mapas de puntos se emplean especialmente para la representación de variables cuantitativas como la producción de un determinado cultivo. Estas cantidades se representan mediante la repetición de puntos, en numero proporcional a su magnitud. Cada uno de esos puntos representa un valor unitario, y el conjunto de ellos sobre la zona en cuestión suma la cantidad total a representar. Los puntos tienen todos la misma forma y tamaño, a diferencia de lo que vimos en el caso de los símbolos proporcionales.

Tres son los aspectos que deben tenerse en cuenta a la hora de elaborar un mapa de puntos:

  • El valor de cada punto
  • Su tamaño
  • Su posición
“Mapa de Puntos”

“Mapa de Puntos”

3. Datos

En esta oportunidad vamos a trabajar con la base de datos del Censo Nacional de Población y Vivienda del año 2018 (CNPV); enfocandonos en el tema de Necesidades Básicas Insatisfechas (NBI). Dichos datos se pueden descargar en el Geoportal del DANE.

Los datos fueron limpiados en Excel, eliminando imágenes, columnas y filas sin información y dejando para nuestro uso únicamente los datos relacionados con los datos totales de cada municipio. Posteriormente serán filtrados para el departamento de Nariño en R.

4. Preparación

Limpiamos la memoria del programa.

rm(list=ls())

Ahora, instalamos las librerías que necesitaremos.

  #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)

Luego de instalados los paquetes, procedemos a cargar las librerías:

library(tidyverse)
## -- Attaching packages ------------------------------------ tidyverse 1.3.0 --
## v ggplot2 3.3.0     v purrr   0.3.4
## v tibble  3.0.1     v dplyr   0.8.5
## v tidyr   1.0.3     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(readxl)
library(rgeos)
## Loading required package: sp
## rgeos version: 0.5-3, (SVN revision 634)
##  GEOS runtime version: 3.8.0-CAPI-1.13.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.8.0, GDAL 3.0.4, PROJ 6.3.1
library(cartography)
library(SpatialPosition)

5. Lectura datos NBI

Leemos el archivo .csv, que contiene la base de datos “Necesidades Básicas Insatisfechas (NBI)” por departamento en Colombia.

datos<-read_excel("./2018-NBI.xlsx")
datos
head(datos)

Procedemos a filtrar los datos para nuestro departamento de interés en este caso Nariño.

attach(datos)
nbi<-filter(datos,DEPTO=='NARINO')

El municipio con el mayor porcentaje de NBI, es:

nbi %>%
  slice(which.max(NBI))->MAX_NBI
MAX_NBI

Con lo anterior, decimos que el municipio de Magüí Payán, cuenta con el mayor porcentaje de necesidades básicas insatisfechas, con un 82.5%; esto debido a la falta de participación por parte del estado y a la presencia de grupos armados ilegales en la zona. Para ampliar más la información hacer click aquí.

Por otra parte el municipio con el menor porcentaje de NBI, es:

nbi %>%
  slice(which.min(NBI))->MIN_NBI
MIN_NBI

De acuerdo a lo anterior tenemos la capital de Nariño, Pasto es el municipio con menor porcentaje de NBI, con 8.11%.

Ahora ¿Por qué no ordenar estos los municipios de Nariño, de mayor a menor NBI?, de forma que:

nbi %>%
  arrange(desc(NBI))->desc_NBI
desc_NBI

De esta forma podemos visualizar los datos por municipio y hacer comparaciones de forma fácil, entre los % de NBI.

6. Unión de datos NBI a municipios

Teniendo previamente cargado un archivo con datos georeferenciados de cada municipio, lo leemos en R.

munic<-st_read("./52_NARIÑO/ADMINISTRATIVO/MGN_MPIO_POLITICO.shp")
## Reading layer `MGN_MPIO_POLITICO' from data source `D:\Mis documentos\RStudio_Works\52_NARIÑO\ADMINISTRATIVO\MGN_MPIO_POLITICO.shp' using driver `ESRI Shapefile'
## Simple feature collection with 64 features and 9 fields
## geometry type:  MULTIPOLYGON
## dimension:      XY
## bbox:           xmin: -79.01021 ymin: 0.3613481 xmax: -76.83368 ymax: 2.683898
## geographic CRS: WGS 84

Chequeamos que hay en el atributo donde esta el código del municipio:

head(munic$MPIO_CCDGO)
## [1] "52683" "52685" "52687" "52560" "52693" "52565"

Continuamos usando la función left_join para unir cada municipio con su respectivo dato de NBI.

munic$MPIO_CCDGO=as.factor(munic$MPIO_CCDGO)
nbi$COD_MUN=as.factor(nbi$COD_MUN)
nbi_munic<-left_join(munic,nbi,by=c("MPIO_CCDGO"="COD_MUN"))
nbi_munic %>%
  dplyr::select(MUNICIPIO,MPIO_CCDGO,NBI)->data_nbi_munic
head(data_nbi_munic)

Finalmente realizamos una trasformación de las coordenadas geográficas a coordenadas planas para su lectura por la librería cartography.

nbi_munic_new <- st_transform(nbi_munic, crs = 3116)

7. Ejemplos de Mapas Temáticos

Usamos la librería carthography porque la calidad de los mapas obtenidos es bastante buena, se compara con la calidad de los mapas obtenidos e softwares como QGIS o ArcGIS. Además para el uso de la librería necesitamos objetos espaciales que pueden ser sf o sp, sin emebargo la más recoendada es sf.

7.1 Mapas proporcionales, usando como mapa base OpenStreetMap

Podemos descargar los mapas con la función getTiles() y visualizarlos con tilesLayer(); por otro lado si vamos a utilizar variables cuantitativas proporcionales a un área, usamos la variable propSymbolsLayer(), algunos de los símbolos disponibles den esta librería hay círculos, barras, cuadrados entre otros. Y el tamaño de los símbolos se pueden personalizar usando el argmento inches.

map1<-getTiles(x=nbi_munic_new,type="OpenStreetMap",zoom = 9, cachedir=TRUE,crop=FALSE)
opar<-par(mar=c(1.2,0,1.2,1))
tilesLayer(x=map1)
plot(st_geometry(nbi_munic_new),col=NA,border="burlywood3",add=TRUE)
propSymbolsLayer(
  x=nbi_munic_new,
  var="NBI",
  inches=0.18,
  col="aquamarine3",
  legend.pos = "topleft",
  legend.title.txt = "NBI Total"
  )
layoutLayer(
  title = "Distribución de NBI en Nariño", 
  sources ="Fuente:DANE, 2018 \n OpenStreetMap",
  author="Andrea Galindo",frame=TRUE, north = FALSE, tabtitle = TRUE)
north(pos="topright")

De este mapa podemos concluir que los mmunicipios con más Necesidades insatisfechas se encuentran al norte del departamento, entre ellos Magüí y Mosquera.

7.2 Mapa de Coropletas

Este tipo de mapas coonsisten en la coloración de diferentes áreas de acuerdo al cambio de una varible cuantitativa. Puede ser usado para representar ratios o índices. Por otro lado la función choroLayer() muestra el mapa de cloropletas y podemos personalizarlo modificando los argumentos nclass, method, breaks. Y la variable getBreaks() nos permite clasificar fuera de la función anterior; por ejemplo la paleta de colores se modifica con el argumento col o se puede crear un conjunto de colores con carto.pal() de tipo secuenciales, divergentes y cualitativas o podemos usar el comando display.carto.all, pues muestra todas las paletas de colores disponibles.

opar <- par(mar = c(1,0,1.5,0))
par(bg="white")
plot(st_geometry(nbi_munic_new), col = NA, border = NA, bg = "darkolivegreen2")

choroLayer(
  x = nbi_munic_new, 
  var = "NBI",
  method = "arith",
  nclass=5,
  col = carto.pal(pal1 = "pink.pal", n1 = 5),
  border = "white", 
  lwd = 0.5,
  legend.pos = "topright", 
  legend.title.txt = "NBI",
  add = TRUE
) 
# layout
layoutLayer(title = "Distribución de NBI en Nariño", 
  sources ="Fuente:DANE, 2018 \n OpenStreetMap",
  author="Andrea Galindo",frame=TRUE, north = FALSE, tabtitle = TRUE)
north(pos="topright")

Este mapa por otra parte, nos informa del valor de NBI por municipio, se observa que hay más NBI en los departamentos del Norte de Nariño, esto nos sirve para darnos una idea de la distribución de este índice, sin embargo no es muy claro, por ello podemos hacer uso del siguiente mapa desarrollado.

7.3 Símbolos proporcionales y mapa de tipología

La función propSymbolsLayer() crea mapas con símbolos que tienen un tamaño proporcional al valor de una variable cuantitativa y coloreado en función del valor de una segunda variable que es de tipo cualitativa. Usaremos la combinación de argumentos de propSymbolsLayer() y typoLayer.

Lo primero que haremos es crear una función cualitativa, para ello usamos la función mutate.

map3 <- dplyr::mutate(nbi_munic_new, poverty = ifelse(MISERIA > 20, "Extrema",                                           ifelse(HACINAMIENTO > 5, "Alta", "Intermedia")))

El nuevo atributo se llama pobreza. Su valor depende de los valores umbral definidos anteriormente.

head(map3)
opar <- par(mar = c(0,0,1,0))
plot(st_geometry(map3), col="gold", border="red4", bg =NA, 
     lwd = 0.5)

propSymbolsTypoLayer(
  x = map3, 
  var = "NBI", 
  inches = 0.45,
  symbols = "bar",
  border = "gray8",
  lwd = .5,
  legend.var.pos = "topright", 
  legend.var.title.txt = "NBI",
  var2 = "poverty",
  legend.var2.values.order = c("Extrema", "Alta", 
                               "Intermedia"),
  col = carto.pal(pal1 = "multi.pal", n1 = 3),
  legend.var2.pos ="right", 
  legend.var2.title.txt = "Pobreza"
) 

layoutLayer("Distribución de NBI en Nariño", 
  sources ="Fuente:DANE, 2018 \n OpenStreetMap",
  author="Andrea Galindo", 
            scale = 1, tabtitle = TRUE, frame = TRUE)
north(pos = "topleft")

Este mapa nos facilita la caracterización de la pobreza en el departamento, entre más alta sea la barra nos indica que hay mayor porcentaje de necesidades básicas insatisfechas en la zona y en color rojo los municipios que nos indican que este valor llega a ser clasificado como pobreza extrema, entre ellos están los municipios de Magüí, Barbacoas y Ricaurte.

7.4 Mapa con etiquetas

Este mapa combina las funciones choroLayer y labelLayer:

opar <- par(mar = c(0,0,1.2,0))
par(bg="grey25")
plot(st_geometry(map3), col = "lightpink", border = "indianred4", 
     bg = "lightgoldenrodyellow", lwd = 0.5)
choroLayer(
  x = nbi_munic_new, 
  var = "NBI",
  method = "arith",
  nclass=5,
  col = carto.pal(pal1 = "red.pal", n1 = 5),
  border = "lightsalmon4", 
  lwd = 0.5,
  legend.pos = "topright", 
  legend.title.txt = "NBI",
  add = TRUE
) 

labelLayer(
  x = map3, 
  txt = "MUNICIPIO", 
  col= "grey20", 
  cex = 0.45, 
  font = 4,
  halo = TRUE, 
  bg = "white", 
  r = 0.045, 
  overlap = FALSE, 
  show.lines = FALSE
)

layoutLayer(
  title = "Municipios de Nariño", 
  sources = "Fuente: DANE, 2018",  
  author = "Andrea Galindo", 
  frame = TRUE,
  tabtitle = TRUE, 
  theme = "sand.pal"
) 
north(pos = "topleft")

Este mapa tiene como base el desarrollado anteriormente en coropletas, sin embargo es de gran ayuda para la lectura de un mapa tener en este las leyendas, pues facilita su comprensión al momento de leerlo sin necesidad de recurrir a otra ayuda educativa.

7.5 Mapa de isopletas o isolíneas

Los mapas deisopletas se basan en que el fenómeno a representar tiene una distribución continua. Estos mapas utilizan un enfoque de modelado de interacción espacial que tiene como objetivo calcular indicadores basados en valores de stock ponderados por distancia. Permite una representación espacial del fenómeno independiente de la heterogeneidad inicial de la división territorial. smoothLayer () depende en gran medida del paquete SpatialPosition. La función utiliza una capa de puntos marcados y un conjunto de parámetros (una función de interacción espacial y sus parámetros) y muestra una capa de mapa de isopletas.

Usaremos otro conjunto de datos para hacer un mapa de isopletas. En este caso, subiré datos estadísticos sobre la producción de papa de 2018 en Nariño.

Leemos la base de datos

datos <- read_excel("D:/Mis documentos/RStudio_Works/Base_Def.xlsx")

Creamos un nuevo atributo que coincida con los códigos de los municipios:

datos$TEMP <-  as.character(datos$COD_MUN)
datos$MPIO_CCDGO <- as.factor(paste( datos$TEMP, sep=""))

Y hacemos el join:

papa_munic = left_join(munic, datos, by="MPIO_CCDGO",)
## Warning: Column `MPIO_CCDGO` joining factors with different levels, coercing to
## character vector

Verificamos la salida:

head(papa_munic)

Reproyectamos los municipios:

rep_papa <- st_transform(papa_munic, crs = 3116)

Y creamos el mapa:

opar <- par(mar = c(0,0,1.2,0))
plot(st_geometry(rep_papa), col = NA, border = "black", bg = "lavenderblush")
smoothLayer(
  x = rep_papa, 
  var = 'PRODUCCION',
  typefct = "exponential",
  span = 30000,
  beta = 2,
  nclass = 7,
  col = carto.pal(pal1 = 'blue.pal', n1 = 7),
  border = "cadetblue1",
  lwd = 0.1, 
  mask = rep_papa, 
  legend.values.rnd = 0,
  legend.title.txt = "Producción",
  legend.pos = "topright", 
  add=TRUE
)

text(x = 380000, y = 740000, cex = 0.8, adj = 0, font = 3,  labels ="Distance function:\n- Tipo = Exponencial\n- Beta = 2\n- Lapso = 50 km")

layoutLayer(title = "Distribución de la producción de papa en Nariño",
            sources = "Fuentes: DANE and MADR, 2018",
            author = "Andrea Galindo",
            frame = FALSE, north = FALSE, tabtitle = TRUE, theme = "blue.pal")

north(pos = "topleft")

En el anterior ejemplo se observa la distribución de la producción de papa en el departamento, donde las zonas donde el color es más intenso indican una mayor producción de papa en específico y los colores claros indican lo opuesto, por ende podemos decir que la producción de papa se concentra en la zona sur-oriental del departamento, esto lo veremos a detalle con el mapa final de nuestro informe.

8. ¿Cómo guardar los mapas?

Haremos otro mapa de producción de papa en 2018. Esta vez usaremos símbolos proporcionales y mapas de coropletas. La salida se guardará como un archivo .png. Debemos tener en cuenta que: - propSymbolsChoroLayer () crea un mapa de símbolos que son proporcionales a los valores de una primera variable y coloreados para reflejar la clasificación de una segunda variable. - Se utiliza una combinación de argumentos propSymbolsLayer () y choroLayer ().

El siguiente fragmento no muestra un mapa. En cambio, escribe el mapa en el nombre de archivo papa_2018.png debajo del directorio de trabajo

png("./papa_2018.png", width = 1024, height = 763)
opar <- par(mar = c(0,0,5,5))
plot(st_geometry(rep_papa), col="yellowgreen", border="gray30",  
     bg = "white", lwd = 0.6)

propSymbolsChoroLayer(
  x = rep_papa, 
  var = "PRODUCCION", 
  var2 = "RENDIMIENTO",
  col = carto.pal(pal1 = "turquoise.pal", n1 = 3,pal2 = "red.pal",n2 = 3),
inches = 0.5, 
method = "q6",
border = "gray30", lwd = 1,
legend.title.cex = 1.5,
legend.values.cex = 1.0,
legend.var.pos = "topright", 
legend.var2.pos = "left",
legend.var2.values.rnd = 2,
legend.var2.title.txt = "Rendimiento\n(Ton/Ha)",
legend.var.title.txt = "Producción de papa en 2018",
legend.var.style = "e"
)


labelLayer(
  x = rep_papa, 
  txt = "MPIO_CNMBR", 
  col= "black", 
  cex = 1.0, 
  font = 4,
  halo = FALSE, 
  bg = "black", 
  r = 0.1, 
  overlap = FALSE, 
  show.lines = FALSE
)

layoutLayer(title="Producción de papa & rendimiento en Nariño, 2018",
            author = "Andrea Galindo", 
            sources = "Fuentes: MADR & DANE, 2018", 
            scale = 60, tabtitle = FALSE, frame = TRUE)

north(pos = "topleft")
#
title(main="Producción de papa & rendimiento en Nariño, 2018", cex.main=3,
      sub= "Fuente: MADR & DANE, 2018", cex.sub=2)

graticule = TRUE

par(opar)

dev.off()
## png 
##   2

Y de esta forma obtenemos esta imagen en nuestro ordenador:

“MAPA DE LA DISTRIBUCIÓN PRODUCCIÓN Y RENDIMIENTO EN PAPA DE NARIÑO”

“MAPA DE LA DISTRIBUCIÓN PRODUCCIÓN Y RENDIMIENTO EN PAPA DE NARIÑO”

Y como lo habiamos mencionado más arriba, cuando un mapa tiene las respectivas leyendas y especficación de proporciones ya que facilita su análisis y comprensión, aquí podemos confirmar que en los municipios del sur-oriente del departamento la producción y rendimiento de papa es mayor y podemos y especificar los municipios, entre ellos Pasto, Ospina, Aldana y Providencia.