Android地图轨迹抽稀、动态绘制

来源:互联网 发布:种族歧视 知乎 编辑:程序博客网 时间:2024/05/04 22:39

今日科技快讯

9月26日,阿里巴巴集团宣布,为进一步推进新零售战略,将增持旗下菜鸟网络的股份,未来五年继续投入1000亿元,加快建设全球领先的物流网络,实现中国24小时、全球72小时必达,为全球消费者提供最好的物流体验,并进一步推动中国社会物流总成本的降低。

作者简介

本篇来自 莫比乌丝环丶 的投稿,详细地讲解了Android地图轨迹抽稀、动态绘制,希望大家喜欢

莫比乌丝环丶 的博客地址:

http://www.jianshu.com/u/f914004db506

前言

因公司业务调整降低运动门槛,产品部要求引入地图,记录用户的运动轨迹上传至服务器,用户进入记录页面可查看运动轨迹。而且绘制轨迹的时候要求有一个绘制动画(参照咕咚)。听到这心中万只草泥马 ~~~ 可是需求下来了,还是得硬着头皮做啊。

动态绘制效果体验

本文用到的一切地图相关的东西都来源高德地图。至于地图展示不是本文重点,所以不做赘述。文中提及的距离的计算,根据自己引用的地图类型做替换即可。文中是地图API所有,会有标注。效果如如下:

那该怎么实现呢?往下看。

实现方式

定位点的抽稀-道格拉斯算法

  • 道格拉斯简介

Douglas一Peukcer 算法由 D.Douglas 和 T.Peueker 于1973年提出,简称D一P算法,是眼下公认的线状要素化简经典算法。现有的线化简算法中,有相当一部分都是在该算法基础上进行改进产生的。它的长处是具有平移和旋转不变性,给定曲线与阂值后,抽样结果一定。

算法的基本思路是:对每一条曲线的首末点虚连一条直线,求所有点与直线的距离,并找出最大距离值 dmax ,用 dmax 与限差 D 相比:若 dmax < D ,这条曲线上的中间点所有舍去;若dmax ≥D ,保留 dmax 相应的坐标点,并以该点为界,把曲线分为两部分,对这两部分反复使用该方法。

算法的具体过程如下:

  • 在曲线首尾两点间虚连一条直线,求出其余各点到该直线的距离,如图3(1)。

  • 选其最大者与阈值相比較,若大于阈值,则离该直线距离最大的点保留,否则将直线两端点间各点所有舍去,如图3(2),第4点保留。

  • 根据所保留的点,将已知曲线分成两部分处理,反复第1、2步操作,迭代操作,即仍选距离最大者与阈值比較,依次取舍,直到无点可舍去,最后得到满足给定精度限差的曲线点坐标,如图3(3)、(4)依次保留第6点、第7点,舍去其它点,即完成线的化简。

  • 算法代码实现

存储经纬度坐标的实体 LatLngPoint

使用三角形面积(使用海伦公式求得)相等方法计算点 pX 到点 pA 和 pB 所确定的直线的距离, AMapUtils.calculateLineDistance(start.latLng, end.latLng) 计算两点之间的距离,此公式高德API

Douglas 工具类具体代码:

  • 结果

上图中展示的轨迹是定位得到的4417个点,经过抽稀之后绘制在地图上的样式。算法中传入的阙值是10,4417个点处理之后只136个点。而且这136个点绘制的轨迹和4417个点绘制的轨迹几乎没有什么差别。

不知道你们有没有被震撼到,反正我是彻彻底底被震到了。作为算法小白的我,感觉整个世界都被颠覆了。

轨迹绘制-自定义运动轨迹View

最开始得时候认为直接在地图上绘制动态轨迹的,根据高德提供绘制轨迹的 API,结果直接卡死。当时一脸懵逼的找高德客服,一提高德的客服更让人窝火。算了不提了。后面自己试了好多遍之后放弃直接在地图上绘制,不知道哪一刻,就突然想到在地图上覆盖一个自定义的 View。当时有一瞬间觉得自己是这个世界上智商最接近250的┐(‘~`;)┌地图API提供了经纬度转换成手机上的坐标,所以可以拿到地图上点对应的屏幕的位置,也就自然可以自定义一个 View 动态的绘制轨迹,当自定义 View 的动画结束之后,隐藏自定义 View 然后在地图上绘制轨迹。这就是我的整体思路,下面袖子撸起,上代码:

  • 初始化变量、画笔、path

  • 轨迹 View 绘制

  • 设置数据

来来来,小板凳,划重点!!!

本文重点:算法、算法、算法、PathMeasure、Path

说到底写这篇文章的初衷还是想让大多数和我一样的朋友能意识到算法的重要性,之前因为不是计算机专业毕业,所以只听别人说算法如何如何重要,但在自己的内心里却并没有多重视。但是当你程序中真正用到的时候,你会发现算法之美。强大的算法会让你在千千万万的数据中找寻真正的美(也就是去除噪声,原谅我毫无征兆的文艺一下)。作为一个叛变的工科生,曾经怀疑过为什么要学数学,平常工作生活中完全用不到当年所学的夹逼定理啊,让人有种报国无门的感觉,可是经过这次算法的洗礼之后,让我想起了阔别多年的数学,而且让我第一次真正的意识到数学真的贼TM有用。如果你还想在程序这条路上继续下去那你真的应该尽快捡起数学。

至此,我想说的也完了。希望能帮到有类似需求的猿友们,文中有错误的地方请指出。-.-

更多

如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。

欢迎长按下图 -> 识别图中二维码或者扫一扫关注我的公众号:

原创粉丝点击