交通GPS数据拥堵演变模式挖掘

"经过思路的整理,对上次组会的思想进行实验"

Posted by neo on November 21, 2019

交通拥堵演变模式关键点挖掘_数据处理

毕设已经开始两周了,但是我现在还没有自己成型的研究方法,因此要加把劲

1. 数据来源

通过对高德地图API的访问请求,利用Python对数据进行爬取,每隔两分钟获得一次对应的信息,主要字段包括

然后进行正则匹配获得对应的字段。

根据矩形区域进行对应的爬取和分析,以上海市的中心为基准,8*8的格子进行处理

#coding=utf-8

def request_map_one_minute():
    Times = time.strftime('%Y_%m_%d %H:%M:%S',time.localtime())
    global Lines, Names, Speeds, Status, Lenghts, Lcodes, Timestamps, locs, key
#     all_datas = []
    for i in locs:
        url = BASE_URL.format(loc=i, k=keys[3])
#         print(url)
        res = requests.get(url)
        datas = res.json()
#         all_datas.append(datas)
        if datas['status'] == '1':
            for road in datas['trafficinfo']['roads']:
                if 'speed' in road: 
                    s = int(road['speed']))
                else:
                    s = -1
                for code in road['lcodes']:
                    lcode.append[code]
                    Timestamps.append(Times)
                    Status.append(road['status'])
                    Speeds.append(s)
#                 polyline = road['polyline']
#                 polylines = [
#                     (float(y[0]), float(y[1])) for y in
#                     [x.split(',') for x in [i for i in polyline.split(';')]]
#                 ]
#                 line = LineString(polylines)
#                 Lines.append(line)
#                 Names.append(road['name'])
#                 Lcodes.append(road['lcodes'])
#                 Timestamps.append(Times)
#                 if 'speed' in road: Speeds.append(int(road['speed']))
#                 else: Speeds.append(100)
#                 Status.append(road['status'])
#                 Lenghts.append(line.length)

        else:
            if datas['infocode'] == '10003':
                key_flag = (key_flag + 1)%len(keys)
            if datas['infocode'] == '20003':
                continue
            else:
                print("Error of status",datas['infocode'])
#     with open("record.json","w") as f:
#         json.dump(all_datas,f)
#         print("加载入文件完成...")


def plot_show(pds_dict):
    ShangHai = geopandas.GeoDataFrame(pds_dict)
    #     ShangHai.to_file("shanghai.shp")
    #     ShangHai = geopandas.read_file("shanghai.shp")
    ShangHai.plot(column='speed', cmap='RdYlGn', legend=True)
    plt.figure(dpi=400)
    plt.show()


def save_to_file(data):
    datas = geopandas.GeoDataFrame(data)
    ti = "Shanghai_" + str(
        str(time.localtime()[1]) + '_' + str(time.localtime()[2]) + '_' +
        str(time.localtime()[3]))
    datas.to_file(ti,encoding='utf-8')

2. 数据处理

比较棘手的一点就是高德并没有对应的路网信息给我们进行查询,而且里面的路网信息每次传递的时候也不是一致的,因此需要对传递回来的路段进行匹配,然后进行对的方法研究,主要是对利用拆分的思想对其进行分割,利用已有的点去得到并没有的点的信息。然后将路段信息存储到.shapfile

这里可以使用 geopandas对其进行处理,直接使用plot就可以得到比较好的数据

2.1 Pandas 处理笔记

这部分真的烦死我了,很多看起来很简单的操作都还是不会,还是需要好好学习一下。

将数据存放在csv文件中,然后可以通过pandas的groupby函数对其进行分析和画图

2.2 Pyecharts 可视化笔记

这部分,其实比较简单,但是刚开始还是会遇到一些错。

官方文档如下:https://pyecharts.org/#/zh-cn/intro

我主要把柱状图,还有折线图进行了实现

1
2
3
4
5
6
7
8
9
def bar_base(name_y, x, y, title=None, subtitle=None) -> Bar:
    l = (
        Bar()
        .add_xaxis(x)
        .add_yaxis(name_y[0],y[0])
        .add_yaxis(name_y[1], y[1])
        .add_yaxis(name_y[2], y[2])
        .set_global_opts(title_opts=opts.TitleOpts(title=title))
    )

def line_base(name_y, x, y, y_c, number = 0,title=None, subtitle=None) -> Line:
    if number != 0:
        y = [i + number for i in y]
        y_c = [i + number for i in y_c]
    l = (
        Line()
        .add_xaxis(x)
        .add_yaxis(name_y[0], y ,is_smooth=True,
            markline_opts=opts.MarkLineOpts(
            data=[opts.MarkLineItem(type_="average")]),)
        .add_yaxis(name_y[0]+"_congestion", y_c,is_smooth=True,
            markline_opts=opts.MarkLineOpts(
            data=[opts.MarkLineItem(type_="average")]),)
#         .set_series_opts(
#             areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
#             label_opts=opts.LabelOpts(is_show=False),
#         )
#         .set_global_opts(
#             title_opts=opts.TitleOpts(title=title),
#             xaxis_opts=opts.AxisOpts(
#                 axistick_opts=opts.AxisTickOpts(is_align_with_label=True),
#                 is_scale=False,
#                 boundary_gap=False,
#             ),
#         )
    )
#     s = (
#         Scatter()
#         .add_xaxis(x)
#         .add_yaxis(name_y[0], y_c)
#         .set_global_opts(
#             title_opts=opts.TitleOpts(title="Scatter-VisualMap(Color)"),
#             visualmap_opts=opts.VisualMapOpts(max_=150),
#         )
#     )
#     l.overlap(s)
    return l

2.3 Folium 地图可视化

主要是对point进行集合选定,然后就使用map将这些经纬度的点连接起来。最后返回一个html进行展示

def get_Road_info(lcode):
    route = []
    avg_lat,avg_lon =0,0
    count = 0
    for code in lcode:
        try :
            s = Roads[Roads['Lcode'] == code]
            for m in s['geometry'].values:
                q = list(m.coords)
                count += len(q)
            for i in q:
                avg_lat += i[0]
                avg_lon += i[1]
                route.append([i[1],i[0]])
        except:
            print("Not Found",code)
    avg_lat = avg_lat / count
    avg_lon = avg_lon / count
    return route,avg_lat,avg_lon
def line_map(all_data,x,y):
 
    line_map = folium.Map(location=[y, x],
                          zoom_start=13,)
 
    folium.PolyLine(all_data,
                    weight=5,       # 粗细
                    opacity=0.8,    # 透明度
                    color='orange').add_to(line_map)
 
    return line_map

打开的html

3. 数据案例分析

查看11-26号 上海市抚顺路附近的拥堵发生和演变情况