การครอบตัดแผนที่ sf ใน R

Aug 20 2020

ฉันกำลังพยายามพล็อตแม่น้ำทุกสายในคาบสมุทรไอบีเรียตามที่เห็นในภาพ แต่ Shapefile รวมถึงหมู่เกาะคะเนรีและข้อมูลเกี่ยวกับแอฟริกาตอนเหนือ ในการพล็อตฉันใช้:

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))

แต่สิ่งที่ฉันได้คือแม่น้ำเพียงไม่กี่สายจากแอฟริกาเหนือตามที่พล็อตแสดง

แต่ฉันไม่รู้วิธีลบข้อมูลทั้งหมดจากหมู่เกาะคานารี เป้าหมายสุดท้ายของฉันคือพล็อตนี้ทางเหนือของ lat 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)