如何从OpenStreetMap的osm.pbf文件中提取街道名称
提取OSM街道名称的实现方法
OSM中街道属于way类型要素,核心判定依据是要素携带highway标签,街道名称存储在同要素的name(或对应语言的name:xx)标签下,按以下步骤处理即可准确提取:
步骤1:锁定道路类要素
首先排除node(点位)、relation(关系)类要素,同时排除没有highway标签的非道路way(比如建筑边界、用地边界、水系岸线等):
# 提取所有带highway标签的道路way的唯一ID road_way_ids = df_osm[ (df_osm["type"] == "way") & (df_osm["tagkey"] == "highway") ]["id"].unique() # 筛选出所有道路way关联的全部标签 road_tag_records = df_osm[df_osm["id"].isin(road_way_ids)]
步骤2:宽表转换提取属性
把长表格式的标签记录透视为每行对应一个道路要素的宽表,方便提取属性:
# 标签行转列,每个道路way为单独一行 road_attrs = road_tag_records.pivot( index=["id"], columns="tagkey", values="tagvalue" ).reset_index()
步骤3:过滤得到有名称的街道
从宽表中提取有名称的道路,可按需按道路等级筛选需要的街道类型:
# 过滤掉无名称的道路,提取核心字段 named_streets = road_attrs.dropna(subset=["name"])[ ["id", "highway", "name"] ].drop_duplicates(subset=["id"])
精度优化注意事项
- 道路类型过滤:常规城市公开街道一般对应
highway字段值为residential(居住区道路)、primary/secondary/tertiary(各级城市干道)、pedestrian(步行街)、living_street(生活街道),可按需排除不需要的类型:比如motorway/motorway_link(高速及匝道)、service(内部服务通道)、cycleway(专用自行车道)、footway(步行小径)、steps(台阶)、path(郊野野径)。 - 多语言名称适配:如果需要特定语言的街道名,可直接提取对应标签,比如中文名称取
name:zh字段、英文名称取name:en字段,不必强制使用默认name字段。 - 避坑提醒:不要直接筛选
tagkey == 'name'的记录,建筑、POI点位、公交站、站点等大量非街道要素都携带name标签,必须先通过「way类型+存在highway标签」的规则锁定道路实体,再提取名称,避免混入无关数据。
内容的提问来源于stack exchange,提问作者Nabih Bawazir
相关产品推荐
相关产品推荐

