使用Overpy与Python从OSM获取数据:表格结果获取问题
解决Overpy无法获取道路长度统计数据的问题
overpy库仅支持解析OpenStreetMap的核心元素(节点、道路、关系),而你使用make stat生成的是统计结果,不属于overpy默认处理的元素类型,因此无法通过它的属性访问数据。以下是两种可行的解决方案:
方案一:直接请求CSV格式并转换为DataFrame
利用你原本在Overpass Turbo中可用的CSV查询,直接通过requests调用Overpass API获取结果,再用Pandas解析:
import requests import pandas as pd from io import StringIO # Overpass API地址 OVERPASS_API = "https://overpass-api.de/api/interpreter" # 你的CSV查询语句 query = """ [out:csv(length,value)]; way[highway](50.6,7.0,50.8,7.3); for (t["highway"]) { make stat value=_.val,length=sum(length()); out; } """ # 发送请求并获取响应 response = requests.get(OVERPASS_API, params={"data": query}) response.raise_for_status() # 捕获请求错误 # 解析CSV为DataFrame df = pd.read_csv(StringIO(response.text)) # 保存为本地CSV文件 df.to_csv("road_length_stats.csv", index=False) # 打印结果 print(df)
方案二:请求JSON格式并解析统计数据
如果偏好JSON格式,可通过requests获取JSON响应后手动提取统计字段:
import requests import pandas as pd OVERPASS_API = "https://overpass-api.de/api/interpreter" # JSON格式的查询语句 query = """ [out:json]; way[highway](50.6,7.0,50.8,7.3); for (t["highway"]) { make stat value=_.val,length=sum(length()); out; } """ response = requests.get(OVERPASS_API, params={"data": query}) response.raise_for_status() json_data = response.json() # 提取统计数据 stats = [] for elem in json_data["elements"]: stats.append({ "road_type": elem["tags"]["value"], "total_length": float(elem["tags"]["length"]) }) # 转换为DataFrame并保存 df = pd.DataFrame(stats) df.to_csv("road_length_stats.csv", index=False) print(df)
核心原因说明
overpy的设计定位是处理OSM的地图实体数据(节点、道路等),而非统计聚合结果。因此当查询返回make stat生成的统计元素时,overpy不会将其存入Result对象的nodes/ways/relations属性中,导致无法通过常规方式访问。
内容的提问来源于stack exchange,提问作者Klapaucius
相关产品推荐
相关产品推荐

