栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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()

读取公交站点数据

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

到离站信息匹配
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()

运营车速
#转换坐标系为投影坐标系,方便后面计算距离
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
 

#筛选去掉车速过快的
#车速单位转换为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()

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/488747.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号