使用openrouteservice.org POIs服务出现KeyError: osm_tags错误如何解决
错误原因说明
KeyError: 'osm_tags'和点位名称为波斯语无任何关联,该错误是因为你修改坐标后,接口返回的POI结果中部分点位不存在osm_tags字段:openrouteservice POI接口仅对绑定了对应OSM标签的点位返回该字段,未绑定标签的点位不会返回该字段,原示例使用的坐标对应的POI刚好都有该字段所以不会报错。
解决方法
- 替换直接键访问为安全取值方式:将代码中所有直接读取
poi['osm_tags']的逻辑,替换为字典的get方法,不存在时返回默认空字典,避免抛出键错误:
# 原错误写法 osm_tags = poi['osm_tags'] # 修改后安全写法 osm_tags = poi.get('osm_tags', {})
- 新增分支逻辑兼容无标签点位:读取
osm_tags下的子字段时,同样使用get方法或者提前判断字段是否存在,示例逻辑如下:
for poi in pois_response['features']: # 安全读取各字段 poi_name = poi.get('name', '未命名点位') osm_tags = poi.get('osm_tags', {}) amenity_type = osm_tags.get('amenity', '无对应设施类型') # 后续业务逻辑 print(f"点位名称:{poi_name},设施类型:{amenity_type}")
- 可选:过滤返回结果仅保留带OSM标签的点位:如果你的业务逻辑必须依赖
osm_tags字段,可以在发请求时在filters参数中添加规则,接口只会返回符合条件的点位:
# 请求参数新增过滤规则示例 request_params = { "request": "pois", "geometry": {"geojson": {"type": "Point", "coordinates": [34.798282, 48.514728]}, "buffer": 500}, # 新增过滤条件 "filters": { "osm_tags": {"exists": True} } }
- 可选:修改返回名称的语言:如果需要优先获取英文点位名称,可以在请求头中添加
Accept-Language: en参数,接口会优先返回英文的name字段,无对应英文值时才会返回本地语言(波斯语)。
内容的提问来源于stack exchange,提问作者user16529463
相关产品推荐
相关产品推荐

