我正在try 使用R中的osmdataggplot来生成路易斯安那州和其中的教区(即县)的 map .这是我目前所在的位置:

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

返回以下内容:

enter image description here

这正确地包括路易斯安那州及其所有教区,但也包括邻近的密西西比州、阿肯色州和德克萨斯州的县.我要怎么做才能到路易斯安那州?

Relatedly... 我第一次try 的是以下内容:

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

而我得到的回报是这个,它包括了整个邻近的州:

enter image description here

所以,似乎是关于我接近这一点的方式的一些东西导致我得到了我正在寻找的任何东西,添加了在同一管理级别上相邻的东西.

推荐答案

@克里斯是正确的,这一切都是关于路易斯安那州的边界框.Overpass({osmdata}用于获取数据)返回与边界框相交的所有要素.功能齐全.因此,你也有周围的国家.最简单的方法是将结果与路易斯安那边界(admin_level = 4name == Louisiana)相交(sf::st_filter()).

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

Edit:

让我扩展一下答案,试着解释它的工作方式:

第一步,我们要求路易斯安那州的边界框:

l <- osmdata::getbb("Louisiana")

边界框作为矩阵返回

l
#>         min       max
#> x -94.04319 -88.75833
#> y  28.85429  33.01959

此边界框稍后将由OVERPASS用作我们查询的空间过滤器.

让我将其转换为用于 map 绘制/绘制的多边形,并将其绘制到路易斯安那州:

whole_bbox <- l |>
  sfext::as_bbox(crs = "EPSG:4326") |>
  sfext::sf_bbox_to_sf()

tmap::tm_shape(whole_bbox) +
  tmap::tm_borders(col = "blue", lwd = 3) +
  tmap::tm_shape(l_state) +
  tmap::tm_borders(col = "red") +
  tmap::tm_basemap()

现在,让我们在边界框中查询Pareshes并将其绘制在 map 上:

all_parishes <- osmdata::opq(bbox = l, timeout = 60*20) |>
  osmdata::add_osm_feature(key = "boundary", value = "administrative") |>
  osmdata::add_osm_feature(key = "admin_level", value = c("6")) |>
  osmdata::osmdata_sf() |>
  osmdata::unname_osmdata_sf()

tmap::tm_shape(all_parishes$osm_multipolygons) +
  tmap::tm_borders(col = "green") +
  tmap::tm_shape(whole_bbox) +
  tmap::tm_borders(col = "blue", lwd = 3) +
  tmap::tm_shape(l_state) +
  tmap::tm_borders(col = "red") +
  tmap::tm_basemap()

如你所见,Overpass返回了所有touched个边界框的教区(事实上,所有与边界框空间相交的教区),包括路易斯安那州以外的教区.因此,我们以某种方式过滤掉了那些有趣的东西.由于没有可用于过滤的通用标签,我们使用空间过滤器(sf::st_filter())来仅获得within路易斯安那州(st_within)的那些.

希望有意义:).

创建于2024-03-20,共reprex v2.1.0

R相关问答推荐

如何使用Cicerone指南了解R Shiny中传单 map 的元素?

将模拟变量乘以多个观测结果中的模拟变量

在数据表中呈现数学符号

R形式的一维数字线/箱形图样式图表

如何删除R中除某些特定名称外的所有字符串?

为了网络分析目的,将数据框转换为长格式列联表

如何提取所有完美匹配的10个核苷酸在一个成对的匹配与生物字符串在R?>

如何在R中描绘#符号?

如何在R forestplot中为多条垂直线分配唯一的 colored颜色 ?

R中的哈密顿滤波

ComplexHEAT:使用COLUMN_SPLIT时忽略COLUMN_ORDER

将多个列值转换为二进制

有没有可能用shiny 的书签恢复手风琴面板?

如何使用字符串从重复的模式中提取多个数字?

如何在R中使用混合GAM模型只对固定的影响因素进行适当的预测?

`-`是否也用于数据帧,有时使用引用调用?

当由base::限定时,`[.factor`引发NextMethod错误

如果满足条件,则替换列的前一个值和后续值

附加中缀操作符

网络抓取NBA.com