博客内容简介

通过前面的探究,我们大体知道如何获取一个城市的公交数据,并绘制了公交行驶路径散点图(效果不是很理想)。

其实散点图感觉更适合类似于绘制公交站点这样的信息(行驶轨迹有其他更好的绘制技巧),故本篇博客将整理之前爬取公交数据的代码,可视化相关公交站点信息,并透过可视化信息知道哪些站点是关键站点!

和之前一样,本文依旧是基于青岛市来分析

正文

1、获取一个城市所有(可选)基本信息和公交站点信息**

(1)青岛前20路公交基本信息
我(最近)写代码一个基本原则就是,大家拿去就能运行

当然,基本的运行环境得保证没问题,本博客为:Anaconda 中的Spyder软件

(补充说明:bounds变量行车区间(非始发站,终点站坐标),是一个类似对角线的概念!)

import requests
import json
import pandas as pd
import time#自己写的用于记录时间函数
def record_time(flag):if flag==0:global t0t0=time.time()else:t1=time.time()print("用时:%.2fs"%(t1-t0))  print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))#获取公交基本信息
def get_station(cityname,line):global bus_num#1、获取当前公交线路数据url = 'https://restapi.amap.com/v3/bus/linename?s=rsv3&extensions=all&key=a5b7479db5b24fd68cedcf24f482c156&output=json&city={}&offset=1&keywords={}&platform=JS'.format(cityname,line)r = requests.get(url).textrt = json.loads(r)try:#2、读取当前公交线路主要信息dt = {}dt['line_name'] = rt['buslines'][0]['name'] #公交线路名字dt['start_stop'] = rt['buslines'][0]['start_stop'] #始发站dt['end_stop'] = rt['buslines'][0]['end_stop'] #终点站dt['bounds'] = rt['buslines'][0]['bounds'] #行车区间(非始发站,终点站坐标)dt['distance'] = rt['buslines'][0]['distance'] #全程长度#3、获取沿途站点站名、对应坐标和“第几站”信息station_name = []station_coords = []station_sequence = []for st in rt['buslines'][0]['busstops']:station_name.append(st['name'])station_coords.append(st['location'])station_sequence.append(st['sequence'])dt['station_name'] = station_name #沿途站点名dt['station_coords'] = station_coords #沿途站点坐标dt['station_sequence'] = station_sequence #沿途站点第几站bus_num+=1 #有效公交数+1return pd.DataFrame(dt)  #返回pd.DataFrame()类型except: #try语句部分出错进入此部分(一般为站点名错误)print('没有{}公交'.format(line)) #输出没有的公交线路名字,可省略return pd.DataFrame([])  #返回空的pd.DataFrame类型#获取当前城市所有公交基本信息:线路名、行车区间、全程长度、沿途站点及坐标
def Bus_info(city,for_num):all_bus=pd.DataFrame()for i in range(1,for_num+1):  all_bus=pd.concat([all_bus,get_station(city,str(i)+'路')])  #不加这个'路'可能优先获取地铁print("Bus_info函数遍历{}前{}路公交,有效公交线路数为:{}个".format(city,for_num,bus_num))all_bus.to_csv("{}前{}路公交(有效线路数:{})基本信息.csv".format(city,for_num,bus_num),encoding='utf-8-sig')if __name__=="__main__":record_time(0)#用于记录开始时间bus_num=0  #全局变量,计算有效遍历的公交数city='青岛' #需要查询公交信息的城市for_num=20 #遍历的线路数[1路,for_num路],通常公交线路数小于1000,具体可参考8684等网站Bus_info(city,for_num)record_time(1)#用于记录结束时间并输出用时

(2)运行结果

(3)站点位置可视化(部分)
绘图工具:高德开放平台|Map Lab(不是很难,摸索摸索,很快就能上手!)
下图中,颜色深表示有重合

2、获取一个城市所有(可选)公交行驶轨迹

(1)直接可运行出结果的代码
和上面一样,爬取青岛市前20路的公交,只获取行驶轨迹的坐标

