GoTrackIt应用指南:共享单车时空轨迹优化

本篇文章我们来基于GoTrackIt 包来研究一下里面的轨迹数据清洗功能,该包这部分功能是一个用于处理和分析GPS轨迹数据的工具,能够帮助用户进行诸如卡尔曼滤波平滑、轨迹简化;停留点删除、增密、降频、滑动窗口平滑的链式操作,并提供多种方法来分割和分析轨迹数据,确保能够从原始数据中提取出高质量、有价值的轨迹信息,通过这些先进的算法和技术减少噪声干扰和冗余数据。

这里是该作者对包的内容介绍和用法:轨迹处理 - GoTrackIt

第一步:先把原始数据按一定处理逻辑进行清洗,我使用的逻辑可以参考我这篇:

共享单车轨迹数据分析:以厦门市共享单车数据为例(十二)-优快云博客

处理结果如下;

第二步:我们需要把数据预处理成特定格式,'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打点数据的路径优化,其中蓝点是预处理前点位,黄点预处理后点位,具体的参数部分可以参考文档,来调整优化的效果;

文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

图说交通

买猫粮,楼下的流浪猫在等我

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

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

打赏作者

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

抵扣说明:

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

余额充值