高德反向地理编码必须传key和"经度,纬度"格式的location参数,注意顺序、精度及URL编码;响应需检查status="1"而非仅HTTP状态码;addressComponent字段可能为空,应安全取值;调用须限流防OVER_QUERY_LIMIT。

反向地理编码请求必须带 key 和 location 参数
高德 API 的反向地理编码接口(https://restapi.amap.com/v3/geocode/regeo)要求至少传入 key 和 location 两个参数,否则直接返回错误码 10007(缺少必填参数)。location 格式必须是 "经度,纬度" 字符串,顺序不能颠倒,且小数点后建议保留 6 位以内,避免因精度超限被截断或拒绝。
常见错误包括:
- 把
lat,lng写成lng,lat(高德严格要求“先经度后纬度”) - 用空格或分号分隔坐标,如
"116.48 39.99"或"116.48;39.99" - 未 URL 编码特殊字符(实际中
location值不含需编码字符,但若手动拼接 URL,key中含非 ASCII 字符则需编码)
requests.get() 调用时要检查 status_code 和 response["status"]
HTTP 状态码 200 只代表网络可达,不代表 API 成功返回结果。高德响应体是 JSON,必须读取 response["status"] 字段:值为 "1" 才表示业务成功;"0" 表示失败,此时要看 response["info"](如 "INVALID_USER_KEY"、"OVER_QUERY_LIMIT")。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
response = requests.get(url, timeout=5)设置超时,避免卡死 - 加
response.raise_for_status()捕获 4xx/5xx 网络错误 - 再判断
res_json = response.json(); if res_json.get("status") != "1": raise ValueError(res_json.get("info")) - 不要直接对
response.text调用.split()或正则提取——它不是纯文本,是结构化 JSON
返回的 addressComponent 中 adcode 和 district 可能为空
反向编码结果中的 addressComponent 对象包含省市区三级信息,但高德对郊区、野外、海域等位置可能不返回 district(区)或 adcode(行政区划代码)。例如在渤海中部调用,district 为 "",adcode 为 "0",而 province 和 city 也可能为空字符串。
安全取值方式:
- 用
addr.get("district") or addr.get("city") or addr.get("province")提供降级 fallback - 不要假设
addr["adcode"]一定存在或为数字字符串,需先if "adcode" in addr and addr["adcode"].isdigit() - 完整地址推荐优先使用顶层
response["regeocode"]["formatted_address"],它已由高德拼接好,比手动拼addressComponent更稳定
批量调用必须控制 QPS 并处理 OVER_QUERY_LIMIT
免费版高德 Key 默认配额为 1000 次/日、2 QPS(每秒最多 2 次请求)。连续快速发起请求会触发 OVER_QUERY_LIMIT 错误,此时响应中 status 为 "0",info 为该字符串。单纯重试没用,必须限流。
简单可靠的限流做法:
- 每次请求后
time.sleep(0.51)(略大于 0.5 秒),确保不超过 2 QPS - 若需更高吞吐,改用异步(
aiohttp+asyncio.Semaphore(2))并设并发上限 - 记录每次响应头
response.headers.get("X-Rate-Limit-Remaining"),接近 0 时主动暂停 - 生产环境务必加异常重试逻辑,但对
OVER_QUERY_LIMIT类错误应指数退避,而非立即重试
经纬度本身没有“标准格式”,但高德对 location 字符串解析很脆弱——多一个空格、少一位小数、逗号用全角,都会导致 UNKNOWN_ERROR 或空结果。调试时先拿官网示例坐标(如 "116.481488,39.990464")跑通再换自己的数据。



















