#1.Introducción

¡Hola!, mi nombre es Laura Peñuela. En este cuaderno de R mostraré las funciones básicas que se encuentran en las librerías “simple feature” (sf) y tidyverse. El objetivo es obtener diferentes mapas de Colombia, Cundinamraca y Bogotá por medio de la manipulación de archivos shape.

El primer pasa es instalar y cargar las librerías requeridas

#install.packages("tidyverse")
#install.packages("sf")
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.2     v purrr   0.3.4
## v tibble  3.0.2     v dplyr   1.0.0
## v tidyr   1.1.0     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(sf)
## Linking to GEOS 3.8.0, GDAL 3.0.4, PROJ 6.3.1

#2.Leer los datos vectoriales Al tener las librerías cargadas ya se pueden leer archivos tipo Shape. Se deben descargar los datos de Colombia de la división administrativa en el sigueinte link: https://www.diva-gis.org/gdata.Posterior a ello, se cargan con la función “read_sf”. Se debe poner un nombre al objeto, en este caso es llamado “deptos”

deptos <- read_sf("C:/Users/JUAN PABLO/Documents/geo maps/COL_adm1.shp")

Aplicamos la función “head”, para mirar las primeras filas y de este modo conocer las categorías que presenta el archivo Shape

head(deptos)

Como los datos corresponden a datos espaciales es útil ver el sistema de referencia en el que ellos se encuentran. Para ello se debe aplicar la función “st_crs” al objeto

st_crs(deptos)
## Coordinate Reference System:
##   User input: WGS 84 
##   wkt:
## GEOGCRS["WGS 84",
##     DATUM["World Geodetic System 1984",
##         ELLIPSOID["WGS 84",6378137,298.257223563,
##             LENGTHUNIT["metre",1]]],
##     PRIMEM["Greenwich",0,
##         ANGLEUNIT["degree",0.0174532925199433]],
##     CS[ellipsoidal,2],
##         AXIS["latitude",north,
##             ORDER[1],
##             ANGLEUNIT["degree",0.0174532925199433]],
##         AXIS["longitude",east,
##             ORDER[2],
##             ANGLEUNIT["degree",0.0174532925199433]],
##     ID["EPSG",4326]]

#3.Visualizar los datos espaciales por medio de ggplot

La función ggplot sirve para vincular un gráfico a un conjunto de datos. El mapa siguiente corresponde a la representación de los datos del objeto “deptos”. Como se puede observar el mapa de Colombia se ubica en unas coordenadas de acuerdo al sistema de referencia.

ggplot() + geom_sf(data = deptos, fill="darkseagreen")

Los datos pueden ser representados en cualquier sistema de referencia. En este caso se usó el sistema de referencia CRS3978 de Canadá con el objetivo de ejemplificar lo mencionado anteriormente. Sin embargo, no se recomienda usar un sistema de referencia que se haya definido explícitamene para otro país o región

ggplot() + geom_sf(data = deptos, fill="palegreen") + coord_sf(crs=st_crs(3978))

Es necesario convertir el objeto “deptos” al sistema coordenado de referencias de EPSG:4326 a EPSG:32618 para que coincida con el sistema de coordenadas universal transversal de Mercator (UTM)

deptos_utm <- st_transform(deptos, crs = st_crs(32618))
deptos_utm

Ahora se visualiza el nuevo mapa con el sistema de coordenadas UTM por medio de la función ggplot

ggplot() + geom_sf(data = deptos_utm, fill="palegreen3")

#4. Filtrar datos espaciales según los atributos

En este caso el interés es conocer los datos exclusivos para el departamento de Cundinamarca. Esto se realiza al usar el conjunto de símbolos %>%, como se observa en el siguiente cuadro de código. Posterior a filtrar se visualiza el mapa con ggplot

cundinamarca <-  deptos %>%   filter(NAME_1 == "Cundinamarca")
ggplot() + geom_sf(data = cundinamarca, fill="plum1") 

Se pueden usar los pasos anteriores para filtrar la división administrativa de los municipios de Cundinamrca. Para ello necesitamos leer los datos sf llamados COL_adm2.shp que contienen esta información. Nuevamente visualizamos con ggplot y así podemos ver los municipios.

