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

使用R的osmdata绘制路易斯安那州地图时为何包含相邻州?

解决路易斯安那州教区地图多余区域问题

方法一:空间过滤(最可靠)

先精准获取路易斯安那州的边界多边形,再用这个多边形做蒙版,只保留州范围内的教区,彻底排除相邻州的区域。

完整代码:

library(osmdata)
library(ggplot2)
library(sf) # 需用到sf包的空间操作工具

# 1. 获取路易斯安那州的边界多边形
la_bbox <- getbb("Louisiana")
la_state <- opq(bbox = la_bbox) %>%
  add_osm_feature(key = "admin_level", value = "4") %>% # 州级行政级别
  add_osm_feature(key = "name", value = "Louisiana") %>% # 精准匹配州名,避免误抓相邻州
  osmdata_sf()

# 提取州的主多边形(取第一个结果即可)
la_polygon <- la_state$osm_multipolygons[1, ]

# 2. 获取边界框内的所有教区/县级区域
parishes <- opq(bbox = la_bbox) %>%
  add_osm_feature(key = "admin_level", value = "6") %>% # 教区/县级行政级别
  osmdata_sf()

# 3. 空间筛选:只保留完全在路易斯安那州内的教区
la_parishes <- parishes$osm_multipolygons[
  st_within(parishes$osm_multipolygons, la_polygon, sparse = FALSE)[,1], 
]

# 4. 绘制地图
mapla <- ggplot() +
  geom_sf(data = la_parishes, fill = "#87CEEB", color = "white") +
  geom_sf(data = la_polygon, fill = NA, color = "black", linewidth = 1) + # 可选:叠加州边界线
  theme_void()

print(mapla)

方法二:精准OSM标签筛选

直接在查询时通过OSM的属性标签缩小范围,不过要注意OSM标签可能存在不统一的情况,稳定性不如空间过滤。

示例代码:

library(osmdata)
library(ggplot2)

parishes <- opq(getbb("Louisiana")) %>%
  add_osm_feature(key = "admin_level", value = "6") %>%
  add_osm_feature(key = "is_in:state", value = "Louisiana") %>% # 筛选归属路易斯安那州的教区
  osmdata_sf()

mapla <- ggplot() +
  geom_sf(data = parishes$osm_multipolygons) +
  theme_void()

print(mapla)

原代码问题原因

getbb("Louisiana")返回的是路易斯安那州的矩形边界框,这个框会覆盖到相邻州的边缘区域。当你用这个框查询同级行政要素时,OSM会返回所有落在框内的对应级别区域,自然就包含了相邻州的边缘县/州的部分区域。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 13:17:30