精华内容
下载资源
问答
  • 地图轨迹平滑算法

    万次阅读 2016-08-04 00:21:34
    地图轨迹平滑算法,Savitzky-Golay 滤波器

    地图轨迹平滑算法

    引子:

    之前看到网上有大神写过一个demo:
    http://blog.csdn.net/zhoumushui/article/details/41751259
    这里写图片描述
    但是提供的代码不全,一直没有明白这个算法是怎么做的:
    这里写图片描述
    这里写图片描述

    算法说明:

    后来一次偶然的机会,看到这篇文章(注意,这篇文章里的代码,部分算法的参数是错的):
    http://blog.csdn.net/liyuanbhu/article/details/11119081
    这里写图片描述
    其中的5点平滑代码恰恰和之前描述的一样,原来之前的文章只给出了边缘4个点(最前面2个点、最后面2个点),恰恰漏掉了最关键的中间所有点、虽然只是简单的5点平均

    这个算法是Savitzky-Golay 滤波器的“5点1阶”算法。那么,怎么推导出“n点k阶”的系数呢?笔者没有时间去仔细研究算法本身,只想找到最快的方法解决问题,最后发现可以通过MatLab直接的得到这些参数,比如:
    这里写图片描述
    这个矩阵前2行对应前两个点的系数,后2行对应后两个点的系数,中间行对应中间所有点的系数。

    结论:这样就完成了,用MatLab 根据需要得到矩阵,然后就可以编程了!

    展开全文
  • 轨迹平滑和纠偏纠偏通过gps获取坐标点时 因为gps信号不稳定等原因 出现坐标点异常 不符合实际 进行异常点的处理 来对轨迹纠正轨迹偏移不正常...百度地图鹰眼服务:源码主要实现思路:计算相邻坐标点之间距离 通过...

    轨迹平滑和纠偏

    纠偏

    通过gps获取坐标点时 因为gps信号不稳定等原因 出现坐标点异常 不符合实际 进行异常点的处理 来对轨迹纠正

    轨迹偏移不正常

    7333180474e341fcc76b727a34e23e03.png

    取得轨迹坐标集合 对此段轨迹设置起点和终点 取得相邻两坐标点 计算出两点之间距离 对比获取坐标点的时间 判断坐标时速异常 对坐标点移除处理

    代码逻辑

    6305520b19ee88ae1f3bc9f3cc4ecbbd.png

    e41428466869c158ddc4895888c450bb.png

    异常点去除之后轨迹

    e43b0520ba4f55947b4ff80a5e3ded9e.png

    轨迹平滑处理

    实现思路方法

    1.百度地图鹰眼服务:

    源码主要实现思路:计算相邻坐标点之间距离 通过时间判断速度 挑出 异常点 绑定道路的实现方式

    2.数据库坐标去重过滤:

    高斯滤波:.

    百度鹰眼服务

    文档地址:http://lbsyun.baidu.com/index.php?title=yingyan/api/v3/trackupload

    上传轨迹 —轨迹处理—返回轨迹

    请求方式 http://yingyan.baidu.com/api/v3/track/addpoint //POST请求

    参数

    核心参数

    ak 用户授权标识

    Service_id 鹰眼服务标识

    entity_name 轨迹所属实例

    Longitude 经度

    Latitude 纬度

    loc_time 获取坐标点时间

    coord_type_input 坐标类型

    wgs84:GPS 坐标

    gcj02:国测局加密坐标

    bd09ll:百度经纬度坐标

    7eb27aa0593e4f05c42a25771919e7fa.png

    返回值参数

    6f1d750f3db338d80d8305975652c585.png

    多轨迹上传

    可上传多个实例的多个轨迹 核心方法 addpoins

    http://yingyan.baidu.com/api/v3/track/addpoints //POST请求

    所需参数如下

    5ea188ddbeb3e6f4be0160ade6d7db2c.png

    Point_list 为多个实例和轨迹的集合格式如下 返回值如下

    25adffc422e96c5a82065e9dc6d30cc3.png

    10c328c18e6dd69887c3cb2a4eb7d472.png这是entity实例 可单个上传或批量

    a7370494070dc3975407d91c2d7b73d2.png

    这是属于entity的轨迹addpionts 可批量上传 单独上传 进行轨迹处理

    可有去噪 抽稀 绑路 终端补偿等 在传递参数时设置 返回纠正后集合

    纠正之后

    3a85c4b2ea4d10a068fbe5766c3cd8d9.png

    数据库坐标去重过滤

    以下方案摘取:https://www.jianshu.com/p/1c71d10e18bf

    将取到的若干坐标点存入到数据库 核心字段 id 经纬度 时间

    434bd80fac397776ccf93e659f7a4c52.png

    将数据库坐标点去重

    e5fe137b4549df4fb7d5fa7d5bd765b4.png

    数据平滑采用高斯滤波进行平滑处理

    94dd8a9c186f2d9d3d8150ace8d0832e.png

    将处理后的坐标点铺到地图上

    5f668c1de58d8c1cead1c691e14b0fe0.png

    坐标匹配到道路上去,但是由于精度不是那么可靠,切在转弯处的数据匹配也是明显的错误,但是目前没找到好的解决方案

    总结:

    无论纠偏、异常点处理、轨迹平滑 其根本都是对坐标点的处理 核心参数是经纬度以及经纬度对应的时间 进行处理 在坐标点做够多的情况下 gps不稳定获取的坐标点不够精确导致的问题

    展开全文
  • 公司有个需求需要实时绘制扫地机的清洁路径,但是上报的点几千个后,svg绘制就会很卡,决定使用抽稀算法减少些定位点,优化性能。 util.js // 计算两点间距离 export const calculationDistance = (point1, ...

    公司有个需求需要实时绘制扫地机的清洁路径,但是上报的点几千个后,svg绘制就会很卡,决定使用抽稀算法减少些定位点,优化性能。

    util.js

    // 计算两点间距离
    export const calculationDistance = (point1, point2) => {
      const x1 = point1.x;
      const y1 = point1.y;
      const x2 = point2.x;
      const y2 = point2.y;
      const xy = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
      return xy;
    };
    // 计算点pX到点pA和pB所确定的直线的距离
    export const distToSegment = (start, end, center) => {
      const a = Math.abs(calculationDistance(start, end));
      const b = Math.abs(calculationDistance(start, center));
      const c = Math.abs(calculationDistance(end, center));
      const p = (a + b + c) / 2.0;
      const s = Math.sqrt(Math.abs(p * (p - a) * (p - b) * (p - c)));
      return s * 2.0 / a;
    };
    
    // 递归方式压缩轨迹
    export const compressLine = (coordinate, result, start, end, dMax) => {
      if (start < end) {
        let maxDist = 0;
        let currentIndex = 0;
        const startPoint = coordinate[start];
        const endPoint = coordinate[end];
        
        for (let i = start + 1; i < end; i++) {
          const currentDist = distToSegment(startPoint, endPoint, coordinate[i]);
          if (currentDist > maxDist) {
            maxDist = currentDist;
            currentIndex = i;
          }
        }
    
        if (maxDist >= dMax) {
          // 将当前点加入到过滤数组中
          // console.warn(maxDist);
          result.push(coordinate[currentIndex]);
          // 将原来的线段以当前点为中心拆成两段,分别进行递归处理
          compressLine(coordinate, result, start, currentIndex, dMax);
          compressLine(coordinate, result, currentIndex, end, dMax);
        }
      }
    
      return result;
    };
    
    export const douglasPeucker = (coordinate, dMax = 10) => {
      if (!coordinate || !(coordinate.length > 2)) {
        return null;
      }
      coordinate.forEach((item, index) => {
        item.id = index;
      });
    
      const result = compressLine(coordinate, [], 0, coordinate.length - 1, dMax);
      result.push(coordinate[0]);
      result.push(coordinate[coordinate.length - 1]);
      const resultLatLng = result.sort((a, b) => {
        if (a.id < b.id) {
          return -1;
        } else if (a.id > b.id)
          return 1;
        return 0;
      });
      resultLatLng.forEach((item) => {
        item.id = undefined;
      });
      return resultLatLng;
    };

     

    datas= douglasPeucker(newData,10);

     

    优化前

     

    优化后

     

     

     

    转载于:https://www.cnblogs.com/mosquito18/p/10113096.html

    展开全文
  • 这篇是Lyft(美帝第二大打车平台)工程师分享的最近上线的地图匹配算法,非常有参考价值。作者:Marie Douriez编译:McGL当你要求打车时,Lyft 会试着找一个最适合你路线的司机。要做出调度决定,我们首先需要问: 司机...

    打车有时也会职业病发作,琢磨一下车辆调度是怎么做的,路径规划算法要怎么写,GPS偏移该怎么纠正等等。不过就是想想而已,并没有深究。这篇是Lyft(美帝第二大打车平台)工程师分享的最近上线的地图匹配算法,非常有参考价值。

    作者:Marie Douriez编译:McGL

    当你要求打车时,Lyft 会试着找一个最适合你路线的司机。要做出调度决定,我们首先需要问: 司机在哪里?Lyft 使用司机手机的 GPS 数据来回答这个问题。然而,我们得到的 GPS 数据往往是有噪音的,和道路并不匹配。

    ee498e17404b81147e3cc20b9936c507.png

    位置数据经常有噪音,和道路不匹配。

    为了从这些原始数据中得到一个更清晰的图像,我们运行一个算法,输入原始位置并返回道路网中更准确的位置。这个过程称为地图匹配(map-matching)。我们最近开发并发布了一个全新的地图匹配算法,发现它提高了驾驶员定位的准确性,并使 Lyft 的市场更有效率。在这篇文章中,我们将讨论这个新模型的细节。

    什么是地图匹配?

    地图匹配是这样一个过程,匹配原始GPS的位置到道路网路段,以产生一个车辆路线的估计。

    89859df91f2ab2d3fdba427a9fc157dc.png

    我们为什么需要地图匹配?

    在 Lyft,我们有两个主要的地图匹配用例:

    1. 在行程结束时,计算司机所行驶的路程以计算车费。

    2. 为 ETA 团队实时地提供准确的位置,做出调度决定,并在乘客的app上显示司机的车。

    6763bb176220953e10958626580c8b22.png

    实时地图匹配有两种应用: 在乘客的车上精确显示司机的车(左);做出高效的调度决定(右)。

    这两个用例的不同之处在于它们的约束: 实时的情况,我们需要快速地执行地图匹配(低延迟) ,并且当前时间及之前的位置已知。然而,在行程结束时,延迟要求没有那么严格,整个行程的历史对我们来说是可用的(允许我们从未来的位置“向后”执行)。结果表明,使用略有不同的方法可以解决行车终点地图匹配(EORMM)和实时地图匹配(RTMM)问题。在这篇文章中,我们将关注用于实时地图匹配的算法。

    为什么地图匹配有挑战性?

    差的地图匹配位置会导致不准确的预计到达时间(ETAs),然后导致错误的调度决策并令司机和乘客失望。因此,地图匹配直接影响 Lyft 的市场,并对用户体验产生重要影响。地图匹配有几个主要挑战。

    首先,在城市峡谷(街道被高楼包围)、层叠的道路或隧道下面,通过手机收集的位置数据会变噪音很大。这些区域对于地图匹配算法来说尤其具有挑战性,而且由于很多 Lyft 搭乘都发生在那里,正确匹配就显得尤为重要。

    除了噪音和道路几何形状,另一个挑战是缺乏ground truth: 我们实际上不知道司机开车时的真实位置,我们必须找到代理来评估模型的准确性。

    最后,地图匹配算法的性能依赖于道路网数据的质量。这个问题正在由 Lyft 内部的 Mapping 团队解决。

    那么,我们如何解决地图匹配问题呢?

    我们不会介绍解决地图匹配的所有技术,但是为了回顾一下常见的方法,请参考 Quddus 等人的这项研究[1]。

    解决这个问题的一个好方法是使用状态空间模型(state space models)。状态空间模型是时间序列模型,其中系统具有“隐藏”状态,不能直接观测到,但能产生可见的观察结果。这里,我们的隐藏状态是我们试图估计的汽车在道路网络上的实际位置。我们只观察隐藏状态的一个修改版本: 观察值(原始位置数据)。我们假设系统的状态以一种只依赖于当前状态的方式进化(马尔可夫假设) ,并进一步定义了一个隐状态到隐状态的转移密度和一个隐状态到观察的密度。

    8550448df710f5f86de24b13bf0edae7.png

    我们试图估计的汽车在道路网络上的实际位置是我们所谓的“隐藏”状态。但是我们只观察到隐藏状态的一个修改版本: 观察值(原始位置数据)

    用于地图匹配的一个常用的状态空间模型是离散状态隐马尔可夫模型(Newson & Krumm [2], DiDi’s IJCAI-19 Tutorial [3], Map Matching @ Uber [4])。在这个系统中,我们通过查找路段上最接近的点来生成候选点,然后使用 Viterbi 算法来找出最可能的隐藏状态序列。

    然而,隐马尔可夫模型(Hidden Markov Model / HMM)有几个局限性:

    • 对于不同的建模选择和输入数据,它相对不够灵活

    • 它的扩展很差 (O(N²), 其中 N 是每个状态可能的候选)

    • 它不能很好的处理高频观察(见 Newson & Krumm [2])

    基于这些原因,我们开发了一种新的实时地图匹配算法,该算法更加精确和灵活,可以融合额外的传感器数据。

    一种基于(无迹)卡尔曼滤波器的新模型

    卡尔曼滤波器(Kalman filter)基础

    让我们首先回顾一下卡尔曼滤波器的基础知识。

    与离散状态 HMM 不同,卡尔曼滤波器允许隐状态是连续分布的。卡尔曼滤波器的核心是一个简单的线性高斯模型,使用以下方程对系统进行建模:

    b01a73b92bac09b2a1c87c86c91ecc7b.png

    利用这些方程,卡尔曼滤波器通过一个封闭的预测校正步骤(predict-correct step)迭代更新系统的状态表示,从 t-1步后验到 t 步后验。

    29afe77fce1511a2931879fa337cd3e3.png

    卡尔曼滤波估计

    然而,卡尔曼滤波器的一个局限性是它只能处理线性问题。为了处理非线性问题,卡尔曼滤波器被推广应用,如扩展卡尔曼滤波器(EKF)和无迹卡尔曼滤波器(UKF)[5]。正如我们将在下一节中看到的,我们的新 RTMM 算法使用了 UKF 技术。对于本文剩下的部分,卡尔曼滤波器和 UKF 之间的技术差异并不重要: 我们可以简单地假设 UKF 就像标准的线性卡尔曼滤波器一样工作。

    边缘化粒子滤波器(Marginalized Particle Filter)

    现在让我们描述一下我们的新 RTMM 算法是如何工作的。我们把它称为边缘化粒子滤波器(MPF)

    在高层上看,我们的 MPF 算法跟踪多个“粒子” ,每个粒子代表道路网络中一个轨迹上的一个位置,并根据每个轨迹运行一个无迹卡尔曼滤波器。为了更准确的说明,让我们定义以下对象: 

    一个MPF 状态是粒子列表。

    一个粒子代表汽车在地图上一个可能的道路位置,并伴随一定的概率。每个粒子有4个属性:

    • 概率 p ∈[0,1]

    • 轨迹(即地图交叉点的列表)

    • 平均矢量 x = [ d v ]’ ,其中 d 是汽车在轨道上的位置(单位米) ,v 是汽车的速度(单位米/秒)

    • 一个2x2的协方差矩阵 P 表示围绕汽车的位置和速度的不确定性

    843873168a6c62505d923575b695d902.png

    MPF 状态是一个粒子列表,每个粒子都与一些分布和一个概率相关(左)。通过轨迹和平均矢量描述车辆在道路网中的位置(右)

    我们每次从司机的手机收到新的观察数据时,都会更新MPF状态,方法如下:

    ccfbd29bd041f84f05b77845d519c9e5.png

    如果前一个 MPF 状态没有粒子(例如,如果司机刚刚登录到app) ,我们需要初始化一个新粒子。初始化步骤只是“捕捉”GPS 观察值到地图上,并返回最近的道路位置。每个粒子的概率是其到观察值的距离的函数。

    08d3933e187c2019271ffff0ddbdbc7a.png

    在下一次更新(新观察)中,我们迭代我们的状态(非空)粒子列表,并为每个粒子执行两个步骤。首先,轨迹延伸(trajectory extension)步骤从粒子在道路网中的当前位置寻找所有可能的轨迹。其次,我们循环遍历这些新的轨迹,在每一个轨迹上,我们运行 UKF 并更新新创建的粒子的概率。在这两个嵌套循环之后,我们得到了一个新的粒子列表。为了避免在MPF状态中跟踪太多粒子,我们简单地丢弃那些最不可能的(修剪)

    然后,下游的团队可以决定使用来自 MPF 状态的最可能的粒子作为地图匹配的位置,或者可以直接利用我们的概率输出(例如创建可能的 ETAs 分布)。

    回顾一下,边缘化粒子滤波器维护了一组代表汽车在轨迹上可能位置的粒子,并使用卡尔曼滤波算法对每个粒子进行更新。新算法不仅提供了定位,而且还提供了速度估计和不确定性。在实践中,我们观察到,它比 HMM 产生的地图匹配位置更精确,特别是在市中心地区和路口附近(这些地方的错误会导致非常不准确的 ETAs)。

    总结

    在试验了这种新的实时地图匹配算法之后,我们发现在 Lyft 的市场上有了积极的效果。新的模型减少了 ETA 误差,这意味着我们可以更准确地匹配乘客和最适合的司机。这也减少了乘客取消订单,表明这增加了乘客对他们的司机会准时到达接送的信心。

    然而,我们还在进化: 在未来的几个月里,我们计划通过很多种方式来改进这个模型。我们将整合其他手机传感器的数据,比如陀螺仪,它可以让我们检测到驾驶员何时转弯。我们还计划考虑司机的目的地(如果他们有目的地的话,例如在去接人的路上)作为一个优先事项。事实上,边缘化粒子滤波器的另一个优势是它允许我们以一种有原则的方式轻松地将这些新类型的信息添加到模型中,并且它是一个良好的基础,我们可以在此基础上继续为乘客和司机提供更加无缝的 Lyft 体验。

    References

    [1] Quddus M., Ochieng W. & Noland R., “Current map-matching algorithms for transport applications: State-of-the art and future research directions,” Transportation Research Part C: Emerging Technologies, 15(5), 312–328, 2007.

    [2] Newson P. & Krumm J., “Hidden Markov map matching through noise and sparseness,” Proceedings of the 17th ACM SIGSPATIAL International Conference on Advances in Geographic Information Systems GIS 09, 336, 2009

    [3] DiDi’s IJCAI-19 Tutorial: Artificial Intelligence in Transportation (slides 28–40)

    [4] Map Matching @ Uber

    [5] E. A. Wan and R. Van Der Merwe, “The unscented Kalman filter for nonlinear estimation,” Proceedings of the IEEE 2000 Adaptive Systems for Signal Processing, Communications, and Control Symposium (Cat. №00EX373), Lake Louise, Alberta, Canada, 2000, pp. 153–158.

    原文:https://eng.lyft.com/a-new-real-time-map-matching-algorithm-at-lyft-da593ab7b006

    展开全文
  • 轨迹聚类算法

    千次阅读 2017-11-23 15:04:00
    为了实现,页面上显示轨迹线段的报表,涉及到轨迹算法,按例在网上了解了一些轨迹算法,最终找到了相关的轨迹聚类算法,将不同人活着mac在地图上的移动轨迹进行聚类和输出。 算法中用到了轨迹距离,轨迹分段,...
  • 简介: 阿里巴巴高德地图首席科学家任小枫分享的话题是《高精算法推动高精地图落地》。任小枫从算法出发,介绍了高精地图制作和落地的挑战,以及高德如何打磨和突破关键技术,把高精地图做到业界领先 2020云栖大会于...
  • 本文详细阐述了美团在基于神经网络StarNet的行人轨迹交互预测算法的研究。有关轨迹预测算法的研究还在继续,希望能与同行一起交流学习。1. 背景民以食为天,如何提升超大规模配送网络的整体配送效率,改善数亿消费者...
  • 道格拉斯-普克算法(Douglas–Peucker algorithm,亦称为拉默-道格拉斯-普克算法、迭代适应点算法、分裂与合并算法)是将曲线近似表示为一系列点,并减少点的数量的一种算法。该算法的原始类型分别由乌尔斯·拉默(Urs...
  • 目前在开发展示船舶轨迹的应用,有很多地图展示页面,其中一项就是播放轨迹。然而轨迹点太多了,七天的数据就有一万八千多个,点过多会影响性能,于是想到了抽稀。 算法: 目前来说轨迹抽稀较为常用的算法有:步长...
  • 道格拉斯-普克算法(Douglas–Peucker algorithm,亦称为拉默-道格拉斯-普克算法、迭代适应点算法、分裂与合并算法)是将曲线近似表示为一系列点,并减少点的数量的一种算法。它的优点是具有平移和旋转不变性,给定...
  • 缘起:目前在开发一款React Native应用,有很多地图展示页面,其中一项就是播放轨迹。然而轨迹点太多了,七天的数据就有一万八千多个,点过多会影响性能,于是想到了抽稀。算法:目前来说轨迹抽稀较为常用的算法有:...
  • 使用场景出行、运动等类别的app中常常会需要展示车辆或用户的行程轨迹、实时移动轨迹等数据,相应效果需要车辆在地图上平滑移动。该demo展示了如何实现该效果。用到产品核心类/接口类接口说明版本MAMapview- (void)...
  • 算法的详细原理请参考1、2两篇文献 抽析代码 public class DouglasPeuckerUtil { public static List < LatLng > DouglasPeucker ( List < LatLng > points , int epsilon ) { double ...
  • 地图匹配算法实践

    万次阅读 热门讨论 2017-02-21 19:37:42
    地图匹配算法实践 1 背景 如下图所示,1、2、3 这三个点是汽车的GPS定位结果,尽管汽车是在道路上,但定位结果与道路存在偏差。地图匹配(Map Matching)是指将行车轨迹的经纬度采样序列与数字地图路网...
  • wl){if(wl.size() == 0){System.out.println("done");return false;}else if(wl.size() == 1){current = wl.get(0).getDest();length = wl.get(0).getDist();Route.add(Route.size(), wl.get(0));...
  • 文章目录目录地图匹配技术概览文章目录前言一、地图匹配概述二、轨迹预处理1.降噪1.1 中值滤波1.2 极值滤波1.3 分段1.4 插值算法三、基于权重的地图匹配算法3.1、计算方向相似度(ω1)3.2、计算距离相似度(ω2)3.3、...
  • 18日在线上举行,阿里巴巴高德地图携手合作伙伴精心组织了“智慧出行”专场,为大家分享高德地图在打造基于DT+AI和全面上云架构下的新一代出行生活服务平台过程中的思考和实践,并重点分享了「高精地图、高精算法、...
  • 抽稀的算法很多,这里将介绍一种经典的算法:道格拉斯-普克(Douglas-Peuker)算法。 2、道格拉斯-普克(Douglas-Peuker)算法  还是举个栗子吧,假设在平面坐标系上有一条由N个坐标点组成的曲线,已设定一个...
  • 地图匹配算法的有效性和可靠性对于智能交通系统而言是非常重要的,而目前存在的...新算法引入Zernike矩描述轨迹曲线的形状,进一步修正了错误结果。通过仿真和实验表明,新算法在复杂环境下具有较强的有效性和可靠性。
  • 轨迹匹配算法总结为什么要做轨迹匹配几何方法隐式马尔科夫模型(HMM)简单的例子问题定义Viterbi算法求解最大可能序列具体实现——[map-matching](https://github.com/graphhopper/map-matching) 为什么要做轨迹匹配...
  • 地图匹配算法分为在线和离线匹配,针对离线地图匹配中Marchal算法精度较低以及存在模糊多解的问题,利用伪Zenike矩对其进行改进,将行驶轨迹与道路曲线利用伪Zenike矩进行形状描述,然后对曲线进行特征匹配,获取...
  • 算法以选取与车辆行进方向一致的道路为核心,利用孤立点轨迹提取和GPS坏点过滤,取消由电子地图数据不完整和坐标变换误差引起的限制,简化运算的复杂度,并能在电子数据不完整或局部路网数据错误的情况下正常运行...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 196
精华内容 78
关键字:

地图轨迹算法