Pufferküsten

Sep 10 2020

Ich versuche, einen Küstenpuffer mithilfe st_buffer()von Daten aus der rnaturalearthBibliothek zu generieren . Wenn ich den Puffer erstelle, erstreckt er sich jedoch außerhalb des Bereichs der Projektion, anstatt sich auf die andere "Seite" zu wickeln. Dies schafft Probleme für die Verwendung der nachgeschalteten Form. Andere Küstenpufferprobleme (z. B. 1 , 2 ) in GIS SE betrafen keine Probleme mit Projektionskanten oder waren nicht in R.

library(rgdal)
library(rnaturalearth)
library(sf)
library(ggplot2)

robin = CRS("+proj=robin +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs")

ROI = ne_countries(returnclass = 'sf') %>%
  st_combine() %>%
  st_transform(robin)
coastalWaters = ROI %>%
  st_buffer(500000)
ggplot() +
  geom_sf(data = coastalWaters, fill = "lightblue", col = "transparent") +
  geom_sf(data = ROI)

Der obige reproduzierbare Code führt zu einer Darstellung, die so aussieht (rote Kreise, die von mir kommentiert wurden):

Meine Frage ist also, wie kann ich einen globalen Satz von Polygonen mit einer "verstandenen" Umhüllung puffern? Lösungen verwenden vorzugsweise die sf-Funktionsbibliothek.

Antworten

2 Roger-123 Sep 11 2020 at 07:41

Bearbeiten: Bild des Ergebnisses hinzugefügt

Wie FSimardGIS in den Kommentaren erwähnt hat, ist der Schlüssel hier zu verwenden st_wrap_dateline. Der Trick ist, dass Sie ihn st_transformationvor dem Erstellen des Puffers nicht verwenden können , da er (glaube ich) in die Koordinaten der Projektion konvertiert wird, nicht in das Lat / Lon, das st_wrap_datelineerforderlich ist.

st_buffer Dann möchte ich den Pufferabstand in Bogengraden, also habe ich eine schnelle Berechnung durchgeführt, um km in Bogensekunden umzurechnen, muss aber möglicherweise verfeinert werden.

Ich habe dann coord_sfzu ggplot hinzugefügt , damit ggplot die Projektion für das Visuelle durchführen kann.

library(rgdal)
library(rnaturalearth)
library(sf)
library(ggplot2)

robin = CRS("+proj=robin +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs")

ROI = ne_countries(returnclass = 'sf') %>%
  st_combine() 

#Please check the math on this part.
#KM/earth circumference * degrees in circle
buffer_in_km <- 500
buffer_as_arc_degrees<- buffer_in_km/40075*360

coastalWaters = ROI %>%
  st_buffer(buffer_as_arc_degrees)  %>% st_wrap_dateline()

ggplot() +
  geom_sf(data = coastalWaters, fill = "lightblue", col = "transparent") +
  geom_sf(data = ROI) +
  coord_sf(crs = robin)