💡 Datos para la actividad:

Datos.

Scripts.

INTRODUCCIÓN

Como se ha señalado en líneas anteriores, el mapa base hace de soporte a toda la información posterior. En este capítulo se desarrollan algunos procedimientos para cartografiar el mapa base. Para ello, serán necesarios 3 paquetes:

Para activar los paquetes tmap(), sf() y terra() primero hay que conocer si ya está instalado:

system.file(package='tmap')
## [1] "D:/Documentos/R/win-library/4.3/tmap"
system.file(package='sf')
## [1] "D:/Documentos/R/win-library/4.3/sf"
system.file(package='geoboundaries')
## [1] ""

Si ya estuvieran instalados se activan con la función library().

library(sf)
library(tmap)
library(tidyverse)
library(rgeoboundaries)
library(terra)

DESCARGA DE LA INFORMACIÓN

A continuación, se descargará la información correspondiente a Austria.

austria <- gb_adm1("Austria")

A continuación, se visualizará la estructura y el contenido del objeto `austria’.

Posteriormente, se reducirá el tamaño del objeto eliminando las variables no necesarias. Por medio del siguiente comando se conserva sólo la variable que ocupa la tercera columna

austria <- austria[3]

Para hacerla más legigle, se modificará el nombre de esa variable.

colnames(austria) 
## [1] "shapeName" "geometry"
names(austria)[1] <- "estado"

MAPAS BÁSICOS CON TMAP

Una primera modalidad de mapa básico es la que representa el objeto gráfico relleno con un color determinado.

tm_shape(austria) +
      tm_fill(col="gray")+
tm_compass(position = c("left", "top"))+                       # Símbolo del N
tm_scale_bar(position = c("left", "bottom"))+                  # Escala gráfica, posición
tm_layout(main.title = "Austria")                              # Título del gráfico

Sobre este mapa básico se pueden realizar diferentes modificaciones, por ejemplo, añadiendo las unidades administrativas (en este caso, estados federados) mediante polígonos. La función principal para visualizar polígonos es tm_polygons(). Por defecto, relena los polígonos en gris claro (gray85) y los bordes de los polígonos en gris ligeramente oscuro (gray40).

tm_shape(austria) +
  tm_polygons(col="gray") +
tm_compass(position = c("left", "top"))+                       # Símbolo del N
tm_scale_bar(position = c("left", "bottom"))+                  # Escala gráfica, posición
tm_layout(main.title = "Austria")                              # Título del gráfico

Tanto los colores de las unidades administrativas como los de los bordes pueden modificarse utilizando los argumentos col y border.col.

tm_shape(austria) +
  tm_polygons(col = "lightblue",                                                # Relleno con el color azul
              border.col = "black",                                             # Color de las divisiones administrativas.
              lwd = 0.5,                                                        # Ancho de la línea (divisones administrativas)
              lty = "dashed") +                                                 # Tipo de línea.
tm_compass(position = c("left", "top"))+                                        # Símbolo del N
tm_scale_bar(position = c("left", "bottom"))+                                   # Escala gráfica, posición
tm_layout(main.title = "Austria")                                               # Título del gráfico

tm_polygons() es una combinación de otras dos funciones - tm_fill() y tm_borders(). El siguiente conjunto de órdenes es un ejemplo de uso de función tm_fill() rellenando los polígonos con un color fijo y cambiando el color y grosor de la línea que señala los límites administrativos.

tm_shape(austria) +
  tm_fill(col = "lightblue") + 
tm_borders(col="red", lwd=2)+
tm_compass(position = c("left", "top"))+
tm_scale_bar(position = c("left", "bottom"))+
tm_layout(main.title = "Austria")

La función tm_borders() dibuja los bordes de los polígonos, pudiendo cambiar el color, la anchura del trazo o el tipo de línea.

tm_shape(austria) +
  tm_borders(col = "black",                                      # Color de la línea que marca el límite administrativo
             lwd = 0.5,                                          # Ancho de la línea.
             lty = "dashed")                                     # Tipo de línea

Finalmente, podemos añadir al mapa base las etiquetas identificativas de cada unidad administrativa, y representar en colores diferentes cada una de ellas. Es el ejemplo de un mapa político.

tm_shape(austria) +
   tm_polygons(col="estado", legend.show = FALSE)+
tm_compass(position = c("left", "top")) +                                       # Símbolo del N
tm_scale_bar(position = c("left", "bottom")) +                                  # Escala gráfica, posición
tm_layout(main.title = "Austria") +                                             # Título del gráfico
tm_text("estado")

📝 ACTIVIDAD DE EVALUACIÓN CONTINUA MAPA BASE 1

Descarga de la web los límites administrativos correspondientes a un país del mundo de tu elección (utiliza para ello el código ISO3 y elabora un mapa con las unidades administrativas dibujadas en diferentes colores y sus nombres impresos.

austria <- gb_adm1("Austria")

austria <- austria[3]

colnames(austria) 
names(austria)[1] <- "estado"

tm_shape(austria) +
   tm_polygons(col="estado", legend.show = FALSE)+
tm_compass(position = c("left", "top")) +                                       # Símbolo del N
tm_scale_bar(position = c("left", "bottom")) +                                  # Escala gráfica, posición
tm_layout(main.title = "Austria") +                                             # Título del gráfico
tm_text("estado")

También es posible utilizar el color para cartografiar una variable categórica. En este ejemplo, se selecciona una gama de colores utilizando el argumento palette=get_brewer_pal del paquete maptools, adecuada para datos cualitativos, en este caso subregiones del país. En primer lugar, activaremos el paquete maptools.

library(tmaptools)

A continuación se creará un dataframe que se unirá posteriormente al objeto austria. Este nuevo objeto será denominado mi_df y contiene información adicional sobre Austria, en este caso, el estado, la región, la capital y su población.

mi_df <- data.frame(
  estado = c("Burgenland", "Kärnten", "Niederösterreich", "Oberösterreich", "Salzburg", "Steiermark", "Tirol", "Vorarlberg", "Wien"), 
  region = c("Cuenca del Danubio", "Alpes", "Cuenca del Danubio", "Cuenca del Danubio", "Alpes", "Alpes", "Alpes", "Alpes", "Cuenca del Danubio"),
  poblacion = c(297583, 564513, 1698796, 1505140, 560710, 1252922, 764102, 401647, 1931593))

La función merge() es la encargada de unir los dos dataframes en función de columnas comunes en cada uno de ellos. La variable común en ambos es estado.

austria <- merge(austria, mi_df, by = "estado")

A continuación se representará un mapa político en el que se representa la distribución de las dos grandes regiones naturales de Austria. Estas dos regiones constituyen un ejemplo de variable cualitativa (categorías). Para informar a tmap de esta circunstancia, debe añadirse el argumento style = cat. Además, el argumento title en blanco dentro de tm_polygons() no dibuja el título de la leyenda.

tm_shape(austria) +
  tm_polygons(col="region", 
              title="Leyenda", 
              style="cat", 
              palette=get_brewer_pal(palette="Set1", 
                                     n=2, 
                                     plot=FALSE)) +
tm_compass(position = c("left", "bottom")) +
tm_scale_bar(position = c("left", "bottom"))+
tm_layout(main.title = "Regiones naturales de Austria", 
          title.size = 1.5, 
          title.position = c("right", "top"), 
          legend.outside = FALSE, 
          legend.position= c("left", "top"),
          legend.title.size = 1.5, 
          legend.text.size = 1) +
tm_text("estado")

CREACIÓN DE UN MAPA POLÍTICO

Un mapa político de Austria podría representar no sólo los estados federados, sino también otras variables, como la ubicación de las principales ciudades. Estas constituyen un ejemplo de datos puntuales. Para representarlas se creará un dataframe con los nombres de las ciudades, su latitud y longitud, y el número de habitantes.

ciudades_df <- data.frame(lon = c(16.3725,15.4386,14.2864,9.75,13.045,11.3933,14.3),
                          lat = c(48.2083,47.0708,48.3058,47.5167,47.8,47.2683,46.6167),
                          nombre = c("Viena", "Graz", "Linz", "Lochau", "Salzburgo", "Innsbruck", "Klagenfurt"), 
                          habitantes = c(2223236,292630,210165,200000,155021,130585,101403), 
                          status = c("capital nacion", "capital estado", "capital estado", "capital estado", "capital estado", "capital estado", "capital estado"))

Este dataframe no es aún un objeto espacial, por lo que no se puede representar gráficamente. Es necesario convertir ese dataframe en un objeto sf informando a R de cúales son los variables con las coordenadas geográficas (lon y lat) y qué sistema de proyección será utilizado.

ciudades <- st_as_sf(ciudades_df, 
                     coords = c("lon", "lat"),                                  # Nombre de las variables con las coordenadas
                     crs = 4326)                                                # Código del Sistema de Coordenadas Geográfico

De la misma manera, podríamos realizar un mapa básico con la ubicación de las ciudades

tm_shape(austria) +
      tm_fill(col="gray") +
tm_shape(ciudades) + 
  tm_bubbles(size = "habitantes", col="red", title.size = "Número de habitantes:", shape = "status", title.shape = "Status:") +
  tm_text("nombre", col = "blue", size = 1.25, just = "left", ymod = 0.75) +
tm_compass(position = c("left", "bottom")) +                    # Símbolo del N
tm_scale_bar(position = c("left", "bottom")) +                  # Escala gráfica, posición
tm_layout(main.title = "Austria")                               # Título del gráfico

También podríamos representar datos lineales, como las principales autopistas y líneas de ferrocarril. Para ello contamos con la ayuda del paquete naturalearth que facilita la descarga de un buen número de elementos del territorio, tanto en formato vectorial como ráster. Como siempre, se comienza instalando el paquete y activándolo.

library(rnaturalearth)

A continuación, se procede a descargar la capa de carreteras con la función rnaturalearth::ne_download(). Una vez descargada, esta capa mundial va a ser recortada dentro de los límites de Austria con la función sf::intersection()`.

