本文主要讲述利用Python将文本格式的地址转换为数字格式的经纬度坐标数据,主要步骤有:注册高德地图API账号,申请Web服务的Key

了解并测试地理编码API服务

利用Python实现地址转坐标

一、注册高德地图API账号,申请Web服务的Key

本文利用高德地图API中Web服务提供的地理编码接口实现地址转坐标。想要使用地理编码接口,首先要注册成为高德地图API的开发者,下图为注册界面高德地图API账号注册界面

注册成功后,进入应用管理平台,并在“我的应用”中点击“创建新应用”按钮(右上角),根据需要填写“应用名称”以及“应用类型”创建新应用

应用创建成功后,在该应用栏中点击“添加Key”按钮(右上角)点击添加Key

根据需要输入“Key名称”,服务平台需要选择“Web服务”添加“Web服务”的Key

成功创建一个"Web服务"的Key,如果有大批量转换的需要可以申请多个Key。成功申请一个Key

二、了解并测试地理编码接口

高德地图地理编码接口的网址是:地理/逆地理编码-API文档-开发指南-Web服务 API | 高德地图APIlbs.amap.com

地理编码API的使用步骤是:参考接口参数文档发起HTTP/HTTPS请求,将 Key 需作为必填参数一同发送

接收请求返回的数据(JSON或XML格式)

参考返回参数文档解析数据

下图为地理编码API服务的地址。其中,parameters代表的参数包括必填参数和可选参数,所有参数均使用和号字符(&)进行分隔。基于该网址并结合请求参数和Key一同发送就可以得到相应的返回结果。地理编码API服务地址

下图为地理编码API的请求参数说明。该API中必填内容是Key和Address,Key就是第一步中申请得到的密钥,address代表结构化的地址信息。如果想要一次请求返回多条地址的坐标,可以将batch参数设置为true,并用'|'来分隔多条地址,值得注意的是一次请求最多能够支持10条地址。output代表返回数据格式类型,一般默认返回Json格式。地理编码API的请求参数说明

下图为地理编码API的返回参数说明。如果status字段返回1且info字段返回'OK',则该次返回成功。其中,地址的经纬度数据在geocodes下的location中。地理编码API的返回参数说明

接下来,对上述地理编码API进行一次简单的测试。

当前请求参数为:key:27a90950bd4233a3589503ba03d58f25

address:上海市嘉定区墨玉南路888号|上海市嘉定区嘉定区墨玉南路1号

batch:true
output:json

下图为返回结果,可以看到两处红线标住的地方为经纬度坐标地理编码API测试返回结果

三、利用Python实现地址转坐标

下面的代码为执行一次高德地图地理编码查询的函数

# 执行一次高德地图地理编码的查询
# 输入值:locationList -> 地址的序列,currentKey -> 当前使用的Key
# 返回值:resultList -> 查询成功,返回结果坐标的序列
# -1 -> 执行当前查询时Key的配额用完了
# -2 -> 执行当前查询出错
def ExcuteSingleQuery(locationList,currentkey):
# 1-将locationList中的地址连接成高德地图API能够识别的样子
locationString = "" # 当前locationList组成的string
for location in locationList:
locationString += location + '|'
# 2-地理编码查询需要的Url
output = 'json' # 查询返回的形式
batch = 'true' # 是否支持多个查询
base = 'https://restapi.amap.com/v3/geocode/geo?' # 地理编码查询Url的头
currentUrl = base + "output=" + output + "&batch=" + batch + "&address=" + locationString + "&key=" + currentkey
# 3-提交请求
response = requests.get(currentUrl) # 提交请求
answer = response.json() # 接收返回
# 4-解析Json的内容
resultList = [] # 用来存放地理编码结果的空序列
if answer['status'] == '1' and answer['info'] == 'OK':
# 4.1-请求和返回都成功,则进行解析
tmpList = answer['geocodes'] # 获取所有结果坐标点
for i in range(0,len(tmpList)):
try:
# 解析','分隔的经纬度
coordString = tmpList[i]['location']
coordList = coordString.split(',')
# 放入结果序列
resultList.append((float(coordList[0]),float(coordList[1])))
except:
# 如果发生错误则存入None
resultList.append(None)
return resultList
elif answer['info'] == 'DAILY_QUERY_OVER_LIMIT':
# 4.2-当前账号的余额用完了,返回-1
return -1
else:
# 4.3-如果发生其他错误则返回-2
return -2
接下来,用真实的数据对上面的函数进行测试,并输出返回结果
if __name__ == '__main__':
# 创建测试地址数据集
locationList = [
"四川省成都市崇州市崇阳街道晋康北路313号",
"四川省成都市成都高新区盛华北路107号1楼",
"四川省成都市四川省成都市金堂县赵镇迎宾大道一段8号",
"四川省成都市崇州市三江镇崇新村5组",
"四川省成都市大邑县鹤鸣乡联和村二十组",
"四川省成都市成都市蒲江县复兴乡庙峰村3组52号",
"四川省成都市成都高新区新乐路125号1楼",
"四川省成都市成都市青羊区锦里西路127号1层3号",
"四川省成都市成都高新区天府一街616号8栋附203号",
"四川省成都市四川省成都市成华区东三环路二段宝耳路2号1号办公楼3楼1号",
]
# 进行地理编码
print(ExcuteSingleQuery(locationList=locationList, currentkey="365ac412d6e22f49ce3d345270ecc643"))

下面为函数测试的结果,可以看到返回结果为10个地址的经纬度坐标,测试成功!

C:\Users\Administrator\AppData\Local\Programs\Python\Python37\python.exe C:/Users/Administrator/PycharmProjects/Geocoding/Geocoding.py
(103.68455, 30.64138)
(104.051735, 30.558456)
(104.409448, 30.858932)
(103.797445, 30.529827)
(103.391601, 30.598182)
(103.42105, 30.313147)
(104.04065, 30.605325)
(104.047531, 30.653964)
(104.054761, 30.559163)
(104.163724, 30.692028)
Process finished with exit code 0

利用上述代码可以将文本格式的地址转换为数字形式的坐标数据,但是值得注意的是利用高德地图API返回的经纬度为GCJ-02坐标系,在实际使用前需要先进行坐标转换。

下面的链接讲述了地理坐标系统的原理及转换算法师大Giser:干货|利用Python进行地理坐标系统的转换zhuanlan.zhihu.com

下面的链接提供了一个不写代码就可以进行地理坐标系统转换的工具师大Giser:工具|一个不写代码就能够实现地理坐标系统转换的工具