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

如何提取OpenElevation API响应JSON的elevation存入DataFrame新列

从OpenElevation API提取海拔值写入Pandas DataFrame的正确实现

报错根因

你之前的两种写法踩了两个基础语法/结构错误:

  • resp.json是requests库响应对象的方法,不是存储解析结果的属性,必须加()调用才能直接得到解析完成的Python字典/列表结构,不需要额外调用json.loads()二次处理。json.loads()只接收原始JSON格式的字符串/字节,你把方法对象直接传进去触发第一个类型错误。
  • 接口返回结构中results对应的是列表类型(返回值外层包裹了[]),不是直接的键值对字典,必须先通过索引[0]取出列表内的点位对象,才能访问到elevation字段,直接对列表按字典方式取键触发第二个报错。

单条坐标海拔提取正确代码

coordinates = f"{stations.iloc[2]['Lat']}, {stations.iloc[2]['Long']}"
url = f'https://api.open-elevation.com/api/v1/lookup?locations={coordinates}'
resp = rq.get(url)
resp_data = resp.json()
# 先取results列表第一个元素,再取elevation字段
single_elevation = resp_data['results'][0]['elevation']
print(single_elevation) # 输出27,和你之前拿到的接口返回一致

批量给整个DataFrame添加海拔列

逐行发请求效率极低,OpenElevation支持单次请求传入多个坐标(不同坐标用|分隔),可以一次性拿到所有点位的海拔:

# 把每行的经纬度拼接成接口要求的格式
coord_parts = []
for _, row in stations.iterrows():
    coord_parts.append(f"{row['Lat']}, {row['Long']}")
# 多个坐标用|拼接成请求参数
locations_param = "|".join(coord_parts)
url = f'https://api.open-elevation.com/api/v1/lookup?locations={locations_param}'
resp = rq.get(url)
all_results = resp.json()['results']
# 按返回顺序提取海拔值,赋值为DataFrame新列
stations['elevation'] = [res['elevation'] for res in all_results]

如果点位总数超过1000个,建议拆分成分批请求,避免URL过长触发接口限制。


内容的提问来源于stack exchange,提问作者Fabio D'Elfant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:24:26