borrame <- ne_download(scale = 10, type = "roads", category = "cultural") %>% 
  sf::st_intersection(austria)
## Reading layer `ne_10m_roads' from data source 
##   `C:\Users\Domingo\AppData\Local\Temp\Rtmpq8uPh0\ne_10m_roads.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 56600 features and 31 fields
## Geometry type: MULTILINESTRING
## Dimension:     XY
## Bounding box:  xmin: -166.5325 ymin: -55.11212 xmax: 178.4191 ymax: 71.17768
## Geodetic CRS:  WGS 84

Una vez descargada y recortada, se procede a limpiar esa base de datos, seleccionado sólo las autopistas (Mayor Highway).

at_autopistas <- borrame %>% 
  filter(type == "Major Highway") %>% 
  select(c(15, 29)) %>% 
  rename(codigo = label) %>%
  group_by(codigo) %>% 
    summarise()

Para comprobar que el procedimiento se ha realizado correctamente, se representa gráficamente la red de autopistas

plot(at_autopistas)

De la misma manera se procederá con las autopistas

borrame <- ne_download(scale = 10, type = "railroads", category = "cultural") %>% 
  sf::st_intersection(austria)
## Reading layer `ne_10m_railroads' from data source 
##   `C:\Users\Domingo\AppData\Local\Temp\Rtmpq8uPh0\ne_10m_railroads.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 25413 features and 12 fields
## Geometry type: LINESTRING
## Dimension:     XY
## Bounding box:  xmin: -150.1122 ymin: -51.89528 xmax: 179.3578 ymax: 69.60437
## Geodetic CRS:  WGS 84