import requests
import json
import pandas as pd
import time#自己写的用于记录时间函数
def record_time(flag):if flag==0:global t0t0=time.time()else:t1=time.time()print("用时:%.2fs"%(t1-t0))  print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))#获取公交的行驶轨迹数据
def get_line(cityname,line,path,num):url = 'https://restapi.amap.com/v3/bus/linename?s=rsv3&extensions=all&key=a5b7479db5b24fd68cedcf24f482c156&output=json&city={}&offset=1&keywords={}&platform=JS'.format(cityname,line)r = requests.get(url).textrt = json.loads(r)try:polyline=rt['buslines'][0]['polyline'] path=path+polyline           return num+1,path         except:print('没有{}公交'.format(line)) #正常情况下,这条语句不会执行return num,path  #获取当前城市所有公交的行驶轨迹
def Bus_lines(city,for_num):path_str=''bus_num=0  for i in range(1,for_num+1):  bus_num,path_str=get_line(city,str(i)+'路',path_str,bus_num)path={}path['station_coords']=path_str.split(";") print("Bus_lines函数遍历{}前{}路公交,有效公交线路数为:{}个,轨迹坐标为:{}条".format(city,for_num,bus_num,len(path['station_coords'])))pd.DataFrame(path).to_csv('{}前{}路公交(有效线路数:{})轨迹坐标数据.csv'.format(city,for_num,bus_num),index=False,encoding='utf-8')if __name__=="__main__":record_time(0)city='青岛' #需要查询公交信息的城市for_num=20 #遍历的线路数[1路,for_num路],通常公交线路数小于1000,具体可参考8684等网站bus_num=0  #全局变量,计算有效遍历的公交数Bus_lines(city,for_num)record_time(1)

(2)运行结果

保存的表格自由坐标数据,5935条

(3)结合站点可视化(部分)
站点为红色,路径为黄色,深色部分表示有重合

这个时候我们就会思考:能不能将轨迹图用不同颜色标注出来?

3、获取一个城市所有(可选)公交行驶轨迹(附带线路名)

(1)能直接出结果的代码
因为2部分获取代码的方式特殊性,这里的功能看似和2变化不大(就加了个线路名),实际改动的地方还挺多的

import requests
import json
import pandas as pd#获取公交的行驶轨迹数据
def get_line(cityname,line):global bus_numurl = 'https://restapi.amap.com/v3/bus/linename?s=rsv3&extensions=all&key=a5b7479db5b24fd68cedcf24f482c156&output=json&city={}&offset=1&keywords={}&platform=JS'.format(cityname,line)r = requests.get(url).textrt = json.loads(r)try:path={}polyline=rt['buslines'][0]['polyline']   #获取公交路径名字path['station_coords']=polyline.split(";")  #拆分路径,将其分布于各行中path['line_name'] = rt['buslines'][0]['name'] #获取公交线路名字bus_num+=1return pd.DataFrame(path)      except:print('没有{}公交'.format(line)) #正常情况下,这条语句不会执行return pd.DataFrame() #获取当前城市所有公交的行驶轨迹
def Bus_lines(city,for_num):all_buslines=pd.DataFrame()for i in range(1,for_num+1):  all_buslines=pd.concat([all_buslines,get_line(city,str(i)+'路')])  #不加这个'路'可能优先获取地铁print("Bus_lines函数遍历{}前{}路公交,有效公交线路数为:{}个,轨迹坐标为:{}条".format(city,for_num,bus_num,len(all_buslines['station_coords'])))all_buslines.to_csv('{}前{}路公交(有效线路数:{})轨迹坐标数据.csv'.format(city,for_num,bus_num),index=False,encoding='utf-8-sig')if __name__=="__main__":city='青岛' #需要查询公交信息的城市for_num=20 #遍历的线路数[1路,for_num路],通常公交线路数小于1000,具体可参考8684等网站bus_num=0  #全局变量,计算有效遍历的公交数Bus_lines(city,for_num)

(2)实验结果:


(3)可视化效果(部分)
高德地图只支持同时显示7种不同线路颜色,emmmm,其实效果还不错!

4、获取青岛市区所有站点信息

(1)分析
通过for循环的方法自然有其优越性:给个大体范围,等上几分钟,就能出所需要城市的几乎所有线路的公交信息!
但是,这样获取终究难免会有遗漏,而且也不能指定特定区域,故这里通过8684青岛公交获取了青岛市区所有公交线路,并演示在获取公交名文本的情况下,如何读取对应公交信息。

(2)通过读取文本获取公交相关信息

