Android中关于轨迹定位点去噪算法,使用简单
公司最近开发的项目需要在移动端进行轨迹点的去噪操作。本来吧,这个工作都是后台做的,基于能后台做移动端就不做的原则,一般这种算法工作就交给后台了。但这次由于一些特殊情况需要移动端直接做了。于是有了下面的抽稀算法,大家可以参考一下。我参考了如下文章,大家也可以看一下。
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中关于轨迹定位点去噪算法,使用简单相关推荐
- Linux驱动学习--android中的内存管理机制ION(一)--简单介绍
目录 一.引言 二.ION的介绍及使用 ------> ION介绍 ------> ION的使用 ------> HEAP种类 三.接口分析 ------> 主要数据结构 -- ...
- Android中连接MySql数据库获取数据的简单实现
文章目录 背景 demo布局 导入jar包 demo代码实现 权限设置 应用运行的结果 背景 一般情况下,Android与数据库中的数据进行交互都是通过调用api接口来实现的.但是今天我们就来尝试实现 ...
- 【Android】基于A星寻路算法的简单迷宫应用
简介 基于[漫画算法-小灰的算法之旅]上的A星寻路算法,开发的一个Demo.目前实现后退.重新载入.路径提示.地图刷新等功能.没有做太多的性能优化,算是深化对A星寻路算法的理解. 界面预览: 初始化: ...
- Android中图片压缩分析(上)
此文章首发:https://mp.weixin.qq.com/s/QZ-XTsO7WnNvpnbr3DWQmg 一.前言 在 Android 中进行图片压缩是非常常见的开发场景,主要的压缩方法有两种: ...
- 自定义注解在拦截器中为空_如何在Android中为特定联系人设置自定义铃声
自定义注解在拦截器中为空 Everyone likes to know who's calling before they actually pick up the phone, and the ea ...
- 详细介绍Android中Parcelable的原理和使用方法
今日推荐 经常阅读博客是个好习惯 推荐技术小黑屋的Blog 引言 本篇文章目的在于详细的理解Parcelable的使用,而不是死记代码 我的简书博客地址 (由于csdn的图片经常出现不显示问题,以后就 ...
- 在几何图形中均匀随机取点算法总结及Delaunay三角剖分算法介绍
在工作中遇到一个需求,需要在圆形 矩形,三角形内随机,尽量均匀取点作为位置信息,但是random得到的信息有时候不是很满意. 这里讨论一下 第一种错误思路: 根据圆的解析式 (假设圆心在原点)我们可以 ...
- Android 中内存泄漏的原因和解决方案
之前研究过一段时间关于 Android 内存泄漏的知识,大致了解了导致内存泄漏的一些原因,但是没有深入去探究,很多细节也理解的不够透彻,基本上处于一种似懂非懂的状态,最近又研究了一波,发现有很多新的收 ...
- android中checkbox使用方法,Android开发中CheckBox的简单用法示例
本文实例讲述了Android开发中CheckBox的简单用法.分享给大家供大家参考,具体如下: CheckBox是一种在界面开发中比较常见的控件,Android中UI开发也有CheckBox,简单的说 ...
最新文章
- java爬虫下载图片到磁盘_java入门爬虫(爬取网页的图片下载到本地磁盘)
- 09_ClickHouse,ReplacingMergeTree,案例,根据排序键去重,使用版本参数的去重(学习笔记)
- QuickFIX/N入门
- Vue跨路由触发事件,Vue监听sessionStorage
- SWFUpload V2.2.0 说明文档
- USACO / A Game (经典区间DP)
- 大数据学习——yarn集群启动
- 远程桌面无法启动Matlab的解决方案
- appium相关记录
- 使用监听器生成请求记录日志
- 2020-10-28网络安全之网络安全产品
- 星环大数据助银行数据仓库全面升级
- 64位java没有javaw.exe_javaw.exe路径错误导致eclipse无法启动
- 机器学习及其Matlab实现——从基础到实践
- cisco路由器设置时间同步
- iphone捷径大全_iPhone捷径,助您一臂之力
- Mybatis的一级缓存和二级缓存执行顺序
- GitHub 上100个优质前端项目整理,非常全面!
- thinkphp5.1和5.0下的中文分词
- 玩凤凰沙盘的几点思考
热门文章
- LinuxProbe学习笔记(二)
- hostapd.conf 解析
- 我的 2020 总结,我在蚂蚁成长的这一年
- 在ubuntu下使用Vim学习C++
- mac 类似matlab,10款Mac上科研人员必备的科研工具推荐和下载 | 玩转苹果
- 分布式计算的详细笔记
- 基于jsp+springboot+mybatis+mysql美食分享平台(含论文)
- axios库读不到cookie_axios中cookie跨域及相关配置示例详解
- 解读:大硕德乡饮耆宾贠尚忠翁芳行碑
- 神经性脚臭案例整理(五)