Como en el caso anterior, los datos extraidos deben limpiarse y modificarse para un uso posterior.

at_ferrocarril <- borrame %>% 
  select(10) %>% 
  rename(id = natlscale) %>%  
    group_by(id) %>% 
    summarise() 

También dibujamos los ferrocarriles para verificar que no ha habido equivocación.

plot(at_ferrocarril)

A continuación se elaborará un mapa político que incluye los estados federados, sus capitales y las líneas de ferrocarril y autopistas.

tm_shape(austria) +
   tm_polygons(col="estado", legend.show = FALSE) +
   tm_text("estado", col = "black", size = 1) +
tm_shape(ciudades) + 
  tm_bubbles(size = "habitantes", col="red", sizes.legend = c(100000, 300000, 2500000), title.size = "Número de habitantes:", shape = "status", title.shape = "Status:") +
  tm_text("nombre", col = "blue", size = 0.75, just = "left", xmod = 0.5, ymod = 0.75) +
tm_shape(at_autopistas) + 
  tm_lines(col="darkgreen", scale=1.5) + 
  tm_text("codigo", col = "darkgreen", size = 0.5, just = "left", xmod = 0.5, ymod = 0.75) +
  tm_add_legend(type = "line", col = "darkgreen", title = "Autopistas") +  
