Buffer litorali

Sep 10 2020

Sto cercando di generare un buffer costiero utilizzando i st_buffer()dati della rnaturalearthlibreria. Tuttavia, quando creo il buffer, si estende al di fuori del regno della proiezione, piuttosto che avvolgersi all'altro "lato". Ciò crea problemi per l'utilizzo della forma a valle. Altri problemi di buffer di costa (ad esempio 1 , 2 ) su GIS SE non hanno coinvolto problemi di bordi di proiezione o non erano 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)

Il codice riproducibile sopra porta a un grafico che assomiglia a questo (cerchi rossi annotati da me):

Quindi, la mia domanda è: come posso bufferizzare un insieme globale di poligoni con un wrapping "comprensibile"? Le soluzioni useranno preferibilmente la libreria di funzioni sf.

Risposte

2 Roger-123 Sep 11 2020 at 07:41

Modifica: aggiunta immagine del risultato

Come FSimardGIS menzionato nei commenti, la chiave qui è usare st_wrap_dateline. Il trucco è che non puoi usarlo st_transformationprima di creare il buffer perché (penso) lo converte nelle coordinate della proiezione, non in lat / lon che st_wrap_datelinerichiede.

st_buffer quindi vuole la distanza del buffer in gradi d'arco, quindi ho inserito un rapido calcolo per convertire i km in secondi d'arco, ma potrebbe essere necessario perfezionarlo.

Ho quindi aggiunto coord_sfa ggplot in modo che ggplot potesse fare la proiezione per il visual.

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)