10  Introducción al manejo de datos geoespaciales con R

10.1 Trabajo previo

10.1.1 Lecturas

Lovelace, R., Nowosad, J., & Münchow, J. (2019). Geocomputation with R (capítulos 1, 2 y 9). CRC Press. https://geocompr.robinlovelace.net/

10.2 Introducción

La comunidad de programadores de R ha desarrollado un conjunto de paquetes para el manejo de datos geoespaciales, tanto en formatos vectoriales como raster. Algunos de los principales de estos paquetes son:

  • El paquete sf. Ofrece un conjunto de funciones para el manejo de datos vectoriales, de acuerdo con el estándar Simple Features.

  • El paquete terra. Implementa un conjunto de funciones para el manejo de datos raster. Es una reimplementación del paquete raster.

  • El paquete tmap. Se utiliza para programar mapas estáticos e interactivos, especialmente mapas temáticos como mapas de coropletas y mapas de burbujas.

Algunos paquetes de graficación estadística, como ggplot2 y plotly, también cuentan con capacidades para visualización de datos geoespaciales.

En CRAN Task View: Analysis of Spatial Data, puede encontrarse un resumen detallado de los paquetes de R con funciones geoespaciales.

10.3 Datos vectoriales

10.3.1 El modelo vectorial

El modelo vectorial de datos está basado en puntos localizados en un sistema de referencia de coordenadas (CRS). Los puntos individuales pueden representar objetos independientes (ej. postes eléctricos, cabinas telefónicas) o pueden también agruparse para formar geometrías más complejas como líneas (ej. ríos, caminos) o polígonos (ej. fincas, países, provincias). Por lo general, los puntos tienen solo dos dimensiones (x, y), a las que se les puede agregar una tercera dimensión z, usualmente correspondiente a la altitud sobre el nivel del mar.

10.3.2 El estándar Simple Features

Simple Features (o Simple Feature Access) es un estándar abierto de la Organización Internacional de Estandarización (ISO) y del Open Geospatial Consortium (OGC) que especifica un modelo común de almacenamiento y acceso para geometrías de dos dimensiones (líneas, polígonos, multilíneas, multipolígonos, etc.). El estándar es implementado por muchas bibliotecas y bases de datos geoespaciales como sf, Fiona, GDAL, PostgreSQL/PostGIS, SQLite/SpatiaLite, Oracle Spatial y Microsoft SQL Server, entre muchas otras.

La especificación define 18 tipos de geometrías, de las cuales siete son las más comúnmente utilizadas. Estas últimas se muestran en la Figura 10.1.

Figura 10.1: Tipos de geometrías de Simple Features más usadas. Imagen de Robin Lovelace et al..

10.3.3 El paquete sf

El paquete sf (de Simple Features) de R implementa los modelos de datos de las geometrías de tipo vectorial: puntos, líneas, polígonos, sus versiones múltiples y las colecciones de geometrías. Está basado en bibliotecas de sofware ampliamente utilizadas en aplicaciones geoespaciales:

sf provee acceso, desde un mismo paquete de R, a la funcionalidad de estas tres bibliotecas, proporcionando así una interfaz unificada para leer y escribir datos geoespaciales mediante GDAL, realizar operaciones con geometrías mediante GEOS y efectuar transformaciones entre sistemas de coordenadas mediante PROJ.

En sf, los conjuntos de datos geoespaciales se almacenan en objetos de una clase también llamada sf, los cuales son data frames que contiene una columna especial para las geometrías. Esta columna se denomina generalmente geom o geometry (aunque pueden tener cualquier otro nombre). El manejo de datos geoespaciales como data frames permite manipularlos con las funciones ya desarrolladas para este tipo de datos y con la misma forma de referenciar las filas (observaciones) y las columnas (variables).

10.3.3.1 Instalación y carga

# Instalación de sf
install.packages("sf")
# Carga de sf
library(sf)

10.3.3.2 Métodos

La lista de métodos (i.e. funciones) de la clase sf puede obtenerse a través de la función methods():

