Skip to content

实时路径匹配

实时与离线的区别

Image title
实时卡尔曼滤波
Image title
实时匹配

实时卡尔曼滤波器

实时卡尔曼滤波器的使用,需要引入OnLineTrajectoryKF类,该类将agent_id一样的车辆定位点视为同一条概率链,示例代码如下:

# 1. 从gotrackit导入相关模块
import pandas as pd
from gotrackit.tools.kf import OnLineTrajectoryKF

# 这是一个接入实时GPS数据的示例函数,用户需要自己依据实际情况去实现他
def monitor_rt_gps(once_num: int = 2):
    gps_df = pd.read_csv(r'./gps.csv')
    num = len(gps_df)
    gps_df.reset_index(inplace=True, drop=True)
    c = 0
    while c < num:
        yield gps_df.loc[c: c + once_num - 1, :].copy()
        c += once_num

if __name__ == '__main__':

    ol_kf = OnLineTrajectoryKF()
    res = pd.DataFrame()
    for _gps_df in monitor_rt_gps(once_num=1):
        if _gps_df.empty:
            continue
        ol_kf.renew_trajectory(trajectory_df=_gps_df)
        _res = ol_kf.kf_smooth()
        res = pd.concat([res, _res])
    res.reset_index(inplace=True, drop=True)
    res.to_csv(r'./online_smooth_gps.csv', encoding='utf_8_sig', index=False)

实时匹配接口

实时地图匹配的使用,需要引入OnLineMapMatch类的execute方法,该类将agent_id一样的车辆定位点视为同一条概率链,示例代码如下:

# 1. 从gotrackit导入相关模块
import pandas as pd
import geopandas as gpd
from gotrackit.map.Net import Net
from gotrackit.MapMatch import OnLineMapMatch
from gotrackit.tools.kf import OnLineTrajectoryKF

# 这是一个接入实时GPS数据的示例函数,用户需要自己依据实际情况去实现它
def monitor_rt_gps(once_num: int = 2):
    loc_df = pd.read_csv(r'./gps.csv')
    num = len(loc_df)
    loc_df.reset_index(inplace=True, drop=True)
    i = 0
    while i < num:
        yield loc_df.loc[i: i + once_num - 1, :].copy()
        i += once_num

if __name__ == '__main__':

    link = gpd.read_file('Link.shp')
    node = gpd.read_file('Node.shp')
    my_net = Net(link_gdf=link, node_gdf=node)
    my_net.init_net()

    # 新建一个实时匹配类别
    ol_mpm = OnLineMapMatch(net=my_net, gps_buffer=50,
                            out_fldr=r'./data/output/match_visualization/real_time/')

    # 新建一个实时卡尔曼滤波器
    ol_kf = OnLineTrajectoryKF()

    c = 0
    for rt_gps_df in monitor_rt_gps(once_num=2):
        if rt_gps_df.empty:
            continue
        ol_mpm.flag_name = rf'real_time_{c}'

        # 更新当前时刻接收到的定位数据
        ol_kf.renew_trajectory(trajectory_df=rt_gps_df)

        # 滤波平滑
        gps_df = ol_kf.kf_smooth(p_deviation=0.002)

        # 实时匹配
        res, warn_info, error_info = ol_mpm.execute(gps_df=gps_df,  overlapping_window=3)

Comments