Litorais de proteção
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
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)