You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 08:45:46