地图业务记录

19 篇文章 0 订阅

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

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uzK1Hd9a-1639791660988)(http://i.imgur.com/6ZxOFo6.png)]

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2RsZgyEj-1639791660990)(http://i.imgur.com/ciOBUuQ.png)]

给一段线路上 虚拟计算出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 来判断人员是否在 线路附近啦~

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值