实现 在手机地图上判断人员巡检是否在 线路附近的功能~
今天遇到一个如题项目功能,先说具体需求,在地图上(使用的百度地图) 已经获取到若干坐标点,将这些点相连形成线路,对该条线路进行巡检,在到达线路附近时给出提示音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 来判断人员是否在 线路附近啦~
第一次写 诸多不足请大神们 轻踩~ 这是本人自己的实现过程,有更好的请 留言指教;