You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中如何绘制河流岸线而非单条中心线以展示河流实际宽度

方法1:直接提取OSM中已有的面状河流边界(优先推荐)

你当前仅调用了osm_lines线状要素,OSM中已标注的河流岸线、河面等面状数据存储在osm_polygons和osm_multipolygons中,调整数据提取和绘图逻辑即可直接获取带实际宽度的河流面:

# 修改后的OSM水系数据提取代码,同时覆盖线状、面状要素
rivers <- bbx %>%
  opq()%>%
  add_osm_feature(key = "waterway", 
                  value = c("river", "riverbank", "canal", "stream")) %>%
  # 新增面状水系提取规则
  add_osm_feature(key = "natural", 
                  value = "water") %>%
  osmdata_sf() 

绘图时先绘制面状河流,再补充绘制细小支流的线状要素即可:

# 绘制面状河流(体现真实岸线与宽度)
geom_sf(data = rivers$osm_multipolygons,
        fill = "#86bbd8",
        col = NA,
        alpha = 0.9)+
# 补充绘制无面数据的细小支流
geom_sf(data = rivers$osm_lines,
        col = "#86bbd8",
        size = 0.2,
        alpha = 1)+

方法2:基于河流中心线生成缓冲面(适配无面状数据的区域)

如果目标区域的OSM没有收录河流面数据,可利用中心线附带的width属性生成对应宽度的缓冲面模拟岸线:

library(dplyr)
library(sf)

# 先将数据转换为投影坐标系(单位为米,避免距离计算错误)
river_lines <- st_transform(rivers$osm_lines, crs = 32650) # 示例为UTM50N投影,可按需替换为对应区域的投影编码

# 补全宽度属性,无标注的河流可自定义默认宽度
river_lines <- river_lines %>%
  mutate(width = as.numeric(width),
         # 缺失值默认填充5米,可根据区域实际情况调整
         width = ifelse(is.na(width), 5, width))

# 按河流宽度生成缓冲面
river_polygons <- st_buffer(river_lines, dist = river_lines$width)

后续绘图直接使用生成的river_polygons面要素即可。

内容的提问来源于stack exchange,提问作者Magda D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:15:03