Python制作炫酷的个人足迹地图

饭宝  金牌会员 | 2022-9-16 17:16:01 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 924|帖子 924|积分 2772

用Python来绘制自己的个人足迹地图, 精确到市级别。
首先我们需要安装以下Python的第三方模块:
  1. echarts-china-cities-pypkg==0.0.9      
  2. echarts-china-provinces-pypkg==0.0.3      
  3. pyecharts==1.6.2
  4. PyYAML==5.3.1
复制代码
 
本项目的完整结构如下:

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

  • 延庆区
  • 昌平区
  • 海淀区
  • 东城区
  • 西城区
  • 大兴区
  • 朝阳区
上海:

  • 嘉定区
  • 青浦区
  • 松江区
  • 宝山区
  • 闵行区
  • 奉贤区
  • 浦东新区
  • 崇明区
  • 徐汇区
  • 黄浦区
  • 静安区
  • 杨浦区
  • 虹口区
  • 金山区
  • 长宁区
  • 普陀区
天津:

  • 滨海新区
  • 南开区
  • 河西区
  • 和平区
河北:

  • 保定市
  • 廊坊市
山东:

  • 烟台市
  • 青岛市
江苏:

  • 南京市
  • 苏州市
  • 扬州市
  • 镇江市
  • 无锡市
浙江:

  • 杭州市
  • 绍兴市
  • 宁波市
  • 舟山市
  • 湖州市
  • 嘉兴市
  • 台州市
  • 金华市
江西:

  • 南昌市
  • 九江市
安徽:

  • 黄山市
湖北:

  • 武汉市
湖南:

  • 长沙市
海南:

  • 海口市
  • 三亚市
四川:

  • 成都市
广东:

  • 湛江市
接着我们利用Python脚本来生成足迹地图。先是全国地图,用于显示省和直辖市的情况,china_map.py的代码如下:
  1. # -*- coding: utf-8 -*-
  2. # author: Jclian91
  3. # place: Pudong Shanghai
  4. # time: 2020/5/31 9:21 上午
  5. # 绘制个人足迹地图:全国范围
  6. # 完整源码加Q群:279199867
  7. import yaml
  8. from pyecharts.charts import Map
  9. from pyecharts import options as opts
  10. # 省和直辖市
  11. with open("travel_config.yml", 'r', encoding='utf-8') as ymlfile:
  12.     province_city_dict = yaml.safe_load(ymlfile)
  13. province_dict = dict(zip(province_city_dict.keys(), [1]*len(province_city_dict.keys())))
  14. print(province_dict)
  15. # maptype='china' 只显示全国直辖市和省级
  16. map = Map(init_opts=opts.InitOpts(width='1200px', height='800px'))
  17. map.set_global_opts(
  18.     title_opts=opts.TitleOpts(title="个人足迹地图"),
  19.     visualmap_opts=opts.VisualMapOpts(max_=1, is_piecewise=True,
  20.                                       pieces=[
  21.                                         {"max": 1, "min": 1, "label": "去过", "color": "#4EA397"},
  22.                                         {"max": 0, "min": 0, "label": "未去过", "color": "#FFFFFF"},
  23.                                         ])  #最大数据范围,分段
  24.                                      )
  25. map.add("个人足迹地图", data_pair=province_dict.items(), maptype="china", is_roam=True)
  26. map.render('全国.html')
复制代码
 
 
运行上述脚本,会生成全国.html。为了保证图片居中显示,我们对该HTML中的下面一行:
  1. [/code] 
  2. 的样式(style)增加如下内容:
  3. [code]margin:auto;top:30px
复制代码
 
全国范围的足迹地图效果图如下:

接着,我们来生成每个省市的足迹地图,利用province_map.py脚本,代码如下:
  1. # -*- coding: utf-8 -*-
  2. # author: Jclian91
  3. # place: Pudong Shanghai
  4. # time: 2020/5/31 10:01 上午
  5. # 绘制个人足迹地图:省市范围
  6. import yaml
  7. from pyecharts.charts import Map
  8. from pyecharts import options as opts
  9. # 省和直辖市下面的市
  10. with open("travel_config.yml", 'r', encoding='utf-8') as ymlfile:
  11.     province_city_dict = yaml.safe_load(ymlfile)
  12. for province, cities in province_city_dict.items():
  13.     map = Map(init_opts=opts.InitOpts(width='1200px', height='800px'))
  14.     map.set_global_opts(
  15.         title_opts=opts.TitleOpts(title="个人足迹地图-%s" % province),
  16.         visualmap_opts=opts.VisualMapOpts(max_=1, is_piecewise=True,
  17.                                           pieces=[
  18.                                             {"max": 1, "min": 1, "label": "去过", "color": "#4EA397"},
  19.                                             {"max": 0, "min": 0, "label": "未去过", "color": "#FFFFFF"},
  20.                                             ])  #最大数据范围,分段
  21.                                          )
  22.     city_dict = dict(zip(cities, [1]*len(cities)))
  23.     map.add("个人足迹地图-%s" % province, data_pair=city_dict.items(), maptype=province, is_roam=True)
  24.     map.render('./provinces/%s.html' % province)
  25.     print("生成个人足迹地图-%s 成功" % province)
复制代码
 
这时,会在provinces目录下生成每个省或者直辖市的足迹地图,我们分别对每个HTML进行修改,保证图片居中。我们在这里只展示三个省市的情况:



最后一步,也是最为关键的一步,就是我们要打通全国足迹地图和每个省市足迹地图的联系,也就是说,我们点击全国足迹地图上去过的省份,那么可以点击进去查看该省市下的足迹地图情况,比如说去过哪些市。
  对此,我们修改生成的全国.html文件,假设该地图的图像句柄为chart_a438407081634ceab6af1c965034ae16,那么在最后的
  1.     chart_a438407081634ceab6af1c965034ae16.on('click', function (param){
  2.         var selected = param.name;
  3.             if (selected) {
  4.                 switch(selected){
  5.                     case '北京':
  6.                         location.href = "provinces/北京.html";
  7.                         break;
  8.                     case '上海':
  9.                         location.href = "provinces/上海.html";
  10.                         break;
  11.                     case '天津':
  12.                         location.href = "provinces/天津.html";
  13.                         break;
  14.                     case '四川':
  15.                         location.href = "provinces/四川.html";
  16.                         break;
  17.                     case '安徽':
  18.                         location.href = "provinces/安徽.html";
  19.                         break;
  20.                     case '山东':
  21.                         location.href = "provinces/山东.html";
  22.                         break;
  23.                     case '江苏':
  24.                         location.href = "provinces/江苏.html";
  25.                         break;
  26.                     case '江西':
  27.                         location.href = "provinces/江西.html";
  28.                         break;
  29.                     case '河北':
  30.                         location.href = "provinces/河北.html";
  31.                         break;
  32.                     case '浙江':
  33.                         location.href = "provinces/浙江.html";
  34.                         break;
  35.                     case '海南':
  36.                         location.href = "provinces/海南.html";
  37.                         break;
  38.                     case '湖北':
  39.                         location.href = "provinces/湖北.html";
  40.                         break;
  41.                     case '湖南':
  42.                         location.href = "provinces/湖南.html";
  43.                         break;
  44.                     case '广东':
  45.                         location.href = "provinces/广东.html";
  46.                         break;
  47.                     default:
  48.                         break;
  49.                 }
  50.         }
  51.   });
复制代码
 
我特意制作了个人足迹地图的视频:https://live.csdn.net/v/229255
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

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

本版积分规则

饭宝

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表