municipios <- read_sf("C:/Users/JUAN PABLO/Documents/geo maps/COL_adm2.shp")
municipios
mun_cundi <- municipios %>% filter(NAME_1 == "Cundinamarca")
ggplot() + geom_sf(data = mun_cundi, fill="orchid1") 

Ahora se lee objeto para ver las catogorías que contienen los datos sf

mun_cundi

Se crea el objeto “cundinamrca_ponits” y se aplica la función “st_centrodide” que provee el centroide en una geometría

cundinamarca_points<- st_centroid(mun_cundi)
## Warning in st_centroid.sf(mun_cundi): st_centroid assumes attributes are
## constant over geometries of x
## Warning in st_centroid.sfc(st_geometry(x), of_largest_polygon =
## of_largest_polygon): st_centroid does not give correct centroids for longitude/
## latitude data
cundinamarca_points <- cbind(mun_cundi, st_coordinates(st_centroid(mun_cundi$geometry)))
## Warning in st_centroid.sfc(mun_cundi$geometry): st_centroid does not give
## correct centroids for longitude/latitude data

Con el siguiente cuadro de código se puede obtener un mapa más detallado de Cundinamarca con sus respectivos municipios.

ggplot(cundinamarca) +
    geom_sf() +
    geom_sf(data = cundinamarca_points, fill = "lightpink") + 
    geom_text(data = cundinamarca_points, aes(x=X, y=Y,label = ID_2), size = 1) +
    coord_sf(xlim = c(-75.2, -72.7), ylim = c(3.5, 6), expand = FALSE)

Instalar y cargar la librería “scales”. Este paquete permite implementar escalas de una manera independete al sistema de gráficos.

#install.packages("scales")
library(scales)
## 
## Attaching package: 'scales'
## The following object is masked from 'package:purrr':
## 
##     discard
## The following object is masked from 'package:readr':
## 
##     col_factor

Por medio de este cuadro de código se puede realizar un mapa que contenga la información de la columna ID_2 y a su vez asingar una escala de color de acuerdo con el número asignado a cada municipio.

ggplot(cundinamarca) + 
  geom_sf(data=cundinamarca_points, aes(x=X, y=Y, fill =
                                       ID_2), color = "black", size = 0.25) +
  geom_text(data = cundinamarca_points, aes(x=X, y=Y,label = ID_2), size = 1) +
  theme(aspect.ratio=1)+
  scale_fill_distiller(name="ID_2", palette = "BuPu", breaks = pretty_breaks(n = 5))+
  labs(title="Mapa de Cundinamarca")
## Warning: Ignoring unknown aesthetics: x, y

Esta visualización puede ser guardada como pdf o png por medio de la función “ggsave”

ggsave("cundinamarca_municipios.pdf")
## Saving 7 x 5 in image
ggsave("map_cundinamarca.png", width = 6, height = 6, dpi = "screen")

#5.Usar la librería “leaflet” para visualizar datos.

Primero se debe instalar y cargar la librería

#install.packages("leaflet")
library(leaflet)

Para usar la biblioteca es necesario convertir el objeto “cundi_points” a puntos espaciales.

#cun_points <- as(cundi_points, 'Spatial')

Para obtener el área de los municipios es necesario cargar la librería “lwgeom”

#install.packages("lwgeom")
library(lwgeom)
## Linking to liblwgeom 3.0.0beta1 r16016, GEOS 3.8.0, PROJ 6.3.1

El siguiente cuadro de código calcula el área de cada municipio en metros cuadrados

mun_cundi$area <- st_area(mun_cundi)

Ahora se obtiene el área de cada municipio pero en kilométros cuadrados

mun_cundi$km2 <- mun_cundi$area/(1000000)

Observar la salida del objeto creado

