轨迹数据能够提取哪些特征?

轨迹

物理学把物体运动所形成的时间和空间对象做成的集合称为轨迹,用以刻画物体运动的时空变化,轨迹具有时空特性,是一种时空数据,轨迹对象不同于常规地理对象,它不是一种地理实体,可以看作是一种物体随时间和空间表现得地理现象。在物联网如何如此发达的今天,我们人类各种各样的的设备无时无刻不在生成轨迹,如微信轨迹,跑步app记录轨迹,车载GPS设备记录,Carplay,Carlife等手机导航软件轨迹等,轨迹通常可以表示为有一些经纬度构成的时间序列

trace_time         lng        lat  spd
0    2023-08-19 16:01:46  109.763576  40.690905  0.0
4    2023-08-19 16:02:45  109.763861  40.690694  7.4
5    2023-08-19 16:02:47  109.763883  40.690658  5.5
7    2023-08-19 16:03:17  109.763843  40.690825  0.0
64   2023-08-19 16:16:26  109.763728  40.690875  0.0
...                  ...         ...        ...  ...
897  2023-08-19 17:15:20  109.737185  40.633745  5.5
900  2023-08-19 17:15:24  109.737225  40.633810  7.4
902  2023-08-19 17:15:26  109.737240  40.633825  3.7
1000 2023-08-19 17:22:17  109.736219  40.634512  5.5
1001 2023-08-19 17:22:33  109.736114  40.634555  1.8

其中,trace_time表示轨迹点记录的时间,是有先后顺序,lng表示该设备在对应时刻所在的经度,lat表示该设备在对应时刻的纬度,spd表示该时刻的速度,任何一条轨迹可以用如下数学表达式表示
L = [ p 1 , p 2 , ⋯   , p n ] L = [p_1,p_2, \cdots, p_n] L=[p1,p2,,pn]

其中, p i ( 1 ≤ i ≤ n ) p_i(1\leq i\leq n) pi1in表示第i个轨迹点的位置信息 p i = [ l n g i , l a t i ] p_i=[lng_i, lat_i] pi=[lngi,lati],这样,一条轨迹可以描述成由一些经纬度构成的轨迹点构成的时序集合,所以在刻画轨迹相似度计算的时候应该尽量使用与轨迹点直接关系的测度,如轨迹点的数目等,而不应该使用有轨迹点组合而成的几何对象,如线,面,多边形等。

轨迹的基本要素

在不同GPS设备,轨迹数据的颗粒度也不一样,那么哪些是轨迹的基本 要素呢?我们说的基本要素是指没有这个要素就不行的属性,而其他要素都可以通过基本要素来生成而得到,如同线性代数里面的最小生成组。

  • 时间戳
  • 经纬度点
  • 方位角

轨迹的特征提取

针对一条轨迹,其特性可以分为整体特性和局部特性,整体特性包括轨迹的轨迹点数目,起点终点直线距离,经度极差,纬度极差,时间极差,四至面积,经度方差,纬度方差,时间方差,平均速度方差,斜率方差,拐角余弦方差,局部特性包括相邻两个经度跨度最大(最小)值,相邻两个纬度跨度最大(最小)值,最大(最小)直线段长度, 最大(最小)平均速度,最大(最小)斜率,拐角余弦最大(最小)值变化、拐角频率等;

核心代码

下面代码用以提取轨迹数据的局部特征和整体特征