tm_shape(at_ferrocarril) + 
  tm_lines(col="#de2b51", scale=1.5) + 
  tm_text("id", col = "#de2b51", size = 0.5, just = "left", xmod = 0.5, ymod = 0.75) +
  tm_add_legend(type = "line", col = "#de2b51", title = "Ferrocarril") +  
tm_compass(position = c("left", "bottom")) +                                  # Símbolo del N
tm_scale_bar(position = c("left", "bottom")) +                                  # Escala gráfica, posición
tm_layout(main.title = "Austria, mapa político", 
          inner.margins = c(0.05, 0.15, 0.05, 0.05),                             # Título del gráfico
          legend.position = c("left", "top"))

De la misma manera, se podría realizar un mapa físico que combine, por ejemplo, la topografía, las montañas más importantes, los ríos y los lagos del país.

Para descargar un Modelo Digital del terreno podemos recurrir al paquete elevtr. Este paquete permite la descarga de MDT con diferentes resoluciones espaciales.

#install.packages("elevatr")
library(elevatr)

A continuación, se procede a descargar el MDT

at_elev <- rast(elevatr::get_elev_raster(locations = austria,                   # El área espacial que nos interesa
                                z = 7,                                          # La resolución espacial requerida.
                                clip = "locations"))                            # Recorta directametne el área de trabajo
at_elev <- setMinMax(at_elev)

Si existen valores inferiores a 0 (topografía submarina) deben eliminarse.

A continuación, se cargarán los nombres, la altitud y la localización de las principales cumbres del país y se transformarán de dataframe a objeto espacial con formato sf.

at_cumbres_df <- data.frame(nombre = c("Großglockner", "Wildspitze", "Piz Buin", "Hochfeiler", "Schneeberg", "Geschriebenstein","Hermannskogel", "Großvenediger", "Hoher Dachstein"), 
                         altitud = c(3798, 3770, 3312, 3510, 2076, 884, 542, 3666, 2995), 
                         lon = c(12.69444444, 10.86722222, 10.11861111, 11.72777778, 15.807778, 16.433889, 16.283333, 12.34638889, 13.606389), 
                         lat = c(47.07416667, 46.88527778, 46.84416667, 46.97222222, 47.7675, 47.352778, 48.266667, 47.10916667, 47.475278))
at_cumbres <- st_as_sf(at_cumbres_df, 
                     coords = c("lon", "lat"),                                  # Nombre de las variables con las coordenadas
                     crs = 4326)                                                # Código del Sistema de Coordenadas Geográfico