# Métodos de la clase sf
methods(class = "sf")
 [1] [                            [[<-                        
 [3] [<-                          $<-                         
 [5] aggregate                    as.data.frame               
 [7] cbind                        coerce                      
 [9] dbDataType                   dbWriteTable                
[11] duplicated                   identify                    
[13] initialize                   merge                       
[15] plot                         points                      
[17] print                        rbind                       
[19] show                         slotsFromS3                 
[21] st_agr                       st_agr<-                    
[23] st_area                      st_as_s2                    
[25] st_as_sf                     st_as_sfc                   
[27] st_bbox                      st_boundary                 
[29] st_break_antimeridian        st_buffer                   
[31] st_cast                      st_centroid                 
[33] st_collection_extract        st_concave_hull             
[35] st_convex_hull               st_coordinates              
[37] st_crop                      st_crs                      
[39] st_crs<-                     st_difference               
[41] st_drop_geometry             st_exterior_ring            
[43] st_filter                    st_geometry                 
[45] st_geometry<-                st_inscribed_circle         
[47] st_interpolate_aw            st_intersection             
[49] st_intersects                st_is_full                  
[51] st_is_valid                  st_is                       
[53] st_join                      st_line_merge               
[55] st_m_range                   st_make_valid               
[57] st_minimum_rotated_rectangle st_nearest_points           
[59] st_node                      st_normalize                
[61] st_point_on_surface          st_polygonize               
[63] st_precision                 st_reverse                  
[65] st_sample                    st_segmentize               
[67] st_set_precision             st_shift_longitude          
[69] st_simplify                  st_snap                     
[71] st_sym_difference            st_transform                
[73] st_triangulate_constrained   st_triangulate              
[75] st_union                     st_voronoi                  
[77] st_wrap_dateline             st_write                    
[79] st_z_range                   st_zm                       
[81] text                         transform                   
see '?methods' for accessing help and source code

Seguidamente, se describen y ejemplifican algunos de los métodos básicos de la clase sf.

10.3.3.2.1 st_read() - lectura de datos

El método st_read() lee datos vectoriales de una fuente en formato geoespacial (ej. shapefiles, archivos GeoJSON, bases de datos geoespaciales) y los recupera en un objeto sf.

En el siguiente bloque de código en R, se utiliza el método st_read() para leer un archivo GPKG con los polígonos de las provincias de Costa Rica. Este archivo proviene de un geoservicio de tipo Web Feature Service (WFS) publicado por el Instituto Geográfico Nacional (IGN).

# Lectura de una capa vectorial (GPKG) de provincias de Costa Rica
provincias <-
  st_read(
    "https://github.com/pf0953-programacionr/2024-ii/raw/refs/heads/main/datos/ign/provincias.gpkg",
    quiet = TRUE # para evitar el despliegue de mensajes
  )

st_read() también puede crear objetos sf a partir de archivos de texto. Esta variante se utiliza principalmente cuando el archivo contiene coordenadas correspondientes a geometrías de puntos.

En el siguiente bloque de código, se utiliza st_read() para leer un archivo CSV con registros de presencia de félidos (familia Felidae) de Costa Rica, el cual contiene dos columnas llamadas decimalLongitude y decimalLatitude correspondientes a la longitud decimal y latitud decimal en las que fue observado cada felino. Este archivo proviene de una consulta al portal de datos de la Infraestructura Mundial de Información en Biodiversidad (GBIF).

# Lectura de un archivo CSV con registros de presencia de félidos en Costa Rica
felidos <-
  st_read(
    "https://raw.githubusercontent.com/pf0953-programacionr/2024-ii/refs/heads/main/datos/gbif/felidos.csv",
    options = c(
      "X_POSSIBLE_NAMES=decimalLongitude", # columna de longitud decimal
      "Y_POSSIBLE_NAMES=decimalLatitude"   # columna de latitud decimal
    ),
    quiet = TRUE
  )

Tanto provincias como felidos son objetos de la clase sf (y además de data.frame).

# Clase del objeto provincias
class(provincias)
[1] "sf"         "data.frame"
# Clase del objeto felidos
class(felidos)
[1] "sf"         "data.frame"

Al escribirse el nombre de un objeto sf en la consola de R, se despliega información general sobre este.

# Información general sobre el objeto provincias
provincias
Simple feature collection with 7 features and 9 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -87.10193 ymin: 5.499137 xmax: -82.55285 ymax: 11.21964
Geodetic CRS:  WGS 84
                 gml_id                gml_id2 OBJECTID CÓDIGO CÓDIGO_PROVINCIA
1 limiteprovincial_5k.1 LIMITE_PROVINCIAL.2715     2715 160103                2
2 limiteprovincial_5k.2 LIMITE_PROVINCIAL.2716     2716 160103                3
3 limiteprovincial_5k.3 LIMITE_PROVINCIAL.2717     2717 160103                5
4 limiteprovincial_5k.4 LIMITE_PROVINCIAL.2718     2718 160103                4
5 limiteprovincial_5k.5 LIMITE_PROVINCIAL.2719     2719 160103                7
6 limiteprovincial_5k.6 LIMITE_PROVINCIAL.2720     2720 160103                6
7 limiteprovincial_5k.7 LIMITE_PROVINCIAL.2721     2721 160103                1
   PROVINCIA
1   Alajuela
2    Cartago
3 Guanacaste
4    Heredia
5      Limón
6 Puntarenas
7   San José
                                                                                                                                                                                                        ORIGEN_DEL_TOPÓNIMO
1                                                                                                                  Se remonta al paraje llamado La Lajuela que por primera vez se cita en los Protocolos de Cartago de 1657
2                                         Don Juan Vázques de Coronado escogió el sitio en el valle del Guarco para trasladar a la ciudad de Garcimuños, en 1563, bautizando al nuevo asentamiento con el nombre de Cartago
3        En alegoria a un frondoso árbol de Guanacaste ubicado en la intersección de los caminos que se dirigían a Nicoya, Bagaces y Rivas, en lo que hoy día es el parque de Liberia. Esta referencia data del siglo XVIII
4                                        En correspondiencia al Presidente  de la Real Audiencia de Guatemala, Capitán General don Alonso Fernández de Heredia, de la Inmaculada Concepción de Cubujuquí a Villa de Heredia
5                                                                                         El origen del nombre de la provincia se remonta a 1852, cuando por primera vez se cita en un documento oficial el puerto de Limón
6 En documento de 1720, se menciona la llegada del pirata Chipperton a la zona, en el cual aparece la descripcíon referente a una embarcación pequeña en la Punta de Arena, adoptando con el tiempo el nombre de Puntarenas
7                                                                                                                                              Se remonta a la creación de la ermita dedicada al Patriarca San José en 1737
      VERSIÓN                               GLOBALID
1 20240703001 {322A624B-14A4-44DB-BA11-F37A656BF296}
2 20240703001 {46E33550-F4C9-436F-ADD7-CE70A6C46EB1}
3 20240703001 {49CD624C-A818-4AF3-9370-DC219973EC03}
4 20240703001 {1CA4FA45-F32C-4088-9031-C48CFC460B34}
5 20240703001 {A062C16C-B115-439D-BB17-B261F64AF776}
6 20240703001 {8D914665-65A7-44B6-9D63-95865A946757}
7 20240703001 {B4447D8B-B85A-4D5E-A1D6-0EA14F13E084}
                           SHAPE
1 MULTIPOLYGON (((-84.66639 1...
2 MULTIPOLYGON (((-84.03403 9...
3 MULTIPOLYGON (((-85.3575 11...
4 MULTIPOLYGON (((-84.02428 1...
5 MULTIPOLYGON (((-83.7025 10...
6 MULTIPOLYGON (((-84.82622 1...
7 MULTIPOLYGON (((-83.9281 10...
10.3.3.2.2 st_crs() y st_transform() - manejo de sistemas de coordenadas

El método st_crs() retorna el CRS de un objeto sf.

# Despliegue del CRS del objeto provincias
st_crs(provincias)
Coordinate Reference System:
  User input: WGS 84 
  wkt:
GEOGCRS["WGS 84",
    ENSEMBLE["World Geodetic System 1984 ensemble",
        MEMBER["World Geodetic System 1984 (Transit)"],
        MEMBER["World Geodetic System 1984 (G730)"],
        MEMBER["World Geodetic System 1984 (G873)"],
        MEMBER["World Geodetic System 1984 (G1150)"],
        MEMBER["World Geodetic System 1984 (G1674)"],
        MEMBER["World Geodetic System 1984 (G1762)"],
        MEMBER["World Geodetic System 1984 (G2139)"],
        ELLIPSOID["WGS 84",6378137,298.257223563,
            LENGTHUNIT["metre",1]],
        ENSEMBLEACCURACY[2.0]],
    PRIMEM["Greenwich",0,
        ANGLEUNIT["degree",0.0174532925199433]],
    CS[ellipsoidal,2],
        AXIS["geodetic latitude (Lat)",north,
            ORDER[1],
            ANGLEUNIT["degree",0.0174532925199433]],
        AXIS["geodetic longitude (Lon)",east,
            ORDER[2],
            ANGLEUNIT["degree",0.0174532925199433]],
    USAGE[
        SCOPE["Horizontal component of 3D system."],
        AREA["World."],
        BBOX[-90,-180,90,180]],
    ID["EPSG",4326]]
# Despliegue CRS del objeto felidos
st_crs(felidos)
Coordinate Reference System: NA

st_crs() también puede asignar un CRS a un objeto sf que no lo tiene.

# Asignación de un CRS al objeto felidos
st_crs(felidos) <- 4326

El método st_transform() transforma un objeto sf a un nuevo CRS.

# Transformación del CRS del objeto provincias a WGS84 (EPSG = 4326)
provincias <-
  provincias |>
  st_transform(4326)
10.3.3.2.3 plot() - mapeo

El método plot() grafica objetos sf en un mapa.

# Mapeo de las geometrías del objeto provincias
plot(provincias$SHAPE)

# Mapeo con argumentos adicionales de plot()
plot(
  provincias$SHAPE,
  extent = st_bbox(c(xmin = -86.0, xmax = -82.3, ymin = 8.0, ymax = 11.3)),
  main = "Provincias de Costa Rica",
  axes = TRUE,
  graticule = TRUE
)

Los argumentos reset y add de plot() permiten generar un mapa con varias capas.

# Primera capa del mapa
plot(
  provincias$SHAPE,
  extent = st_bbox(c(xmin = -86.0, xmax = -82.3, ymin = 8.0, ymax = 11.3)),
  main = "Registros de presencia de félidos en Costa Rica",
  axes = TRUE,
  graticule = TRUE,
  reset = FALSE
)

# Segunda capa
plot(felidos$geometry,
     add = TRUE,     
     pch = 16,
     col = "orange")

Para conocer los valores del argumento pch, puede consultar R plot pch symbols.

10.3.3.2.4 st_write() - escritura de datos

El método st_write() guarda en el disco un objeto sf en los diferentes formatos vectoriales de GDAL.

# Especificación del directorio de trabajo (debe utilizarse una ruta existente)
setwd("/home/mfvargas")

# Escritura del objeto provincias en formato GeoJSON
provincias |>
  st_write("provincias.geojson")

# Escritura del objeto felidos en formato KML
felidos |>
  st_write("felidos.kml")
10.3.3.2.5 Otros
# Cantidad de filas de un objeto sf
nrow(provincias)
[1] 7
# Cantidad de columnas de un objeto sf
ncol(provincias)
[1] 10
# Resumen de la columna de geometría
summary(provincias$SHAPE)
 MULTIPOLYGON     epsg:4326 +proj=long... 
            7             0             0 

10.3.4 Mapeo de objetos sf::sf con otros paquetes

10.3.4.1 tmap

El paquete tmap genera mapas estáticos e interactivos con una sintaxis similar a la que utiliza el paquete ggplot2 para generar gráficos.

10.3.4.1.1 Instalación y carga

De acuerdo con la recomendación que se brinda en el sitio web de tmap, se instala la versión disponible ahí (versión 4) y no la disponible en CRAN (versión 3).

# Instalación de tmap (desde su repositorio en GitHub)
install.packages("remotes")
install_github("r-tmap/tmap")
# Carga de tmap
library(tmap)
10.3.4.1.2 Ejemplos de uso

El paquete tmap incluye varios conjuntos de datos de ejemplo, como el conjunto de datos World, que contiene información geoespacial y socioeconómica de países del mundo. El siguiente bloque de código muestra un mapa básico con los contornos de los países.

# Carga de datos de ejemplo
data("World")

# Modo estático
tmap_mode("plot")

# Mapa del mundo
tm_shape(World) +
  tm_polygons()

La función tm_shape() especifica el objeto espacial que se va a visualizar, mientras que tm_polygons() dibuja los polígonos.

El siguiente bloque de código crea un mapa de coropletas que colorea el mapa de acuerdo con el valor de una variable.

# Modo interactivo
tmap_mode("view")

# Mapa de coropletas por densidad de población
tm_shape(World, name = "Países") +
  tm_polygons(
    col = "pop_est_dens", # columna para las coropletas
    style = "quantile", # método de clasificación
    palette = "YlOrRd", # paleta de colores
    id = "name", # campo que se muestra al pasar el ratón
    popup.vars = c("Área" = "area", # campos de la ventana de pop-up
                   "Población" = "pop_est",
                   "Densidad de población" = "pop_est_dens"),
    title = "Densidad de población")

A continuación, se muestran las capas de provincias de Costa Rica (polígonos) y de registros de presencia de félidos de Costa Rica (puntos).

# Crear mapa de provincias y félidos
mapa_provincias_felidos <-
  tm_view(set.view = c(lon = -84.2, lat = 9.6, zoom = 7))  + # centro y zoom inicial
  tm_shape(provincias, name = "Provincias") + # capa de provincias
  tm_borders() +
  tm_shape(felidos, name = "Félidos") + # capa de félidos
  tm_dots(
    col = "species", # color de los puntos
    palette = "Set1", # paleta de colores
    title = "Especie", # título de la leyenda
    size = 0.05,  # tamaño de los puntos
    id = "species", 
    popup.vars = c("Localidad" = "locality",   
                   "Fecha" = "eventDate",
                   "Fuente" = "institutionCode")
  ) +
  tm_scale_bar(position = c("left", "bottom")) # escala

# Cambiar a modo interactivo
tmap_mode("view")

# Desplegar el mapa
mapa_provincias_felidos

10.4 Datos raster

10.4.1 El modelo raster

El modelo de datos raster usualmente consiste de un encabezado y de una matriz con celdas (también llamadas pixeles) de un mismo tamaño. El encabezado define el CRS, la extensión y el punto de origen de una capa raster. Por lo general, el origen se ubica en la esquina inferior izquierda o en la esquina superior izquierda de la matriz. La extensión se define mediante el número de filas, el número de columnas y el tamaño (resolución) de la celda.

Cada celda tiene una identificación (ID) y almacena un único valor, el cual puede ser numérico o categórico, como se muestra en la Figura 10.2.

Figura 10.2: El modelo raster: (A) ID de las celdas, (B) valores de las celdas, (C) mapa raster de colores. Imagen de Robin Lovelace et al.

A diferencia del modelo vectorial, el modelo raster no necesita almacenar todas las coordenadas de cada geometría (i.e. las esquinas de las celdas), debido a que la ubicación de cada celda puede calcularse a partir de la información contenida en el encabezado. Esta simplicidad, en conjunto con el álgebra de mapas, permiten que el procesamiento de datos raster sea mucho más eficiente que el procesamiento de datos vectoriales. Por otra parte, el modelo vectorial es mucho más flexible en cuanto a las posibilidades de representación de geometrías y almacenamiento de valores, por medio de múltiples elementos de datos.

Los mapas raster generalmente almacenan fenómenos continuos como elevación, precipitación, temperatura, densidad de población y datos espectrales. También es posible representar mediante raster datos discretos, tales como tipos de suelo o clases de cobertura de la tierra, como se muestra en la Figura 10.3.

Figura 10.3: Ejemplos de mapas raster continuos y categóricos. Imagen de Robin Lovelace et al.

10.4.2 El paquete terra

El paquete terra implementa un conjunto de funciones para la lectura, escritura, manipulación, análisis y modelado de datos raster y vectoriales. Implementa la clase SpatRaster para manejar los objetos raster.

10.4.2.1 Instalación y carga

# Instalación de terra
install.packages("terra")
# Carga de terra
library(terra)

10.4.2.2 Métodos

La función help() presenta la documentación del paquete terra, incluyendo sus métodos.

# Ayuda sobre el paquete terra
help("terra-package")

Seguidamente, se describen y ejemplifican algunos de los métodos básicos para manejo de datos raster del paquete terra.

10.4.2.2.1 rast() - lectura de datos

El método rast() lee datos raster.

En el siguiente bloque de código en R, se utiliza el método rast() para leer un archivo GeoTIFF correspondiente a la altitud de Costa Rica. Este archivo proviene de WorldClim, un conjunto de capas climáticas disponibles en varias resoluciones espaciales.

# Lectura de una capa raster de altitud
altitud <-
  rast(
    "https://github.com/pf0953-programacionr/2024-ii/raw/refs/heads/main/datos/worldclim/altitud.tif"
  )

altitud es un objeto de la clase SpatRaster.

# Clase del objeto altitud
class(altitud)
[1] "SpatRaster"
attr(,"package")
[1] "terra"

Al escribirse el nombre de un objeto SpatRaster en la consola de R, se despliega información general sobre este.

# Información general sobre el objeto altitud
altitud
class       : SpatRaster 
dimensions  : 686, 545, 1  (nrow, ncol, nlyr)
resolution  : 0.008333333, 0.008333333  (x, y)
extent      : -87.1, -82.55833, 5.5, 11.21667  (xmin, xmax, ymin, ymax)
coord. ref. : lon/lat WGS 84 (EPSG:4326) 
source      : altitud.tif 
name        : altitud 
10.4.2.2.2 crs() y project() - manejo de sistemas de coordenadas

El método crs() retorna el CRS de un objeto SpatRaster.

# CRS del objeto altitud
crs(altitud)
[1] "GEOGCRS[\"WGS 84\",\n    DATUM[\"World Geodetic System 1984\",\n        ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n            LENGTHUNIT[\"metre\",1]]],\n    PRIMEM[\"Greenwich\",0,\n        ANGLEUNIT[\"degree\",0.0174532925199433]],\n    CS[ellipsoidal,2],\n        AXIS[\"geodetic latitude (Lat)\",north,\n            ORDER[1],\n            ANGLEUNIT[\"degree\",0.0174532925199433]],\n        AXIS[\"geodetic longitude (Lon)\",east,\n            ORDER[2],\n            ANGLEUNIT[\"degree\",0.0174532925199433]],\n    ID[\"EPSG\",4326]]"

crs() también puede asignar un CRS a un objeto SpatRaster.

# Asignación de un CRS a una copia del objeto altitud
altitud_crtm05 <- altitud
crs(altitud_crtm05) <- "EPSG:5367"

# Consulta
crs(altitud_crtm05)
[1] "PROJCRS[\"CR05 / CRTM05\",\n    BASEGEOGCRS[\"CR05\",\n        DATUM[\"Costa Rica 2005\",\n            ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n                LENGTHUNIT[\"metre\",1]]],\n        PRIMEM[\"Greenwich\",0,\n            ANGLEUNIT[\"degree\",0.0174532925199433]],\n        ID[\"EPSG\",5365]],\n    CONVERSION[\"Costa Rica TM 2005\",\n        METHOD[\"Transverse Mercator\",\n            ID[\"EPSG\",9807]],\n        PARAMETER[\"Latitude of natural origin\",0,\n            ANGLEUNIT[\"degree\",0.0174532925199433],\n            ID[\"EPSG\",8801]],\n        PARAMETER[\"Longitude of natural origin\",-84,\n            ANGLEUNIT[\"degree\",0.0174532925199433],\n            ID[\"EPSG\",8802]],\n        PARAMETER[\"Scale factor at natural origin\",0.9999,\n            SCALEUNIT[\"unity\",1],\n            ID[\"EPSG\",8805]],\n        PARAMETER[\"False easting\",500000,\n            LENGTHUNIT[\"metre\",1],\n            ID[\"EPSG\",8806]],\n        PARAMETER[\"False northing\",0,\n            LENGTHUNIT[\"metre\",1],\n            ID[\"EPSG\",8807]]],\n    CS[Cartesian,2],\n        AXIS[\"northing (N)\",north,\n            ORDER[1],\n            LENGTHUNIT[\"metre\",1]],\n        AXIS[\"easting (E)\",east,\n            ORDER[2],\n            LENGTHUNIT[\"metre\",1]],\n    USAGE[\n        SCOPE[\"Cadastre, engineering survey, topographic mapping (large and medium scale).\"],\n        AREA[\"Costa Rica - onshore and offshore east of 86°30'W.\"],\n        BBOX[2.21,-86.5,11.77,-81.43]],\n    ID[\"EPSG\",5367]]"

El método project() reproyecta un objeto SpatRaster a un nuevo CRS.

# Transformación del CRS del objeto altitud
altitud_utm17N <-
  altitud |>
  project("EPSG:8910")

# Consulta
crs(altitud_utm17N)
[1] "PROJCRS[\"CR-SIRGAS / UTM zone 17N\",\n    BASEGEOGCRS[\"CR-SIRGAS\",\n        DATUM[\"CR-SIRGAS\",\n            ELLIPSOID[\"GRS 1980\",6378137,298.257222101,\n                LENGTHUNIT[\"metre\",1]]],\n        PRIMEM[\"Greenwich\",0,\n            ANGLEUNIT[\"degree\",0.0174532925199433]],\n        ID[\"EPSG\",8907]],\n    CONVERSION[\"UTM zone 17N\",\n        METHOD[\"Transverse Mercator\",\n            ID[\"EPSG\",9807]],\n        PARAMETER[\"Latitude of natural origin\",0,\n            ANGLEUNIT[\"degree\",0.0174532925199433],\n            ID[\"EPSG\",8801]],\n        PARAMETER[\"Longitude of natural origin\",-81,\n            ANGLEUNIT[\"degree\",0.0174532925199433],\n            ID[\"EPSG\",8802]],\n        PARAMETER[\"Scale factor at natural origin\",0.9996,\n            SCALEUNIT[\"unity\",1],\n            ID[\"EPSG\",8805]],\n        PARAMETER[\"False easting\",500000,\n            LENGTHUNIT[\"metre\",1],\n            ID[\"EPSG\",8806]],\n        PARAMETER[\"False northing\",0,\n            LENGTHUNIT[\"metre\",1],\n            ID[\"EPSG\",8807]]],\n    CS[Cartesian,2],\n        AXIS[\"(E)\",east,\n            ORDER[1],\n            LENGTHUNIT[\"metre\",1]],\n        AXIS[\"(N)\",north,\n            ORDER[2],\n            LENGTHUNIT[\"metre\",1]],\n    USAGE[\n        SCOPE[\"Oil and gas exploration and production.\"],\n        AREA[\"Costa Rica - offshore - Caribbean sea.\"],\n        BBOX[9.6,-83.6,11.77,-81.43]],\n    ID[\"EPSG\",8910]]"
10.4.2.2.3 plot() - mapeo

El método plot() muestra objetos SpatRaster en un mapa.

# Mapa de la capa de altitud
plot(altitud)

Los argumentos reset y add de plot() permiten generar un mapa con varias capas.

# Primera capa del mapa (raster)
plot(
  altitud,
  main = "Registros de presencia de félidos en Costa Rica",
  axes = TRUE,
  reset = FALSE
)

# Segunda capa (vectorial)
plot(felidos$geometry,
     add = TRUE,     
     pch = 16,
     col = "orange")

10.4.2.2.4 writeRaster() - escritura de datos

La función writeRaster() guarda en el disco un objeto SpatRaster en los diferentes formatos raster de GDAL.

# Especificación del directorio de trabajo (debe utilizarse una ruta existente)
setwd("/home/mfvargas")

# Escritura del objeto altitud
altitud |>
  writeRaster("altitud.asc")
10.4.2.2.5 Otros
# Cantidad de filas de un objeto SpatRaster
nrow(altitud)
[1] 686
# Cantidad de columnas de un objeto SpatRaster
ncol(altitud)
[1] 545
# Resolución de un objeto SpatRaster
res(altitud)
[1] 0.008333333 0.008333333

10.4.3 Mapeo de objetos terra::SpatRaster con otros paquetes

10.4.3.1 tmap

El método tm_raster() de tmap despliega un objeto SpatRaster en un mapa tmap. En el siguiente bloque, se muestran en un mapa tmap las capas de altitud (raster), provincias (polígonos) y registros de presencia de félidos (puntos).

# Crear mapa de provincias y félidos
mapa_altitud_provincias_felidos <-
  tm_view(set.view = c(lon = -84.2, lat = 9.6, zoom = 7))  + # centro y zoom inicial
  tm_shape(altitud, name = "Altitud") + # capa de altitud
  tm_raster(
    palette = c("green", "yellow", "brown", "gray"), 
    title = "Altitud (m)"
  ) +
  tm_shape(provincias, name = "Provincias") + # capa de provincias
  tm_borders() +
  tm_shape(felidos, name = "Félidos") + # capa de félidos
  tm_dots(
    col = "species", # color de los puntos
    palette = "Set1", # paleta de colores
    title = "Especie", # título de la leyenda
    size = 0.05,  # tamaño de los puntos
    id = "species", # campo que se muestra al pasar el ratón
    popup.vars = c("Localidad" = "locality",   # campos de la ventana de pop-up
                   "Fecha" = "eventDate",
                   "Fuente" = "institutionCode")
  ) +
  tm_scale_bar(position = c("left", "bottom")) # escala

# Cambiar a modo interactivo
tmap_mode("view")

# Desplegar el mapa
mapa_altitud_provincias_felidos

10.5 Ejercicios

En un documento Quarto incluya:

  1. Una tabla DT con las columnas del conjunto de datos de félidos de Costa Rica correspondientes a especie (species), fecha (eventDate), provincia (stateProvince), localidad (locality), longitud (decimalLongitude) y latitud (decimalLatitude).
    • Las columnas deben, si es necesario, convertirse al tipo de datos adecuado (ej. Date).
    • Los encabezados de las columnas en la tabla deben desplegarse en español, pero no deben alterarse los nombres de las columnas. Sugerencia: utilice el argumento colnames de la función datatable().
    • Los controles de la tabla deben estar en español.
  2. Un gráfico de barras, generado con gglot2 y traducido a plotly con ggplotly(), que muestre la cantidad de registros para cada especie de félidos.
    • Las barras deben estar ordenadas de mayor a menor.
    • Todos los controles y etiquetas del gráfico deben estar en español.
  3. Un mapa tmap con las siguientes capas:
    • Provincias de Costa Rica (polígonos).
    • Registros de presencia de félidos (puntos).

Publique el documento como un sitio web en GitHub Pages.

Si lo desea, puede utilizar datos de otra zona o país y de otro grupo taxonómico. Se sugieren las siguientes fuentes de datos:

10.6 Recursos de interés

Bivand, R. (2022). CRAN Task View: Analysis of Spatial Data. https://CRAN.R-project.org/view=Spatial

Holtz, Y. (s. f.). The R Graph Gallery – Help and inspiration for R charts. The R Graph Gallery. https://r-graph-gallery.com/

Popovic, M. (s. f.). Milos Makes Maps. https://www.youtube.com/@milos-makes-maps

R-Ladies Madrid. (2021). R-Ladies Madrid (español)—Analiza datos espaciales—Stephanie Orellana. https://www.youtube.com/watch?v=59tO2ARvVVU