免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 1548|回复: 16
收起左侧

原来炫酷的可视化地图,用Python就能搞定!(转)

[复制链接]

8

主题

8589

铜板

22

好友

传奇会员

Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30

积分
24354
发表于 2021-9-17 09:13 | 显示全部楼层 |阅读模式

作者:小F
链接:https://juejin.cn/post/6899585409886453774
来源:掘金
地图数据来源于民政部,真实可靠。
项目地址:gitee.com/jixuanfan/M…

由于小F之前一直用「GitHub」保存代码,压根就没有注册「Gitee」。
而作者的代码以及相关数据是上传到「Gitee」上,需要注册下载。
不想注册那么多账号,所以查了一下在不登录情况下,能否下载项目代码。
CURL,是一个利用URL语法在命令行下工作的文件传输工具
# 在仓库地址(https://gitee.com/jixuanfan/Map-of-China)# 后面拼接/repository/archive/master.zip# 下载本例项目代码curl -o data.zip  https://gitee.com/jixuanfan/Map- ... /archive/master.zip复制代码Windows或许需要安装,那还是老老实实注册账号,然后下载项目代码。
Mac和Linux应该都是内置CURL,直接使用命令就行,无需安装。
/ 01 / 地图数据获取Get_Map,基于Python爬虫,主要用到Selenium+正则。
Selenium是一个用于测试网站的自动化测试工具,这里我们主要是用它来模拟浏览器操作,进而获取地图数据。
安装教程网上都有,推荐使用谷歌浏览器,驱动文件和浏览器版本需一致。
获取地图数据的两个接口地址。
# 首页URL,获取当前所有行政区划的代码http://xzqh.mca.gov.cn/map# 查询URL,获取国家或省市的具体地图数据http://xzqh.mca.gov.cn/defaultQuery?复制代码首先是获取行政区划的代码,最小应该是到县一级。
绘制不同类型的地图,所需要的数据获取函数如下。
行政代码不清楚,网上查询一下就好咯~
import Map_of_China as Map# 创建获取地图数据对象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)# 获取全国所有县级行政区划的数据(合并在一张地图中)M.Get_country_county()复制代码数据主要包括形状、形状颜色、形状轮廓、文字、文字位置、标注点形状、标注点位置等。

具体爬取代码、数据解析及函数的相关参数,查看Map_of_China.py文件可知。
/ 02 / 地图数据呈现Draw_Map,基于Matplotlib绘制地图。
01. 绘制省/地级/县级行政区划的轮廓
import Map_of_China as Map# 创建获取地图数据对象M = Map.Get_Map()# 创建绘制地图对象D = Map.Draw_Map()# #获取首页全国各省的地图数据M.Get_country()# 江苏地图D.Draw_single_shape('Data/Country/320000.txt', LC=[116, 169, 221],                                   FC=[96, 139, 219], BC='w', lw=2, title='江苏轮廓',                                   img_path='jiansu.jpg')# 获取各省份内各地级行政区划的数据M.Get_provinces([32])# 南京地图D.Draw_single_shape('Data/Province/32-江苏/320100.txt', LC='k', FC=None,                                    title='南京轮廓', img_path='nanjing.jpg')复制代码得到结果如下。


函数可设置的参数,有线条、填充、背景颜色,以及线宽、标题、图片保存路径等。

02. 绘制全国地图
import Map_of_China as Map# 创建获取地图数据对象M = Map.Get_Map()# 创建绘制地图对象D = Map.Draw_Map()# 绘制全国地图D.Draw_country(FC=True, img_path='china.jpg', arg={'provName': False,                         'city_name': True, 'city_pos': True, 'sea': False}, title='中国地图')复制代码因为前面已经把全国的地图数据爬取下来,所以这里就省去了下载数据的代码。
得到结果如下。

配色方案,默认设置为民政部官网上的配色

有一些参数和轮廓图相同,不过也添加了一些新的参数。
比如南海地图位置,显示省份名称,省份名称颜色等。
03. 绘制省份地图
import Map_of_China as Map# 创建获取地图数据对象M = Map.Get_Map()# 获取广东省份内各地级行政区划的数据M.Get_provinces([44])# 创建绘制地图对象D = Map.Draw_Map()# 绘制广东省地图D.Draw_province('广东', FC=True, LC='w', arg={'other': True, 'city_pos': True, 'city_name': True},                            img_path='guangdong.jpg')复制代码对于省份数据,前面小F只爬取了江苏省,所以这里需要爬取广东省的地图数据才行。
得到结果如下。