def featureExtract(trajectory): #特征提取,包括整体特征和局部特征
    # print("轨迹\n", trajectory)
    sample_count = len(trajectory) #轨迹点数
    distance_ = distance(trajectory.lat.tolist()[0], trajectory.lng.tolist()[0],  trajectory.lat.tolist()[-1], trajectory.lng.tolist()[-1]) #起点终点距离
    time_span = (trajectory.trace_time.tolist()[-1] - trajectory.trace_time.tolist()[0]).total_seconds()/60 #时间极差
    lng_span= max(trajectory['lng']) - min(trajectory['lng']) #经度极差
    lat_span = max(trajectory['lat']) - min(trajectory['lat']) #纬度极差
    cover_area = lng_span*lat_span #四至面积
    lng_var = np.var(trajectory.lng.tolist()) #经度方差
    lat_var = np.var(trajectory.lat.tolist()) #纬度方差
    
    trajectory['dis_diff'] = [0.1]+[distance(trajectory.lat.tolist()[i], trajectory.lng.tolist()[i], \
                         trajectory.lat.tolist()[i+1], trajectory.lng.tolist()[i+1]) for i in range(len(trajectory)-1)] #相邻轨迹点距离差
    trajectory['time_diff'] = [0.1] + [(trajectory.trace_time.tolist()[i+1] - trajectory.trace_time.tolist()[i]).total_seconds()/3600 for i in range(len(trajectory)-1)]  #相邻时间差(小时)
    trajectory['speed'] = trajectory['dis_diff']/trajectory['time_diff'] #速度
    trajectory['slope'] =[0]+[(trajectory.lat.tolist()[i+1] - trajectory.lat.tolist()[i])/(trajectory.lng.tolist()[i+1] - trajectory.lng.tolist()[i]) if trajectory.lng.tolist()[i+1] - trajectory.lng.tolist()[i]!=0 else 100  for i in range(len(trajectory)-1)] #斜率
    speed_var = np.var(trajectory.speed.tolist()) #速度方差
    slope_var= np.var(trajectory['slope'].tolist()) #斜率方差
    max_time_gap = np.max(trajectory['time_diff'].tolist()) #最大片段时间差
    min_time_gap = np.min(trajectory['time_diff'].tolist()) #最小片段时间差
    max_lng_gap = np.max([trajectory.lng.tolist()[i+1] - trajectory.lng.tolist()[i] for i in range(len(trajectory)-1)]) #最大相邻经度差
    min_lng_gap = np.min([trajectory.lng.tolist()[i+1] - trajectory.lng.tolist()[i] for i in range(len(trajectory)-1)]) #最小相邻经度差
    max_lat_gap = np.max([trajectory.lat.tolist()[i+1] - trajectory.lat.tolist()[i] for i in range(len(trajectory)-1)]) #最大相邻经度差
    min_lat_gap = np.min([trajectory.lat.tolist()[i+1] - trajectory.lat.tolist()[i] for i in range(len(trajectory)-1)]) #最小相邻经度差
    max_dis_gap = np.max(trajectory['dis_diff'].tolist()) #最大相邻距离
    min_dis_gap = np.min(trajectory['dis_diff'].tolist()) #最小相邻距离
    max_speed_gap = np.max(trajectory['speed'].tolist()) #最大片段速度
    min_speed_gap = np.min(trajectory['speed'].tolist()) #最小片段速度
    max_slope_gap = np.max(trajectory['slope'].tolist()) #最大片段斜率
    min_slope_gap = np.min(trajectory['slope'].tolist()) #最小片段斜率
    feature = [sample_count, distance_, time_span, lng_span, lat_span, cover_area, lng_var, lat_var, speed_var, slope_var,\
            max_time_gap, min_time_gap, max_lng_gap, min_lng_gap, max_lat_gap, min_lat_gap, max_dis_gap, min_dis_gap,\
            max_speed_gap, min_speed_gap, max_slope_gap, min_slope_gap]
    
    print(feature)
    return feature

参考文献

1,时空轨迹数据挖掘综述
https://blog.csdn.net/hitheu/article/details/118277685
2,监控视频中的车辆异常行为检测
http://c-s-a.org.cn/html/2018/2/6197.html
3,监控视频中的车辆异常行为检测
http://c-s-a.org.cn/html/2018/2/6197.html#b2
4,时空数据挖掘之轨迹表征(上)
https://zhuanlan.zhihu.com/p/487364409

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三行数学

赞赏也是一种肯定!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值