如何提取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
相关产品推荐
相关产品推荐

