在 R 中使用 osmdata 包查找特定几何类型的对象

Use osmdata package in R to find objects of specific geometry type

我正在尝试通过 osmdata 包从 R 中的 openstreetmap 中提取数据,如下所示:

extract_data <- function(bbx){
  highway_vals <- c("motorway", "trunk", "primary", "secondary")
  data <- bbx %>% 
    opq(timeout = 100) %>% 
    add_osm_feature(
      key = "highway", 
      value = highway_vals
    ) 
  
  data_of_interest <- list(osm_lines = data$osm_lines, osm_polygons = data$osm_polygons)
  data_of_interest
}

从这个函数可以看出,我只对直线和多边形感兴趣。有没有办法将此限制放入查询中?我已经尝试查看 available_features(),但没有符合要求的。虽然,我已经看到 here 原则上应该可以通过几何查询,例如“多边形”。

特别是对于大边界框,我将不可避免地下载大量点,即执行查询后 data 变量中始终存在 data$osm_points。我相信这会浪费大量资源(至少分配给变量 data 的内存比分配给 data_of_interest 的内存大得多)并且实际上使我达到了下载限制相当快,即我遇到了 Please check /api/status for the quota of your IP address 错误。

这在原则上和设计上都是不可能的,因为 OSM 的底层数据模型与 Simple Features 的数据模型完全不同。 osmdata 包反映了前者数据模型到后者的一种映射(在 a package vignette 中对设计决策进行了一定程度的解释)。这些点总是在那里,因为它们是 OSM 数据库中唯一包含实际坐标的部分。 omsdata 包简单地将它们转换为简单功能形式,但无论如何它们总是被交付。 OSM 只知道三件事:节点、方式和关系。线和多边形(以及其他任何东西)都可以由多个单独的“方式”组成,这些方式必须缝合在一起以形成简单要素“线”或“多边形”。这些方式又没有坐标,而只是点 ID 的序列,这就是必须始终交付点的原因。这有效地防止了按照您建议的方式简化查询 - 没有“资源浪费”,因为您想要的(线和多边形)需要无论如何都交付所有数据。您唯一可以做的就是减少您的边界框,或者使用更具体的键值对(或两者)优化您的查询。