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.
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.
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
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)
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"
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
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...
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.
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"
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
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.
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]
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)
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()
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()