如何使用OSMnx筛选OpenStreetMap指定Surface类型的道路边?
如何用OSMnX按道路Surface属性筛选道路边?
问题背景
使用OSMnX获取OpenStreetMap数据时,默认生成的道路边GeoDataFrame不包含surface属性(该属性取值包括Unpaved、Asphalt、Gravel等),现有代码如下:
import osmnx as ox graph = ox.graph_from_place('Bennekom') nodes, edges = ox.graph_to_gdfs(graph)
解决方案
1. 获取包含Surface属性的道路数据
OSMnX默认的道路网络查询不会自动抓取所有OSM标签,需要在查询时明确指定要获取surface属性。修改代码如下:
import osmnx as ox # 自定义查询标签,指定获取公路类型与surface属性 graph = ox.graph_from_place('Bennekom', tags={'highway': True, 'surface': True}) nodes, edges = ox.graph_to_gdfs(graph)
注:若使用旧版OSMnX,可能需要用custom_tags参数代替tags,具体以对应版本文档为准。
2. 按Surface类型筛选道路边
得到包含surface列的edges GeoDataFrame后,直接通过布尔索引筛选即可:
# 筛选沥青路面道路 asphalt_roads = edges[edges['surface'] == 'asphalt'] # 筛选未铺装路面道路 unpaved_roads = edges[edges['surface'] == 'unpaved'] # 筛选碎石路面道路 gravel_roads = edges[edges['surface'] == 'gravel']
注意:OSM标签值通常为小写,匹配时需使用小写字符串。
3. 处理缺失Surface属性的道路
若部分道路未标注surface属性,可先剔除这些数据再筛选:
# 移除无surface属性的道路 valid_edges = edges.dropna(subset=['surface']) # 筛选多种路面类型的道路 target_surfaces = ['asphalt', 'gravel'] filtered_roads = valid_edges[valid_edges['surface'].isin(target_surfaces)]
内容的提问来源于stack exchange,提问作者Bart
相关产品推荐
相关产品推荐

