从零实现:中国地图数据可视化(Python+Selenium+Matplotlib)

中国地图数据可视化(Python)

更新:添加了南海区域的缩略图(2020-5-16)

一、介绍

项目提供了中国地图可视化的API。项目本身不提供地图数据,所有数据均来自于民政部官网。
之前用过Basemap,中国地图是错误的(如藏南地区),当然也可以下载扩展的地图文件包;而且Basemap的安装比较麻烦,对新手可能不太友好。我尝试利用民政部官网中的数据绘制中国地图,已完成一些主要的可视化功能,当然还有很多不完善的地方。仅供大家学习交流。
项目已部署到Gitee中:https://gitee.com/jixuanfan/Map-of-China ,感兴趣的同学可以了解一下。
此外,由于需要用到爬虫,希望不要恶意爬取网站数据。

二、优点

  • 地图数据来自于民政部官网,具有权威性;
  • 可精确到县级行政区划的数据;
  • 可自主配置地图中的构成要素,如颜色、线宽、注释文字等;
  • 提供较为简单便捷的绘图API

三、模块

程序主要包含两个模块:

① 地图数据获取。Get_Map,基于Python爬虫,主要用到Selenium+RegExp
② 地图数据呈现:Draw_Map,基于Matplotlib

  • 绘制省/地级/县级行政区划的轮廓;
  • 热力图:将不同区域按值的大小填充不同颜色;
  • 气泡图

四、应用举例

(1)导入模块

import Map_of_China as Map

M=Map.Get_Map()  #创建获取地图数据对象
D=Map.Draw_Map() #创建绘制地图对象

(2)获取地图数据(需安装Selenium模块)

M=Map.Get_Map() 
M.Get_country()  #获取首页全国各省的地图数据
M.Get_provinces([32,43]) #获取一组省份内各地级行政区划的数据
M.Get_provinces_auto()  #自动获取全国尚未获取的省份数据
M.Get_cities([3201,3203]) #获取一组地级市内各县级行政区划的数据
M.Get_cities_auto(32)  #自动获取某个省尚未获取的县级行政区划数据

(3)呈现数据

  1. 绘制单个行政区划的轮廓(可填充颜色)
D=Draw_Map()
D.Draw_single_shape('Data/Country/320000.txt',LC=None)  #江苏地图
D.Draw_single_shape('Data/Province/32-江苏/320100.txt',LC='k',FC=None,title='南京轮廓')  

江苏地图
南京地图轮廓
2. 全国地图

D=Draw_Map()
D.Draw_country(FC=True,arg={'provName':True}) #默认绘制缩略的南海地图
D.Draw_country(FC=True,arg={'provName':False,'city_name':True,'city_pos':True,'sea':True}) #绘制展开的南海地图

全国地图
全国地图

  1. 省份地图
D=Draw_Map()
D.Draw_province('广东',FC=True,LC='w',arg={'other':True,'city_pos':True,'city_name':True})
D.Draw_province('44',LC='w',FC=True,arg={'other':False,'city_pos':True,'city_name':True})

广东省
广东省
4. 地级行政单位地图

D=Draw_Map()
D.Draw_city('3201') #南京地图(默认样式)
D.Draw_city('深圳',FC=True,LC='w',arg={'other':True,'city_pos':True,'city_name':True})

南京
深圳
5. 地图数据可视化:将区域颜色与数值大小对应

扫描二维码关注公众号,回复: 11235063 查看本文章
D=Draw_Map()
src='Example/GDP-2018.csv'
D.Show_data(src,FC='OrRd',title='2018年各省GDP',arg={'sea':True})  #按数据的绝对大小显示
D.Show_data(src,by_val=False,arg={'default_color':[0.6,0.6,0.6]})  #按数据的相对大小(排名)显示

2018各省GDP
2018各省GDP

D.Show_data('Example/江苏人口2018.txt','32',by_val=True,title='江苏人口2018') #省级数据
D.Show_data('Example/江苏人口2018.txt','32',by_val=True,LC='w',\
	title='江苏人口2018',arg={'city_name':True,'city_pos':True,'other':True}) #可配置地图中的样式

江苏人口
江苏人口

D.Show_data('Example/Suzhou_population.txt','3205',by_val=False,\
	title='苏州人口2018',arg={'city_name':True,'city_pos':True,'other':True}) #地级数据

苏州人口
6. 气泡图:将数值大小与圆的半径或颜色对应

D=Draw_Map()
D.Bubble(src='Example/GDP-2018.csv',img_path='Example/GDP_bubble.png') #更多选项查看:help(D.Bubble)

各省GDP气泡图

  1. 其他
  • 查询所有含有某名称的区域编码
search_region_code('朝阳')

输出:

辽宁省朝阳市: 211300
北京市朝阳区: 110105
辽宁省朝阳市朝阳县: 211321
吉林省长春市朝阳区: 220104
  • 查询某个或一组经纬度对应的点在本地图中的坐标
D=Draw_Map()
val=D.trans_coord([114.313876,30.599835]) 
print(val)

输出

[583.6755468727599, 393.2750787295468]

五、尚未完成的部分

  1. 函数参数的说明尚未完善
  2. 颜色的图例(color map)未完成
  3. 部分地图文字注释的位置太近,无法正常显示(如上海的几个市区)
  4. 在全国范围内绘制县级行政区划地图耗时太长(主要是县级行政区划数量很多)
  5. 无法获取全国范围内地级行政区划的地图数据
  6. 尚未获取省级范围内的县级行政区划地图数据
  7. 目前只能绘制静态地图,希望加入时间维度,绘制动态可视化地图

猜你喜欢

转载自blog.csdn.net/qq_35408030/article/details/106077768