利用网络爬虫和Networkx对城市公交进行拓扑分析

实验结果

首先展示一下效果图:城市公交路线真实分布、拓扑图与其他参数
城市公交路线真实分布
拓扑图
详细参数

实现过程概述

实现过程主要分为以下三步:
1 利用爬虫爬取公交线路数据
2 将数据放置到map lab,显示公交路线在真实地图上的分布
3 利用数据生成网络拓扑图

1 利用爬虫爬取公交线路数据

代码中url的参数key替换成自己的高德地图api的key

# -*- coding: utf-8 -*-
import requests
import json
import pandas as pd
def download(cityname, line):
    url = 'https://restapi.amap.com/v3/bus/linename?s=rsv3&extensions=all&key=none&output=json&city={}&offset=1&keywords={}&platform=JS'.format(cityname,line)
    r = requests.get(url).text
    rt = json.loads(r)
    dt = {}
    dt['line_name'] = rt['buslines'][0]['name'].split('(')[0] 
    station_name = []
    for st in rt['buslines'][0]['busstops']:
        station_name.append(st['name'])
    dt['station_name'] = station_name
    dm = pd.DataFrame(dt)
    dm.to_csv('{}{}公交基本信息.csv'.format(cityname, line), encoding='utf-8-sig')
if __name__ == '__main__':
    cityname = '北京'
    lines = ['311路', '379路', '450路', '484路', '594路', '607路', '695路', '751路']
    for line in lines:
        download(cityname, line)

这样会生成多个公交线路的文体数据,可用代码或是手动将这些数据融合到一个文本中,格式如下图所示:
在这里插入图片描述

2 将数据放置到map lab,显示公交路线在真实地图上的分布

运行以下代码:

# -*- coding: utf-8 -*-
# @Author  : William
# @Time    : 2020/5/12 18:51
# @Description : 

import requests
import json
import pandas as pd
import time
def get_line(cityname, line, path, bus_num):
    url = 'https://restapi.amap.com/v3/bus/linename?s=rsv3&extensions=all&key=none&output=json&city={}&offset=1&keywords={}&platform=JS'.format(
        cityname, line)
    r = requests.get(url).text
    rt = json.loads(r)
    try:
        polyline = rt['buslines'][0]['polyline']
        path = path + polyline  
        return bus_num + 1, path
    except:
        print('没有{}路公交'.format(line))
        return bus_num, path
if __name__ == "__main__":
    t0 = time.time()  
    lines = ['311', '379', '450', '484', '594', '607', '695', '751']
    path_str = ''
    bus_num = 0
    for i in range(0, 8):
        bus_num, path_str = get_line('北京', lines[i], path_str, bus_num)
    path = {}
    path['station_coords'] = path_str.split(";")
    path = pd.DataFrame(path)
    path.to_csv('北京部分线路公交路线轨迹数据.csv', index=False, encoding='utf-8')
    print("坐标数据有{}条".format(len(path['station_coords'])))
    print('遍历了{}条公交线路'.format(bus_num))
    t1 = time.time()
    print("运行用时:%.2fs" % (t1 - t0))

上述代码回生成一个关于lines路线数组的csv文件,将此文件上传到map lab中,map lab使用简单,该代码生成的文件可直接运行于map lab,这样就可以直接生成公交实际轨迹路线。

3 利用数据生成网络拓扑图

# _*_ coding: utf-8 _*_
import networkx as nx
import matplotlib.pyplot as plt
import re
def CreateEdges(originalPath):
    # 创建一个图
    G = nx.Graph()
    flete = open(originalPath, "r", encoding='utf-8')
    lines = flete.readlines()
    count = 1
    preBusNo = ''
    preStopName = ''
    currentBusNo = ''
    currentStopName = ''
    for line in lines:
        elements = re.split(" |,|/|:|\n|\t", line)
        if count == 1:
            preBusNo = elements[1]
            preStopName = elements[2]
        else:
            currentBusNo = elements[1]
            currentStopName = elements[2]
            if preBusNo == currentBusNo:
                G.add_edge(preStopName, currentStopName)
            preBusNo = currentBusNo
            preStopName = currentStopName
        count += 1
    return G

if __name__ == '__main__':
    originalPath = "./dataset_beijing"
    G = CreateEdges(originalPath)
    print(nx.number_of_nodes(G)) #输出图的顶点数
    print(nx.number_of_edges(G)) #输出图的边数
    print(nx.number_connected_components(G)) #输出图的连通子图数量

    lst = list(G.subgraph(c) for c in nx.connected_components(G)) #提取图中所有连通子图,返回一个列表,默认按照结点数量由大到小排序
    H = lst[0] #取顶点数最多连通子图来分析
    print(nx.number_of_nodes(H))
    print(nx.number_of_edges(H))
    print(nx.average_shortest_path_length(H)) #计算平均最短路径长度
    print(nx.average_clustering(H))#计算
    print(G.degree)
    print(nx.degree_histogram(G))
    nx.draw_networkx(G, pos=nx.spring_layout(G), nodesize = 1, alpha = 0.6, with_labels=False) #使用spring绘制图
    plt.show()

用上述代码处理过程1中制作的数据集文件,即可生成网络拓扑图,并能计算出各种详细参数。
以下为讲解视频,欢迎观看,或是关注我的抖音号查看高清视频:dy2krapn1j00

利用网络爬虫和Networkx生成城市公交拓扑网络

  • 5
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值