R中使用osmdata包查询OSM数据时如何限制仅返回线、面几何对象
osmdata包查询OpenStreetMap时仅返回线和多边形的方法
你提出的查询阶段过滤要素类型的需求可以直接通过osmdata包的内置参数实现,不需要下载全量数据后再筛选:add_osm_feature()函数提供了osm_type参数,专门用于指定要查询的OSM要素类型,可选值为node(对应返回结果中的点要素osm_points)、way(对应线/面要素osm_lines/osm_polygons)、relation(对应多线/多面要素osm_multilines/osm_multipolygons)。你在available_features()中没有找到相关参数是正常的,这是osmdata封装的查询控制参数,不属于OSM的要素属性字段。
你只需要在调用add_osm_feature()时指定仅查询way和relation类型,就能从源头上排除点数据的查询和返回,大幅降低下载量和内存占用,避免不必要的配额消耗。
修改后的参考代码如下:
extract_data <- function(bbx){ highway_vals <- c("motorway", "trunk", "primary", "secondary") data <- bbx %>% opq(timeout = 100) %>% add_osm_feature( key = "highway", value = highway_vals, # 仅查询线、关系类型要素,完全排除点要素 osm_type = c("way", "relation") ) %>% osmdata_sf() data_of_interest <- list( osm_lines = data$osm_lines, osm_polygons = data$osm_polygons ) return(data_of_interest) }
额外优化建议
- 若你需要保留多线、多面类型的道路数据,可按需将
osm_multilines、osm_multipolygons加入返回列表 - 查询超大边界框时,可将边界框拆分为多个小框分块查询,进一步降低超时和触达配额限制的概率
内容的提问来源于stack exchange,提问作者AlbertRapp
相关产品推荐
相关产品推荐

