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

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

本文介绍如何使用 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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。