1. Introduction

Se realizara observaciones de algunas funciones geoespaciales utilizando el software de R, para esto el primer paso es instalar las librerias necesarias utilizando el siguiente comando:

#install.package(c("tydiverse", "sf"))

posteriormente se debe cargar las librerias, para la primera se utiliza el comando

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

2. Leer el vector datos

Una vez descargados los archivos nescesarios desde la pagina oficial del DANE, cargamos el shapefile que contiene los datos del departamento de Nariño:

deptos <- read_sf("C:/Users/USER/Desktop/Geomatica/52_NARIÑO/ADMINISTRATIVO/MGN_DPTO_POLITICO.shp")

Se observa los datos que contiene el objeto deptos que fue creado:

head(deptos)

Para conocer el sistema de referencia de las coordenadas de los datos vectoriales almacenados en el objeto deptos se puede usar la función st_crs:

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. Usamos ggplot para vizualizar los datos espaciales.

Para comprender los datas lo mejor es trazarlos, para ello es posible utilizar las funcionalidades de ggplot.

El primer paso es instalar la libreria:

#install.packages("ggplot2")

Y por supuesto hay que cargar la libreria instalada

library(ggplot2)

Ahora si utilizamos los datos del objeto deptos con las funciones de ggplot:

ggplot() + geom_sf(data = deptos)

Por otra parte, si se quiere hacer una obserbacion bajo el sistema de coordenadas nacional, para el departamento de nariño se utilizara la referencia EPSG: 3115 la cual pertenece al sistema MAGNA-SIRGAS para la zona oeste de Colombia:

ggplot() + geom_sf(data = deptos) + coord_sf(crs = st_crs(3115))

En caso de necesitar usar el CRS con codigo EPSG 21818. El cual corresponde a UTM zona 18N usanto st_crs:

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

Y se visualizan los datos de este nuevo objeto:

deptos_utm

De nuevo se visualiza el objeto:

ggplot() + geom_sf(data = deptos_utm)

4. Filtrando datos geoespaciales basados en atributos

deptos_utm

Ahora nos interasa filtrar los municipios que presenta el departamento de Nariño:

munic_nariño <- read_sf("C:/Users/USER/Desktop/Geomatica/52_NARIÑO/ADMINISTRATIVO/MGN_MPIO_POLITICO.shp")
ggplot() + geom_sf(data = munic_nariño)

El objeto munic_nariño

munic_nariño

Es miportante enumerar los municipios, para esto hay que agregar una nuema columna con la funcion cbind, donde podremos enumerar las filas.

munic_nariño=cbind(munic_nariño, ID_1=rep(seq(1,64,1)))

Para configurar el punto del centroide del objeto munic_nariño, para esto se utiliza la función st_centroid:

nariño_points <- st_centroid(munic_nariño)
## Warning in st_centroid.sf(munic_nariño): 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
nariño_points <- cbind(munic_nariño, st_coordinates(st_centroid(munic_nariño$geometry)))
## Warning in st_centroid.sfc(munic_nariño$geometry): st_centroid does not give
## correct centroids for longitude/latitude data

Lo siguiente es observar el objeto nariño con sus municipios enumerados:

ggplot(deptos) + 
  geom_sf() +  
  geom_sf(data = nariño_points, fill= "antiquewhite") +
  geom_text(data = nariño_points, aes(x=X, y=Y, label= ID_1), size = 2) +
  coord_sf(xlim = c(-79.1, -76.8), ylim = c(0.3, 2.8), expand = FALSE) + xlab("Longitud") + ylab("Latitud")

Para el siguiente paso, primero hace falta instalar la libreria scales

#install.packages("scales")

Se llama a la libreria

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

Para finalizar esta seccion observamos de nuevo los municipios numerados, pero con una escala de color:

ggplot(deptos) +
  geom_sf(data= nariño_points, aes(x=X, y=Y, fill= ID_1),color="black", size = 0.25) + 
  geom_text(data= nariño_points, aes(x=X, y=Y, label= ID_1), size = 2) +
  theme(aspect.ratio=1) +
  scale_fill_distiller(name ="N° Mun",palette = "Spectral", breaks= pretty_breaks(n=10)) +
  labs(title="Mapa Nariño a escala") + coord_sf(xlim = c(-79.1, -76.8), ylim = c(0.3, 2.8), expand = FALSE) + xlab("Longitud") + ylab("Latitud")
## Warning: Ignoring unknown aesthetics: x, y

Sin embargo, esta visualizacion no es un mapa real. De igual forma, es posible guardar la salida como PDF o PNG:

ggsave("Nariño_municipios.pdf")
## Saving 7 x 5 in image
ggsave("map_nariño.png", width = 6, height = 6, dpi = "screen")

5. Usando leaflet para vizualizar los datos

El primer paso es instalar la libreria leafflet usando el comando:

#install.packages("leaflet")

Y se llama a la libreria:

library(leaflet)

Para poder usar la libreria, se necesita convertir el objeto de nariño_points desde simple features a spatial points:

nar_points <- as(nariño_points, 'Spatial')

Y para ver lo que hay dentro del objeto se usa:

#head(nar_points)

Para poder ver el area de los municipios se instala el paquete lwgeom

#install.packages("lwgeom")

Y se carga la libreria:

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

Ahora es posible calcular el area de cada municipio (en metros cuadrados) de la siguiente forma:

munic_nariño$area <- st_area(munic_nariño)

Y ahora se busca almacenar el área en kilómetros cuadrados:

munic_nariño$km2 <- munic_nariño$area/(1000000)

