1. 程式人生 > 其它 >Python 教你繪製個人旅行地圖,就是那麼牛

Python 教你繪製個人旅行地圖,就是那麼牛

今天教大家玩一個別人沒有玩過的東西,用Python晒自己的旅行地圖。聽起來就很高階,這下要成為朋友圈最亮的仔了。 很多地圖都只能顯示到省級,無法顯示到市級。今天就教大家如何用Python來製作個人的足跡地圖,精確到市級的那種噢。

 

 

下面的部分,將介紹如何簡單地來繪製個人足跡地圖。
  首先我們需要安裝以下Python的第三方模組:

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

 

完整結構如下:

完整的專案結構

我們在專案中採用YAML檔案來配置自己旅行過的省以及省下面的市,筆者的配置檔案如下:
北京:

  • 延慶區
  • 昌平區
  • 海淀區
  • 東城區
  • 西城區
  • 大興區
  • 朝陽區
    上海:
  • 嘉定區
  • 青浦區
  • 松江區
  • 寶山區
  • 閔行區
  • 奉賢區
  • 浦東新區
  • 崇明區
  • 徐彙區
  • 黃浦區
  • 靜安區
  • 楊浦區
  • 虹口區
  • 金山區
  • 長寧區
  • 普陀區
    天津:
  • 濱海新區
  • 南開區
  • 河西區
  • 和平區
    河北:
  • 保定市
  • 廊坊市
    山東:
  • 煙臺市
  • 青島市
    江蘇:
  • 南京市
  • 蘇州市
  • 揚州市
  • 鎮江市
  • 無錫市
    浙江:
  • 杭州市
  • 紹興市
  • 寧波市
  • 舟山市
  • 湖州市
  • 嘉興市
  • 台州市
  • 金華市
    江西:
  • 南昌市
  • 九江市
    安徽:
  • 黃山市
    湖北:
  • 武漢市
    湖南:
  • 長沙市
    海南:
  • 海口市
  • 三亞市
    四川:
  • 成都市
    廣東:
  • 湛江市

接著我們利用Python指令碼來生成足跡地圖。先是全國地圖,用於顯示省和直轄市的情況,china_map.py的程式碼如下:

#######
####資料加Q群:906715085

#
-*- coding: 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

 

全國範圍的足跡地圖效果圖如下:

                                                  個人足跡地圖——全國
 

接著,我們來生成每個省市的足跡地圖,利用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進行修改,保證圖片居中。我們在這裡只展示三個省市的情況:

個人足跡地區——海南

個人足跡地圖——江蘇

個人足跡地圖——浙江

最後一步,也是最為關鍵的一步,就是我們要打通全國足跡地圖和每個省市足跡地圖的聯絡,也就是說,我們點選全國足跡地圖上去過的省份,那麼可以點選進去檢視該省市下的足跡地圖情況,比如說去過哪些市。
  對此,我們修改生成的全國.html檔案,假設該地圖的影象控制代碼為chart_a438407081634ceab6af1c965034ae16,那麼在最後的

    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;
                }

        }
  });

 

這一個小專案還是不錯滴,很適合拿來練手,練完了還可以高調的炫一波,真是讓人羨慕的操作。快點學起來吧,這一篇就到這裡了,下一篇見。