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


绘制gdf格式的轨迹数据:对进行绘图,我们只是有很多紧密地点放在一起的绘图
ax = gdf.plot(**plot_defaults)ax.set_title('A trajectory consisting of points')ax.set_xticks([])ax.set_yticks([])plt.show()
绘制mdf格式的轨迹数据:内置了对绘图的支持,绘制新构建的轨迹,许多点已经被转化为轨迹
# 绘制轨迹集合ax = mdf.plot(**plot_defaults)ax.set_title('Trajectory')ax.set_xticks([])ax.set_yticks([])plt.show()
如果想访问一个特定的轨迹,可以通过使用轨迹的索引来实现
# 选择轨迹one_traj = mdf.trajectories[4]print(f'轨迹信息:\n{one_traj}\n')# 获取轨迹长度print(f'轨迹长度{one_traj.get_length()}')# 绘制单个轨迹ax = one_traj.plot(color='purple', **plot_defaults)ax.set_title('A single trajectory')ax.set_xticks([])ax.set_yticks([])plt.show()
可以根据参数绘制轨迹
ax = one_traj.plot(column='speed', vmax=40, **plot_defaults)# 根据速度绘制轨迹ax.set_title('Travel speed')ax.set_xticks([])# 设置坐标轴刻度ax.set_yticks([])# 设置坐标轴刻度divider = make_axes_locatable(ax)# 创建坐标轴对象cax = divider.append_axes('bottom', size='5%', pad=0.5)# 在底部添加新的坐标轴对象cbar = plt.colorbar(ax.collections[0], cax=cax, orientation='horizontal')# 添加颜色条cbar.set_label('Speed(km/h)')# 设置颜色条标签plt.show()
根据给定的时间或时间范围内的位置,或根据与另一个几何体的交集,提取轨迹的一个元素
1、时间:
# 给定时间time1 = datetime(2007,2,20,7,35,0)time2 = datetime(2007,2,20,10,25,10)# 获取给定时间最近的位置p1 = one_traj.get_position_at(time1, method="nearest")p2 = one_traj.get_position_at(time2, method="nearest")print(f'{time1}最近点位置:{p1}\n{time2}最近点位置:{p2}\n')# 获取时间范围内的位置segment = one_traj.get_segment_between(time1, time2)print(f'给定时间段内的轨迹\n{segment}')# 绘制轨迹ax = one_traj.plot(color='orange', **plot_defaults, legend=True)segment.plot(ax=ax, color='red', linewidth=5, legend=True)ax.set_title('A trajectory segment——time')ax.set_xticks([])# 设置坐标轴刻度ax.set_yticks([])# 设置坐标轴刻度ax.legend(['Trajectory', 'Segment'])plt.show()
2、几何体相交的部分:
# 如果剪裁产生的轨迹不止一条,该方法将返回一个轨迹集合xmin, xmax, ymin, ymax = one_traj.get_bbox()# 获取轨迹的边界dist = 1000# 设置距离poly = Polygon([(xmin+dist, ymin+dist), (xmin+dist, ymax-dist), (xmax-dist, ymax-dist), (xmax-dist, ymin+dist), (xmin+dist, ymin+dist)])# 创建多边形intersections = one_traj.clip(poly)# 剪裁轨迹# 绘制轨迹ax = one_traj.plot(color='orange', **plot_defaults, legend=True)intersections.plot(ax=ax, color='red', linewidth=5, legend=True)ax.set_title('A trajectory segment——Plolygon')ax.set_xticks([])# 设置坐标轴刻度ax.set_yticks([])# 设置坐标轴刻度ax.legend(['Trajectory', 'Segment'])plt.show()
分割轨迹:如果观察有时间间隔,且物体以很低的速度运动,或者物体有一段时间没有离开同一地点,轨迹就会被分割
1、在观察有时间间隔的情况下,分割轨迹:
# 分割'''ObservationGapSplitter是一个用于轨迹观测间隔分割的类 。它可以将轨迹分割成多个子轨迹,其中每个子轨迹表示连续观测之间的时间间隔 。'''split = mpd.ObservationGapSplitter(one_traj).split(gap=timedelta(minutes=4))# 设置时间间隔# 绘制轨迹fig, axes = plt.subplots(nrows=1, ncols=len(split), figsize=(20,5))for i, traj in enumerate(split):traj.plot(ax=axes[i], linewidth=5.0, capstyle='round', column='speed', vmax=20)fig.suptitle("Trajectory split by stops(4 minutes)")plt.show()