1. Introducción

Este trabajo utiliza el lenguaje de R para trabajar con datos geoespaciales vectoriales(tipo de datos geográficos que representan la localización y forma de objetos en la Tierra mediante geometrías precisas) a través del paquete sf (simple features),entre otros, es una herramienta moderna que reemplaza al antiguo paquete sp. El paquete sf permite la lectura, escritura, visualización, análisis y manipulación de datos espaciales, de manera similar a lo que se realiza en software SIG como QGIS o ArcGIS, con la diferencia que aprovecha las herramientas y capacidad de manejo de datos y comandos de R.

2. Llamar las librerias necesarias

Primero se carga el paquete sf para trabajar con datos espaciales y dplyr para manipulación de datos.Esto permite el uso de funciones como st_read(), st_write(), filter(), entre muchas otras. De esta foorma, Los paquetes quedan disponibles para su uso en el script. #mesagge = False, warning = FALSE <- PARA BORRAR MENSAJES DESPUES DE LAS LIBRERIAS

library(sf)
## Linking to GEOS 3.13.1, GDAL 3.10.2, PROJ 9.5.1; sf_use_s2() is TRUE
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

2. Continuación de carga de librerias necesarias

Se cargan las siguientes dos librerias necesarias para el desarrollo del trabajo: ggplot2 para visualización de datos y ggspatial para agregar elementos espaciales (escalas, flechas del norte); esto con el fin de generar mapas temáticos más complejos y profesionales.

library(ggplot2)
library(ggspatial)

3. Lectura y escritura de datos espaciales

La función lista los archivos disponibles en una carpeta determinada con una dirección determinada. Esto verifica que el archivo .shp se encuentra en la ruta correcta antes de leerlo.

list.files("C:/Users/menju/OneDrive/Documentos/GB2/Rstudio/MGN2023_MPIO_POLITICO")
## [1] "MGN_ADM_MPIO_GRAFICO.cpg"     "MGN_ADM_MPIO_GRAFICO.dbf"    
## [3] "MGN_ADM_MPIO_GRAFICO.prj"     "MGN_ADM_MPIO_GRAFICO.sbn"    
## [5] "MGN_ADM_MPIO_GRAFICO.sbx"     "MGN_ADM_MPIO_GRAFICO.shp"    
## [7] "MGN_ADM_MPIO_GRAFICO.shp.xml" "MGN_ADM_MPIO_GRAFICO.shx"

3a. Lectura con st_read

Lee un archivo shapefile que contiene los límites políticos de los municipios de Colombia, en esta parte se puede especificar la ruta relativa para leer el shapefile. A la misma vez se crea un objeto sf llamado colombia que contiene geometrías y atributos.

colombia <- st_read("C:/Users/menju/OneDrive/Documentos/GB2/Rstudio/MGN2023_MPIO_POLITICO/MGN_ADM_MPIO_GRAFICO.shp")
## Reading layer `MGN_ADM_MPIO_GRAFICO' from data source 
##   `C:\Users\menju\OneDrive\Documentos\GB2\Rstudio\MGN2023_MPIO_POLITICO\MGN_ADM_MPIO_GRAFICO.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 1121 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -81.73562 ymin: -4.229406 xmax: -66.84722 ymax: 13.39473
## Geodetic CRS:  MAGNA-SIRGAS

Visualización de las primeras filas del objeto colombia.

Esta Permite inspeccionar los datos: nombres de departamentos, municipios, códigos, etc. Al usar st_read para leer un shapefile, obtenemos una vista previa de algunos de sus metadatos espaciales. Los datos se leyeron con el controlador ESRI Shapefile. Los datos incluyen 1121 entidades (el número de municipios de Colombia) y tienen 11 campos de atributos.

El tipo de geometría es multipolígono (Un multipolígono representa múltiples áreas o regiones geográficas delimitadas. Se usa comúnmente para mostrar territorios, límites o regiones que constan de múltiples formas. Configuración: Para configurar un multipolígono, se definen los polígonos individuales que conforman un área mayor. Cada polígono tiene un conjunto de coordenadas que definen su forma. El multipolígono agrupa estos polígonos para representar un área geográfica más compleja.)

El cuadro delimitador es el rectángulo más pequeño que encierra completamente un objeto espacial o conjunto de objetos. Se define por sus coordenadas mínimas y máximas en latitud (Y) y longitud (X). En este caso tenemos los siguientes datos: xmin: -81.73562 ymin: -4.229406 xmax: -66.84722 ymax: 13.39473