mun_cundi$km2
## Units: [m^2]
##   [1]   76.15363   66.44340  119.21639  119.85758  107.47458  184.38331
##   [7]  211.57878   52.30997   75.99254  117.53693  457.78629   59.40923
##  [13]   49.09098  592.53649  306.07664   81.08696  173.19669  119.07608
##  [19]  215.35620  319.86611  127.49569   53.16071   91.75662  120.19914
##  [25]  119.12324  476.79685  155.70691   74.20352  116.43546   69.93551
##  [31]  307.46709  422.85426   43.60324  353.11446  102.47574  106.21432
##  [37]  179.98855  785.82995  324.85095  119.43901  139.57971   62.74291
##  [43]  211.58357  607.42953  222.64887  335.18189  348.70941  157.17983
##  [49]  209.69651  135.08022  161.57786  145.41077  220.72771  119.14988
##  [55]  101.99121 1633.38987   94.86542  117.17884   99.77867  205.90696
##  [61]   74.27546   60.67551  393.49430  171.02753  100.00624  776.64209
##  [67]  146.68829  567.06836  186.86541   77.23026  202.57553  130.78296
##  [73]  147.32023   89.47211  193.42735  264.71363  123.48160  316.43054
##  [79] 1650.84698  100.16249  143.14552  105.48010  174.79363  106.28521
##  [85]  252.18718  119.75797  288.11260  187.33163  129.79540  115.06902
##  [91]   59.40725   73.51989  214.98681   82.08100  100.60445   92.41850
##  [97]   64.98824  262.08657   66.39905  154.53974  318.62965  112.95061
## [103]  114.96535   89.05010  135.46022  152.43358   77.24548  111.08833
## [109]   75.71577  198.60633  147.27553  198.06351  921.84588   55.61708
## [115]  188.60388

Se debe convertir el objeto cun_mun a poliginos espaciales

cun_mun <- as(mun_cundi, 'Spatial')

Seguido a ello, se debe preparar el plot

bins <- c(0, 50, 100, 200, 300, 500, 1000, 2000, Inf)
pal <- colorBin("YlOrRd", domain = cun_mun$km2, bins = bins)


labels <- mun_cundi$NAME_2

labels
##   [1] "Agua de Dios"                "Albán"                      
##   [3] "Anapoima"                    "Anolaima"                   
##   [5] "Apulo"                       "Arbeláez"                   
##   [7] "Beltrán"                     "Bituima"                    
##   [9] "Bojacá"                      "Cáqueza"                    
##  [11] "Cabrera"                     "Cachipay"                   
##  [13] "Cajicá"                      "Caparrapí"                  
##  [15] "Carmen de Carupa"            "Chía"                       
##  [17] "Chaguaní"                    "Chipaque"                   
##  [19] "Choachí"                     "Chocontá"                   
##  [21] "Cogua"                       "Cota"                       
##  [23] "Cucunubá"                    "El Colegio"                 
##  [25] "El Peñon"                    "Fómeque"                    
##  [27] "Facatativá"                  "Fúquene"                    
##  [29] "Fosca"                       "Funza"                      
##  [31] "Fusagasugá"                  "Gachalá"                    
##  [33] "Gachancipá"                  "Gachetá"                    
##  [35] "Gama"                        "Girardot"                   
##  [37] "Guachetá"                    "Guaduas"                    
##  [39] "Guasca"                      "Guataquí"                   
##  [41] "Guatavita"                   "Guayabal de Síquima"        
##  [43] "Guayabetal"                  "Gutiérrez"                  
##  [45] "Jerusalén"                   "Junín"                      
##  [47] "La Calera"                   "La Mesa"                    
##  [49] "La Palma"                    "La Peña"                    
##  [51] "La Vega"                     "Lenguazaque"                
##  [53] "Machetá"                     "Madrid"                     
##  [55] "Manta"                       "Medina"                     
##  [57] "Mosquera"                    "Nariño"                     
##  [59] "Nemocón"                     "Nilo"                       
##  [61] "Nimaima"                     "Nocaima"                    
##  [63] "Pacho"                       "Paime"                      
##  [65] "Pandi"                       "Paratebueno"                
##  [67] "Pasca"                       "Puerto Salgar"              
##  [69] "Pulí"                        "Quebradanegra"              
##  [71] "Quetame"                     "Quipile"                    
##  [73] "Ricaurte"                    "San Antonio del Tequendama" 
##  [75] "San Bernardo"                "San Cayetano"               
##  [77] "San Francisco"               "San Juan de Río Seco"       
##  [79] "Santafé de Bogotá"           "Sasaima"                    
##  [81] "Sesquilé"                    "Sibaté"                     
##  [83] "Silvania"                    "Simijaca"                   
##  [85] "Soacha"                      "Sopó"                       
##  [87] "Subachoque"                  "Suesca"                     
##  [89] "Supatá"                      "Susa"                       
##  [91] "Sutatausa"                   "Tabio"                      
##  [93] "Tausa"                       "Tena"                       
##  [95] "Tenjo"                       "Tibacuy"                    
##  [97] "Tibirita"                    "Tocaima"                    
##  [99] "Tocancipá"                   "Topaipí"                    
## [101] "Ubalá"                       "Ubaque"                     
## [103] "Une"                         "Utica"                      
## [105] "Venecia"                     "Vergara"                    
## [107] "Vianí"                       "Villa de San Diego de Ubaté"
## [109] "Villagómez"                  "Villapinzón"                
## [111] "Villeta"                     "Viotá"                      
## [113] "Yacopí"                      "Zipacón"                    
## [115] "Zipaquirá"

