如何用Python从OpenStreetMap Overpass API结果中提取name和id
如何从Overpass API返回的JSON中提取id和name字段?
问题背景
我正在使用Python调用OpenStreetMap的Overpass API,执行了以下代码:
import requests import json lat='51.404924' lon='12.444895' overpass_url = "http://overpass-api.de/api/interpreter" overpass_query = "[out:json][timeout:600];(way(around:700,"+lat+","+lon+")[landuse=industrial];);out geom;" response = requests.get(overpass_url, params={'data': overpass_query}) data = response.json() for key in data: print("dict has", key) elements=data["elements"] print(type(elements))
得到的简化返回结果如下:
{ "version": 0.6, "generator": "Overpass API 0.7.55 579b1eec", "elements": [ { "type": "way", "id": 12805981, "geometry": [ { "lat": 51.410593, "lon": 12.4327856 } ], "tags": { "addr:housenumber": "1", "addr:street": "BMW-Allee", "landuse": "industrial", "name": "BMW Werk 07.10 Leipzig" } } ] }
我原本以为elements是字典,但实际它是列表,导致我最初尝试的print(data["elements"]["tags"]["name"])无法运行。请问该如何提取其中的name和id?
解决方案
别担心,这个问题很常见——你混淆了字典和列表的访问方式!返回结果里的elements是列表类型(因为API可能返回多个匹配的工业用地条目),而不是单个字典,所以必须先访问列表中的元素,再去提取字典里的字段。
情况1:确定只有一个返回结果
如果你的查询逻辑只会返回一个匹配项,可以直接通过索引[0]获取列表的第一个元素,再提取字段:
# 从elements列表中取出第一个元素(字典类型) target_element = data["elements"][0] # 提取id和name element_id = target_element["id"] element_name = target_element["tags"]["name"] print(f"元素ID: {element_id}") print(f"元素名称: {element_name}")
情况2:兼容多个返回结果
如果查询可能返回多个条目,推荐用循环遍历整个elements列表,这样不管结果数量多少都能处理,还能避免因没有name标签导致的报错:
for element in data["elements"]: # 提取id element_id = element["id"] # 用get方法获取name,不存在时返回默认值"无名称" element_name = element["tags"].get("name", "无名称") print(f"ID: {element_id}, 名称: {element_name}")
错误原因说明
你之前的代码data["elements"]["tags"]["name"]试图直接对列表使用字典的键访问方式,但列表只能通过数字索引访问元素,因此会抛出TypeError。正确的步骤是:先从列表中拿到字典元素,再通过键访问对应的字段。
内容的提问来源于stack exchange,提问作者Luis Paganini
相关产品推荐
相关产品推荐

