实验结果
首先展示一下效果图:城市公交路线真实分布、拓扑图与其他参数
实现过程概述
实现过程主要分为以下三步:
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()