se verifica la salida:

munic_nariño$km2
## Units: [m^2]
##  [1]  101.25724   64.99166  248.39090  386.96405  111.57203   39.79601
##  [7]   55.49148  349.01380  538.40673  129.15778  602.62339  118.94025
## [13]   43.05150  303.62802 1096.11385   38.50430   47.44962   56.88452
## [19]   68.65473   60.01407   41.73274  634.16147   61.58378   25.22962
## [25]   64.60346  115.08920  233.90009  217.24463  145.81539  119.44494
## [31]  306.10785  215.43633  135.17101  102.38269  566.56033  238.25391
## [37]  135.85540  246.52511  393.48336  155.02832  141.74342  116.31368
## [43]  309.42650   29.84915   80.23950   81.43645 1566.53096  911.10183
## [49]  353.82363  518.49216  244.01202  953.00053  432.80073 1050.64666
## [55] 2719.00147 2480.07375  413.73801 1799.38198  763.58791  997.66434
## [61]  521.91233 1449.45897 1219.17160 3588.53943

De nuevo, se necesita hacer una conversion desde simples features a spatial polygons:

nar_mun <- as(munic_nariño, 'Spatial')

Y se observa lo que hay dentro del objeto:

#head(nar_mun)

Ahora, hay que preparar el plot:

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


labels <- munic_nariño$MPIO_CNMBR

labels
##  [1] "SANDONÁ"                          "SAN BERNARDO"                    
##  [3] "SAN LORENZO"                      "POTOSÍ"                          
##  [5] "SAN PABLO"                        "PROVIDENCIA"                     
##  [7] "SAN PEDRO DE CARTAGO"             "PUERRES"                         
##  [9] "SANTA CRUZ (Guachavés)"           "PUPIALES"                        
## [11] "SAMANIEGO"                        "CONSACÁ"                         
## [13] "CONTADERO"                        "CÓRDOBA"                         
## [15] "PASTO"                            "ALBÁN (San José)"                
## [17] "ALDANA"                           "CUASPUD"                         
## [19] "ANCUYA"                           "ARBOLEDA"                        
## [21] "BELEN"                            "BUESACO"                         
## [23] "COLON"                            "NARIÑO"                          
## [25] "OSPINA"                           "SAPUYES"                         
## [27] "TAMINANGO"                        "TANGUA"                          
## [29] "CHACHAGÜÍ"                        "EL PEÑOL"                        
## [31] "EL TABLÓN DE GÓMEZ"               "TUQUERRES"                       
## [33] "LINARES"                          "YACUANQUER"                      
## [35] "MALLAMA (Piedrancha)"             "LA CRUZ"                         
## [37] "LA FLORIDA"                       "EL TAMBO"                        
## [39] "FUNES"                            "GUACHUCAL"                       
## [41] "LA UNIÓN"                         "GUAITARILLA"                     
## [43] "LEIVA"                            "GUALMATÁN"                       
## [45] "ILES"                             "IMUES"                           
## [47] "IPIALES"                          "CUMBAL"                          
## [49] "CUMBITARA"                        "EL ROSARIO"                      
## [51] "LA LLANADA"                       "LOS ANDES"                       
## [53] "POLICARPA"                        "RICAURTE"                        
## [55] "BARBACOAS"                        "EL CHARCO"                       
## [57] "LA TOLA"                          "MAGÜÍ (Payán)"                   
## [59] "MOSQUERA"                         "OLAYA HERRERA (Bocas de Satinga)"
## [61] "FRANCISCO PIZARRO (Salahonda)"    "ROBERTO PAYÁN (San José)"        
## [63] "SANTA BÁRBARA (Iscuandé)"         "TUMACO"

Ahora, podemos crear el plot interactivo:

m <- leaflet(nar_mun) %>%
  setView(-77.8, 1.3, 7)  %>% addPolygons(
  fillColor = ~pal(km2),
  weight = 2,
  opacity = 1,
  color = "white",
  dashArray = "3",
  fillOpacity = 0.7,
  highlight = highlightOptions(
    weight = 5,
    color = "#666",
    dashArray = "",
    fillOpacity = 0.7,
    bringToFront = TRUE),
  label = labels) %>%
  addLegend(pal = pal, values = ~km2, opacity = 0.7, title = NULL,
    position = "bottomright")

Y observamos el plot:

m

Y para mejorar la observación, se utiliza mapas bases como muestra a continuación:

leaflet() %>%
  addProviderTiles(providers$CartoDB.DarkMatterNoLabels , options = providerTileOptions( opacity = 0.99)) %>%
  addPolygons(data = nar_mun, popup = nar_mun$MPIO_CNMBR, fillColor = ~pal(km2) ,
    weight = 2,
    opacity = 1,
    color = 'white',
    dashArray = "3",
    fillOpacity = 0.7,
    highlight = highlightOptions(
      weight = 5,
      fillOpacity = 0.7,
      bringToFront = TRUE),
    label = labels, stroke = TRUE, smoothFactor = 0.25)
leaflet() %>%
  addProviderTiles(providers$Wikimedia , options = providerTileOptions( opacity = 0.99)) %>%
  addPolygons(data = nar_mun, popup = nar_mun$MPIO_CNMBR, fillColor = ~pal(km2) ,
    weight = 2,
    opacity = 1,
    color = 'white',
    dashArray = "3",
    fillOpacity = 0.7,
    highlight = highlightOptions(
      weight = 5,
      fillOpacity = 0.7,
      bringToFront = TRUE),
    label = labels, stroke = TRUE, smoothFactor = 0.25)

```