Con la función rnaturalearth::ne_download() podemos descargar la capa de ríos, replicando el mismo proceso realizado para autopistas y ferrocarriles.

borrame <- ne_download(scale = 10, type = "rivers_lake_centerlines", category = "physical") %>% 
  sf::st_intersection(austria)
## Reading layer `ne_10m_rivers_lake_centerlines' from data source 
##   `C:\Users\Domingo\AppData\Local\Temp\Rtmpq8uPh0\ne_10m_rivers_lake_centerlines.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 1473 features and 38 fields
## Geometry type: MULTILINESTRING
## Dimension:     XY
## Bounding box:  xmin: -164.9035 ymin: -52.15775 xmax: 177.5204 ymax: 75.79348
## Geodetic CRS:  WGS 84

COLOR amarillo:

En ciertos casos, los rios constituyen la frontera entre países, por lo que la descarga de los límites administrativos puede segmentar el río en varios tramos, cada uno con su etiqueta. Esto puede llenar el mapa de etiquetas con los nombres de los ríos. Una alternativa es crear un buffer alrededor de las fronteras del país, a una distancia de 10 km respecto a la frontera.

austria_adm0 <- gb_adm0("Austria")
buff_10000 = st_buffer(austria_adm0, dist = 10000)

Este buffer puede imprimirse junto con las fronteras reales para ver su disposición.

plot(st_geometry(austria_adm0))
plot(st_geometry(buff_10000), add = TRUE)

Este buffer servirá para realizar la intersección con la capa de ríos, desplazando la frontera, lo que en teoría favorecerá que cada río aparezca ahora como un único tramo y con una única etiqueta.

borrame <- ne_download(scale = 10, type = "rivers_lake_centerlines", category = "physical") %>% 
  sf::st_intersection(buff_10000)
## Reading layer `ne_10m_rivers_lake_centerlines' from data source 
##   `C:\Users\Domingo\AppData\Local\Temp\Rtmpq8uPh0\ne_10m_rivers_lake_centerlines.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 1473 features and 38 fields
## Geometry type: MULTILINESTRING
## Dimension:     XY
## Bounding box:  xmin: -164.9035 ymin: -52.15775 xmax: 177.5204 ymax: 75.79348
## Geodetic CRS:  WGS 84

Una vez descargada y recortada, se procede a limpiar esa base de datos.

at_rios <- borrame %>% 
  select(4) %>% 
  rename(nombre = name) %>%
  group_by(nombre) %>% 
    summarise()

Para comprobar que el procedimiento se ha realizado correctamente, se representa gráficamente la red fluvial

plot(at_rios)

✅ ** PROBLEMA CON LOS RÍOS**:

En algunos casos, aparecen numerosas etiquetas del mismo río cuando éste hace de frontera. Ello tiene que ver con el grado de precisión de los límites administrativos de la base de datos “rnaturalearth”. Para solventar este problema es necesario alejar unos km la frontera real y usar esa nueva frontera para realizar el recorte. Este desplazamiento de la frontera se crea mediante un “buffer”

En primer lugar se crea el buffer alrededor de la frontera, alejada 10 km.

buff_10000 <- st_buffer(austria_adm0, dist = 10000)

A continuación se dibuja la frontera real y la creada por el buffer.

plot(st_geometry(austria_adm0))
plot(st_geometry(buff_10000), add = TRUE)

Posteriormente se descarga la capa de ríos, utilizando el objeto buff_10000 como base para el recorte.

borrame <- ne_download(scale = 10, type = "rivers_lake_centerlines", category = "physical") %>% 
  sf::st_intersection(buff_10000)
## Reading layer `ne_10m_rivers_lake_centerlines' from data source 
##   `C:\Users\Domingo\AppData\Local\Temp\Rtmpq8uPh0\ne_10m_rivers_lake_centerlines.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 1473 features and 38 fields
## Geometry type: MULTILINESTRING
## Dimension:     XY
## Bounding box:  xmin: -164.9035 ymin: -52.15775 xmax: 177.5204 ymax: 75.79348
## Geodetic CRS:  WGS 84

