boke01

实现 在手机地图上判断人员巡检是否在 线路附近的功能~

今天遇到一个如题项目功能,先说具体需求,在地图上(使用的百度地图) 已经获取到若干坐标点,将这些点相连形成线路,对该条线路进行巡检,在到达线路附近时给出提示音1,在巡检过程中,离线路过远后在次给出提示音2;

分析1: 实际上我们要知道的是 我们当前位置到线路的垂直线的距离

如果 两红点 是我们要巡检的线路 蓝点是自身当前位置,那么黄线距离就是我们需要得到用来判断远近的值了;

分析2:如何得到在自身移动的情况下,并且有多个红点时,如何获得该段距离呢 (逐个计算三角形太麻烦)? 首先,我们可以想想线上有无数多个点,那么我们可以求得当前位置到每个点(绿点)的距离 在求出最小值(深红线)就是我们需要的那个值了;

给一段线路上 虚拟计算出5个点(越高精度越高);list_maker_data 是我用来存储 坐标点的集合 ;la_list 和lo_list是分别存储新点 坐标经度、纬度的集合

         Double oneLa = Double.valueOf(list_maker_data.get(i).getLatitude());
        Double oneLo = Double.valueOf(list_maker_data.get(i).getLangtitude());
        Double twoLa = Double.valueOf(list_maker_data.get(i+1).getLatitude());
        Double twoLo = Double.valueOf(list_maker_data.get(i+1).getLangtitude());
        //把计算的经度值加入 集合
        if (twoLa>=oneLa){
            double la = twoLa - oneLa;
            for(int j=1;j<=5;j++){
                la_list.add(twoLa - la*j/5);
            }
        }else{
            double la = oneLa-twoLa;
            for(int j=1;j<=5;j++){
                la_list.add(twoLa + la*j/5);
            }
        }
         //把计算的纬度值加入 集合
        if (twoLo>=oneLo){
            double lo = twoLo - oneLo;
            for(int m=1;m<=5;m++){
                lo_list.add(twoLo - lo*m/5);
            }
        }else{
            double lo = oneLo-twoLo;
            for(int m=1;m<=5;m++){
                lo_list.add(twoLo + lo*m/5);
            }
        }

计算到这些点的距离 并求出最小值

将得到的所有距离 保存到length_list集合 并求出最小值
//判断是否超出范围的方法
private Boolean IsOutScope(){
 //存储两点之间距离的长度集合
    ArrayList<Double> length_list = new ArrayList<>();
    for (int i=0;i<lo_list.size();i++){
    double la = Math.abs(bdLocation.getLatitude()-la_list.get(i));
    double lo = Math.abs(bdLocation.getLongitude()-lo_list.get(i));

    double length = Math.sqrt(la * la + lo * lo);//获得“当前位置”到某个坐标点的距离长度

            length_list.add(length);
    }

    //选出最短的距离
    Double min=200.0;
    for(int i=0;i<length_list.size();i++)
    {
        Log.i("fanjava",min+"bbb");
        if(length_list.get(i)<min)   // 判断最小值
         min= length_list.get(i);
    }
    Log.i("fanjava",min+"aaa"); // 输出最小值

    return min>0.0005;
}

最后就可以通过最小值min 来判断人员是否在 线路附近啦~

第一次写 诸多不足请大神们 轻踩~ 这是本人自己的实现过程,有更好的请 留言指教;

猜你喜欢

转载自blog.csdn.net/weixin_37558974/article/details/71159049
今日推荐