1. Introducción

El paquete sf (simple features) es una herramienta para el manejo y análisis de datos geoespaciales en R. Permite trabajar con datos vectoriales implementando el modelo de geometrias dentro del entorno de programación R.El formato Simple Features (sf) permite trabajar con entidades espaciales como puntos, líneas y polígonos, incluyendo su geometría y atributos asociados. Esta libreria, además de facilitar la manipulación de datos bajo el estándar sf, proporciona funciones para análisis espacial, filtrado, unión, transformación de sistemas de coordenadas, y visualización geográfica. Entre sus funciones más representativas se encuentran: st_read(), st_write(), st_as_sf() y st_geometry() las cuales permiten interactuar con los datos espaciales.

Objetivos

A través de este cuaderno se pretende explorar las funcionalidades principales del paquete sf, aplicadas al análisis geográfico y territorial del departamento del Putumayo. Para ello, se desarrollará la creación de un mapa utilizando librerías de visualización como ggplot2, integrando funciones de otros paquetes complementarios. El paquete sf destaca por ofrecer una interfaz compatible y coherente con el ecosistema del tidyverse, lo que permite realizar análisis espaciales de manera eficiente.

Requisitos

Se debe contar con un archivo shapefile como el proporcionado por el DANE. Para realizar este análisis espacial, es indispensable contar con un archivo shapefile (.shp) que contenga la información geográfica de los municipios de Colombia. En este caso, se utilizó el shapefile proporcionado por el DANE , el cual incluye la división político-administrativa del país. Este archivo contiene datos vectoriales en formato poligonal, representando cada municipio con su respectiva geometría.

2. Configuración

Como proposito de esta sección es dejar listo el entorno de trabajo en R para manipular datos espaciales vectoriales, asegurando la instalación de las librerias y carga de los paquetes. Paquetes requeridos:

sf

Permite Leer, manipular y analizar datos espaciales vectoriales (como shapefiles, geopackages) siguiendo el estándar Simple Features.

dplyr

Es una herramienta del paquete tidyverse, sirve para manipular y transformar data frames (tibbles).

ggplot2

Un paquete para visualización gráfica, en este proyecto se utilizará para representar mapas del departamento del Putumayo.

ggspatial

Es un complemento de ggplot2 que permite añadir elementos cartográficos a los mapas, como la escala del mapa, flecha norte.

2.1 Instalación de paquetes

Para instalar los aquetes se pueden instalar con la función install.packages(“nombre_paquete”) o, de forma más sencilla, desde la pestaña Packages del entorno de trabajo de RStudio. Una vez instalados, se cargan con la función library() de la siguiente manera: NOTA: El codigo escrito en la primera linea es para ocultar los mensajes y advertencias que puedan aparecer al cargar los paquetes con el fin de mantener un orden en este proyecto.

library(sf)
library(dplyr)
library(ggplot2)
library(ggspatial)

2.2 Lectura de datos espaciales

Esta sección tiene como objetivo cargar y explorar los datos espaciales de los municipios de Colombia, a partir de un archivo shapefile proporcionado por el DANE. Con la función list.files, miramos todos los archivos contenidos en la carpeta de municipio y nos aseguramos que el archivo .shp esté presente en el directorio de trabajo.

list.files("./datos/municipios")
## [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"    
## [9] "municipio_putumayo.gpkg"

2.3 Información contenida en variable

En esta sección, vamos a leer el archivo espacial vectorial con el nombre de “MGN_ADM_MPIO_GRAFICO.shp” utilizando la función st_read(). Miramos que información esta contenida en la variable “colombia” Como resultado del proceso, se muestra información clave como el tipo de geometría, el número de registros, el sistema de referencia espacial, la caja delimitada

colombia <- st_read("./datos/municipios/MGN_ADM_MPIO_GRAFICO.shp")
## Reading layer `MGN_ADM_MPIO_GRAFICO' from data source 
##   `D:\P3_lISBETH\datos\municipios\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

La función head() permite inspeccionar los primeros atributos que contiene el archivo como códigos DANE, nombres de municipios y coordenadas de referencia.

head(colombia)

2.4 Generación de archivo GeoPackage

En este paso se guarda el objeto espacial colombia en un nuevo archivo de tipo GeoPackage (.gpkg) utilizando la función st_write() del paquete sf. Este tipo de archivo permite almacenar información geográfica vectorial, con múltiples capas y atributos.

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.

2.5 Verificación del archivo creado

Se verifica que el archivo se haya creado correctamente utilizando list.files()

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

2.6 Relectura del GeoPackage

se lee nuevamente con st_read() para confirmar su contenido y garantizar que los datos espaciales han sido correctamente exportados y pueden ser reutilizados.

colombia2 <- st_read("./municipios.gpkg")
## Reading layer `municipios' from data source `D:\P3_lISBETH\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

3.Seleccionar datos Geográficos

3.1 Filtrado espacial

Aquí se utiliza el paquete dplyr junto con sf para filtrar datos espaciales del departamento de Putumayo. Se seleccionan todos los municipios cuyo departamento es “PUTUMAYO” con la función dplyr::filter() y este nuevo resultado se gaarda en una variable denominada putumayo. Utilizamos la función head para visualizan las primeras filas del objeto putumayo.

putumayo <- dplyr::filter(colombia, dpto_cnmbr=="PUTUMAYO")
head(putumayo)

3.2 Creación del mapa

Se grafican los polígonos de los municipios y también se representan sus centroides, mostrando un símbolo rojo en cada centroide.

plot(st_geometry(putumayo), col = sf.colors(12, categorical = TRUE), border = 'grey', 
     axes = TRUE)
