在R中绘制蒙特利尔行政区地图遇问题,请求修正代码
修正后的蒙特利尔行政区地图绘制代码
原代码未筛选特定层级的行政边界,导致获取了包含城市、省级等更高层级的边界,覆盖了目标行政区。以下是修正后的代码,可完整显示所有蒙特利尔行政区并添加名称标签:
library(osmdata) library(ggplot2) library(sf) # 获取蒙特利尔行政区边界数据,筛选admin_level=9(对应蒙特利尔行政区层级) montreal_boroughs <- getbb("Montreal, Quebec, Canada") %>% opq(timeout = 50) %>% add_osm_feature(key = "boundary", value = "administrative") %>% add_osm_feature(key = "admin_level", value = "9") %>% # 指定行政区层级 osmdata_sf() # 提取多边形数据并保留名称字段 boroughs_sf <- montreal_boroughs$osm_multipolygons %>% select(name, geometry) %>% filter(!is.na(name)) # 过滤无名称的无效条目 # 计算每个行政区的中心坐标,用于放置标签 borough_centroids <- st_centroid(boroughs_sf) # 绘制地图并添加标签 ggplot() + geom_sf(data = boroughs_sf, fill = "#e0f2f1", color = "#263238", linewidth = 0.5) + geom_sf_text(data = borough_centroids, aes(label = name), size = 3, color = "#004d40") + coord_sf(xlim = st_bbox(boroughs_sf)[c(1,3)], ylim = st_bbox(boroughs_sf)[c(2,4)]) + # 聚焦行政区范围 theme_void() + labs(title = "蒙特利尔行政区地图", caption = "数据来源:OpenStreetMap")
关键修正说明:
- 新增
add_osm_feature(key = "admin_level", value = "9")筛选蒙特利尔专属的行政区层级,排除其他层级的边界干扰。 - 用
sf包的st_centroid计算多边形中心,确保标签精准落在每个行政区的核心位置。 - 过滤无名称条目,避免无效标签显示。
- 设置
coord_sf的视图范围,确保所有行政区完整展示在画布内。
内容的提问来源于stack exchange,提问作者ebrahimi
相关产品推荐
相关产品推荐

