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')
时,您将获得:
我使用 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')
时,您将获得: