R osmdata query returns 对象被旧查询的结果污染

R osmdata query returns object contaminated with results from an old query

我使用 osmdata 包进行了以下查询:

library(osmdata)
library(sf)

# Get map boundaries for UK:
bb <- getbb ('uk', format_out = 'polygon')

# Fetch data for selected boundaries from osmdata:
ukbasemap <- opq(bbox = bb) %>% # set boundary box
  add_osm_feature(key = 'admin_level', value = '4') %>% # add feature
  osmdata_sf () %>% # convert to sf object
  trim_osmdata (bb) # trim to edges of boundary (i.e. UK borders)

这返回了以下警告,但在其他方面创建了 sf 对象而没有明显问题: bb_poly has more than one polygon; the first will be selected.

然后我尝试绘制数据,但下面的代码生成了一个空白图:

> sf::plot_sf(ukbasemap$osm_lines)
> sf::plot_sf(ukbasemap$osm_polygons)
> sf::plot_sf(ukbasemap$osm_multipolygons)
> sf::plot_sf(ukbasemap$osm_points)

当我查看 sf 对象时,我惊讶地发现其中有一些来自中非共和国的地名。我 运行 几个月前查询了 ​​CAR,我唯一能想到的是我不小心设置了一些全局选项来引用 CAR 数据 - 但我不记得这样做了。这是 sf 对象的片段:

> ukbasemap$osm_points
Simple feature collection with 2 features and 23 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 20.54475 ymin: 5.768001 xmax: 20.67557 ymax: 6.311055
Geodetic CRS:  WGS 84
               osm_id    name   GNS.id alt_name capital created_by  ele ford is_in.continent
2222388003 2222388003   Ouaka     <NA>     <NA>    <NA>       <NA> <NA> <NA>            <NA>
4680378478 4680378478 Bambari -1339188     <NA>       4       <NA> <NA> <NA>            <NA>
           is_in.country name.de name.en   name.ko  name.ru name.sg  name.uk place
2222388003          <NA>    <NA>    <NA>      <NA> Уака  Wäkä Уака state
4680378478          <NA>    <NA>    <NA> 밤바리     <NA>    <NA>     <NA>  city
           population  ref source state_code wikidata wikipedia                  geometry
2222388003       <NA>   UK   <NA>         UK  Q848560  fr:Ouaka POINT (20.54475 6.311055)
4680378478      41356 <NA>    GNS       <NA>  Q805946      <NA> POINT (20.67557 5.768001)

“Ouaka”和“Bambari”是中非共和国的地名。

有人知道这里会发生什么吗?我该如何解决?

这是因为您的边界框实际上并未指代英国。之所以如此,是因为默认 featuretype = "settlement" 结合了“国家”以下和“街道”以上的所有中间级别的结果(参见 here)。

您可以通过添加 feature_type = "country".

来获取国家/地区的边界框
bb <- getbb("uk", format_out = 'polygon', featuretype = "country")

您可以通过这样映射来检查您的边界框是否正确。

library(leaflet)

bb <- getbb("uk", format_out = 'sf_polygon', featuretype = "country")

leaflet(bb$multipolygon) %>% 
  addProviderTiles("CartoDB.Positron") %>% 
  addPolygons()

当使用 bb <- getbb ('uk', format_out = 'polygon') 时,您将获得: