MovingPandas时空轨迹数据探索和分析——上海市出租车数据集( 三 )


2、分割一条轨迹,观察结果至少在50米内停留4分钟,丢弃产生的短于500米的轨迹:
# 按要求分割'''StopSplitter是一个用于轨迹停留点分割的类 。它可以将轨迹分割成多个子轨迹,其中每个子轨迹表示连续停留的时间段 。'''split = mpd.StopSplitter(one_traj).split(max_diameter=30, min_duration=timedelta(minutes=4), min_length=500)# 绘图fig, axes = plt.subplots(nrows=2, ncols=3, figsize=(14,10))for i, traj in enumerate(split):row = i//3col = i%3traj.plot(ax=axes[row][col], linewidth=5.0, capstyle='round', column='speed', vmax=20)fig.suptitle("Trajectory split by 4 minutes stay within 50 metres and drop 500 metres long")plt.show()
3、分割速度低于5米/秒的轨迹,至少5分钟:
# 按要求分割'''SpeedSplitter是一个用于轨迹速度分割的类 。它可以将轨迹分割成多个子轨迹,其中每个子轨迹表示在速度变化较大的位置发生的事件或活动 。'''split = mpd.SpeedSplitter(one_traj).split(speed=5, duration=timedelta(minutes=5))# 绘图fig, axes = plt.subplots(nrows=3, ncols=3, figsize=(14,10))for i, traj in enumerate(split):row = i//3col = i%3traj.plot(ax=axes[row][col], linewidth=5.0, capstyle='round', column='speed', vmax=20)fig.suptitle("Trajectory split by Speed less than 5 m/s and for 5 minutes")plt.show()
减少用于描述轨迹的点的数量
lizer是一个用于轨迹简化的算法,它可以通过减少轨迹中的点数来近似表示原始轨迹 。它的原理是保留轨迹中具有重要形状变化的关键点,而删除介于这些关键点之间的冗余点 。
lizer算法需要以下参数:
fig, ax = plt.subplots(figsize=(10,5))# tolerance参数指定了简化的容差值,较小的容差值会导致更多的点被保留,而较大的容差值会导致更多的点被删除dp_generalized= mpd.DouglasPeuckerGeneralizer(one_traj).generalize(tolerance=20)dp_generalized.plot(ax=ax, column='speed', vmax=20, **plot_defaults, legend=True)ax.set_xticks([])# 设置坐标轴刻度ax.set_yticks([])# 设置坐标轴刻度ax.set_title('Generalized trajectory')print('Original length: %s'%(one_traj.get_length()))print('Generalized length: %s'%(dp_generalized.get_length()))
轨迹聚合
是一个用于轨迹集合聚合的类,它可以将轨迹集合中的相邻轨迹段聚合在一起形成更长的轨迹段 。
需要以下参数:
# 首先对轨迹进行简化,以汇总的更多跟快的速度generalized = mpd.MinDistanceGeneralizer(mdf).generalize(tolerance=100)# 聚合轨迹aggregator = mpd.TrajectoryCollectionAggregator(generalized, max_distance=1000, min_distance=100, min_stop_duration=timedelta(minutes=5))# 获取重要点对象,可能是停留点、速度变化较大的位置或其他被定义为重要的位置# 群集,聚类可能是根据一定的空间或时间特征对轨迹进行聚合而形成的群集# 流量信息,可能是在聚类结果中识别出的轨迹流动的指标,如流动的起点、终点、频率等pts = aggregator.get_significant_points_gdf()clusters = aggregator.get_clusters_gdf()flows = aggregator.get_flows_gdf()# 最大标记尺寸max_size = 150# 用每个群组的标记尺寸创建列clusters['n_norm'] = (clusters.n - clusters.n.min()) / (clusters.n.max() - clusters.n.min())clusters['m_size'] = clusters.n_norm * max_size# 绘图fig, ax = plt.subplots(figsize=(10,10))flows.plot(ax=ax, linewidth=flows.weight*2, color='black', legend=True)pts.plot(ax=ax, color='orange', legend=True)clusters.plot(ax=ax, color='red', markersize=clusters['m_size'], legend=True)ax.set_xticks([])# 设置坐标轴刻度ax.set_yticks([])# 设置坐标轴刻度ax.set_title('Trajectory collection aggregation')ax.legend(['Flows', 'Significant points', 'Clusters'])plt.show()