El sistema de referencia de coordenadas (SRC) es MAGNA-SIRGAS el cual es un sistema de referencia geocéntrico utilizado en Colombia, compatible con marcos globales como el ITRF (ej. ITRF2008, ITRF2014), basado en el datum SIRGAS. Emplea el elipsoide GRS80, con un semieje mayor de 6,378,137.0 m, un achatamiento de 1/298.257222101 y un semieje menor de aproximadamente 6,356,752.3141 m. Utiliza coordenadas geodésicas (latitud, longitud, altura elipsoidal), en grados decimales y metros.

head(colombia)
## Simple feature collection with 6 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -76.18451 ymin: 5.664284 xmax: -74.83629 ymax: 7.29255
## Geodetic CRS:  MAGNA-SIRGAS
##   dpto_ccdgo mpio_ccdgo mpio_cdpmp dpto_cnmbr mpio_cnmbr
## 1         05        001      05001  ANTIOQUIA   MEDELLÍN
## 2         05        002      05002  ANTIOQUIA  ABEJORRAL
## 3         05        004      05004  ANTIOQUIA   ABRIAQUÍ
## 4         05        021      05021  ANTIOQUIA ALEJANDRÍA
## 5         05        030      05030  ANTIOQUIA      AMAGÁ
## 6         05        031      05031  ANTIOQUIA     AMALFI
##                          mpio_crslc mpio_tipo mpio_narea mpio_nano shape_Leng
## 1                              1965 MUNICIPIO  374.83400      2023  1.0353800
## 2                              1814 MUNICIPIO  507.14109      2023  1.1585036
## 3                              1912 MUNICIPIO  296.89405      2023  0.8121832
## 4 Decreto departamental 304 de 1907 MUNICIPIO  128.93215      2023  0.7051995
## 5                              1912 MUNICIPIO   84.13248      2023  0.4455330
## 6                              1843 MUNICIPIO 1209.14546      2023  2.0587316
##    shape_Area                       geometry
## 1 0.030607649 MULTIPOLYGON (((-75.66974 6...
## 2 0.041383896 MULTIPOLYGON (((-75.46938 5...
## 3 0.024248255 MULTIPOLYGON (((-76.08351 6...
## 4 0.010534527 MULTIPOLYGON (((-75.0332 6....
## 5 0.006866507 MULTIPOLYGON (((-75.67587 6...
## 6 0.098921101 MULTIPOLYGON (((-74.91836 7...

3b. Escritura de datos espaciales con st_write

Para exportar datos espaciales, la función st_write() puede guardar un objeto sf en diversos formatos. Esta función escribe el objeto colombia a un archivo GeoPackage (.gpkg) y asi guardar los datos en un formato espacial moderno y más flexible que .shp.

st_write(colombia, "municipios.gpkg", driver = "GPKG", append = F)
## Deleting layer `municipios' using driver `GPKG'
## Writing layer `municipios' to data source `municipios.gpkg' using driver `GPKG'
## Writing 1121 features with 11 fields and geometry type Multi Polygon.

Se usa comando list.files()

El argumento pattern = “gpkg” le dice a la función que solo muestre los archivos cuyos nombres contengan la cadena “gpkg”

list.files(pattern="gpkg")
## [1] "municipios.gpkg"  "stder_munic.gpkg"

Se usa comando st_read()

st_read() se usa para leer archivos espaciales, como shapefiles (.shp) o GeoPackages (.gpkg); “municipios.gpkg” es el nombre del archivo GeoPackage que contiene información geográfica de los municipios de Colombia, es decir, el comando lee el contenido de este archivo. La expresión colombia2 <- asigna el resultado (los datos espaciales) a un objeto llamado colombia2.

colombia2 <- st_read("municipios.gpkg")
## Reading layer `municipios' from data source 
##   `C:\Users\menju\OneDrive\Documentos\GB2\Rstudio\municipios.gpkg' 
##   using driver `GPKG'
## Simple feature collection with 1121 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -81.73562 ymin: -4.229406 xmax: -66.84722 ymax: 13.39473
## Geodetic CRS:  MAGNA-SIRGAS

4. Seleccion de Caracteristicas

4a. Seleccionar por atributo

