需求:现有一份商家地址数据,地址十分详细,可以具体到门牌号,但是,我们做分析不需要这么详细的地址,我们往往更希望得到地址所在的区,如:
上海闸北区广中西路777弄91、99号504室506室
对应的区为:静安区
高德地图提供了一个API接口,方便我们调用接口直接获取行政区域信息。
地理/逆地理编码-API文档-开发指南-Web服务 API | 高德地图APIlbs.amap.com在正式使用该接口之前需要在高德地图上注册,获得开发者账户,同时创建一个自己的“应用”,具体操作参见下面文章:
大咪:Python玩转高德地图API(一)zhuanlan.zhihu.com成功创建的应用和Key(密钥)如下:
根据高德地图API官方文档可知,进行地区查询的关键是构造出一个请求URL,高德地图会根据这个URL返回我们需要的地址。以下信息是我们在构造这个URL时必须知道的:
parameters代表的参数包括必填参数和可选参数。所有参数均使用和号字符(&)进行分隔。下面的列表枚举了这些参数及其使用规则:
其中,city参数支持中文输入行政区名称,如city=北京。
city参数提到了“城市编码表”,点击蓝色字体可以进入相关页面下载一份高德地图自己设计的城市编码表。通过这张表,获知每个行政区域的唯一编码。
城市编码表中数据示例:
最终,以请求"上海闸北区广中西路777弄91、99号504室506室"的行政区域信息为例,我们想要返回该地址的行政区域信息,并以JSON格式返回查询结构,一个完整的请求URL应该长这样:
url = 'https://restapi.amap.com/v3/geocode/geo?address=上海闸北区广中西路777弄91、99号504室506室&city=上海&output=JOSON&key=<申请的key>'
在python中,通过调用requests库进行数据请求,通过json库对返回的内容进行解析。
具体代码如下:
#获取单个地址的行政区域
import requests
import json
address = '上海闸北区广中西路777弄91、99号504室506室'
url = 'https://restapi.amap.com/v3/geocode/geo?address='+address+'&city=上海&output=JOSON&key=<申请的key>'
request=requests.get(url).text
result = json.loads(request)
print(result)
可以看到,我们需要的结果为“静安区”,该信息处于geocodes下的district键中。
返回结果result是一个字典格式,geocodes是其中一个键值对的键,geocodes的值是一个列表,该列表中包含一个字典,该字典中包含多个键值对,district是其中一个键值对的键。
所以,我们提取目标信息的代码为:
district = result['geocodes'][0]['district']
print(district)
运行结果:
同理,如果我们给出某个全国的具体地址信息,假装我们事先不知道该地址属于哪个城市,我们想要返回该地址所属的省份,那么,在url构建时,可以不指明city参数。如下:
#获取全国范围内某详细地址的行政区域信息
import requests
import json
address = '成都市成华区二仙桥东三路1号'
url = 'https://restapi.amap.com/v3/geocode/geo?address='+address+'&output=JOSON&key=<申请的key>'
request=requests.get(url).text
result = json.loads(request)
print(result)
province= result['geocodes'][0]['province']
print(province)
#四川省
最后,如何批量导入地址数据,并返回地址的行政区域?
现有一份店铺地址信息如下:
链接:https://pan.baidu.com/s/1ERzmhbguZg29or9KF22tcQ
提取码:1o9t
1.将获取地址的行政区域信息功能封装为函数
import requests
import json
def get_district(address):
url = 'https://restapi.amap.com/v3/geocode/geo?address='+address+'&city=上海&output=JOSON&key=<申请的key>'
request=requests.get(url).text
result = json.loads(request)
district = result['geocodes'][0]['district']
return district
2.读入数据
import pandas as pd
data=pd.read_excel('D:Jupyter工作空间shop_info.xlsx')
data.head()
3.向data中新增district列,用于存储获取到的区域信息
data['district'] = data['address'].apply(get_district)
data.head()
运行效果如下:
特别注意,这个API接口对地址数据有严格的格式要求,输入的地址信息必须为“省-市-区(县)-街道”这样的结构,如果地址信息不规范,记得自己进行预处理~
完毕~