Se limpia la capa con los ríos.

austria_rios <- borrame %>% 
  select(4) %>% 
  rename(nombre = name) %>%
  group_by(nombre) %>% 
  summarise()

Finalmente, se hace una prueba con la capa de ríos

tm_shape(austria_rios) +
  tm_lines(col= "blue", lwd= 1.5) +  
  tm_text("nombre", col = "blue", just = "top")

En casos en los que el problema pudiera persistir, se puede jugar con la distancia del buffer (10000), aumentándola o disminuyéndola.

A continuación se dibujará un mapa físico de Austria, representando el relieve y las principales cumbres de la región.

tm_shape(at_elev) +
  tm_raster(title = "Altitud (m asl)", 
            style = "cont",
            palette = "YlOrBr") + 
tm_shape(austria) +
  tm_borders(col = "black", 
             lwd = 1) +
tm_shape(at_rios) +
  tm_lines(col= "blue", lwd= 1.5) +  
  tm_text("nombre", col = "blue", just = "top") +
tm_shape(at_cumbres) + 
  tm_symbols(col = "black") +
  tm_text("nombre", size=0.75, ymod = 1) +
tm_scale_bar(position = c("left", "bottom")) +                                  # Escala gráfica, posición
tm_compass(position = c("right", "top"),
             type = "rose", 
             size = 2) +
tm_layout(main.title = "Mapa fisico de Austria", 
          bg.color = "lightgreen",
          inner.margins = c(0.05, 0.05, 0.05, 0.05)) +                          # Título del gráfico
tm_credits(text = "Geog 2040")

Por último, se eliminan aquellos objetos sin interés y se graban los restantes

rm(borrame, mi_df, ciudades_df, at_cumbres_df)
save(list=ls(),                                                                 # Graba todos los objetos existentes en el Global Environ
     file="datos_G2040_02_mapa_base.RData")                                     # Nombre del fichero que contendrá todos los objetos

📝 ACTIVIDAD DE EVALUACIÓN CONTINUA MAPA BASE 2

  1. Visualiza la estructura del objeto oregon_condados y comenta qué tipo de variables se encuentran en dicho objeto.
load("D:/G2040/Datos_varios/oregon/LOS_UTILIZADOS/oregon_condados.RData")
View(oregon_condados)
  1. Representa un mapa básico, en el que el estado de Oregon aparece sin ninguna división administrativa. El territorio de este estado aparecerá en color azul claro. Incluye:
  • Un símbolo indicando el N, situado a la izquierda y arriba,

  • Una escala gráfica abajo en el centro.

  • El título debe incluir la siguiente frase: “Estado de Oregón”

tm_shape(oregon_condados) +
      tm_fill(col="lightblue") +
tm_compass(position = c("left", "top"))+                        # Símbolo del N
tm_scale_bar(position = c("left", "bottom"))+                   # Escala gráfica, posición
tm_layout(main.title = "Estado de Oregon",                      # Título del gráfico
          inner.margins = c(0.15, 0.10, 0.01, 0.15),            # Márgenes internos
          frame = FALSE)                                        # Sin marco
  1. Crea otro mapa, representando la división del estado en regiones de tipo geográfico. Para ello, deberas cargar el fichero denominado oregon_regiones y añadirlo al fichero oregon_condados. Para no modificar este último, crea un nuevo objeto denominado oregon, resultado de la fusión de los dos anteriores
load("D:/G2040/Datos_varios/oregon/LOS_UTILIZADOS/oregon_regiones.RData")
oregon <- merge(oregon_condados, oregon_regiones, by = "condado")
tm_shape(oregon) +
  tm_polygons(col="Region_Geografia", 
              title="", 
              style="cat", 
              palette= "RdYlGn") +
