我正在尝试使用 R 中的
osmdata
和 ggplot
生成路易斯安那州及其教区(即县)的地图。这是我当前所在的位置:
library(osmdata)
library(ggplot2)
louisiana <- opq(getbb("Louisiana"))
parishes <- osmdata_sf(add_osm_feature(louisiana, key = "admin_level", value = "6"))
mapla <- ggplot() +
geom_sf(data = parishes$osm_multipolygons) +
theme_void()
返回以下内容:
这正确地包括路易斯安那州及其所有教区,但也包括邻近的密西西比州、阿肯色州和德克萨斯州的县。我需要做什么才能到达路易斯安那州?
相对... 我首先尝试的是以下内容:
louisiana <- opq(getbb("Louisiana"))
state <- osmdata_sf(add_osm_feature(louisiana, key = "admin_level", value = "4"))
mapla <- ggplot() +
geom_sf(data = state$osm_multipolygons) +
theme_void()
我得到的回报是这个,其中包括整个邻近的州:
因此,似乎我处理此问题的方式导致我找回了我正在寻找的任何内容,并添加了同一管理级别上相邻的任何内容。
@Chris 是对的,这都是关于路易斯安那州的边界框。 Overpass(由 {osmdata} 用于获取数据)返回与边界框相交的所有要素。功能齐全。因此你也有周边的国家。最简单的方法是将结果与路易斯安那州边界(
sf::st_filter()
和 admin_level = 4
)相交 (name == Louisiana
)。
l <- osmdata::getbb("Louisiana")
b <- osmdata::opq(bbox = l, timeout = 60*20) |>
osmdata::add_osm_feature(key = "boundary", value = "administrative") |>
osmdata::add_osm_feature(key = "admin_level", value = c("4", "6")) |>
osmdata::osmdata_sf() |>
osmdata::unname_osmdata_sf()
l_state <- b$osm_multipolygons |>
subset(admin_level == 4 & name == "Louisiana")
parishes <- b$osm_multipolygons |>
sf::st_filter(l_state, .predicate=sf::st_within) |>
subset(admin_level == 6)
tmap::tm_shape(parishes) +
tmap::tm_borders() +
tmap::tm_shape(l_state) +
tmap::tm_borders(col = "red")
创建于 2024-03-20,使用 reprex v2.1.0
如果您感兴趣,您还可以使用
tigris
包更快地获得相同的结果,该包从美国人口普查局的 TIGER/Line Shapefile 中获取权威的政治边界。
library(tigris)
library(ggplot2)
la_parishes <- counties(state = "LA")
la_state <- states() |>
filter_state("Louisiana")
ggplot() +
geom_sf(data = la_parishes) +
geom_sf(data = la_state, fill = NA, color = "red") +
theme_void()