基于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 简易计算器程序,代码就几行
Aug 29 Python
使用Python编写Linux系统守护进程实例
Feb 03 Python
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
May 22 Python
Python实现PS滤镜特效之扇形变换效果示例
Jan 26 Python
一篇文章读懂Python赋值与拷贝
Apr 19 Python
django 捕获异常和日志系统过程详解
Jul 18 Python
Python实现二叉树的最小深度的两种方法
Sep 30 Python
在Python中使用MySQL--PyMySQL的基本使用方法
Nov 19 Python
基于python读取.mat文件并取出信息
Dec 16 Python
在Python 的线程中运行协程的方法
Feb 24 Python
pyqt5数据库使用详细教程(打包解决方案)
Mar 25 Python
pycharm软件实现设置自动保存操作
Jun 08 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
用libTemplate实现静态网页的生成
2006/10/09 PHP
windows7下安装php的imagick和imagemagick扩展教程
2014/07/04 PHP
PHP读书笔记整理_结构语句详解
2016/07/01 PHP
ZendFramework框架实现连接两个或多个数据库的方法
2016/12/08 PHP
Git命令之分支详解
2021/03/02 PHP
Wordpress ThickBox 点击图片显示下一张图的修改方法
2010/12/11 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
javascript调试之DOM断点调试法使用技巧分享
2014/04/15 Javascript
javascript中声明函数的方法及调用函数的返回值
2014/07/22 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
2014/09/22 Javascript
jQuery性能优化技巧分析
2015/02/20 Javascript
一个php+js实时显示时间问题
2015/10/12 Javascript
jquery+ajax实现直接提交表单实例分析
2016/06/17 Javascript
AngularJS中isolate scope的用法分析
2016/11/22 Javascript
清除js缓存的多种方法总结
2016/12/09 Javascript
原生JS实现左右箭头选择日期实例代码
2017/03/14 Javascript
基于daterangepicker日历插件使用参数注意的问题
2017/08/10 Javascript
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
JavaScript简单实现关键字文本搜索高亮显示功能示例
2018/07/25 Javascript
使用jQuery给Table动态增加行、清空table的方法
2018/09/05 jQuery
jQuery点击页面其他部分隐藏下拉菜单功能
2018/11/27 jQuery
JS实现扫码枪扫描二维码功能
2020/01/03 Javascript
在vscode 中设置 vue模板内容的方法
2020/09/02 Javascript
Python实现简单字典树的方法
2016/04/29 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
2017/08/25 Python
Python 将pdf转成图片的方法
2018/04/23 Python
python实时监控cpu小工具
2018/06/21 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
2018/12/26 Python
Python企业编码生成系统总体系统设计概述
2019/07/26 Python
通过实例解析Python调用json模块
2019/12/11 Python
广告艺术设计专业自荐书
2014/07/08 职场文书
超市优秀员工获奖感言
2014/08/15 职场文书
婚庆公司计划书
2014/09/15 职场文书
2015年惩防体系建设工作总结
2015/05/22 职场文书
Golang中异常处理机制详解
2021/06/08 Golang
MyBatis自定义SQL拦截器示例详解
2021/10/24 Java/Android