使用高德API批量获取地址经纬度数据(Python实现指南)

一、背景与目标

  • 需求场景:
  • 批量获取Excel表格中地址的经纬度坐标,用于地图可视化或数据分析。

  • 解决的问题:
  • 地址标准化:非结构化地址需清洗为API可解析的格式。

  • API调用限制:并发请求、日调用量限制。

  • 错误处理:应对API返回的多种错误类型(如密钥错误、并发超限、地址解析失败等)

  • 核心代码逻辑:
  • 读取Excel文件,遍历地址列。

  • 调用高德地理编码API。

  • 解析返回的JSON数据,提取经纬度。

  • 错误处理与重试机制。

  • 代码优化点:
  • 添加请求间隔(如time.sleep(0.5))。

  • 记录失败地址,支持重试和二次修改。

  • 二、完整流程与步骤

    1.环境准备(安装Python、VSCode及扩展插件)
  • 下载Python:
  • 参考CSDN文章:今天给大家带来Python的下载安装教程!

  • 下载VS Code:
  • 参考CSDN文章:2024 Visual Studio Code的下载与安装
  • 安装扩展插件:
  • 点击侧边栏的 -> 在搜索框输入“python” -> 安装官方Python插件,如图所示。

  • 顺道可以安装中文包,以及一个AI编码插件TalkX(注册后可长期免费使用),如图所示。

  • 2.API获取
  • 注册开发者账号:
  • 高德地图:高德开放平台
  • 点击右上角“注册”,如图所示。
  • 进入以下页面,完善信息,如图所示。

  • 创建应用并获取 API Key : 
  • 回到首页,鼠标点击右上角“控制台”,如图所示。

  • 侧边栏里,点击"应用管理"下的“我的应用” -> 点击右侧“创建新应用”,如图所示。
  • 根据自身需要,填写“应用名称”和选择“应用类型” ,然后点击“新建”即可。

  • 鼠标点击右上角“添加Key”,如图所示。
  •  自命名Key名称 -> 选择“Web服务”平台,勾选阅读并同意相关协议 -> 点击“提交”,即可获取API Key,如图所示。

  • 3.数据准备
  • 数据格式:
  • 将目标数据保存为Excel文件(.xlsx),列名清晰(如:“序号” “名称” “地址” 等)。

  • 如需从网页中获取表格可参考CSDN文章:数据获取|如何将网页里的表格导出成Excel表格

  • 地址清洗:
  • 确保地址包含省市区(如“广东生深圳市南山区科技园”)。(tip:没有“省”“市”也没关系,如果报错则需相应添加)

  •  移除模糊词(如“附近”“对面”)、特殊符号(如#、())。(tip:可以借助Excel的“查找和选择”功能批量处理,如图所示)

  • 4.代码实现      
  • 打开VS Code -> 点击“打开文件夹”,选择存放目标Excel表格的文件夹,如图所示。

  • 点击“新建文件” -> 输入Python文件名称(如test.py),如图所示。

  •  复制粘贴如下代码,注意:代码中的API key表格名称都需要替换成自己的。

    import requests
    import pandas as pd
    import time
    
    # 高德API参数
    key = "你的API Key"
    url = "https://restapi.amap.com/v3/geocode/geo"
    
    # 读取Excel数据
    df = pd.read_excel("你的表格名称及后缀")
    
    # 请求参数
    max_retries = 3
    retry_delay = 1  # 秒
    request_interval = 0.5  # 秒
    
    failed_addresses = []
    
    for index, row in df.iterrows():
        address = row["地址"] #如果报错,可检查这里表格储存地址的列名是否对应
        params = {
            "address": address,
            "key": key,
        }
        for attempt in range(max_retries):
            try:
                response = requests.get(url, params=params)
                result = response.json()
                if result["status"] == "1" and result["geocodes"]:
                    location = result["geocodes"][0]["location"]
                    lng, lat = location.split(",")
                    df.at[index, "经度"] = lng
                    df.at[index, "纬度"] = lat
                    break
                else:
                    #如果报错,可复制粘贴“返回结果”的内容,询问AI进行调试
                    print(f"地址 {address} 第{attempt+1}次尝试失败:{result.get('info')},返回结果:{result}") 
                    time.sleep(retry_delay)
            except Exception as e:
                print(f"请求异常:{e}")
                time.sleep(retry_delay)
        else:
            df.at[index, "经度"] = "失败"
            df.at[index, "纬度"] = "失败"
            failed_addresses.append(address)
        
        time.sleep(request_interval)  # 控制请求频率
    
    # 保存结果
    df.to_excel("你的表格名称_带坐标.xlsx", index=False)
    
    # 保存失败地址
    if failed_addresses:
        with open("failed_addresses.txt", "w") as f:
            f.write("\n".join(failed_addresses))
        print(f"有{len(failed_addresses)}个地址解析失败,已保存到文件。")
  • 找到菜单栏 -> 点击“终端” -> “新建终端”,如图所示。
  • 输入以下命令:
  • 安装依赖
    pip install pandas requests openpyxl

  • 运行Python文件(tip:python+自己创建的Python文件名称及后缀)
    python test.py
  • 4.常见报错与解决方案                
  • DAILY_QUERY_OVER_LIMIT(原因:日调用量超限)(解决:升级商用套餐或等待次日重置)
  • CUQPS_HAS_EXCEEDED_THE_LIMIT(原因:并发请求超限)(解决:降低请求频率(如每秒1次),分批处理数据)
  • USERKEY_PLAT_NOMATCH(原因:API Key与平台类型不匹配)(解决:检查Key绑定的平台,注意需选“Web服务”)
  • ENGINE_RESPONSE_DATA_ERROR(原因:地址无法解析)(解决:根据failed_addresses.txt文件,找到错误地址,打开高德官网输入目标名称检查地址是否更新,手动修正表格里的失败地址)
  • 希望以上流程总结和复用代码对大家有所帮助,欢迎各位在评论区指正或留下新遇到的问题,一起交流进步!

    作者:千年奶酪

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用高德API批量获取地址经纬度数据(Python实现指南)

    发表回复