本篇文章我们来基于GoTrackIt 包来研究一下里面的轨迹数据清洗功能,该包这部分功能是一个用于处理和分析GPS轨迹数据的工具,能够帮助用户进行诸如卡尔曼滤波平滑、轨迹简化;停留点删除、增密、降频、滑动窗口平滑的链式操作,并提供多种方法来分割和分析轨迹数据,确保能够从原始数据中提取出高质量、有价值的轨迹信息,通过这些先进的算法和技术减少噪声干扰和冗余数据。
这里是该作者对包的内容介绍和用法:轨迹处理 - GoTrackIt
第一步:先把原始数据按一定处理逻辑进行清洗,我使用的逻辑可以参考我这篇:
共享单车轨迹数据分析:以厦门市共享单车数据为例(十二)-CSDN博客
处理结果如下;
第二步:我们需要把数据预处理成特定格式,'agent_id','time','lng','lat';因为这里的'agent_id'需要保证是唯一id,所以把BICYCLE_ID和ORDER_NUM做了关联,目的是为了生成唯一id;
df['agent_id'] = df['BICYCLE_ID'] + '&' + df['ORDER_NUM']
完整代码#运行环境 Python 3.11
import pandas as pd
# 读取CSV文件
df = pd.read_csv(r'D:\data\gxdc.csv', encoding='gbk') # 注意可能需要调整编码
# 创建新的agent_id,格式为 BICYCLE_ID&ORDER_NUM
df['agent_id'] = df['BICYCLE_ID'] + '&' + df['ORDER_NUM'].astype(str)
# 选择并重命名指定列
selected_df = df[['agent_id', 'LOCATING_TIME', 'LATITUDE', 'LONGITUDE']].copy()
# 重命名列
selected_df.columns = ['agent_id', 'time', 'lat', 'lng']
# 转换时间格式
selected_df['time'] = pd.to_datetime(selected_df['time']).dt.strftime('%Y-%m-%d %H:%M:%S')
# 保存为新的CSV
selected_df.to_csv(r'D:\data\processed_gps_data.csv', index=False, encoding='utf-8-sig')
print("处理完成,已保存到 D:\data\processed_gps_data.csv")
这里有一个小tips: 就是csv另存为时间字段精度丢失的问题,如果你现有的csv有时间标签且时间精度到秒的话,直接另存为文件会丢失精度,因为csv默认格式仅保存到分钟,所以你可以通过python脚本声明你要保存时间标签的颗粒度,再通过脚本另存为即可,如('%Y-%m-%d %H:%M:%S'),这样就可以保证csv时间字段精度不会丢失。
第三步:配置轨迹数据清洗的功能和参数,这些选用了3个功能和参数:去重停留点,增密,卡尔曼滤波,具体的参数配置和功能介绍原作者已经讲的很详细了,可以移步了解;
tp.del_dwell_points(dwell_l_length=5,dwell_n=2).dense(dense_interval=30).kf_smooth(p_deviation=0.01,o_deviation=0.1) # 去重停留点,增密,卡尔曼滤波
完整代码#运行环境 Python 3.11
import os
import pandas as pd
from gotrackit.gps.Trajectory import TrajectoryPoints
if __name__ == '__main__':
# 读取处理后的CSV文件
gps_df = pd.read_csv(r'D:\data\processed_gps_data.csv')
# 去除同一出行中的相同定位时间点数据
gps_df.drop_duplicates(subset=['agent_id', 'time'], keep='first', inplace=True)
gps_df.reset_index(inplace=True, drop=True)
# 构建TrajectoryPoints类, 并且指定一个plain_crs
tp = TrajectoryPoints(gps_points_df=gps_df, time_unit='ms', plain_crs='EPSG:32649')
# 使用链式操作自定义预处理的先后顺序, 只要保证kf_smooth()操作后没有执行 - 滑动窗口平滑、增密,处理后的轨迹数据即可得到分项速度数据
tp.del_dwell_points(dwell_l_length=5,dwell_n=2).dense(dense_interval=30).kf_smooth(p_deviation=0.01,o_deviation=0.1) # 去重停留点,增密,卡尔曼滤波
# 获取清洗后的结果
# _type参数可以取值为 df 或者 gdf
process_df = tp.trajectory_data(_type='df')
# 输出文件夹
out_fldr = r'D:\data'
# 存储结果
if not os.path.exists(out_fldr):
os.makedirs(out_fldr)
process_df.to_csv(os.path.join(out_fldr, r'after_reprocess_gps.csv'), encoding='utf_8_sig', index=False)
# 输出为html进行动态可视化
tp.export_html(out_fldr=out_fldr, file_name='sample', radius=9.0)
print("处理完成,结果已保存到 D:\data")
脚本会输出一个after_reprocess_gps.csv,也就是坐标经过调整的轨迹坐标,和每个唯一订单id的HTML,如果订单数据量太多的话,可以注释掉HTML输出部分;
本篇文章我们将继续以厦门市的共享单车数据作为研究对象,这里我们选取部分轨迹数据来探究共享单车gps打点数据的路径优化,其中蓝点是预处理前点位,黄点预处理后点位,具体的参数部分可以参考文档,来调整优化的效果;
文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。