使用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
相关产品推荐
相关产品推荐