import requests
import json
import pandas as pd
import time#自己写的用于记录时间函数
def record_time(flag):if flag==0:global t0t0=time.time()else:t1=time.time()print("用时:%.2fs"%(t1-t0))  print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))#获取公交基本信息
def get_station(cityname,line):#1、获取当前公交线路数据url = 'https://restapi.amap.com/v3/bus/linename?s=rsv3&extensions=all&key=a5b7479db5b24fd68cedcf24f482c156&output=json&city={}&offset=1&keywords={}&platform=JS'.format(cityname,line)r = requests.get(url).textrt = json.loads(r)try:#2、读取当前公交线路主要信息dt = {}dt['line_name'] = rt['buslines'][0]['name'] #公交线路名字dt['start_stop'] = rt['buslines'][0]['start_stop'] #始发站dt['end_stop'] = rt['buslines'][0]['end_stop'] #终点站dt['bounds'] = rt['buslines'][0]['bounds'] #行车区间(始发站,终点站坐标)dt['distance'] = rt['buslines'][0]['distance'] #全程长度#3、获取沿途站点站名、对应坐标和“第几站”信息station_name = []station_coords = []station_sequence = []for st in rt['buslines'][0]['busstops']:station_name.append(st['name'])station_coords.append(st['location'])station_sequence.append(st['sequence'])dt['station_name'] = station_name #沿途站点名dt['station_coords'] = station_coords #沿途站点坐标dt['station_sequence'] = station_sequence #沿途站点第几站return pd.DataFrame(dt)  #返回pd.DataFrame()类型except: #try语句部分出错进入此部分(一般为站点名错误)print('没有{}公交'.format(line)) #指定公交路线情况下,词条语句不会执行!return pd.DataFrame()  #返回空的pd.DataFrame类型#获取青岛市区所有公交基本信息:线路名、行车区间、全程长度、沿途站点及坐标
def Bus_info():with open("公交线路.txt", "r", encoding="utf-8") as f:bus_name = f.readlines() #读取当前文件夹公交车线路名bus_name = bus_name[0].split(",") #将获取的线路名文件通过','进行拆分all_bus=pd.DataFrame()for i in bus_name:  all_bus=pd.concat([all_bus,get_station('青岛',i)])  print("获取青岛市区{}条路线基本信息成功!".format(len(bus_name)))all_bus.to_csv("青岛市区{}条路线基本信息.csv".format(len(bus_name)),encoding='utf-8-sig')if __name__=="__main__":record_time(0)#用于记录开始时间  Bus_info() #已知文本具体信息都有,不需要传参record_time(1)#用于记录结束时间并输出用时

(3)实验结果:
文本中所写256条市区线路全部读取成功!

部分文本内容示意:

(4)青岛市区256条线路站点位置可视化
①市区站点鸟瞰图
深颜色代表重合(多条线路汇集处),密恐不知道感觉咋样?

②站点分布⭐形图
这样一来,哪些站点是关键站点就比较清楚了

③站点热度分布示意图
觉得上图分布还不够直观?那就来看看大小点图

④加强对比感

⑤来点小汽车?
青岛几个关键的景点都在这张图里了<( ̄︶ ̄)↗[GO!]

其实这篇博客还是蛮实用的,得到的城市公交站点热度分布效果挺不错的!

找一个你感兴趣的城市(家乡)试一试?( •̀ .̫ •́ )✧

