Python 利用高德地图 API 实现经纬度与地址批量转换
本文介绍如何使用 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。基于我的使用经验,测试阶段无需处理过多数据,直接开始正式爬取数据更为高效。
以上就是本文的全部内容,希望这对大家的学习有所帮助,也欢迎大家继续支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