plot(st_geometry(st_centroid(putumayo)), pch = 1, col = 'red', add = TRUE)
## Warning: st_centroid assumes attributes are constant over geometries

3.3 Nuevamente creamos un geopackage

El subconjunto de PUTUMAYO es guardado como un archivo .gpkg, lo que permite conservar la información espacial para reutilizarla

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

4. Subir datos de Cuidades

En esta sección se integran datos externos de ciudades con el fin de analizar su distribución espacial dentro del departamento del Putumayo. Para ello, se emplea un archivo .csv que contiene información geográfica como latitud y longitud, Se listan los archivos contenidos en la carpeta datos/ciudades para asegurarse de que el archivo worldcite_R.csv está disponible.

list.files("datos/ciudades")
## [1] "license.txt"            "New_cities.csv"         "putumayo_ciudades.gpkg"
## [4] "worldcite_R.csv"        "worldcities.xlsx"       "worldcities_enfila.csv"

4.1 Lectura del archivo CSV

Se carga el archivo worldcite_R.csv, el cual contiene datos de diferentes ciudades del mundo. Se especifica que el separador que corresponde a “;” y se define el sistema de codificación latin1 para evitar problemas con caracteres especiales.

ciudades <- read.csv("datos/ciudades/worldcite_R.csv", sep = ";", fileEncoding = "latin1")

Remplazamos las comas de las coordenadas geográficas lat y lng por puntos, para convertir a valores numéricos y poder tratarlos como datos espaciales.

ciudades$lat <- as.numeric(gsub(",", ".", ciudades$lat))
ciudades$lng <- as.numeric(gsub(",", ".", ciudades$lng))

4.2 Corrección de codificación de texto

Se corrigen los errores de codificación en las columnas city y admin_name que presentaban caracteres mal interpretados (como Ã, Â, etc.). Se transforman desde latin1 a UTF-8, garantizando que los nombres de las ciudades se muestren correctamente.

ciudades$city <- iconv(ciudades$city, from = "latin1", to = "UTF-8")
ciudades$admin_name <- iconv(ciudades$admin_name, from = "latin1", to = "UTF-8")

4. 3 Conversión a objeto espacial (Simple Features)

Se convierte el data frame ciudades en un objeto espacial de tipo sf, utilizando las columnas lng (longitud) y lat (latitud) como coordenadas. Se especifica el sistema de referencia EPSG:4326, que es el más usado.

cities <- st_as_sf(ciudades, coords = c("lng", "lat"), crs = 4326)

Al correr este codigo, se evidencian las cuidades

cities 

4.4 Verificar sistema de referencia

Luego, se verifica que el sistema de referencia de coordenadas (CRS) de las ciudades (cities) sea compatible con el del shapefile del Putumayo (putumayo). Como presentan distintos CRS, se transforma el de las ciudades al CRS del shapefile mediante st_transform().

st_crs(cities)$epsg
## [1] 4326
st_crs(putumayo)$epsg
## [1] 4686

Se verifica si el sistema de coordenadas de cities coincide con el de putumayo. Si no son iguales, se transforma el sistema de cities para que coincida con el de putumayo

ncities <- st_transform(cities, crs= st_crs(putumayo))

4.5 Seleccionar Putumayo

Con los datos ya transformados, se procede a seleccionar únicamente aquellas ciudades que se encuentran dentro del departamento del Putumayo, utilizando la función de selección espacial st_within. Esta operación retorna las ciudades cuyo punto de localización se encuentra dentro de los límites del polígono del Putumayo.

ptuyo_cities <- ncities[putumayo, , op = st_within]

4.6 Visualización del mapa

se visualiza el resultado mediante plot(), superponiendo las ciudades seleccionadas (en color rojo) sobre el mapa del Putumayo, coloreado por municipios.

plot(st_geometry(putumayo), col = sf.colors(12, categorical = TRUE), border = 'grey', axes = TRUE)
plot(st_geometry(ptuyo_cities), pch = 20, col = 'red', add = TRUE)

## 5. Elementos cartográficos En esta sección, se implementa la visualización de los municipios del departamento de Putumayo junto con las ciudades que se encuentran dentro de sus límites, utilizando la librería ggplot2. Para ello, se hace uso de la función geom_sf() que permite graficar datos espaciales en el contexto del sistema ggplot.

5.1 Visualización básica

Este codigo genera un mapa básico, en donde los municipios estan representados con color gris claro, las cuidades con puntos de colores y los titulos de los ejes.

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

### 5.2 Mejora estética del mapa En este paso, se mejoró la presentación del mapa del departamento del Putumayo con la incorporación de elementos cartográficos. Usando la librería ggspatial, se añadieron una barra de escala (annotation_scale) y una flecha de norte (annotation_north_arrow) para mejorar la interpretación espacial. Estos elementos se ubicaron en la parte superior derecha del mapa (location = “tr”). Además, se mantuvo la visualización de los municipios y ciudades del departamento utilizando geom_sf() de ggplot2.

ggplot() +
  #Crop Virginia boundary to spatial extent of cities and add Virginia layer
  geom_sf(data = putumayo) +
  #Add cities layer
  geom_sf(data = ptuyo_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(0.3, "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, "cm"),
                         which_north = "true", location = "tr", 
                         pad_x = unit(0.5, "in"), pad_y = unit(0.05, "in")) +
  #Add titles
  labs(x = "Longitud", y = "Latitud", title = "Ciudades de Putumato") +
  #Add theme
  theme_bw()
## Warning in layer_sf(geom = GeomSf, data = data, mapping = mapping, stat = stat,
## : Ignoring unknown aesthetics: label
## Warning in annotation_scale(location = "tr", height = unit(0.25, "cm"), :
## Ignoring unknown parameters: `width`