tm_layout(main.title = "Regiones de Oregon", 
          title.size = 2.5, 
          title.position = c("right", "top"),  
          legend.outside=TRUE, 
          legend.position= c("right", "bottom"), 
          inner.margins = c(0.15, 0.05, 0.05, 0.1)) +
tm_text("condado", size = 0.6) + 
tm_compass(position = c("right", "top")) +
tm_scale_bar(position = c("left", "bottom")) 
  1. Identifica qué condado perteneciente a la región “Southern Oregon” tiene línea de costa
#El condado de Douglas
  1. Identifica a qué región pertenece el condado de Harney.
# La región de Eastern Oregon
  1. Identifica a qué región pertenece el condado de Wasco.
# La región de Hood and Columbia
  1. Efectua un mapa básico con la ubicación de las ciudades. Estas deberás cargarlas desde rnaturalearth como populated_places_simple.
borrame <- ne_download(scale = 10, "populated_places_simple", category = "cultural") %>% 
  sf::st_intersection(oregon)
oregon_ciudades <- borrame %>% 
  select(c(4, 5, 23, 32)) %>% 
  rename(estatus = featurecla, nombre = name) 
tm_shape(oregon) +
      tm_fill(col="gray") +
tm_shape(oregon_ciudades) + 
  tm_dots(size = "pop_max", col="red") +
  tm_text("nombre") +
tm_compass(position = c("left", "bottom")) +                    # Símbolo del N
tm_scale_bar(position = c("left", "bottom")) +                  # Escala gráfica, posición
tm_layout(main.title = "Oregon")                              # Título del gráfico
  1. Elabora un mapa de las principales infraestructuras de transporte del estado de Oregon que contenga:
  • La división administrativa en condados (objeto oregon_condados).

  • Las principales autopistas (extraer de rnaturalearth).

  • Las principales líneas de ferrocarril (idem naturalearth).

  • Los aeropuertos (idem naturalearth).

  • El título del gráfico puede ser “Infraestructuras de transporte del estado de Oregon”.

Para crear el fichero vectorial que te permitirá recortar las imágenes, procede de la siguiente manera

library(tidyverse)
oregon <- oregon_condados %>% 
  group_by() %>% 
  summarise()
  1. Elabora un mapa físico que incluya la topografía, los ríos, las cumbres y los volcanes más importantes.
oregon_elev <- rast(elevatr::get_elev_raster(locations = oregon,                   # El área espacial que nos interesa
                                z = 7,                                          # La resolución espacial requerida.
                                clip = "locations"))                            # Recorta directametne el área de trabajo
oregon_elev <- setMinMax(at_elev)

oregon_elev <- app(at_elev, 
            function(x){x[x < 0] <- NA;return(x)})

borrame <- ne_download(scale = 10, type = "rivers_lake_centerlines", category = "physical") %>% 
  sf::st_intersection(oregon)

oregon_rios <- borrame %>% 
  select(4) %>% 
  rename(nombre = name) %>%
  group_by(nombre) %>% 
    summarise()
tm_shape(oregon_elev) +
  tm_raster(title = "Altitud (m asl)", 
            style = "cont",
            palette = "YlOrBr") + 
tm_shape(oregon) +
  tm_borders(col = "black", 
             lwd = 1) +
tm_shape(oregon_rios) +
  tm_lines(col= "blue", lwd= 1.5) +  
  tm_text("nombre", col = "blue", just = "top") +
tm_scale_bar(position = c("left", "bottom")) +                                  # Escala gráfica, posición
tm_compass(position = c("right", "top"),
             type = "rose", 
             size = 2) +
tm_layout(main.title = "Mapa fisico de Oregon", 
          bg.color = "lightgreen",
          inner.margins = c(0.05, 0.05, 0.05, 0.05)) +                          # Título del gráfico
tm_credits(text = "Geog 2040")