为什么在 R 中使用 osmdata 进行映射时会得到相邻状态?

问题描述 投票:0回答:2

我正在尝试使用 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()

我得到的回报是这个,其中包括整个邻近的州:

因此,似乎我处理此问题的方式导致我找回了我正在寻找的任何内容,并添加了同一管理级别上相邻的任何内容。

r ggplot2 openstreetmap osmdata
2个回答
2
投票

@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


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()

© www.soinside.com 2019 - 2024. All rights reserved.