Python 利用高德地图 API 实现经纬度与地址批量转换

阿麦
阿麦
发布时间:2026-10-13 | 5人浏览过
原创

本文介绍如何使用 Python 调用高德地图 Web 服务 API,实现经纬度与地址的批量相互转换。通过解析 CSV 文件数据,结合坐标转换与逆地理编码接口,解决异步返回问题,提供完整的代码示例及 Key 使用注意事项,帮助开发者高效完成地理数据批量处理任务。

引言与 API 概述

通常我们可以利用高德地图 API 进行经纬度与地址之间的相互转换。但当面临大量地址与经纬度数据需要批量处理时,该如何高效实现这一需求?

本文选用高德 Web 服务 API,具体利用其中的地址编码与逆地址编码功能,来完成经纬度与地址的双向转换。

相关的高德 API 文档地址如下:

地理编码与逆地理编码接口地址:http://lbs.amap.com/api/webservice/guide/api/georegeo

坐标转换接口地址:http://lbs.amap.com/api/webservice/guide/api/convert

API 申请与坐标转换

第一步:申请 API Key

第二步:执行坐标转换

坐标转换接口属于简单的 HTTP 请求,主要功能是将用户提供的非高德坐标系数据(如 GPS、Mapbar、百度坐标)转换为高德坐标系数据。


def transform(location):
 parameters = {'coordsys':'gps','locations': location, 'key': '7ec25a9c6716bb26f0d25e9fdfa012b8'}
    base = 'http://restapi.amap.com/v3/assistant/coordinate/convert'
    response = requests.get(base, parameters)
    answer = response.json()
    return answer['locations']

逆地理编码与数据读取

第三步:地理/逆地理编码

由于本文主要需求是将经纬度转换为具体地址,因此选用的是逆地理编码接口。


def geocode(location):
    parameters = {'location': location, 'key': '7ec25a9c6716bb26f0d25e9fdfa012b8'}
    base = 'http://restapi.amap.com/v3/geocode/regeo'
    response = requests.get(base, parameters)
    answer = response.json()
    return answer['regeocode']['addressComponent']['district'].encode('gbk','replace'),answer['regeocode']['formatted_address'].encode('gbk','replace')

第四步:从文件读取数据

为了实现批量获取,通常需要从文件中读取数据源。读取数据的代码如下:


def parse():
 datas = []
 totalListData = pd.read_csv('locs.csv')
 totalListDict = totalListData.to_dict('index')
 for i in range(0, len(totalListDict)):
 datas.append(str(totalListDict[i]['centroidx']) + ',' + str(totalListDict[i]['centroidy']))
 return datas

完整代码实现与注意事项

第五步:完整代码示例

在实现批量获取的过程中,我曾尝试使用 JavaScript 接口,但由于 JS 接口的函数是异步返回结果,导致数据顺序错乱(例如第 10 行的结果可能出现在第 15 行),难以稳定解决。最终改用 Web 接口并成功实现。以下为完整代码,供参考:


#!/usr/bin/env
#-*- coding:utf-8 -*-
'''
利用高德地图api实现经纬度与地址的批量转换
'''
import requests
import pandas as pd
import time
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
 
def parse():
 datas = []
 totalListData = pd.read_csv('locs.csv')
 totalListDict = totalListData.to_dict('index')
 for i in range(0, len(totalListDict)):
 datas.append(str(totalListDict[i]['centroidx']) + ',' + str(totalListDict[i]['centroidy']))
 return datas
 
def transform(location):
 parameters = {'coordsys':'gps','locations': location, 'key': '7ec25a9c6716bb26f0d25e9fdfa012b8'}
    base = 'http://restapi.amap.com/v3/assistant/coordinate/convert'
    response = requests.get(base, parameters)
    answer = response.json()
    return answer['locations']
 
def geocode(location):
    parameters = {'location': location, 'key': '7ec25a9c6716bb26f0d25e9fdfa012b8'}
    base = 'http://restapi.amap.com/v3/geocode/regeo'
    response = requests.get(base, parameters)
    answer = response.json()
    return answer['regeocode']['addressComponent']['district'].encode('gbk','replace'),answer['regeocode']['formatted_address'].encode('gbk','replace')
 
if __name__=='__main__':
 i = 0
 count = 0
 df = pd.DataFrame(columns=['location','detail'])
 #locations = parse(item)
 locations = parse()
 for location in locations:
 dist, detail = geocode(transform(location))
 df.loc[i] = [dist, detail]
 i = i + 1
 df.to_csv('locdetail.csv', index =False)

注意事项:

在实际测试中,一个 API Key 大约可以处理 2000 至 3000 条数据,而一个账号最多可申请 4 个 Key。基于我的使用经验,测试阶段无需处理过多数据,直接开始正式爬取数据更为高效。

以上就是本文的全部内容,希望这对大家的学习有所帮助,也欢迎大家继续支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表