@[TOC]30分钟用python+pyechart写一个近期深圳的疫情地点展示
背景
最近(今天20220227),深圳的–疫--情–又严重起来了。深圳卫健委天天都有在发病例XX,居住XX,只看地址不够直观,要是直接有地图就好了。
因此,我在深圳卫健委官网http://wjw.sz.gov.cn/yqxx/index.html搞下数据,进行可视化。
*** 注:本文数据来源于深圳卫健委,如数据有出入,以深圳卫健委为准,请不要传谣。 ***
开发
开发环境:
python3.7
pyecharts == 1.9.0
requests == 2.21.0
数据来源
如上所说,数据来源于深圳卫健委官网,本次我就不使用爬虫了,因为他们更新频率很低1天1~2次。所以就手动复制吧。
我们只需要把它复制下来,存在txt文件里就行。
数据解析
把刚才的源数据进行解析,主要解析的方法是正则表达式的形式。
我们发现,卫健委的格式还是比较完整,都是“居住在XXX”地址。
所以我们的解析的函数如下:
def parse_data(file_name='DataText.txt'):
with open(file_name, 'r', encoding='utf-8') as f:
data_lines = f.readlines()
addrs = []
for line in data_lines:
addr_re_list = re.findall('居住在(.*?[。?,?])', line)
if addr_re_list:
addrs.append(addr_re_list[0])
# print(addrs)
return addrs
地址GPS查询
要将地址转成GPS才可以在地图上展示,在这里我们使用百度地图的API。
AK = 'YourbaiduAK_XXX' # Dish
def getPosition(addr):
'''返回经纬度信息'''
url = 'http://api.map.baidu.com/geocoding/v3/?address={inputAddress}&output=json&ak={myAk}'.format(inputAddress=addr, myAk=AK)
res = requests.get(url)
json_data = json.loads(res.text)
lat = None
lng = None
if json_data['status'] == 0:
lat = json_data['result']['location']['lat'] #纬度
lng = json_data['result']['location']['lng'] #经度
else:
print("Error output!")
print(json_data['status'])
return lat, lng
生成pyechart对应数据
将你GPS数据转换成合适使用的格式。
为了避免信息泄漏,直接使用例X表示。
def gen_gps_list(addrs):
gps_list = []
for i, addr in enumerate(addrs):
lat, lng = getPosition(addr)
gps_list.append(['例'+str(i), lat, lng])
# print(gps_list)
return gps_list
生成地图(Baidu)
这里是使用pyecharts还生成一个百度的地图,这个用法会有比较好的交互。
def gen_map(gps_list):
b = BMap()
b.add_schema(baidu_ak=AK, center=[114.040647,22.609058], zoom=12,)
for gg in gps_list:
print(gg)
b.add_coordinate(gg[0], gg[2], gg[1])
data_pair = [(gg[0], 100) for gg in gps_list]
print(data_pair)
b.add(
"bmap",
data_pair,
type_="effectScatter",
label_opts=opts.LabelOpts(formatter="{b}"),
)
b.set_global_opts(
title_opts=opts.TitleOpts(title="BMap-热力图"), visualmap_opts=opts.VisualMapOpts()
)
b.render("bmap_heatmap.html")
所有代码
from pyecharts import options as opts
from pyecharts.charts import BMap
from pyecharts.faker import Faker
import requests
import json
import re
def parse_data(file_name='DataText.txt'):
with open(file_name, 'r', encoding='utf-8') as f:
data_lines = f.readlines()
addrs = []
for line in data_lines:
addr_re_list = re.findall('居住在(.*?[。?,?])', line)
if addr_re_list:
addrs.append(addr_re_list[0])
# print(addrs)
return addrs
AK = 'YourbaiduAK_XXX' # Dish
def getPosition(addr):
'''返回经纬度信息'''
url = 'http://api.map.baidu.com/geocoding/v3/?address={inputAddress}&output=json&ak={myAk}'.format(inputAddress=addr, myAk=AK)
res = requests.get(url)
json_data = json.loads(res.text)
lat = None
lng = None
if json_data['status'] == 0:
lat = json_data['result']['location']['lat'] #纬度
lng = json_data['result']['location']['lng'] #经度
else:
print("Error output!")
print(json_data['status'])
return lat, lng
def gen_gps_list(addrs):
gps_list = []
for i, addr in enumerate(addrs):
lat, lng = getPosition(addr)
gps_list.append(['例'+str(i), lat, lng])
# print(gps_list)
return gps_list
def gen_map(gps_list):
b = BMap()
b.add_schema(baidu_ak=AK, center=[114.040647,22.609058], zoom=12,)
for gg in gps_list:
print(gg)
b.add_coordinate(gg[0], gg[2], gg[1])
data_pair = [(gg[0], 100) for gg in gps_list]
print(data_pair)
b.add(
"bmap",
data_pair,
type_="effectScatter",
label_opts=opts.LabelOpts(formatter="{b}"),
)
b.set_global_opts(
title_opts=opts.TitleOpts(title="BMap-热力图"), visualmap_opts=opts.VisualMapOpts()
)
b.render("bmap_heatmap.html")
if __name__ == '__main__':
addrs = parse_data()
print(addrs)
gps_list = gen_gps_list(addrs)
print(gps_list)
gen_map(gps_list)