如何绘制河岸而不是 R 中的一条线?

How to plot river banks instead of a single line in R?

我一直在尝试使用 sf 和 osm 制作城市地图,但我在与河流作斗争。我设法提取了河流线,所以它在图像上看起来像,即每条河流只有一条线。

有没有办法画出河流的边界,这样就能看出河流有多宽?

我这样提取行:

rivers <- bbx %>%
  opq()%>%
  add_osm_feature(key = "waterway", 
                  value = c("river", "riverbank", "canal", "stream")) %>%
  osmdata_sf() 

然后这是我的 ggplot2 代码中的相关部分:

  geom_sf(data = rivers$osm_lines,
          col = "red",
          size = .15,
          alpha = 1)+

两者都可以查询;您只需要记住标签 waterway returns a line geometry, while water returns 是一个多边形(通常是多边形类型)。您可能需要拨打两次 OSM 立交桥电话 API。

对于具体示例,请考虑这段代码,它使用来自英国伦敦的河流 - 您希望泰晤士河在其中占据显着位置;它穿过城市时变得很宽...

请注意,从 API 调用返回的多边形和多边形都需要映射。

library(dplyr)
library(ggplot2)
library(osmdata)

bbx <- getbb("London")

# first API call - rivers as lines
rivers_as_lines <- opq(bbox = bbx) %>% 
  add_osm_feature(key = "waterway") %>%
  osmdata_sf(quiet = F) 

# second API call - rivers as polygons
rivers_as_polygons <- opq(bbox = bbx) %>% 
  add_osm_feature(key = "water") %>%
  osmdata_sf(quiet = F) 

# a visual overview; note the polygons + multipolygons plotted separately
ggplot() +
  geom_sf(data = rivers_as_polygons$osm_polygons, fill = "steelblue") +
  geom_sf(data = rivers_as_polygons$osm_multipolygons, fill = "steelblue") +
  geom_sf(data = rivers_as_lines$osm_lines, color = "red") +
  coord_sf(xlim = bbx["x", ],
           ylim = bbx["y", ])