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