【大数据】城市公交网络分析与可视化(三):获取公交站点信息并可视化站点重要程度相关推荐

  1. 基于大数据的智能网络分析

    2018云栖大会深圳峰会弹性计算.网络和CDN专场上,阿里云高级技术专家云州给大家一起探讨了大数据的智能网络分析.通过介绍全球网络的超大规模,进而说明了智能网络齐天的设计必要性,着重详讲解了齐天智能网 ...

  2. 【大数据入门核心技术-Tez】(三)Tez与Hive整合

    一.准备工作 1.Hadoop和Hive安装 [大数据入门核心技术-Hadoop](五)Hadoop3.2.1非高可用集群搭建 [大数据入门核心技术-Hadoop](六)Hadoop3.2.1高可用集 ...

  3. 大数据技术原理与应用 第三版 林子雨 期末复习(二) Hadoop HDFS HBase

    大数据技术原理与应用 第三版 林子雨 期末复习(二) Hadoop HDFS HBase Hadoop生态系统 HDFS HDFS结构 块 Name Node与Second Name Node与Dat ...

  4. hadoop大数据开发技术学习笔记第三天:(前序)MySQL数据库进阶

    hadoop大数据开发技术学习笔记第三天:(前序)MySQL数据库进阶 一.回顾知识 1.myschool数据库和数据表的创建 (1)创建数据库 (2)数据库模型图 (3)创建数据表grand (4) ...

  5. 漫谈大数据时代的个人信息安全(三)——“点赞之交”

    大数据时代的个人信息安全系列三:"点赞之交" 1. 点赞之交 2. 点赞诈骗 3. 个人信息保护小贴士 互联网就像公路,用户使用它,就会留下脚印. 每个人都在无时不刻的产生数据,在 ...

  6. 中国离婚大数据:离婚/结婚比东北三省和四大直辖市霸榜

    导读:民政部近日发布了<2018年第4季度各省社会服务统计数据>,虽说名称叫"第4季度",但实际上其中的数据是2018年全年的累计值.从全国数据来看,2018年全年全国 ...

  7. 大数据时代的网络分析,如何挖掘大数据?

    我们生活在一个互联实体(entities)构成的复杂世界中.人类涉足的所有领域,从生物学到医学.经济学和气候科学,都充满了大规模数据集. 这些数据集将实体(entities)模拟为节点.节点之间的连接 ...

  8. jdbc代码_凯哥带你从零学大数据系列之数据库篇---第三章:JDBC基础

    温馨提示:如果想学扎实,一定要从头开始看凯哥的一系列文章(凯哥带你从零学大数据系列),千万不要从中间的某个部分开始看,知识前后是有很大关联,否则学习效果会打折扣. 系列文章第一篇是拥抱大数据:凯哥带你 ...

  9. 东北大学oj平台python答案_东北大学大数据班R实训第三次作业

    title: "R实训第三次作业" output: html_notebook 1.通过读取文件death rate.csv获取数据保存到df中:简单分析数据,获取共 有数据多少条 ...

  10. 大数据特点5V 商业智能实现的三个层次

    大数据有哪些特点(高大多低真) Volume(大量) 数据规模很大,通常是GB.TB级别,甚至是PB级别. Velocity(高速) 数据的增长速度快. Variety(多样) 数据的类型不是唯一的, ...

最新文章

  1. spark写mysql优化简书_spark——通过jdbc连接数据库中遇到的问题
  2. two.js文档阅读笔记-two.js的基本使用
  3. 基于Spring + Spring MVC + Mybatis 高性能web构建
  4. 前端入职后很痛苦_NGW前端新技术赛场:Serverless SSR 技术内幕
  5. MyEclipse使用阿里p3c代码规范
  6. WeAPI android ios,WechatOpenSDK 1.8.6 iOS接入指南
  7. python3网络爬虫(堆糖网)
  8. 如何查找计算机密码cmd,教你如何查看计算机所连wifi密码
  9. 餐巾计划(网络流24题之二(模板2))
  10. 使用键盘设置桌面计算机图标的显示不出来,显示桌面,小编教你显示桌面图标不见了如何恢复...
  11. java read dxf xdata_DXF格式文件数据提取
  12. 游戏服务端框架之配置与玩家数据库设计
  13. Android游戏开发教程汇总
  14. 你的饿了么订单又超时啦!
  15. 别把自己当作“千里马”,“笨鸟”先飞才是硬道理。
  16. Centos7.9+mysql8.0开启指定IP远程连接数据库
  17. 上海流浪汉沈_流浪汉,木偶和Mozilla,我的天哪
  18. 中秋节祝福html,中秋节祝福页面 在线制作祝福网页 祝你中秋节快乐!
  19. linux中sl是什么命令,都知道linux中的ls命令,但是你知道sl命令是什么作用吗?...
  20. 公共WiFi到底该不该连?黑客教父龚蔚这么说

热门文章

  1. 一位软科大一的周结(week 1)
  2. MAC地址、IP地址以及ARP协议详细讲解
  3. 如何成就一个App 游戏界的百万富翁
  4. k重特征值必有k个线性无关的_大学线性代数必过复习资料
  5. 一款优秀的富文本编辑器element tiptap的使用
  6. 理解Java ClassLoader机制 |用Java说话,人气战胜时间!Come On
  7. mysql查询1万条数据要1秒钟_SQL查询效率:100w数据查询只需要1秒钟
  8. 通过emmc分区挂载根文件系统
  9. 2017第三届中国西部农资展览会会刊(参展商名录)
  10. 关于FPGA极速交易的一点小总结(安湖科技版本)