文章目录
使用的接口API是行政“区域查询” https://lbs.amap.com/api/webservice/guide/api/district
1. 申请高德地图Key
首先打开上面的链接,根据要求去申请一个key
登录以后进入到自己的控制台,在应用界面创建新的应用
创建之后就可以拿到自己的Key了
2. 编写python代码,访问API,解析内容
2.1 获取所有的省市分类
中国的所有省市分类如下
参考百度文库https://baike.baidu.com/item/%E7%9C%81%E4%BB%BD/1635191?fr=aladdin
23个省分别为:河北省、山西省、辽宁省、吉林省、黑龙江省、江苏省、浙江省、安徽省、福建省、江西省、山东省、河南省、湖北省、湖南省、广东省、海南省、四川省、贵州省、云南省、陕西省、甘肃省、青海省、台湾省。
5个自治区分别为:内蒙古自治区、广西壮族自治区、西藏自治区、宁夏回族自治区、新疆维吾尔自治区。
4个直辖市分别为:北京市、天津市、上海市、重庆市。
2个特别行政区分别为:香港特别行政区、澳门特别行政区。
根据如上内容,可以使用python的split功能得到各个列表
# 省
province = '河北省、山西省、辽宁省、吉林省、黑龙江省、江苏省、浙江省、安徽省、福建省、江西省、山东省、河南省、湖北省、湖南省、广东省、海南省、四川省、贵州省、云南省、陕西省、甘肃省、青海省、台湾省'
# 自治区
auto_region = '内蒙古自治区、广西壮族自治区、西藏自治区、宁夏回族自治区、新疆维吾尔自治区'
# 直辖市
muni_city = '北京市、天津市、上海市、重庆市'
# 特别行政
spec_region = '澳门特别行政区、香港特别行政区'
province = province.split('、')
auto_region = auto_region.split('、')
muni_city = muni_city.split('、')
spec_region = spec_region.split('、')
2.2 使用request调用API
代码如下
# 访问链接
import requests
response = requests.get('https://restapi.amap.com/v3/config/district?key=你的KEY&keywords=河北省&subdistrict=2&extensions=base')
# 解析json文件
import json
json_dic = json.loads(response.text)
2.3 解析json
经过分析json文件,可以发现 省,自治区,特别行政区的格式都类似,第二级目录直接到市。而 直辖市的格式需要在第三级目录下直接到市。示例代码如下
关于省的分析
# 经度简写lng,竖着
# 纬度简写lat,横着
# 中国 经纬度范围
# 黑龙江 北纬53°31′到 曾母暗沙 北纬4°15′
# 新疆 东经73° 到 黑龙江 东经135°
## 省
# 省名和省的中心坐标
pro_name = json_dic['districts'][0]['name']
pro_center = json_dic['districts'][0]['center']
print(pro_name,pro_center)
# 省下面的市
for each_pro in json_dic['districts'][0]['districts']:
print(each_pro['name'],each_pro['center'])
关于市的分析
response = requests.get('https://restapi.amap.com/v3/config/district?key=你的KEY&keywords=北京市&subdistrict=2&extensions=base')
json_dic = json.loads(response.text)
## 市的分析
# 市名和市的中心坐标
pro_name = json_dic['districts'][0]['name']
pro_center = json_dic['districts'][0]['center']
print(pro_name,pro_center)
# 市下面的区
for each_pro in json_dic['districts'][0]['districts'][0]['districts']:
print(each_pro['name'],each_pro['center'])
最终获取自己需要的就好了。
3. 全部保存的代码
3.1 访问API的函数
首先定义一个获取url内容的函数,使用while循环不断获取内容,直到得到返回值
# 访问链接
import requests
# 解析json文件
import json
def get_json(url):
json_dic = None
# 一直发消息,直到不循环
while json_dic == None:
response = requests.get(url)
json_dic = json.loads(response.text)
return json_dic
3.2 初始化要遍历的区域和存储他们的字典、列表
# 省
province = '河北省、山西省、辽宁省、吉林省、黑龙江省、江苏省、浙江省、安徽省、福建省、江西省、山东省、河南省、湖北省、湖南省、广东省、海南省、四川省、贵州省、云南省、陕西省、甘肃省、青海省、台湾省'
# 自治区
auto_region = '内蒙古自治区、广西壮族自治区、西藏自治区、宁夏回族自治区、新疆维吾尔自治区'
# 直辖市
muni_city = '北京市、天津市、上海市、重庆市'
# 特别行政区
spec_region = '澳门特别行政区、香港特别行政区'
province = province.split('、')
auto_region = auto_region.split('、')
muni_city = muni_city.split('、')
spec_region = spec_region.split('、')
from itertools import chain
# 所有地区的列表
all_region_list = [province,auto_region,muni_city,spec_region]
all_region_list = list(chain(*all_region_list))
# 大地方经纬度的字典
big_region_dic = {}
# 小地方经纬度的字典
small_region_dic = {}
# 大地方到小地方关系的字典
big_small_relationship = {}
3.3 获取全部区域经纬度的信息
# 经度简写lng,竖着
# 纬度简写lat,横着
# 中国 经纬度范围
# 黑龙江 北纬53°31′到 曾母暗沙 北纬4°15′
# 新疆 东经73° 到 黑龙江 东经135°
for pro in all_region_list:
url = 'https://restapi.amap.com/v3/config/district?key=你的KEY&keywords={}&subdistrict=2&extensions=base'.format(pro)
json_dic = get_json(url)
# 名大地方的 名字 和 中心坐标
pro_name = json_dic['districts'][0]['name']
pro_center = json_dic['districts'][0]['center'].split(',')
lng,lat = float(pro_center[0]),float(pro_center[1])
# 大地方的地理坐标
big_region_dic[pro_name] = {
'lng':lng,
'lat':lat
}
# 获得了哪个省的信息
print(pro_name,pro_center)
each_small_region = []
# 省、自治区、特别行政区 或者 直辖市
try:
districts = json_dic['districts'][0]['districts']
except:
districts = json_dic['districts'][0]['districts'][0]['districts']
# 小区域
for each_pro in districts:
# 得到名字
name = each_pro['name']
# 得到中心点坐标
center = each_pro['center'].split(',')
lng,lat = float(center[0]),float(center[1])
# 保存小地方的地理坐标
small_region_dic[name] = {
'lng':lng,
'lat':lat
}
# 保存到小地方的字典里
each_small_region.append(name)
# 关系也保存到大字典里
big_small_relationship[pro_name] = each_small_region
3.4 结果展示
大区域的字典
小区域的字典
大小区域的关系表示
3.5 保存成pickle文件
import pickle
#保存
with open('region.pickle', 'wb') as fp:
pickle.dump((big_region_dic,small_region_dic,big_small_relationship), fp)
# 读取
with open('region.pickle', 'rb') as fp:
big_region_dic,small_region_dic,big_small_relationship = pickle.load(fp)