Crossin的程式設計教室 1月7日
以下文章來源于Python幹貨鋪子 ,作者不正經的kimol君

Python幹貨鋪子
Python學習和幹貨分享、爬蟲、機器學習、深度學習、地理資料處理與空間可視化、NCL科研繪圖、Matlab學習、ArcGIS空間可視化。隻有您想不到的,沒有本鋪子做不到的,還不關注一波嘛?
前言
大家好,歡迎來到Crossin的程式設計教室!
就在今天,我感受到了來自堵車的深深惡意。沒有錯!我今天被堵在路上近乎3個小時,美好的約會就這樣化為泡影了。
特别說明:由于資料具有實時性,畫圖時已經過了高峰期,于是圖上一片綠油油也并不奇怪。
接下來請聽我慢慢分解(ps.涉及到爬蟲、pyecharts、flask等)
一、爬取擁堵指數
某度智慧交通提供了各個城市的擁堵指數的資料,我們隻需要通過幾行代碼便可輕松抓取:
# 擷取各城市的擁堵指數
url = 'https://jiaotong.baidu.com/trafficindex/city/list' # 接口api
res = requests.get(url)
data = res.json()
其中,url為擷取資料的接口位址,通過簡單的抓包分析便能知道。而data為傳回後的資料,它包括很多字段,但是我們隻需要提取其中的城市名和擁堵指數即可:
# 提取資料
citys = [i['cityname'] for i in data['data']['list']] # 提取城市
indexs = [float(i['index']) for i in data['data']['list']] # 提取對應的指數
有了資料,接下來我們就可以将其可視化展示出來。
二、資料可視化
利用可視化神器pyecharts庫繪制地圖,并将城市以及對應的擁堵指數表示出來。其安裝如下:
pip install pyecharts
部分版本需要再安裝額外的地圖庫,方法如下:
pip install echarts-countries-pypkg
pip install echarts-cities-pypkg
pip install echarts-china-provinces-pypkg
pip install echarts-china-cities-pypkg
首先定義地圖:
geo = Geo()
geo.add_schema(maptype = 'china') # 加入中國地圖
添加資料并進行相關設定:
geo.add('各城市擁堵指數', zip(citys,indexs), type_ = 'effectScatter') # 設定地圖類型及資料
geo.set_series_opts(label_opts = opts.LabelOpts(is_show = False)) #設定是否顯示标簽
根據擁堵指數的大小進行分類,分别為暢通、緩行、擁堵、嚴重擁堵:
geo.set_global_opts(visualmap_opts = opts.VisualMapOpts(
#max_ = 2.5, # 用于連續表示
is_piecewise = True, # 是否分段
pieces = [{'min':1.0,'max':1.5,'label':'暢通','color':'#16CE95'},
{'min':1.5,'max':1.8,'label':'緩行','color':'#F79D06'},
{'min':1.8,'max':2.0,'label':'擁堵','color':'#D80304'},
{'min':2.0,'max':2.5,'label':'嚴重擁堵','color':'#8F0921'}])) # 設定圖例顯示
最後将地圖儲存在本地:
geo.render(path='各城市擁堵指數.html')
到這裡,我們就得到了文章一開始看到的那張圖~ 然而,由于擁堵資料是實時變化的,如果我每次都要去運作一次代碼豈不是很麻煩?很顯然,機智如我是不會這麼做的,咱接着往下看。
三、搭建展示網站
為了更加友善地将各城市擁堵情況展示出來,我決定搭建一個用于展示的網站。方法可以是各式各樣的,在這裡我選擇了利用flask架構,簡單快捷~
我的完整代碼如下:
# -*- coding: utf-8 -*-
"""
Created on Sun Nov 15 01:34:36 2020
@author: kimol_love
"""
import requests
from pyecharts.charts import Geo
from pyecharts import options as opts
from flask import Flask, render_template
def get_data():
'''
擷取擁堵指數
'''
# 擷取各城市的擁堵指數
url = 'https://jiaotong.baidu.com/trafficindex/city/list' # 接口api
res = requests.get(url)
data = res.json()
# 提取資料
citys = [i['cityname'] for i in data['data']['list']] # 提取城市
indexs = [float(i['index']) for i in data['data']['list']] # 提取對應的指數
# 傳回資料
return zip(citys,indexs)
def get_geo():
'''
擷取地圖
'''
# 擷取各城市的擁堵指數
data = get_data()
# 繪制散點分布圖
geo = Geo()
geo.add_schema(maptype = 'china') # 加入中國地圖
geo.add('各城市擁堵指數 by kimol', data, type_ = 'effectScatter') # 設定地圖類型及資料
geo.set_series_opts(label_opts = opts.LabelOpts(is_show = False)) #設定是否顯示标簽
geo.set_global_opts(visualmap_opts = opts.VisualMapOpts(
#max_ = 2.5, # 用于連續表示
is_piecewise = True, # 是否分段
pieces = [{'min':1.0,'max':1.5,'label':'暢通','color':'#16CE95'},
{'min':1.5,'max':1.8,'label':'緩行','color':'#F79D06'},
{'min':1.8,'max':2.0,'label':'擁堵','color':'#D80304'},
{'min':2.0,'max':2.5,'label':'嚴重擁堵','color':'#8F0921'}])) # 設定圖例顯示
# 傳回地圖
return geo
# 定義app
app = Flask(__name__)
# 定義主界面
@app.route("/")
def hello():
geo = get_geo()
return render_template('geo.html',
mygeo=geo.render_embed())
if __name__ == "__main__":
#運作項目
app.run()
其中,get_geo()為擷取地圖的函數,傳回了pyecharts繪制的地圖。在目前目錄下建立templates檔案夾,并建立子產品檔案geo.html,如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>各城市交通擁堵指數</title>
</head>
<body>
{{mygeo|safe}}
</body>
</html>
至此,通路網站位址即可看到繪制的擁堵情況地圖~
作者:不正經的kimol君來源:Python幹貨鋪子