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

Python调用OpenElevation API查询海拔返回Invalid JSON报错问题

问题原因

报错核心原因是传参方式不符合接口规则:

  1. OpenElevation的POST接口要求请求体必须传入标准JSON格式数据,将locations作为URL查询参数传递时,服务端读取不到合法JSON请求体,直接返回Invalid JSON错误
  2. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:36:35