轨迹
物理学把物体运动所形成的时间和空间对象做成的集合称为轨迹,用以刻画物体运动的时空变化,轨迹具有时空特性,是一种时空数据,轨迹对象不同于常规地理对象,它不是一种地理实体,可以看作是一种物体随时间和空间表现得地理现象。在物联网如何如此发达的今天,我们人类各种各样的的设备无时无刻不在生成轨迹,如微信轨迹,跑步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) pi(1≤i≤n)表示第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