1 数据来源
T-Drive trajectory data sample - Microsoft Research
2 数据介绍
- 数据集包含了2008年2月2日至2月8日期间在北京市内的10,357辆出租车的GPS轨迹。
- 总共包含约1500万个GPS点,轨迹总里程达到了900万公里。
- 图1显示了两个连续点之间的时间间隔和距离间隔的分布情况。
- 平均采样间隔约为177秒,平均距离为623米。
- 该数据集的每个文件以出租车ID命名,每个文件包含了一辆出租车的轨迹数据。
图2可视化了该数据集中GPS点的密度分布情况。
3 数据格式
出租车id,时间,经度,维度
4 数据处理
4.1 读取数据
import os
os.chdir(数据所处的路径)
files=os.listdir()
import pandas as pd
gps_data=pd.read_csv(files[0],names=['taxi_id','time','latitude','longitude'])
for file in files[1:]:
tmp=pd.read_csv(file,names=['taxi_id','time','longitude','latitude'])
gps_data=pd.concat([gps_data,tmp])
gps_data
4.2 处理数据
4.2.1 按照出租车ID+时间排序
gps_data1=gps_data.sort_values(by=['taxi_id','time'],ignore_index=True)
gps_data1
4.2.2 去重
gps_data1.drop_duplicates(inplace=True,ignore_index=True)
gps_data1
4.2.3 去除范围外的数据
我们先看一下目前数据经纬度的最大最小值
max(gps_data1.latitude),min(gps_data1.latitude)
#(116.69568, 0.0)
max(gps_data1.longitude),min(gps_data1.longitude)
#(255.3, 0.0)
0这种显然不合理
——>我们只保留一定经纬度范围内的数据
gps_data1=gps_data1[(gps_data1['latitude']>39.83)&
(gps_data1['latitude']<40.05)&
(gps_data1['longitude']>116.17)&
(gps_data1['longitude']<116.62)]
gps_data1
4.3 数据映射到路网中
4.3.1 获取路网数据
import osmnx as ox
beijing_road=ox.graph_from_bbox(40.05,39.83,116.62,116.17,network_type='drive')
4.3.2 可视化路网
ox.plot_graph(beijing_road,figsize=(15,15),show=False,close=False,node_size=4)
4.3.3 将一定数量的轨迹投影到地图上
import matplotlib.pyplot as plt
latitude = gps_data1.latitude.to_list()
longitude = gps_data1.longitude.to_list()
#将gps点的经纬度提取出来
fig,ax = ox.plot_graph(beijing_road,figsize=(15,15),show=False,close=False,node_size=4)
#可视化路网
ax.scatter(longitude[:100000],latitude[:100000],s=0.5,alpha=1,c='red')
#在路网中投影10万个坐标点
plt.show()
4.3.4 可视化每一条路网轨迹
for i in set(gps_data1.taxi_id):
latitude = gps_data1[gps_data1.taxi_id==i].latitude.to_list()
longitude = gps_data1[gps_data1.taxi_id==i].longitude.to_list()
#投影
fig,ax = ox.plot_graph(beijing_road,figsize=(15,15),show=False,close=False,node_size=1)
ax.scatter(longitude,latitude,s=5,alpha=1,c='red')#投影10万个坐标点
plt.title('Trajectory for taxi '+str(i))
plt.show()
。。。