行千里,看山城轻轨穿楼越林;致广大,望重庆交通桥上桥下

点击上方“AI搞事情”关注我们


说到重庆,没有不为其魔幻交通所惊讶折服的,有这样婶儿的

这样婶儿的????

这样的????这样的????

以及这样的????当然,还有这样的????

言归正传,这篇文章除了让大伙儿感受下山城交通的魔幻属性外,我们将通过python爬虫和可视化,以及结合百度地图,对重庆的公共交通进行可视化展示分析。

01 公交数据爬虫

公交线路数据

之前,我们有通过python的scrapy爬虫框架进行各种数据的爬取(【利用python分析了下乘风破浪的姐姐以】及【Scrapy爬取姓名大全,看看那个名字最受父母青睐】),同样可以利用scrapy进行重庆公共交通数据的爬取。不过,这次小编在网上看见有比人造好轮子,直接利用requests请求网站,并通过BeautifulSoup解析HTML标签进行数据抓取。

首先,我们选择的网站是8684公交查询网站:chongqing.8684.cn,然后遍历每个数字或者字母开头下面的所有数据。

话说为什么没有7开头的公交呢?

以数字1开头的公交数据为例:

我们可以继续深钻爬取站点数据,但是8684缺少公交站点的GPS坐标以及公交线路GPS坐标数据。

GPS坐标数据

GPS数据怎么获取呢?我们可以通过地图api进行实现,这里我们选择高德地图获取公交线路的站点GPS和线路GPS信息,可以看到返回的json格式数据包含了线路名称、站点GPS、线路GPS等信息。

02 公交数据可视化

利用pyecharts库中百度地图BMap进行经纬度在地图上的绘制,在这之前,需要先在百度地图注册获取百度开放平台秘钥(浏览器端AK),地址为:

http://lbsyun.baidu.com/apiconsole/key#

同时,高德地图GPS采用火星坐标系(GCJ-02),需要转换为百度GPS坐标系(BD-09),这样才不会有偏差。

重庆轻轨线路

代码可以参照pyecharts官方demo

import re
import math
import pandas as pd
import json
import random
from pyecharts.charts import BMap
from pyecharts import options as opts

# 轨道交通颜色
sub_way_color = {'轨道交通1号线': "rgba(255, 0, 0, 1)",
                 '轨道交通2号线': "rgba(0, 255, 0, 1)",
                 '轨道交通3号线': "rgba(0, 0, 255, 1)",
                 '轨道交通3号线北延伸段': "rgba(0, 0, 255, 1)",
                 '轨道交通4号线': "rgba(255, 255, 0, 1)",
                 '轨道交通5号线': "rgba(0, 255, 255, 1)",
                 '轨道交通6号线': "rgba(242, 158, 177, 1)",
                 '轨道交通6号线支线': "rgba(242, 158, 177, 1)",
                 '轨道交通10号线': "rgba(128, 0, 128, 1)",
                 '轨道交通环线': "rgba(250, 202, 46, 1)"}
def prcess_data():
    df_line = pd.read_csv('chongqing_line.csv')
    df_line['line_name_sub'] = df_line['line_name'].apply(lambda x: re.sub(r'[(](.*)[)]', '', x, 2,flags=re.I ))
    # print(len(set(df_line['line_name_sub'])))
    print(df_line.head(3))
    gs = df_line.groupby('line_name_sub')
    result = []
    for name, g in gs:
        if '轨道' not in name:
            continue
        if name == '': continue
        print(name)
        line_dict = {}
        # lons, lats = wgs84_to_gcj02(g['lon'].values.tolist(), g['lat'].values.tolist())
        line_dict["coords"] = g[['lon', 'lat']].values.tolist()  # [[lon, lat] for lon, lat in zip(lons, lats)]
        color = sub_way_color[name] if name in sub_way_color else "rgba({},{},{},1)".format(random.randint(0, 255),
                                                                                random.randint(0, 255),
                                                                                random.randint(0, 255))
        line_dict["lineStyle"] = {"normal": {"color": color}}
        result.append(line_dict)
    return result
    
if __name__ == '__main__':
    bus_lines = prcess_data()
    # visualization
    BAIDU_MAP_AK = "pAYSAsGIDpUfGcN4fg9Ar3F2mqQZHnVH" # 浏览器端AK
    c = (
        BMap(init_opts=opts.InitOpts(width="1200px", height="800px"))
            .add_schema(
            baidu_ak=BAIDU_MAP_AK,
            center=[106.58, 29.56],
            zoom=10,
            is_roam=True,
            map_style={
                "styleJson": [
                    {
                        "featureType": "water",
                        "elementType": "all",
                        "stylers": {"color": "#031628"},
                    },
                    {
                        "featureType": "land",
                        "elementType": "geometry",
                        "stylers": {"color": "#000102"},
                    },
                    # 去除了部分地图样式代码
                ]
            },
        )
            .add(
            "",
            type_="lines",
            is_polyline=True,
            data_pair=bus_lines,
            linestyle_opts=opts.LineStyleOpts(opacity=0.2, width=0.5),
            # 如果不是最新版本的话可以注释下面的参数(效果差距不大)
            progressive=200,
            progressive_threshold=500,
        )
        .render("bmap_chongqing_bus_routines_guidao.html")
    )

同理,我们把重庆的公交数据均绘制出来

重庆公交动态展示

至此,我们对重庆公交线路的动态可视化就完成了。

往期推荐


长按二维码关注我们

有趣的灵魂在等你

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值