文章目录

  • 简介
  • 安装
  • 初试
  • 响应结果
  • 直接展示
  • 构造字典
  • 树结构展示
  • 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))

效果

响应结果

data_version:行政区划数据版本

result 的结果:

  • 行政区划

    • 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()

对比百度地图

参考文献

  1. WebService API | 腾讯位置服务
  2. 国家统计局 - 统计用区划和城乡划分代码
  3. 2021最新省市区 Gitee
  4. 最全最新中国省,市,地区json及sql数据 GitHub
  5. Python树结构库treelib
  6. Matplotlib Basemap Toolkit Documentation
  7. python采用Basemap绘制完美中国地图
  8. python 不规则多边形计算重心
  9. How to compute the centroid of a polygon in Python
  10. Shapely Ddocumentation
  11. 判断点是否在多边形内的Python实现及小应用(射线法)

Python获取最新省市区列表并绘制中国地图(含港澳台)相关推荐

  1. vue使用echarts来绘制中国地图下钻省市区县级地图

    文章目录 前言 一.echarts 二.使用步骤 1.vue安装.引入echarts 2.使用echarts 总结 前言 公司需要一个中国地图点击可进入省市区县级,但是在我使用echarts绘制中国地 ...

  2. 【Python 实战基础】 如何绘制中国地图展示省份GDP数据

    目录 一.实战场景 二.主要知识点 文件读写 基础语法 字符串处理 文件生成 数据构建 循环遍历 三.菜鸟实战 1.创建 python 文件 2.运行结果 一.实战场景 实战场景: 如何绘制中国地图展 ...

  3. 利用Python获取最新的sci论文摘要信息并群发邮箱

    本博客结构 利用Python获取最新的sci论文摘要信息并群发邮箱 1. 需要的包:biopython.markdown 2. 正式代码 利用Python获取最新的sci论文摘要信息并群发邮箱 1. ...

  4. Basemap绘制中国地图

    2022.06.02更新 CHN_adm_shp.zip 网盘下载链接: 链接:https://pan.baidu.com/s/11igf-bfDLuolI5HzEykzMw 提取码:oas6 201 ...

  5. [Echarts可视化] 一.入门篇之简单绘制中国地图和贵州地区

    最近发生了很多事情,去到了一个新环境学习.但是不论在哪里,我都需要不忘初心,坚持做自己喜欢的事情,在CSDN写博客.教学.爱娜.生活等等.         这篇文章主要是通过Echarts可视化介绍入 ...

  6. Android-高级-UI-进阶之路-(七)-SVG-基础使用-+-绘制中国地图

    给 path 定义 name,如下所示 定义一个 Animator 文件,以表示对这幅 Vector 图像做动画 <?xml version="1.0" encoding=& ...

  7. 使用raphael.js绘制中国地图

    最近的数据统计项目中要用到中国地图,也就是在地图上动态的显示某个时间段某个省份地区的统计数据,我们不需要flash,仅仅依靠raphael.js以及SVG图像就可以完成地图的交互操作.在本文中,我给大 ...

  8. qcustomplot绘制热力图瀑布图_使用REmap绘制中国地图

    上次我们介绍了使用ggplot2绘制中国热力地图,需要温习的同学可以点击以下链接 使用ggplot2绘制中国地图  .在使用ggplot2绘制的时候,需要进行数据处理的步骤比较多,今天我们介绍一个新的 ...

  9. Ant Design Charts绘制中国地图并动态添加标记点

    绘制中国地图并动态添加标记点,在这里使用的是antd charts绘制,需要求只显示中国地图,并且跟踪物流信息 使用组件地址: 图表 - Plot | Ant Design Charts 这里的引入方 ...

  10. 广西地图html插件,ECharts绘制中国地图、广西地图

    准备工作:导入ECharts依赖.和地图需要的.js文件. 文件获取方式: 官网:url github:url (下载完后 :incubator-echarts-4.8.0mapjsprovince目 ...

最新文章

  1. pip 指定目录安装
  2. SQL Server 字符串操作
  3. 什么是OOA/OOD
  4. Quartz定时任务学习(九)Quartz监听器
  5. MATLAB 图像函数(第三章) 图像基本处理
  6. TCExam开源在线考试系统
  7. 一致性hash 简单实现
  8. GDCM:gdcm::VL 的测试程序
  9. Redis 缓存常见问题:缓存一致性的解决方案
  10. DCL并非单例模式专用
  11. des加密的c语言程序,C++中四种加密算法之DES源代码
  12. 最近30分钟合约市场爆仓842万美元
  13. oracle_linux安装oracle_12.1.0
  14. 进政府网站要求IE8浏览器,IE8浏览器进不去,使用IE进政府机构网站提示非法进入提示不能直接使用URL进入网址,windows10安装IE8提示系统不支持【解决办法】
  15. 搜狗站长工具【post请求模拟登录】代码分享总结【批量提交搜狗收录网址】
  16. 微信怎么制作朋友圈H5链接
  17. mac虚拟摄像头插件_【OBS虚拟摄像头插件下载】OBS VirtualCam(OBS虚拟摄像头插件) v2.0.5 官方最新版-开心电玩...
  18. win10删除右键菜单多余项
  19. Arbitrary Style Transfer with Deep Feature Reshuffle
  20. Linux iptables 防火墙 添加删除 端口

热门文章

  1. 回顾2020年(1)
  2. ACM竞赛入门,从零开始
  3. H.266 JEM编码块结构:四叉树+二叉树QTBT
  4. 放大器设计-光电放大电路噪声分析-理论
  5. H264编码器性能测试
  6. 35、html制作QQ彩贝热销时装页面(注意:需要素材)
  7. jer中无html文件,jsoup抓取网页+详细讲解
  8. php网页动态加载swf,HTML_如何修改网页中的FlashSWF文件,看到一个网站用flash做的,很 - phpStudy...
  9. MMD原神动画制作(学习教程一)
  10. DynamipsGUI 模拟pix防火墙