如何基于rnaturalearth生成全球海岸线缓冲区?
全球海岸线可变距离缓冲区实现方案
针对生成全球海岸线面状缓冲区(用于船舶交通数据筛选,支持自定义距离)的需求,结合实际踩坑经验,整理出如下最优实现:
遇到的问题
- 初期方案生成的缓冲区边缘锯齿严重,且存在国际日期变更线绕接问题
- 使用
terra::buffer()优化后效果提升,但大西洋区域会出现多余缓冲区域
最优代码实现
# 获取海岸线数据 coast <- rnaturalearth::ne_coastline(scale = 110, returnclass = "sf") # 预处理海岸线数据 coast <- sf::st_union(coast) coast <- sf::st_make_valid(coast) coast <- sf::st_wrap_dateline(coast) # 生成缓冲区 c_buffer <- terra::vect(coast) terra::crs(c_buffer) <- "epsg:4326" # 200海里对应370400米(1海里≈1852米) c_buffer <- terra::buffer(c_buffer, width = 370400) c_buffer <- sf::st_as_sf(c_buffer) c_buffer <- sf::st_wrap_dateline(c_buffer) # 可视化验证 ggplot2::ggplot()+ ggplot2::geom_sf(data = c_buffer, fill = "lightBlue")+ ggplot2::geom_sf(data = coast, fill = "grey")
生成效果

自定义距离适配
若需生成其他距离的缓冲区,只需修改terra::buffer()中的width参数:
- 计算公式:目标距离(海里)× 1852,得到对应的米数后替换代码中的
370400即可
内容的提问来源于stack exchange,提问作者geetlord
相关产品推荐
相关产品推荐

