Bờ biển đệm

Sep 10 2020

Tôi đang cố tạo vùng đệm đường bờ biển bằng cách sử dụng st_buffer()dữ liệu từ rnaturalearththư viện. Tuy nhiên, khi tôi tạo vùng đệm, nó sẽ mở rộng ra bên ngoài phạm vi của phép chiếu, thay vì quấn quanh "phía" bên kia. Điều này tạo ra các vấn đề cho việc sử dụng hình dạng hạ lưu. Các vấn đề vùng đệm đường bờ biển khác (ví dụ 1 , 2 ) trên GIS SE không liên quan đến các vấn đề về cạnh hình chiếu hoặc không nằm trong 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ạn mã có thể tái tạo ở trên dẫn đến một âm mưu trông như thế này (các vòng tròn màu đỏ do tôi chú thích):

Vì vậy, câu hỏi của tôi là, làm thế nào tôi có thể đệm một tập hợp đa giác toàn cục với một gói "hiểu"? Các giải pháp sẽ ưu tiên sử dụng thư viện hàm sf.

Trả lời

2 Roger-123 Sep 11 2020 at 07:41

Chỉnh sửa: thêm hình ảnh kết quả

Như FSimardGIS đã đề cập trong các nhận xét, chìa khóa ở đây là sử dụng st_wrap_dateline. Bí quyết là bạn không thể sử dụng st_transformationtrước khi tạo bộ đệm vì (tôi nghĩ) nó chuyển đổi nó thành tọa độ của phép chiếu chứ không phải vĩ độ / kinh độ st_wrap_datelineyêu cầu.

st_buffer sau đó muốn khoảng cách đệm theo độ cung, vì vậy tôi đã thực hiện một phép tính nhanh để chuyển đổi km sang giây cung, nhưng có thể cần phải được tinh chỉnh.

Sau đó, tôi đã thêm coord_sfvào ggplot để ggplot có thể thực hiện phép chiếu cho hình ảnh.

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)