基于Python绘制个人足迹地图


Posted in Python onJune 01, 2020

前言

前两年,足迹地图小程序风靡朋友圈,一时间大家都流行晒自己的旅行地图。但是,笔者最近体验了好几款足迹地图的小程序,发现这些小程序虽然号称是足迹地图,但最多只是展示到省级别,无法精确到市级别,因此,笔者周末花了点时间,用Python来绘制自己的个人足迹地图,可以精确到市级别。

下面的部分,笔者将介绍如何简单地来绘制个人足迹地图。

首先我们需要安装以下Python的第三方模块:

echarts-china-cities-pypkg==0.0.9
echarts-china-provinces-pypkg==0.0.3
pyecharts==1.6.2
PyYAML==5.3.1

本项目的完整结构如下:

基于Python绘制个人足迹地图

  我们在项目中采用YAML文件来配置自己旅行过的省以及省下面的市,笔者的配置文件如下:

北京:
 - 延庆区
 - 昌平区
 - 海淀区
 - 东城区
 - 西城区
 - 大兴区
 - 朝阳区
上海:
 - 嘉定区
 - 青浦区
 - 松江区
 - 宝山区
 - 闵行区
 - 奉贤区
 - 浦东新区
 - 崇明区
 - 徐汇区
 - 黄浦区
 - 静安区
 - 杨浦区
 - 虹口区
 - 金山区
 - 长宁区
 - 普陀区
天津:
 - 滨海新区
 - 南开区
 - 河西区
 - 和平区
河北:
 - 保定市
 - 廊坊市
山东:
 - 烟台市
 - 青岛市
江苏:
 - 南京市
 - 苏州市
 - 扬州市
 - 镇江市
 - 无锡市
浙江:
 - 杭州市
 - 绍兴市
 - 宁波市
 - 舟山市
 - 湖州市
 - 嘉兴市
 - 台州市
 - 金华市
江西:
 - 南昌市
 - 九江市
安徽:
 - 黄山市
湖北:
 - 武汉市
湖南:
 - 长沙市
海南:
 - 海口市
 - 三亚市
四川:
 - 成都市
广东:
 - 湛江市

 接着我们利用Python脚本来生成足迹地图。先是全国地图,用于显示省和直辖市的情况,china_map.py的代码如下:

g: utf-8 -*-
# author: Jclian91
# place: Pudong Shanghai
# time: 2020/5/31 9:21 上午
# 绘制个人足迹地图:全国范围
import yaml
from pyecharts.charts import Map
from pyecharts import options as opts

# 省和直辖市
with open("travel_config.yml", 'r', encoding='utf-8') as ymlfile:
  province_city_dict = yaml.safe_load(ymlfile)

province_dict = dict(zip(province_city_dict.keys(), [1]*len(province_city_dict.keys())))
print(province_dict)

# maptype='china' 只显示全国直辖市和省级
map = Map(init_opts=opts.InitOpts(width='1200px', height='800px'))
map.set_global_opts(
  title_opts=opts.TitleOpts(title="个人足迹地图"),
  visualmap_opts=opts.VisualMapOpts(max_=1, is_piecewise=True,
                   pieces=[
                    {"max": 1, "min": 1, "label": "去过", "color": "#4EA397"},
                    {"max": 0, "min": 0, "label": "未去过", "color": "#FFFFFF"},
                    ]) #最大数据范围,分段
                   )
map.add("个人足迹地图", data_pair=province_dict.items(), maptype="china", is_roam=True)
map.render('全国.html')

运行上述脚本,会生成全国.html。为了保证图片居中显示,我们对该HTML中的下面一行:

<div id="a438407081634ceab6af1c965034ae16" class="chart-container" style="width:1200px; height:800px;"></div>

的样式(style)增加如下内容:

margin:auto;top:30px

全国范围的足迹地图效果图如下:

个人足迹地图——全国

基于Python绘制个人足迹地图

接着,我们来生成每个省市的足迹地图,利用province_map.py脚本,代码如下:

# -*- coding: utf-8 -*-
# author: Jclian91
# place: Pudong Shanghai
# time: 2020/5/31 10:01 上午
# 绘制个人足迹地图:省市范围
import yaml
from pyecharts.charts import Map
from pyecharts import options as opts

# 省和直辖市下面的市
with open("travel_config.yml", 'r', encoding='utf-8') as ymlfile:
  province_city_dict = yaml.safe_load(ymlfile)


for province, cities in province_city_dict.items():

  map = Map(init_opts=opts.InitOpts(width='1200px', height='800px'))
  map.set_global_opts(
    title_opts=opts.TitleOpts(title="个人足迹地图-%s" % province),
    visualmap_opts=opts.VisualMapOpts(max_=1, is_piecewise=True,
                     pieces=[
                      {"max": 1, "min": 1, "label": "去过", "color": "#4EA397"},
                      {"max": 0, "min": 0, "label": "未去过", "color": "#FFFFFF"},
                      ]) #最大数据范围,分段
                     )
  city_dict = dict(zip(cities, [1]*len(cities)))
  map.add("个人足迹地图-%s" % province, data_pair=city_dict.items(), maptype=province, is_roam=True)
  map.render('./provinces/%s.html' % province)
  print("生成个人足迹地图-%s 成功" % province)

这时,会在provinces目录下生成每个省或者直辖市的足迹地图,我们分别对每个HTML进行修改,保证图片居中。我们在这里只展示三个省市的情况:

