Python公交GPS数据的到离站信息匹配(TransBigData)

公交GPS的到离站信息匹配

使用示例中的样例数据集在github仓库中,链接为:https://github.com/ni1o1/transbigdata/tree/main/example

下面的案例展示如何用TransBigData包处理公交GPS数据,以内置方法计算公交车辆的到离站信息、统计公交单程耗时与运营车速

import transbigdata as tbd
import pandas as pd
import geopandas as gpd

读取数据

读取GPS数据

BUS_GPS= pd.read_csv(r'busgps.csv',header = None)
BUS_GPS.columns = ['GPSDateTime', 'LineId', 'LineName', 'NextLevel', 'PrevLevel',
       'Strlatlon', 'ToDir', 'VehicleId', 'VehicleNo', 'unknow']
#时间转换为datetime格式
BUS_GPS['GPSDateTime'] = pd.to_datetime(BUS_GPS['GPSDateTime'])

经纬度坐标转换

#切分经纬度的字符串
BUS_GPS['lon'] = BUS_GPS['Strlatlon'].apply(lambda r:r.split(',')[0])
BUS_GPS['lat'] = BUS_GPS['Strlatlon'].apply(lambda r:r.split(',')[1])
#坐标系转换
BUS_GPS['lon'],BUS_GPS['lat'] = tbd.gcj02towgs84(BUS_GPS['lon'].astype(float),BUS_GPS['lat'].astype(float))
BUS_GPS.head(5)
GPSDateTimeLineIdLineNameNextLevelPrevLevelStrlatlonToDirVehicleIdVehicleNounknowlonlat
02019-01-16 23:59:5971007121121.335413,31.1731881沪D-R7103Z5A-00211121.33085831.175129
12019-01-17 00:00:0071007121121.334616,31.1722711沪D-R1273Z5A-00021121.33006331.174214
22019-01-17 00:00:007100712423121.339955,31.1730250沪D-R5257Z5A-00201121.33539031.174958
32019-01-17 00:00:017100711413121.409491,31.204330沪D-R5192Z5A-00131121.40484331.206179
42019-01-17 00:00:037100711514121.398615,31.2002530沪D-T0951Z5A-00221121.39396631.202103

读取公交线数据

shp = r'busline.json'
linegdf = gpd.GeoDataFrame.from_file(shp,encoding = 'gbk')
line = linegdf.iloc[:1].copy()
line.plot()

../_images/output_8_1.png

读取公交站点数据

shp = r'busstop.json'
stop = gpd.GeoDataFrame.from_file(shp,encoding = 'gbk')
stop = stop[stop['linename'] == '71路(延安东路外滩-申昆路枢纽站)']
stop.plot()

../_images/output_10_1.png

到离站信息匹配

arriveinfo = tbd.busgps_arriveinfo(BUS_GPS,line,stop)

数据清洗中…

运行位置匹配中……

匹配到离站信息………………………………………………………………………………………………………………………………………

arriveinfo
arrivetimeleavetimestopnameVehicleId
02019-01-17 07:19:422019-01-17 07:31:14延安东路外滩1
12019-01-17 09:53:082019-01-17 10:09:34延安东路外滩1
02019-01-17 07:13:232019-01-17 07:15:45西藏中路1
12019-01-17 07:34:242019-01-17 07:35:38西藏中路1
22019-01-17 09:47:032019-01-17 09:50:22西藏中路1
...............
22019-01-17 16:35:522019-01-17 16:36:49吴宝路148
32019-01-17 19:21:092019-01-17 19:23:44吴宝路148
02019-01-17 13:36:262019-01-17 13:45:04申昆路枢纽站148
12019-01-17 15:52:262019-01-17 16:32:46申昆路枢纽站148
22019-01-17 19:24:542019-01-17 19:25:55申昆路枢纽站148

8984 rows × 4 columns

单程耗时

onewaytime = tbd.busgps_onewaytime(arriveinfo,stop,
                                   start = '延安东路外滩',
                                   end = '申昆路枢纽站',col = ['VehicleId','stopname'])
## 绘制耗时分布箱型图
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['font.serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus']=False
fig     = plt.figure(1,(8,4),dpi = 250)
ax1      = plt.subplot(111)

sns.boxplot(x = 'shour',y = onewaytime['duration']/60,hue = '方向',data = onewaytime)

plt.ylabel('始发站至终点站耗时(分钟)')
plt.xlabel('小时')
plt.ylim(0)
plt.show()

../_images/output_16_0.png

运营车速

#转换坐标系为投影坐标系,方便后面计算距离
line.crs = {'init':'epsg:4326'}
line_2416 = line.to_crs(epsg = 2416)
#公交线路数据里面的geometry
lineshp = line_2416['geometry'].iloc[0]
linename = line_2416['name'].iloc[0]
lineshp
 

../_images/output_18_1.png

#筛选去掉车速过快的
#车速单位转换为km/h
onewaytime['speed'] = (lineshp.length/onewaytime['duration'])*3.6
onewaytime = onewaytime[onewaytime['speed']<=60]
## 车速分布
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['font.serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus']=False
fig     = plt.figure(1,(8,4),dpi = 250)
ax1      = plt.subplot(111)
sns.boxplot(x = 'shour',y = 'speed',hue = '方向',data = onewaytime)
plt.ylabel('运营速度(km/h)')
plt.xlabel('小时')
plt.ylim(0)
plt.show()

../_images/output_20_0.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值