绘制省份地图函数对应的参数有。

code可为省份的2位编码或者名称,此处设置为「广东」。
函数还包含绘制热力图的参数,data和by_val。
arg中的other设置为False时,表现不显示周围省份或城市的地图,默认参数为True,即显示。

04. 地级行政单位地图
import Map_of_China as Map# 创建获取地图数据对象M = Map.Get_Map()# 获取南京、深圳行政区划的数据M.Get_cities([3201, 4403])# 创建绘制地图对象D = Map.Draw_Map()# 南京地图(默认样式)D.Draw_city('3201', img_path='nanjing_city.jpg')# 深圳地图(自定义样式)D.Draw_city('深圳', FC=True, LC='w', arg={'other': True, 'city_pos': True, 'city_name': True},                     img_path='shenzhen.jpg')复制代码得到结果如下。


此处code为地级市的四位编码。

05. 绘制热力图
将不同区域按值的大小填充不同颜色,可惜少了图例。
import Map_of_China as Map# 创建获取地图数据对象M = Map.Get_Map()# 创建绘制地图对象D = Map.Draw_Map()# 文件路径src = 'Example/GDP-2018.csv'# 按数据的相对大小(排名)显示D.Show_data(src, by_val=False, arg={'default_color': [0.6, 0.6, 0.6], 'sea': False},                     img_path='gdp.jpg', title='2018年各省市GDP')复制代码得到结果如下。

CSV文件具体内容格式如下。

第一列为区域名称或者编码,第二列为数值。
数据处理模块在Map_of_China.py文件中。

参数by_val,绝对大小和相对大小,通常应该都会选择绝对大小这种方式展示的。
就是作者的这个热力图,是没有图例的,等待更新~
# 省级数据D.Show_data('Example/江苏人口2018.txt', '32', by_val=True, title='江苏人口2018',            img_path='jiangsu_2018_1.jpg')# 配置地图中的样式D.Show_data('Example/江苏人口2018.txt', '32', by_val=True, LC='w', title='江苏人口2018',            arg={'city_name': True, 'city_pos': True, 'other': True},            img_path='jiangsu_2018_2.jpg')复制代码TXT格式的数据也能使用。



06. 绘制气泡图
# 气泡图D.Bubble(src='Example/GDP-2018.csv', title='2018年各省市GDP', img_path='GDP_bubble.png')复制代码得到结果如下。

气泡颜色默认为黄色,可自定义参数。

发现和Pyecharts好像,相信在修改地图配色文本字体及位置后,地图会变得更好看!





11

主题

2万

铜板

8

好友

地信院士

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
2617

童话节勋章

发表于 2021-9-17 09:54 | 显示全部楼层
6666666666666666
回复 支持 反对

使用道具 举报

0

主题

3967

铜板

1

好友

教授级高工

Rank: 12Rank: 12Rank: 12

积分
1713
发表于 2021-10-7 17:44 | 显示全部楼层
谢谢分享
回复

使用道具 举报

0

主题

612

铜板

0

好友

助理工程师

Rank: 5Rank: 5

积分
107
发表于 2021-10-16 15:48 | 显示全部楼层
good!     
回复 支持 反对

使用道具 举报

10

主题

1万

铜板

19

好友

资深会员

Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

积分
3722
发表于 2021-11-10 10:19 | 显示全部楼层

谢谢分享
回复

使用道具 举报

0

主题

1万

铜板

10

好友

教授级高工

Rank: 12Rank: 12Rank: 12

积分
1315

精华勋章

发表于 2021-12-14 10:38 | 显示全部楼层
谢谢分享
回复

使用道具 举报

0

主题

1万

铜板

2

好友

地信院士

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
2542
发表于 2021-12-16 10:35 | 显示全部楼层
感谢分享,支持
回复 支持 反对

使用道具 举报

2

主题

3万

铜板

6

好友

钻石会员

Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26

积分
5686
发表于 2021-12-19 09:18 | 显示全部楼层
谢谢分享
回复

使用道具 举报

0

主题

1万

铜板

7

好友

高级工程师

Rank: 9Rank: 9Rank: 9

积分
975
发表于 2022-1-24 11:52 | 显示全部楼层
学习了。。。
回复

使用道具 举报

0

主题

1万

铜板

6

好友

资深会员

Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

积分
3265
发表于 2023-2-28 16:31 | 显示全部楼层
路过支持一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表