Python获取最新省市区列表并绘制中国地图(含港澳台)
文章目录
- 简介
- 安装
- 初试
- 响应结果
- 直接展示
- 构造字典
- 树结构展示
- tkinter展示
- 绘制成图
- 参考文献
简介
数据来源:
- 省、市、区:腾讯 API
- 省、市、区、街道、社区:国家统计局
安装
pip install requests
初试
使用腾讯 API
1. 注册
2. 我的应用 → 创建应用
3. 添加 Key:Key名称随意,启用产品 WebServiceAPI,选签名校验,复制 Secret key
4. 复制 Key
5. 获取最新省市区列表并保存为JSON
import json
from hashlib import md5
from urllib.parse import urljoin, urlencodeimport requestskey = 'JYRBZ-6B7WQ-SKG52-GKT6U-INYEH-OTB2B'
secret_key = 'qhiND3JeHmFJTPk0HliqClqWn1ytmHqd'
path = '/ws/district/v1/list'
base = 'https://apis.map.qq.com/'
url = urljoin(base, path)
params = dict(key=key)
params = {k: v for k, v in sorted(params.items())} # 升序排序
sig = md5('{}?{}{}'.format(path, urlencode(params), secret_key).encode()).hexdigest() # 签名计算
params['sig'] = sig # 放回请求
response = requests.get(url=url, params=params)
data = response.json()
print(data)
open('data.json', mode='w', encoding='utf-8').write(json.dumps(data))
效果
响应结果
- 行政区划
- id:行政区划唯一标识(adcode)
- name:简称,如“内蒙古”
- fullname:全称,如“内蒙古自治区”
- location:经纬度
- lat:纬度
- lng:经度
- pinyin:行政区划拼音全拼的数组,如:[“nei”,“meng”,“gu”]
- cidx:子级行政区划在下级数组中的下标位置
- polygon:行政区划的轮廓经纬度点串,可形成多边形
直接展示
import jsondata = json.load(open('data.json'))
data_version = data['data_version']
print(data_version)
provinces = data['result'][0]
citys = data['result'][1]
districts = data['result'][2]
for province in provinces:cidx = province['cidx']province_citys = citys[cidx[0]:cidx[1]]print(province['fullname'])for city in province_citys:print('\t', city['fullname'])cidx = city.get('cidx')if cidx:city_districts = districts[cidx[0]:cidx[1]]for district in city_districts:print('\t\t', district['fullname'])
# 广东省
# 广州市
# 荔湾区
# 越秀区
# 海珠区
# 天河区
# 白云区
# 黄埔区
# 番禺区
# 花都区
# 南沙区
# 从化区
构造字典
import json
from collections import defaultdictdata = json.load(open('data.json'))
provinces = data['result'][0]
citys = data['result'][1]
districts = data['result'][2]
province_city_district_map = defaultdict(lambda: defaultdict(list))
for province in provinces:cidx = province['cidx']province_citys = citys[cidx[0]:cidx[1]]for city in province_citys:if city['fullname'] not in province_city_district_map[province['fullname']]:province_city_district_map[province['fullname']][city['fullname']] = list()cidx = city.get('cidx')if cidx:city_districts = districts[cidx[0]:cidx[1]]for district in city_districts:province_city_district_map[province['fullname']][city['fullname']].append(district['fullname'])
print(province_city_district_map)
树结构展示
安装
pip install treelib
代码
import jsonfrom treelib import Treedata = json.load(open('data.json'))
data_version = data['data_version']
provinces = data['result'][0]
citys = data['result'][1]
districts = data['result'][2]
tree = Tree()
tree.create_node('中国省市区列表', data_version) # 根节点
for province in provinces:cidx = province['cidx']province_citys = citys[cidx[0]:cidx[1]]tree.create_node(province['fullname'], province['id'], parent=data_version)for city in province_citys:tree.create_node(city['fullname'], city['id'], parent=province['id'])cidx = city.get('cidx')if cidx:city_districts = districts[cidx[0]:cidx[1]]for district in city_districts:tree.create_node(district['fullname'], district['id'], parent=city['id'])
tree.show()
# ├── 广东省
# │ ├── 东莞市
# │ ├── 中山市
# │ ├── 佛山市
# │ │ ├── 三水区
# │ │ ├── 南海区
# │ │ ├── 禅城区
# │ │ └── 顺德区
统计,有某些区名是重复的
from collections import Countercounter = Counter([tree[node].tag for node in tree.expand_tree(mode=Tree.DEPTH, sorting=False)])
print(counter)
# Counter({'东区': 6, '鼓楼区': 4, '市中区': 4, '北区': 4, '和平区': 3, '新华区': 3, '城区': 3, '郊区': 3, '铁西区': 3, '中山区': 3, '南区': 3, '朝阳区': 2, '通州区': 2, '河东区': 2, '长安区': 2, '桥西区': 2, '复兴区': 2, '新城区': 2, '青山区': 2, '松山区': 2, '铁东区': 2, '海州区': 2, '太平区': 2, '龙潭区': 2, '西安区': 2, '向阳区': 2, '南山区': 2, '东山区': 2, '宝山区': 2, '大同区': 2, '新兴区': 2, '普陀区': 2, '金山区': 2, '西湖区': 2, '江北区': 2, '永定区': 2, '泰山区': 2, '白云区': 2, '龙华区': 2, '城中区': 2, '大安区': 2, '西区': 2, '城关区': 2, '新市区': 2, '中正区': 2, '信义区': 2, '中西区': 2})
tkinter展示
import json
from tkinter import *
from tkinter import ttk
from collections import defaultdictdata = json.load(open('data.json'))
provinces = data['result'][0]
citys = data['result'][1]
districts = data['result'][2]
province_fullnames = []
province_city_district_map = defaultdict(lambda: defaultdict(list))
for province in provinces:province_fullnames.append(province['fullname'])cidx = province['cidx']province_citys = citys[cidx[0]:cidx[1]]for city in province_citys:if city['fullname'] not in province_city_district_map[province['fullname']]:province_city_district_map[province['fullname']][city['fullname']] = list()cidx = city.get('cidx')if cidx:city_districts = districts[cidx[0]:cidx[1]]for district in city_districts:province_city_district_map[province['fullname']][city['fullname']].append(district['fullname'])last_province = '' # 上次选择的省
last_city = '' # 上次选择的市def select_province(event):"""选择了省"""global last_provinceprovince = province_combobox.get()city_combobox['value'] = [i for i in province_city_district_map[province].keys()]if last_province != province:city_combobox.set('')district_combobox.set('')last_province = provincedef select_city(event):"""选择了市"""global last_cityprovince = province_combobox.get()city = city_combobox.get()district_combobox['value'] = province_city_district_map[province][city]if last_city != city:district_combobox.set('')last_city = citywin = Tk()
win.title('中国省市区列表')
win.geometry('280x130')
win.eval('tk::PlaceWindow . center')
province_combobox = ttk.Combobox(win, value=province_fullnames)
province_combobox.bind('<<ComboboxSelected>>', select_province)
province_combobox.pack(fill=BOTH, expand=True)
city_combobox = ttk.Combobox(win)
city_combobox.bind('<<ComboboxSelected>>', select_city)
city_combobox.pack(fill=BOTH, expand=True)
district_combobox = ttk.Combobox(win)
district_combobox.pack(fill=BOTH, expand=True)
statusbar = Label(win, text='数据版本:{}'.format(data['data_version']), bd=1, relief=SUNKEN, anchor=W, name='statusbar')
statusbar.pack(side=BOTTOM, fill=X)
win.mainloop()
效果
绘制成图
获取数据
import json
from hashlib import md5
from urllib.parse import urljoin, urlencodeimport requestskey = 'JYRBZ-6B7WQ-SKG52-GKT6U-INYEH-OTB2B'
secret_key = 'qhiND3JeHmFJTPk0HliqClqWn1ytmHqd'
path = '/ws/district/v1/getchildren'
base = 'https://apis.map.qq.com/'
url = urljoin(base, path)
params = dict(key=key, get_polygon=2)
params = {k: v for k, v in sorted(params.items())} # 升序排序
sig = md5('{}?{}{}'.format(path, urlencode(params), secret_key).encode()).hexdigest() # 签名计算
params['sig'] = sig # 放回请求
response = requests.get(url=url, params=params)
data = response.json()
print(data)
open('polygon.json', mode='w', encoding='utf-8').write(json.dumps(data))
安装
pip install basemap
绘制
import jsonimport matplotlib.pyplot as plt
from matplotlib.patches import Polygon
from mpl_toolkits.basemap import Basemapdef get_mass_center(xy):"""计算多边形重心"""area = 0.0x, y = 0.0, 0.0for i in range(len(xy)):lat = xy[i][0]lng = xy[i][1]if i == 0:lat1 = xy[-1][0]lng1 = xy[-1][1]else:lat1 = xy[i - 1][0]lng1 = xy[i - 1][1]fg = (lat * lng1 - lng * lat1) / 2.0area += fgx += fg * (lat + lat1) / 3.0y += fg * (lng + lng1) / 3.0x = x / areay = y / areareturn x, y# 读取
data = json.load(open('polygon.json'))
province_polygon_map = dict()
for province in data['result'][0]:province_polygon_map[province['name']] = province['polygon']# 中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 微软雅黑
plt.rcParams['axes.unicode_minus'] = False # 正确显示负号# 绘制
m = Basemap(llcrnrlon=77, llcrnrlat=14, # 左下角经纬度urcrnrlon=140, urcrnrlat=51, # 右上角经纬度projection='lcc', # 地图投影方式为朗伯等角圆锥投影lat_0=33, # 纬度中心lon_0=100 # 经度中心
)
m.fillcontinents(color='white') # 填充大陆for province, polygons_list in province_polygon_map.items():xy_list = [] # 行政区多个多边形的所有点for polygons in polygons_list:xy = []for i in range(len(polygons))[::2]: # 经纬度多边形xy_list.append((polygons[i], polygons[i + 1]))xy.append(m(polygons[i], polygons[i + 1]))plt.gca().add_patch(Polygon(xy))x, y = get_mass_center(xy_list) # 多边形重心x = x - 1.2 # 手动修正y = y - 0.5plt.annotate(province, xy=m(x, y)) # 填上省份print(province, x, y)
plt.annotate('海南', xy=m(108.0, 19.0)) # 不知道为什么API获取的海南好像有问题,手动填入plt.xticks([]) # 去掉x轴
plt.yticks([]) # 去掉y轴
plt.axis('off') # 去掉坐标轴
plt.savefig('1.jpg', dpi=300, bbox_inches='tight') # 保存图片
plt.show()
对比百度地图
参考文献
- WebService API | 腾讯位置服务
- 国家统计局 - 统计用区划和城乡划分代码
- 2021最新省市区 Gitee
- 最全最新中国省,市,地区json及sql数据 GitHub
- Python树结构库treelib
- Matplotlib Basemap Toolkit Documentation
- python采用Basemap绘制完美中国地图
- python 不规则多边形计算重心
- How to compute the centroid of a polygon in Python
- Shapely Ddocumentation
- 判断点是否在多边形内的Python实现及小应用(射线法)
Python获取最新省市区列表并绘制中国地图(含港澳台)相关推荐
- vue使用echarts来绘制中国地图下钻省市区县级地图
文章目录 前言 一.echarts 二.使用步骤 1.vue安装.引入echarts 2.使用echarts 总结 前言 公司需要一个中国地图点击可进入省市区县级,但是在我使用echarts绘制中国地 ...
- 【Python 实战基础】 如何绘制中国地图展示省份GDP数据
目录 一.实战场景 二.主要知识点 文件读写 基础语法 字符串处理 文件生成 数据构建 循环遍历 三.菜鸟实战 1.创建 python 文件 2.运行结果 一.实战场景 实战场景: 如何绘制中国地图展 ...
- 利用Python获取最新的sci论文摘要信息并群发邮箱
本博客结构 利用Python获取最新的sci论文摘要信息并群发邮箱 1. 需要的包:biopython.markdown 2. 正式代码 利用Python获取最新的sci论文摘要信息并群发邮箱 1. ...
- Basemap绘制中国地图
2022.06.02更新 CHN_adm_shp.zip 网盘下载链接: 链接:https://pan.baidu.com/s/11igf-bfDLuolI5HzEykzMw 提取码:oas6 201 ...
- [Echarts可视化] 一.入门篇之简单绘制中国地图和贵州地区
最近发生了很多事情,去到了一个新环境学习.但是不论在哪里,我都需要不忘初心,坚持做自己喜欢的事情,在CSDN写博客.教学.爱娜.生活等等. 这篇文章主要是通过Echarts可视化介绍入 ...
- Android-高级-UI-进阶之路-(七)-SVG-基础使用-+-绘制中国地图
给 path 定义 name,如下所示 定义一个 Animator 文件,以表示对这幅 Vector 图像做动画 <?xml version="1.0" encoding=& ...
- 使用raphael.js绘制中国地图
最近的数据统计项目中要用到中国地图,也就是在地图上动态的显示某个时间段某个省份地区的统计数据,我们不需要flash,仅仅依靠raphael.js以及SVG图像就可以完成地图的交互操作.在本文中,我给大 ...
- qcustomplot绘制热力图瀑布图_使用REmap绘制中国地图
上次我们介绍了使用ggplot2绘制中国热力地图,需要温习的同学可以点击以下链接 使用ggplot2绘制中国地图 .在使用ggplot2绘制的时候,需要进行数据处理的步骤比较多,今天我们介绍一个新的 ...
- Ant Design Charts绘制中国地图并动态添加标记点
绘制中国地图并动态添加标记点,在这里使用的是antd charts绘制,需要求只显示中国地图,并且跟踪物流信息 使用组件地址: 图表 - Plot | Ant Design Charts 这里的引入方 ...
- 广西地图html插件,ECharts绘制中国地图、广西地图
准备工作:导入ECharts依赖.和地图需要的.js文件. 文件获取方式: 官网:url github:url (下载完后 :incubator-echarts-4.8.0mapjsprovince目 ...
最新文章
- pip 指定目录安装
- SQL Server 字符串操作
- 什么是OOA/OOD
- Quartz定时任务学习(九)Quartz监听器
- MATLAB 图像函数(第三章) 图像基本处理
- TCExam开源在线考试系统
- 一致性hash 简单实现
- GDCM:gdcm::VL 的测试程序
- Redis 缓存常见问题:缓存一致性的解决方案
- DCL并非单例模式专用
- des加密的c语言程序,C++中四种加密算法之DES源代码
- 最近30分钟合约市场爆仓842万美元
- oracle_linux安装oracle_12.1.0
- 进政府网站要求IE8浏览器,IE8浏览器进不去,使用IE进政府机构网站提示非法进入提示不能直接使用URL进入网址,windows10安装IE8提示系统不支持【解决办法】
- 搜狗站长工具【post请求模拟登录】代码分享总结【批量提交搜狗收录网址】
- 微信怎么制作朋友圈H5链接
- mac虚拟摄像头插件_【OBS虚拟摄像头插件下载】OBS VirtualCam(OBS虚拟摄像头插件) v2.0.5 官方最新版-开心电玩...
- win10删除右键菜单多余项
- Arbitrary Style Transfer with Deep Feature Reshuffle
- Linux iptables 防火墙 添加删除 端口
热门文章
- 回顾2020年(1)
- ACM竞赛入门,从零开始
- H.266 JEM编码块结构:四叉树+二叉树QTBT
- 放大器设计-光电放大电路噪声分析-理论
- H264编码器性能测试
- 35、html制作QQ彩贝热销时装页面(注意:需要素材)
- jer中无html文件,jsoup抓取网页+详细讲解
- php网页动态加载swf,HTML_如何修改网页中的FlashSWF文件,看到一个网站用flash做的,很 - phpStudy...
- MMD原神动画制作(学习教程一)
- DynamipsGUI 模拟pix防火墙