Python调用OpenElevation API查询海拔返回Invalid JSON报错问题
问题原因
报错核心原因是传参方式不符合接口规则:
- OpenElevation的POST接口要求请求体必须传入标准JSON格式数据,将
locations作为URL查询参数传递时,服务端读取不到合法JSON请求体,直接返回Invalid JSON错误 - 用
requests的params字段传值时,会自动对特殊符号做URL编码,分隔经纬度的逗号、分隔多点位的|都会被转义,即使用GET请求也容易出现格式不匹配问题。
正确调用实现
1. 少量点位:GET请求
点位数量少时可直接用GET请求,坐标串直接拼接在URL路径后,不要用params传参避免自动转义:
import requests # 多个坐标用|分隔,单个坐标格式为 纬度,经度 url = "https://api.open-elevation.com/api/v1/lookup?locations=10,10|20,20|41.161758,-8.583933" resp = requests.get(url) print(resp.json())
返回结构示例:
{ "results": [ {"latitude": 10, "longitude": 10, "elevation": 515}, {"latitude": 20, "longitude": 20, "elevation": 492}, {"latitude": 41.161758, "longitude": -8.583933, "elevation": 117} ] }
2. 批量点位:POST请求(大批量场景推荐)
POST请求需携带Content-Type: application/json请求头,坐标列表放在JSON请求体中传递,无需用|拼接坐标,直接传结构化坐标数组即可,可避开GET请求的URL长度限制:
import requests url = "https://api.open-elevation.com/api/v1/lookup" # 构造请求体:locations为坐标对象数组,每个对象包含latitude、longitude字段 payload = { "locations": [ {"latitude": 10, "longitude": 10}, {"latitude": 20, "longitude": 20}, {"latitude": 41.161758, "longitude": -8.583933} ] } # 传入json参数,requests会自动完成序列化、设置对应请求头 resp = requests.post(url, json=payload) print(resp.json())
注意:不要用
data=payload直接传字典,requests的json参数会自动将字典序列化为JSON字符串,同时配置正确的请求头;手动传data如果不做序列化、不单独设置请求头,依然会触发Invalid JSON报错。
大批量坐标处理提示
- 单次POST请求携带点位建议不超过1000个,避免请求超时或被服务端拦截
- 超大量点位建议分块切片后增加请求间隔,不要短时间发起高频请求触发限流
- 对服务稳定性要求高的场景,可本地部署OpenElevation服务,不受公共接口限流规则约束
内容的提问来源于stack exchange,提问作者okayatcp12
相关产品推荐
相关产品推荐

