Обрезка sf-карты в R

Aug 20 2020

Я пытаюсь отобразить все реки Пиренейского полуострова, как видно на изображении, но шейп-файл включает Канарские острова и информацию о Северной Африке. Для его построения я использовал:

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)

Файл формы можно скачать с https://www.dropbox.com/s/gqoz9xppf4bjwt2/bcn500_0301l_hidrografia.shp?dl=0

Я могу удалить всю информацию о Северной Африке с помощью

rios <- rios %>%
  drop_na()

Я пытался использовать

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

Но, как показывает сюжет, я получил всего несколько рек из Северной Африки.

Но я не знаю, как удалить всю информацию с Канарских островов. Моя конечная цель - это участок к северу от широты. 35.95 и до длинного -9.80, так что я могу получить что-то, потому что это изображение такое же, что и из красного квадрата).

Какие-либо предложения?

Ответы

2 JonasV Aug 20 2020 at 20:16

Ваша степень обрезки, конкретно yminи ymaxневерна. В коде, который вы показали, вы обрезали только африканскую часть. Это должно соответствовать Пиренейскому полуострову:

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

Обрезка, как вы видели, обрезает элементы до квадратной ограничительной рамки; st_intersectionделает клип вдоль границы слоя отсечения, в вашем случае я бы отфильтровал острова, а затем пересек:

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)