公司最近开发的项目需要在移动端进行轨迹点的去噪操作。本来吧,这个工作都是后台做的,基于能后台做移动端就不做的原则,一般这种算法工作就交给后台了。但这次由于一些特殊情况需要移动端直接做了。于是有了下面的抽稀算法,大家可以参考一下。我参考了如下文章,大家也可以看一下。

https://juejin.cn/post/6844903943651196942

好了,现在开始说我的内容,首先这逻辑是这样的,第一个点我们记录,第二个点和第一个点距离要在合理范围内,如果在,则第三个点直接可以记录;如果不在合理范围,第三个点和第二个点比较,如果第三个点和第二个点也不在合理范围,说明第二个点不对。如果第三个点和第二个点在合理范围,说明第一个点不对。之后和上一个点比较即可。

首先我们需要一个计算两点距离的方法,这个方法吧,我们可以用高德或者百度提供的,也可以用我这个通用的方法,方法如下。

/*** 根据两点间经纬度坐标(double值),计算两点间距离,* @param lat1* @param lng1* @param lat2* @param lng2* @return 距离:单位为米*/
public static double distanceOfTwoPoints(double lat1,double lng1,double lat2,double lng2) {double radLat1 = rad(lat1);double radLat2 = rad(lat2);double a = radLat1 - radLat2;double b = rad(lng1) - rad(lng2);double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)+ Math.cos(radLat1) * Math.cos(radLat2)* Math.pow(Math.sin(b / 2), 2)));s = s * EARTH_RADIUS;s = Math.round(s * 10000) / 10000;return s;
}private static double rad(double d) {return d * Math.PI / 180.0;
}private static final double EARTH_RADIUS = 6378137;

接着我们就要开始按照刚才的逻辑进行记录了。我的记录代码如下

private static double minDistance = 1.4 * 5;//步行速度 1.39m/s
private static int maxDistance = 33 * 5;//开车速度(120km/h) 33m/s x 上传间隔 5s@Overridepublic void onLocationChanged(AMapLocation aMapLocation) {if (aMapLocation != null) {if (aMapLocation.getErrorCode() == 0) {//经纬度山西范围判断 山西范围 经度 110-115  纬度 34-41if (aMapLocation.getLongitude()>110 && aMapLocation.getLongitude()<115 && aMapLocation.getLatitude()>34 && aMapLocation.getLatitude()<41){//进行存储LatlngBean latLng = new LatlngBean(aMapLocation.getLatitude(),aMapLocation.getLongitude(),aMapLocation.getAddress());if (NullUtil.isListEmpty(listPoint)){//第一个点,直接添加listPoint.add(latLng);}else if (listPoint.size() == 1){//第二个点,要计算距离listPoint.add(latLng);//--计算距离double distance = distanceOfTwoPoints(listPoint.get(0).getLatitude(),listPoint.get(0).getLontitude(),latLng.getLatitude(), latLng.getLontitude());//判断距离,如果符合,则直接加入,并开始绘制;如果不符合,计算第三个点if (distance>minDistance && distance<maxDistance){//符合速度要求for (int i = 0; i < listPoint.size(); i++) {recordSite(listPoint.get(i).getLontitude(),listPoint.get(i).getLatitude(),listPoint.get(i).getAddress());}}else{//不符合速度要求,需要采集第三个点,判断是第一个不符合还是第二个不符合flag = true;}}else if (listPoint.size() == 2){//判断第三个点是不是需要计算double distance = distanceOfTwoPoints(listPoint.get(1).getLatitude(),listPoint.get(1).getLontitude(),latLng.getLatitude(), latLng.getLontitude());if (flag){listPoint.add(latLng);//说明前两个点不符合要求,要根据第三个判断前两个到底是哪个不对if (distance>minDistance && distance<maxDistance){//第二个和第三个点距离合适,说明是第一个点不对的,去掉第一个点recordSite(listPoint.get(1).getLontitude(),listPoint.get(1).getLatitude(),listPoint.get(1).getAddress());recordSite(listPoint.get(2).getLontitude(),listPoint.get(2).getLatitude(),listPoint.get(2).getAddress());listPoint.remove(0);flag = false;}else{//第二个和第三个距离也不对,说明是第二个不对recordSite(listPoint.get(0).getLontitude(),listPoint.get(0).getLatitude(),listPoint.get(0).getAddress());recordSite(listPoint.get(2).getLontitude(),listPoint.get(2).getLatitude(),listPoint.get(2).getAddress());listPoint.remove(1);flag = false;}}else{//说明前两个点是符合要求的,第三个不管了,直接判断后上传if (distance>minDistance && distance<maxDistance){listPoint.add(latLng);recordSite(aMapLocation.getLongitude(),aMapLocation.getLatitude(),aMapLocation.getAddress());}}}else{//三个点都完了之后的了,直接判断绘制就算了double distance = distanceOfTwoPoints(listPoint.get(listPoint.size()-1).getLatitude(),listPoint.get(listPoint.size()-1).getLontitude(),latLng.getLatitude(), latLng.getLontitude());if (distance>minDistance && distance<maxDistance){listPoint.add(latLng);recordSite(aMapLocation.getLongitude(),aMapLocation.getLatitude(),aMapLocation.getAddress());}}}}else{//定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。Log.e("AmapError", "location Error, ErrCode:"+ aMapLocation.getErrorCode() + ", errInfo:"+ aMapLocation.getErrorInfo());}}else{//定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。Log.e("AmapError", "location Error, ErrCode:"+ aMapLocation.getErrorCode() + ", errInfo:"+ aMapLocation.getErrorInfo());}}

