Litorais de proteção

Sep 10 2020

Estou tentando gerar um buffer de linha costeira usando st_buffer()dados da rnaturalearthbiblioteca. No entanto, quando eu crio o buffer, ele se estende para fora do domínio da projeção, em vez de se estender para o outro "lado". Isso cria problemas para o uso de forma downstream. Outros problemas de buffer de linha costeira (por exemplo , 1 , 2 ) em GIS SE não envolveram questões de bordas de projeção ou não estiveram em 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)

O código reproduzível acima leva a um gráfico semelhante a este (círculos vermelhos anotados por mim):

Portanto, minha pergunta é, como posso armazenar em buffer um conjunto global de polígonos com uma embalagem "compreendida"? As soluções usarão preferencialmente a biblioteca de funções sf.

Respostas

2 Roger-123 Sep 11 2020 at 07:41

Editar: imagem adicionada do resultado

Como FSimardGIS mencionou nos comentários, a chave aqui é usar st_wrap_dateline. O truque é que você não pode usar st_transformationantes de criar o buffer porque (eu acho) ele o converte nas coordenadas da projeção, não na latitude / longitude que st_wrap_datelinerequer.

st_buffer então deseja a distância do buffer em graus de arco, então eu fiz um cálculo rápido para converter km em segundos de arco, mas pode precisar ser refinado.

Em seguida, adicionei coord_sfao ggplot para que o ggplot pudesse fazer a projeção para o 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)