La herramienta “Seleccionar por atributos” del software SIG permite proporcionar una expresión de consulta SQL(Structured Query Language (Lenguaje de Consulta Estructurado, es un lenguaje diseñado para gestionar y manipular bases de datos relacionales.) para seleccionar entidades que cumplan con los criterios de selección.

Por otro lado, sf y dplyr ofrecen opciones bastante sencillas para realizar operaciones similares.

(Tolima <- dplyr::filter(colombia, dpto_cnmbr=="TOLIMA"))
## Simple feature collection with 47 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -76.10574 ymin: 2.871081 xmax: -74.47482 ymax: 5.319342
## Geodetic CRS:  MAGNA-SIRGAS
## First 10 features:
##    dpto_ccdgo mpio_ccdgo mpio_cdpmp dpto_cnmbr        mpio_cnmbr
## 1          73        001      73001     TOLIMA            IBAGUÉ
## 2          73        024      73024     TOLIMA         ALPUJARRA
## 3          73        026      73026     TOLIMA          ALVARADO
## 4          73        030      73030     TOLIMA          AMBALEMA
## 5          73        043      73043     TOLIMA        ANZOÁTEGUI
## 6          73        055      73055     TOLIMA            ARMERO
## 7          73        067      73067     TOLIMA             ATACO
## 8          73        124      73124     TOLIMA         CAJAMARCA
## 9          73        148      73148     TOLIMA CARMEN DE APICALÁ
## 10         73        152      73152     TOLIMA        CASABIANCA
##                               mpio_crslc mpio_tipo mpio_narea mpio_nano
## 1                                   1906 MUNICIPIO  1377.2514      2023
## 2  Decreto 650 del 13 de Octubre de 1887 MUNICIPIO   501.5113      2023
## 3                                   1540 MUNICIPIO   344.3356      2023
## 4                                   1627 MUNICIPIO   238.0376      2023
## 5   Ordenanza 21 del 30 de Marzo de 1915 MUNICIPIO   469.7113      2023
## 6  Decreto 1049 de Septiembre 29 de 1908 MUNICIPIO   440.6308      2023
## 7  Decreto 650 del 13 de Octubre de 1887 MUNICIPIO  1017.6598      2023
## 8                                   1913 MUNICIPIO   508.4909      2023
## 9  Decreto 650 del 13 de Octubre de 1887 MUNICIPIO   190.8361      2023
## 10  Ordenanza 26 del 22 de Junio de 1896 MUNICIPIO   174.9306      2023
##    shape_Leng shape_Area                       geometry
## 1   2.4800420 0.11217106 MULTIPOLYGON (((-75.36517 4...
## 2   1.0547137 0.04080342 MULTIPOLYGON (((-74.99192 3...
## 3   1.0695888 0.02805438 MULTIPOLYGON (((-74.97668 4...
## 4   1.0091029 0.01940220 MULTIPOLYGON (((-74.74744 4...
## 5   1.3101775 0.03826692 MULTIPOLYGON (((-75.20098 4...
## 6   1.4441004 0.03592418 MULTIPOLYGON (((-74.88687 5...
## 7   2.2522480 0.08276960 MULTIPOLYGON (((-75.3251 3....
## 8   1.0293681 0.04140402 MULTIPOLYGON (((-75.48219 4...
## 9   0.7339295 0.01554073 MULTIPOLYGON (((-74.74471 4...
## 10  1.0803200 0.01425931 MULTIPOLYGON (((-75.07491 5...

#Confirmación de información correcta Luego de verificar los datos, se construye un gráfico básico de los municipios de Tolima, se realiza el trazado de los límites de los municipios, así como sus centroides.

plot(st_geometry(Tolima), col = sf.colors(12, categorical = TRUE), border = 'grey', axes = TRUE)
plot(st_geometry(st_centroid(Tolima)), pch = 3, col = 'red', add = TRUE)

st_write(Tolima, "stder_munic.gpkg", driver = "GPKG", append = F)
## Deleting layer `stder_munic' using driver `GPKG'
## Writing layer `stder_munic' to data source `stder_munic.gpkg' using driver `GPKG'
## Writing 47 features with 11 fields and geometry type Multi Polygon.

4b. Seleccionar por ubicacion

Ahora se escriben las entidades seleccionadas en un nuevo archivo geopackage para usarlas después:

cities = read.csv('C:/Users/menju/OneDrive/Documentos/GB2/Rstudio/worldcities.csv') %>% 
         st_as_sf(coords=c("lng","lat"), crs=4326)

Primero, se lee el archivo CSV que contiene ciudades del

cities
## Simple feature collection with 47868 features and 9 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: -179.6 ymin: -54.9333 xmax: 179.3703 ymax: 81.7166
## Geodetic CRS:  WGS 84
## First 10 features:
##           city  city_ascii      country iso2 iso3       admin_name capital
## 1        Tokyo       Tokyo        Japan   JP  JPN            Tōkyō primary
## 2      Jakarta     Jakarta    Indonesia   ID  IDN          Jakarta primary
## 3        Delhi       Delhi        India   IN  IND            Delhi   admin
## 4    Guangzhou   Guangzhou        China   CN  CHN        Guangdong   admin
## 5       Mumbai      Mumbai        India   IN  IND      Mahārāshtra   admin
## 6       Manila      Manila  Philippines   PH  PHL           Manila primary
## 7     Shanghai    Shanghai        China   CN  CHN         Shanghai   admin
## 8    São Paulo   Sao Paulo       Brazil   BR  BRA        São Paulo   admin
## 9        Seoul       Seoul Korea, South   KR  KOR            Seoul primary
## 10 Mexico City Mexico City       Mexico   MX  MEX Ciudad de México primary
##    population         id                 geometry
## 1    37732000 1392685764 POINT (139.6922 35.6897)
## 2    33756000 1360771077  POINT (106.8275 -6.175)
## 3    32226000 1356872604      POINT (77.23 28.61)
## 4    26940000 1156237133     POINT (113.26 23.13)
## 5    24973000 1356226629  POINT (72.8775 19.0761)
## 6    24922000 1608618140 POINT (120.9772 14.5958)
## 7    24073000 1156073548 POINT (121.4747 31.2286)
## 8    23086000 1076532519  POINT (-46.6333 -23.55)
## 9    23016000 1410836482     POINT (126.99 37.56)
## 10   21804000 1484247881 POINT (-99.1333 19.4333)
st_crs(cities)$epsg
## [1] 4326

#Comprobación de similitud de datos

st_crs(Tolima)$epsg
## [1] 4686

#Transformación de datos Antes de usar cualquier selección por ubicación, se debe transformar el CRS de ciudades para que coincida con el CRS de Tolima. Se puede hacer usando la función st_transform:

ncities <- st_transform(cities, crs= st_crs(Tolima))
Tol_cities <- ncities[Tolima, , op = st_within]

Comprobar si se hicieron los cambios correctos

Se realiza un grafico rudimentario con el fin de saber si tenemos los datos necesarios para obtener un buen resultado final

plot(st_geometry(Tolima), col = sf.colors(12, categorical = TRUE), border = 'grey', axes = TRUE)
plot(st_geometry(Tol_cities), pch = 19, col = 'red', add = TRUE)

5. Trazando con elegancia

5a. Trazando con ggplot

Usaremos ggplot() y llamaremos a geom_sf(), que indica a R que estamos trabajando con datos espaciales. Se obtiene entonces un mapa modelo de los limites y nombres de los municipios pertenecientes al departameto del Tolima

ggplot() +
  #Add  municipalities
  geom_sf(data = Tolima) +
  #Add cities layer
  geom_sf(data = Tol_cities, aes(color = city, label = city), size = 3) +
  #Add titles
  labs(x = "Longitud", y = "Latitud", title = "Ciudades de Tolima") +
  #Add theme
  theme_bw()

5b. Trazando usando ggplot y ggspatial

Ahora se agregan algunos elementos personalizados al mapa, como una flecha de norte y una barra de escala, usando el paquete R ggspatial

ggplot()+
  #Crop Virginia boundary to spatial extent of cities and add Virginia layer
  geom_sf(data = Tolima) +
  #Add cities layer
  geom_sf(data = Tol_cities, aes(color = city, label = city), size = 3) +
  #Add scale bar to bottom left from ggspatial
  annotation_scale(location = "tr", height = unit(.25, "cm"), 
                   width = unit(1, "cm"), pad_x = unit(1.65, "in"), 
                   pad_y = unit(0.5, "in")) +
  #Add north arrow to bottom left from ggspatial
  annotation_north_arrow(height = unit(1, "cm"), width = unit(1.5, "cm"),
                         which_north = "true", location = "tr", 
                         pad_x = unit(1.65, "in"), pad_y = unit(0.05, "in")) +
  #Add titles
  labs(x = "Longitud", y = "Latitud", title = "Ciudades de Tolima") +
  #Add theme
  theme_bw()