基于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 相关文章推荐
Python实现的HTTP并发测试完整示例
Apr 23 Python
python 读写、创建 文件的方法(必看)
Sep 12 Python
python密码错误三次锁定(实例讲解)
Nov 14 Python
Python实现列表删除重复元素的三种常用方法分析
Nov 24 Python
用Python下载一个网页保存为本地的HTML文件实例
May 21 Python
pyqt5利用pyqtDesigner实现登录界面
Mar 28 Python
python3射线法判断点是否在多边形内
Jun 28 Python
Python入门Anaconda和Pycharm的安装和配置详解
Jul 16 Python
django的ORM操作 删除和编辑实现详解
Jul 24 Python
基于Tensorflow使用CPU而不用GPU问题的解决
Feb 07 Python
Python requests模块session代码实例
Apr 14 Python
详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式
Jan 24 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
微信公众平台接口开发入门示例
2014/12/24 PHP
php将图片保存入mysql数据库失败的解决方法
2014/12/27 PHP
php获取四位字母和数字的随机数的实现方法
2015/01/09 PHP
laravel手动创建数组分页的实现代码
2018/06/07 PHP
php源码的使用方法讲解
2019/09/26 PHP
Web开发之JavaScript
2012/03/29 Javascript
js动画(animate)简单引擎代码示例
2012/12/04 Javascript
html中使用javascript调用本地程序(exe、doc等)实现代码
2013/04/26 Javascript
jquery实现相册一下滑动两次的方法
2015/02/09 Javascript
JS函数定义方式的区别介绍
2016/03/22 Javascript
微信小程序 自己制作小组件实例详解
2016/12/22 Javascript
利用jquery实现实时更新歌词的方法
2017/01/06 Javascript
RequireJs的使用详解
2017/02/19 Javascript
jQuery实现动态生成表格并为行绑定单击变色动作的方法
2017/04/17 jQuery
AngularJs每天学习之总体介绍
2017/08/07 Javascript
浅谈Vuex@2.3.0 中的 state 支持函数申明
2017/11/22 Javascript
Vue动态生成表格的行和列
2019/07/18 Javascript
利用layer实现表单完美验证的方法
2019/09/26 Javascript
JavaScript实现联动菜单特效
2020/01/07 Javascript
js HTML DOM EventListener功能与用法实例分析
2020/04/27 Javascript
vue3.0 的 Composition API 的使用示例
2020/10/26 Javascript
分析并输出Python代码依赖的库的实现代码
2015/08/09 Python
python绘制直线的方法
2018/06/30 Python
Python+AutoIt实现界面工具开发过程详解
2019/08/07 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
2019/08/26 Python
python 实现学生信息管理系统的示例
2020/11/28 Python
Europcar英国:英国汽车和货车租赁
2017/01/21 全球购物
毕业生求职信范文
2014/06/29 职场文书
国企干部对照检查材料
2014/08/22 职场文书
领导干部个人整改措施落实情况汇报
2014/10/29 职场文书
软件项目经理岗位职责
2015/04/01 职场文书
行政诉讼答辩状
2015/05/21 职场文书
2016清明节森林防火广播稿
2015/12/17 职场文书
大学生军训心得体会5篇
2019/08/15 职场文书
python 实现mysql自动增删分区的方法
2021/04/01 Python
JavaScript实现简单计时器
2021/06/22 Javascript