RでのSFマップのトリミング

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)