技术文档|利用Python将地址转换成经纬度坐标
点击下面链接获取 地址转坐标工具V.1.02 (零代码)
目录
本文主要讲述利用Python将 文本格式的地址 转换为 数字格式的经纬度坐标数据 ,主要步骤有:
- 注册高德地图API账号,申请Web服务的Key
- 了解并测试地理编码API服务
- 利用Python实现地址转坐标
一、注册高德地图API账号,申请Web服务的Key
本文利用高德地图API中Web服务提供的 地理编码 接口实现地址转坐标。想要使用地理编码接口,首先要注册成为高德地图API的开发者,下图为注册界面
注册成功后,进入应用管理平台,并在“我的应用”中点击“创建新应用”按钮(右上角),根据需要填写“应用名称”以及“应用类型”
应用创建成功后,在该应用栏中点击“添加Key”按钮(右上角)
根据需要输入“Key名称”,服务平台需要选择“Web服务”
成功创建一个"Web服务"的Key,如果有大批量转换的需要可以申请多个Key。
二、了解并测试地理编码接口
高德地图地理编码接口的网址是:
地理编码API的使用步骤是:
- 参考接口参数文档发起HTTP/HTTPS请求,将 Key 需作为必填参数一同发送
- 接收请求返回的数据(JSON或XML格式)
- 参考返回参数文档解析数据
下图为地理编码API服务的地址。其中,parameters代表的参数包括必填参数和可选参数,所有参数均使用和号字符(&)进行分隔。基于该网址并结合请求参数和Key一同发送就可以得到相应的返回结果。
下图为地理编码API的请求参数说明。该API中必填内容是Key和Address,Key就是第一步中申请得到的密钥,address代表结构化的地址信息。如果想要一次请求返回多条地址的坐标,可以将batch参数设置为true,并用'|'来分隔多条地址,值得注意的是一次请求最多能够支持10条地址。output代表返回数据格式类型,一般默认返回Json格式。
下图为地理编码API的返回参数说明。如果status字段返回1且info字段返回'OK',则该次返回成功。其中,地址的经纬度数据在geocodes下的location中。
接下来,对上述地理编码API进行一次简单的测试。
当前请求参数为:
- key:27a90950bd4233a3589503ba03d58f25
- address:上海市嘉定区墨玉南路888号|上海市嘉定区嘉定区墨玉南路1号
- batch:true
- output:json
下图为返回结果,可以看到两处红线标住的地方为经纬度坐标
三、利用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)):
# 解析','分隔的经纬度
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)