Ahora se crea el plot

m <- leaflet(cun_mun) %>%
  setView(-75.5, 7, 8)  %>% addPolygons(
  fillColor = ~pal(km2),
  weight = 2,
  opacity = 1,
  color = "black",
  dashArray = "3",
  fillOpacity = 0.7,
  highlight = highlightOptions(
    weight = 5,
    color = "PuRd",
    dashArray = "",
    fillOpacity = 0.7,
    bringToFront = TRUE),
  label = labels) %>%
  addLegend(pal = pal, values = ~km2, opacity = 0.7, title = "Cundimarca_Área",
    position = "bottomright")

Se llama al objeto que da lugar al siguiente mapa donde se puede observar la división administrativa de Cundinamrca y a su vez el tamaño aproximado de los municipios en kilómetros cuadrados gracias a la escala de color

m

Este cuadro de código corresponde a otra visualización más simple de Cundinamarca y sus departamentos

leaflet() %>%
  addProviderTiles(providers$Esri.WorldImagery, options= providerTileOptions(opacity = 0.99)) %>%
  addPolygons(data = cun_mun, popup= cun_mun$NAME_2, 
    stroke = TRUE, fillOpacity = 0.25, smoothFactor = 0.25
  )

Otra representación usando Esri.NatGeoworldMap. Este permite visualizar la topografía del terreno

leaflet() %>%
  addProviderTiles(providers$Esri.NatGeoWorldMap, options= providerTileOptions(opacity = 1)) %>%
  addPolygons(data = cun_mun, popup= cun_mun$NAME_2, 
    stroke = TRUE, fillOpacity = 0.25, smoothFactor = 1, weight = 2
  )

Otra visualización similar

leaflet() %>%
  addProviderTiles(providers$Esri.WorldStreetMap, options= providerTileOptions(opacity = 1)) %>%
  addPolygons(data = cun_mun, popup= cun_mun$NAME_2, 
    stroke = TRUE, fillOpacity = 0.25, smoothFactor = 1, weight = 2
  )

A paritr de este código se puede observar una vista de la ciduad capital de Cundimarca (Bogotá). Se realiza un procedimiento similiar al realizado cuando se visualizó Cundinamarca

municipios <- read_sf("C:/Users/JUAN PABLO/Documents/geo maps/COL_adm2.shp")
head(municipios)
bogota <- municipios %>% filter(NAME_2 == "Santafé de Bogotá")
ggplot() + geom_sf(data = bogota, fill="orchid")

leaflet() %>%
  addProviderTiles(providers$Esri.NatGeoWorldMap, options= providerTileOptions(opacity = 0.99)) %>%
  addPolygons(data = bogota, popup= bogota$NAME_2,
    stroke = TRUE, fillOpacity = 0.25, smoothFactor = 0.25, weight = 2
  )
rpubs.upload.method="internal"