30分钟用python+pyechart写一个近期深圳的疫情地点展示

@[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)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值