boke01

xiaoxiao2021-02-27  489

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

今天遇到一个如题项目功能,先说具体需求,在地图上(使用的百度地图) 已经获取到若干坐标点,将这些点相连形成线路,对该条线路进行巡检,在到达线路附近时给出提示音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 来判断人员是否在 线路附近啦~

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

转载请注明原文地址: https://www.6miu.com/read-1634.html

最新回复(0)