如何删除使用的'$ osm_points'在R中的osmdata对象中绘制其他空间对象,例如'$ osm_polygons'和'$ multipolygons'

问题描述

我希望找出位于布里斯班各个公交车站400m以内的兴趣点(例如商店,大学,体育设施)。为此,我一直使用R中的osmdata包从Open Street Map中提取要素。我的计划是计算每个公交车站400m缓冲区内的点数,并计算多边形的数量与所述缓冲区相交。

但是,我注意到osmdata对象中的'$ osm_points'中的一些但不是全部似乎并不表示POI,而是这些点较复杂的空间对象,例如'$ osm_polygons''$ osm_multipolygons'。在下面的布里斯班中央商务区商店示例中可以看到这一点:

@H_502_13@## Import libraries
library(osmdata)
library(ggmap)




# Define functions

## Function to make bounding Box
makebb <- function(x) {
  x <- matrix(x,nrow=2,ncol=2)
  rownames(x) <- c("x","y")
  colnames(x) <- c("min","max")
  return(x)
}

## Function to extract all values within a specific key
osm_key <- function(x,bb) {
  x <- bb %>% opq() %>% add_osm_feature(x)
  x <- osmdata_sf(x)
  return(x)
}

## Function to extract specific values within a key
osm_keyvalue <- function(x,y,bb) {
  x <- bb %>% opq() %>% add_osm_feature(x,y)
  x <- osmdata_sf(x)
  return(x)
}

## Function to plot OSM objects
osm_plot <- function(x,bb) {
  defined_map <- get_map(bb,maptype = "toner-background")
  if (is.null(x$osm_multipolygons)) {
    ggmap(defined_map) +
      geom_sf(data = x$osm_points,inherit.aes = FALSE,colour = "#238443",fill = "#004529",alpha = 1,size = .7,shape = 21) +
      geom_sf(data = x$osm_polygons,alpha = .5,size = .3,shape = 21) +
      labs(x = "",y = "")
  } else {
    ggmap(defined_map) +
      geom_sf(data = x$osm_points,shape = 21) +
      geom_sf(data = x$osm_multipolygons,y = "")
  }
  
}




# Plot shops in CBD
CBD <- makebb(c(153.02,-27.475,153.03,-27.465))
shop <- osm_key("shop",CBD)
osm_plot(shop,CBD)

enter image description here

如您所见,有些观点似乎代表着独立的商店,我希望将其包括在POI计数中。但是,其他人似乎只是代表较大百货商店的多边形的角,我想排除在外。

一个更极端的例子是昆士兰大学(UoQ)校园的例子:

@H_502_13@# Plot University of Queensland campus
UoQ <- makebb(c(153.00,-27.51,-27.49))
university <- osm_keyvalue("amenity","university",UoQ)
osm_plot(university,UoQ)

enter image description here

在这里,这些点显然并不代表单独的大学,而是UoQ校园多面体的一角。因此,在校园边缘的一个公共汽车站只有一个,可能会错误注册400m半径内的几所大学。

是否可以删除用于绘制其他空间对象(例如“ $ osm_polygons”和“ $ multipolygons”)的“ $ osm_points”,以便仅相关POI保留在“ $ osm_points”部分中osmdata对象?

解决方法

这里最好的方法可能是在osmdata的{​​{3}}中创建一个新问题,要求作者定​​义一个新功能来执行github issue page的相反操作(或者可能只是征求建议)。同时,我认为您可以使用以下方法:

# packages
library(osmdata)
#> Data (c) OpenStreetMap contributors,ODbL 1.0. https://www.openstreetmap.org/copyright
library(mapview)

# Define functions

## Function to make bounding box
makebb <- function(x) {
  x <- matrix(x,nrow = 2,ncol = 2)
  rownames(x) <- c("x","y")
  colnames(x) <- c("min","max")
  return(x)
}

## Function to extract all values within a specific key
osm_key <- function(x,bb) {
  x <- bb %>% opq() %>% add_osm_feature(x)
  x <- osmdata_sf(x)
  return(x)
}

## Function to extract specific values within a key
osm_keyvalue <- function(x,y,bb) {
  x <- bb %>% opq() %>% add_osm_feature(x,y)
  x <- osmdata_sf(x)
  return(x)
}

# Plot shops in CBD
CBD <- makebb(c(153.02,-27.475,153.03,-27.465))
shop <- osm_key("shop",CBD)

mapview(shop$osm_points,cex = 2) + shop$osm_polygons

# Get all the points that define the polygons
shop_points_defining_polygons <- osm_points(shop,rownames(shop$osm_polygons))
# Exclude all points that define the polygons
shop_proper_points <- dplyr::anti_join(
  shop$osm_points,sf::st_drop_geometry(shop_points_defining_polygons),by = "osm_id"
)

mapview(shop_proper_points,cex = 2) + shop$osm_polygons

osm_points(v0.3.0)于2020-08-23创建