GPS轨迹飘点处理(原创)

当我们处理gps设备传过来的数据时,最让人头疼的事情莫过于设备定位异常所传输的异常点了,我们习惯的叫它为飘点。这些数据是设备层面的异常,目前没有什么有效的方法来减少设备发送的飘点。但是我们可以通过程序来过滤掉这些点。

原理 

  1.  获取时间范围内(默认一天)设备的连续gps信息。
  2. 遍历这些信息,计算两个相邻点的距离,这个距离要根据实际情况确定
  3. 若距离大于可容忍距离。则证明该两个相邻点其中有一个点异常
  4. 根据3的原理,我们将正常的轨迹通过异常点切分为若干个小的轨迹(d1,d2,d3)
  5. 找出若干个小轨迹分段中最常的一个将其视为合法轨迹(这里如果合法轨迹都是飘点,那使用的设备也没啥使用的意义了)
  6. 将5找出的合法轨迹的起始点和结束点均作为起点,向整条轨迹的两侧遍历,计算两点之间的距离,若距离大于可容忍距离,则过滤该点。

图示

 代码

/**
*获得合法轨迹的list起止下标
*计算两点距离的工具类(LocationConvertUtils)自行百度
*实体中用到的信息就是经纬度和时间,我这里时间用的是毫秒的时间戳
*/ 
private String getSafeIndex(List<CarriskAlarmVO> gpsList){
        int start=0;
        int end=0;
        List<String> indexList = new ArrayList<>();
        CarriskAlarmVO dangerBefore = null;
        for(int i=1;i<gpsList.size();i++){
            CarriskAlarmVO dangerVo = gpsList.get(i);
            if(dangerBefore == null){
                dangerBefore = gpsList.get(i-1);
            }
            double disKM = LocationConvertUtils.getGPSDistanceKM(dangerVo.getGpslng(),dangerVo.getGpslat(),dangerBefore.getGpslng(),dangerBefore.getGpslat());
            long time = Math.abs(dangerVo.getGpsts()-dangerBefore.getGpsts());
            double speed = disKM*1000*3600/time;
            if(speed>200){
                if(end>start){
                    indexList.add(end+"-"+start);
                }
                start=i;
            }
            end =i;
            dangerBefore = dangerVo;
        }
        if(end>start){
            indexList.add(end+"-"+start);
        }
        int maxIndx = 0;
        int max = 0;
        for(int i=0;i<indexList.size();i++){
            int tmpEnd = Integer.valueOf(indexList.get(i).split("-")[0]);
            int tmpStart = Integer.valueOf(indexList.get(i).split("-")[1]);
            if(tmpEnd-tmpStart>max){
                max = tmpEnd-tmpStart;
                maxIndx = i;
            }
        }
      
        return indexList.get(maxIndx);
    }

找出飘点

   private void removeErrorPoint( List<CarriskAlarmVO> gpsList){
        String safeInxs = getSafeIndex(gpsList);
        int startIndex = Integer.valueOf(safeInxs.split("-")[1]);
        int endIndex = Integer.valueOf(safeInxs.split("-")[0]);
        if(startIndex==0 && endIndex==gpsList.size()-1){
            return;//轨迹正常
        }
        List<String> deleteList = new ArrayList<>();
        CarriskAlarmVO safeVo = gpsList.get(startIndex);
        for(int i=startIndex-1;i>-1;i--){
            CarriskAlarmVO dangerVo = gpsList.get(i);
            double disKM = LocationConvertUtils.getGPSDistanceKM(dangerVo.getGpslng(),dangerVo.getGpslat(),safeVo.getGpslng(),safeVo.getGpslat());
            long time = Math.abs(dangerVo.getGpsts()-safeVo.getGpsts());
            double speed = disKM*1000*3600/time;
            if(speed>200){
                deleteList.add(dangerVo.getId());
            }else{
                safeVo = dangerVo;
            }
        }
        safeVo = gpsList.get(endIndex);
        for(int i = endIndex+1;i<gpsList.size();i++){
            CarriskAlarmVO dangerVo = gpsList.get(i);
            double disKM = LocationConvertUtils.getGPSDistanceKM(dangerVo.getGpslng(),dangerVo.getGpslat(),safeVo.getGpslng(),safeVo.getGpslat());
            long time = Math.abs(dangerVo.getGpsts()-safeVo.getGpsts());
            double speed = disKM*1000*3600/time;
            if(speed>200){
                deleteList.add(dangerVo.getId());
            }else{
                safeVo = dangerVo;
            }
        }
        if(!deleteList.isEmpty()){
            //TODO 对飘点自行处理
        }
    }

 

各种gps应用程序 1、 data_log.c 数据采集程序 2、 rinexout.c RINEX数据格式写入子程序 3、 to_rinex.c 数据格式转换 4、 sav_pos.c 卫星位置计算程序 5、 sky_sav.c 卫星天空显示程序 6、 dop_calc.c 卫星星座DOP计算程序 7、 view_sav.c 历书预报卫星出现程序 8、 absl_pos.c 单绝对定位程序 9、 ssgsoft.c -- 相对静态定位主程序 10、 controlf.c ? 读取输入文件子程序 11、 orbit.c -- 选择参考卫星子程序 12、 broad.c -- 读广播星历计算子程序 13、 igs.c -- 读 IGS 精密星历子程序 14、 singlep.c -- 近似位置计算子程序 15、 rinex.c -- 读 Rinex 数据、探测跳周、组成单差子程序 16、 eqdd_s.c -- 组成双差方程子程序 17、 normdd_s.c ? 组成法方差子程序 18、 ad_core.c -- 平差子程序19、 ambifix.c -- 模糊度固定子程序 20、 tranf.c -- 坐标变换子程序 21、 dgps_ppr. 相位平滑伪距改正数计算程序 22、 dgps_phr 准载波相位改正数计算程序 23 rtcmencd.c RTCM 电文编码程序 24 rtcmencd.c RTCM 电文译码程序 25、 net_dgn.c 测量格网设计程序 26 sur_ctr.c 动态测量控制程序 27、 replay.c 动态测量数据回放程序 28、 kin_tran.c 动态定位坐标转换程序 29、 rms.c 定位精度估计程序 30、 tide.c 潮位改正程序 31、 xybl_54.c 54坐标变换程序 32、 xyxy_loc.c 任意坐标系转换程序 33、 gga+gsv.c GGA和GSV数据模拟程序 34、 depth.c 水深数据模拟程序
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值