这里注意咱们最小和最大距离是按照5秒算的,也就是我的定位时常是5秒。这里要灵活变化。

这样就可以实现轨迹点去噪效果。服务端最后的显示还可以用道格拉斯算法实现一下抽稀。

Android中关于轨迹定位点去噪算法,使用简单相关推荐

  1. Linux驱动学习--android中的内存管理机制ION(一)--简单介绍

    目录 一.引言 二.ION的介绍及使用 ------> ION介绍 ------> ION的使用 ------> HEAP种类 三.接口分析 ------> 主要数据结构 -- ...

  2. Android中连接MySql数据库获取数据的简单实现

    文章目录 背景 demo布局 导入jar包 demo代码实现 权限设置 应用运行的结果 背景 一般情况下,Android与数据库中的数据进行交互都是通过调用api接口来实现的.但是今天我们就来尝试实现 ...

  3. 【Android】基于A星寻路算法的简单迷宫应用

    简介 基于[漫画算法-小灰的算法之旅]上的A星寻路算法,开发的一个Demo.目前实现后退.重新载入.路径提示.地图刷新等功能.没有做太多的性能优化,算是深化对A星寻路算法的理解. 界面预览: 初始化: ...

  4. Android中图片压缩分析(上)

    此文章首发:https://mp.weixin.qq.com/s/QZ-XTsO7WnNvpnbr3DWQmg 一.前言 在 Android 中进行图片压缩是非常常见的开发场景,主要的压缩方法有两种: ...

  5. 自定义注解在拦截器中为空_如何在Android中为特定联系人设置自定义铃声

    自定义注解在拦截器中为空 Everyone likes to know who's calling before they actually pick up the phone, and the ea ...

  6. 详细介绍Android中Parcelable的原理和使用方法

    今日推荐 经常阅读博客是个好习惯 推荐技术小黑屋的Blog 引言 本篇文章目的在于详细的理解Parcelable的使用,而不是死记代码 我的简书博客地址 (由于csdn的图片经常出现不显示问题,以后就 ...

  7. 在几何图形中均匀随机取点算法总结及Delaunay三角剖分算法介绍

    在工作中遇到一个需求,需要在圆形 矩形,三角形内随机,尽量均匀取点作为位置信息,但是random得到的信息有时候不是很满意. 这里讨论一下 第一种错误思路: 根据圆的解析式 (假设圆心在原点)我们可以 ...

  8. Android 中内存泄漏的原因和解决方案

    之前研究过一段时间关于 Android 内存泄漏的知识,大致了解了导致内存泄漏的一些原因,但是没有深入去探究,很多细节也理解的不够透彻,基本上处于一种似懂非懂的状态,最近又研究了一波,发现有很多新的收 ...

  9. android中checkbox使用方法,Android开发中CheckBox的简单用法示例

    本文实例讲述了Android开发中CheckBox的简单用法.分享给大家供大家参考,具体如下: CheckBox是一种在界面开发中比较常见的控件,Android中UI开发也有CheckBox,简单的说 ...

最新文章

  1. java爬虫下载图片到磁盘_java入门爬虫(爬取网页的图片下载到本地磁盘)
  2. 09_ClickHouse,ReplacingMergeTree,案例,根据排序键去重,使用版本参数的去重(学习笔记)
  3. QuickFIX/N入门
  4. Vue跨路由触发事件,Vue监听sessionStorage
  5. SWFUpload V2.2.0 说明文档
  6. USACO / A Game (经典区间DP)
  7. 大数据学习——yarn集群启动
  8. 远程桌面无法启动Matlab的解决方案
  9. appium相关记录
  10. 使用监听器生成请求记录日志
  11. 2020-10-28网络安全之网络安全产品
  12. 星环大数据助银行数据仓库全面升级
  13. 64位java没有javaw.exe_javaw.exe路径错误导致eclipse无法启动
  14. 机器学习及其Matlab实现——从基础到实践
  15. cisco路由器设置时间同步
  16. iphone捷径大全_iPhone捷径,助您一臂之力
  17. Mybatis的一级缓存和二级缓存执行顺序
  18. GitHub 上100个优质前端项目整理,非常全面!
  19. thinkphp5.1和5.0下的中文分词
  20. 玩凤凰沙盘的几点思考

热门文章

  1. LinuxProbe学习笔记(二)
  2. hostapd.conf 解析
  3. 我的 2020 总结,我在蚂蚁成长的这一年
  4. 在ubuntu下使用Vim学习C++
  5. mac 类似matlab,10款Mac上科研人员必备的科研工具推荐和下载 | 玩转苹果
  6. 分布式计算的详细笔记
  7. 基于jsp+springboot+mybatis+mysql美食分享平台(含论文)
  8. axios库读不到cookie_axios中cookie跨域及相关配置示例详解
  9. 解读:大硕德乡饮耆宾贠尚忠翁芳行碑
  10. 神经性脚臭案例整理(五)