个人足迹地区——海南

基于Python绘制个人足迹地图

个人足迹地图——江苏

基于Python绘制个人足迹地图

个人足迹地图——浙江

基于Python绘制个人足迹地图

最后一步,也是最为关键的一步,就是我们要打通全国足迹地图和每个省市足迹地图的联系,也就是说,我们点击全国足迹地图上去过的省份,那么可以点击进去查看该省市下的足迹地图情况,比如说去过哪些市。

对此,我们修改生成的全国.html文件,假设该地图的图像句柄为chart_a438407081634ceab6af1c965034ae16,那么在最后的<script>对中添加内容如下:(确保点击去过的省份,可以查看该省市的足迹地图)

chart_a438407081634ceab6af1c965034ae16.on('click', function (param){
      var selected = param.name;
        if (selected) {
          switch(selected){
            case '北京':
              location.href = "provinces/北京.html";
              break;
            case '上海':
              location.href = "provinces/上海.html";
              break;
            case '天津':
              location.href = "provinces/天津.html";
              break;
            case '四川':
              location.href = "provinces/四川.html";
              break;
            case '安徽':
              location.href = "provinces/安徽.html";
              break;
            case '山东':
              location.href = "provinces/山东.html";
              break;
            case '江苏':
              location.href = "provinces/江苏.html";
              break;
            case '江西':
              location.href = "provinces/江西.html";
              break;
            case '河北':
              location.href = "provinces/河北.html";
              break;
            case '浙江':
              location.href = "provinces/浙江.html";
              break;
            case '海南':
              location.href = "provinces/海南.html";
              break;
            case '湖北':
              location.href = "provinces/湖北.html";
              break;
            case '湖南':
              location.href = "provinces/湖南.html";
              break;
            case '广东':
              location.href = "provinces/广东.html";
              break;
            default:
              break;
          }

      }
   });

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
Jul 01 Python
Python 如何访问外围作用域中的变量
Sep 11 Python
Python虚拟环境项目实例
Nov 20 Python
Django admin美化插件suit使用示例
Dec 12 Python
python实现简易数码时钟
Feb 19 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
Mar 18 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
Mar 26 Python
python实现登录密码重置简易操作代码
Aug 14 Python
Python制作词云图代码实例
Sep 09 Python
Python爬虫解析网页的4种方式实例及原理解析
Dec 30 Python
python enumerate内置函数用法总结
Jan 07 Python
使用python绘制cdf的多种实现方法
Feb 25 Python
python 写函数在一定条件下需要调用自身时的写法说明
Jun 01 #Python
解决python调用自己文件函数/执行函数找不到包问题
Jun 01 #Python
Python如何在循环内使用list.remove()
Jun 01 #Python
IntelliJ 中配置 Anaconda的过程图解
Jun 01 #Python
解决python中import文件夹下面py文件报错问题
Jun 01 #Python
浅谈Python中文件夹和python package包的区别
Jun 01 #Python
python 通过文件夹导入包的操作
Jun 01 #Python
You might like
php执行sql语句的写法
2009/03/10 PHP
删除无限分类并同时删除它下面的所有子分类的方法
2010/08/08 PHP
php实现最简单的MVC框架实例教程
2014/09/08 PHP
php使用变量动态创建类的对象用法示例
2017/02/06 PHP
javascript window对象属性整理
2009/10/24 Javascript
jquery 图片轮换效果
2010/07/29 Javascript
使用jquery实现图文切换效果另加特效
2013/01/20 Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
2013/01/23 Javascript
使用indexOf等在JavaScript的数组中进行元素查找和替换
2013/09/18 Javascript
JS批量操作CSS属性详细解析
2013/12/16 Javascript
jQuery前端分页示例分享
2015/02/10 Javascript
JavaScript获得url所有参数键值表的方法
2015/03/21 Javascript
js仿苹果iwatch外观的计时器代码分享
2015/08/26 Javascript
JS实现仿苹果底部任务栏菜单效果代码
2015/08/28 Javascript
基于cssSlidy.js插件实现响应式手机图片轮播效果
2016/08/30 Javascript
Vue.js -- 过滤器使用总结
2017/02/18 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
2017/03/08 Javascript
Vue组件Draggable实现拖拽功能
2018/12/01 Javascript
bootstrap-table后端分页功能完整实例
2020/06/01 Javascript
openlayers实现图标拖动获取坐标
2020/09/25 Javascript
[02:23]1个至宝=115个英雄特效 最“绿”至宝拉比克“魔导师密钥”登场
2018/12/29 DOTA
python装饰器实例大详解
2017/10/25 Python
python3转换code128条形码的方法
2019/04/17 Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
2019/05/10 Python
使用Filter过滤python中的日志输出的实现方法
2019/07/17 Python
centos7之Python3.74安装教程
2019/08/15 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
2019/11/11 Python
TensorFlow查看输入节点和输出节点名称方式
2020/01/04 Python
pycharm无法导入本地模块的解决方式
2020/02/12 Python
Python Matplotlib简易教程(小白教程)
2020/07/28 Python
Pytorch之扩充tensor的操作
2021/03/04 Python
全国优秀教师事迹材料
2014/08/26 职场文书
求职简历自我评价范文
2015/03/10 职场文书
公司档案管理制度
2015/08/05 职场文书
Mysql中where与on的区别及何时使用详析
2021/08/04 MySQL
mysql中整数数据类型tinyint详解
2021/12/06 MySQL