Recortar mapa sf en R

Aug 20 2020

Estoy tratando de trazar todos los ríos de la Península Ibérica como se puede ver en la imagen, pero el shapefile incluye las Islas Canarias e información sobre el norte de África. Para graficarlo usé:

library(sf)
library(tidyverse)
rios <- st_read("/Users/JMFR/Downloads/BCN500/BCN500_0301L_HIDROGRAFIA.shp")
ggplot() +
  borders("world", c("spain", "portugal"), fill = "lightsteelblue") +
  geom_sf(data = rios)

El archivo de forma se puede descargar desdehttps://www.dropbox.com/s/gqoz9xppf4bjwt2/bcn500_0301l_hidrografia.shp?dl=0

Puedo eliminar toda la información del norte de África con

rios <- rios %>%
  drop_na()

he tratado de usar

rios <- st_crop(rios, c(xmin= -9.80, ymin = 27.68933, xmax = 4.837648, ymax = 35.95))

Pero lo que obtuve fueron solo unos pocos ríos del norte de África, como muestra la trama.

Pero no sé cómo borrar toda la información de Canarias. Mi objetivo final es esta parcela al norte de lat. 35,95 y hasta largo -9,80 así que puedo sacar algo como esta imagen es la misma que la del cuadrado rojo).

¿Alguna sugerencia?

Respuestas

2 JonasV Aug 20 2020 at 20:16

Su extensión de recorte, específicamente yminy ymaxes incorrecta. En el código que mostraste, solo recortaste la parte africana. Esto debería cosechar a la Península Ibérica:

rios <- st_crop(rios, c(xmin= -9.80, ymin = 36, xmax = 4.837648, ymax = 44))
2 ElioDiaz Aug 21 2020 at 04:55

Recortar, como ha visto, corta las entidades a un cuadro delimitador cuadrado; st_intersectionhace un clip a lo largo del límite de la capa de recorte, en su caso, filtraría las islas y luego las intersecaría:

library(ggplot2)
library(raster)
library(sf)
library(dplyr)
esp = getData(country = "ESP", level = 1)
esp = esp %>% st_as_sf() %>% filter(!NAME_1 %in% c("Islas Canarias", "Islas Baleares"))
rios = st_read("/Users/JMFR/Downloads/BCN500/BCN500_0301L_HIDROGRAFIA.shp")
rios = st_intersection(rios, esp)