浅谈百度地图的简单开发之结合方向传感器实现定位功能(三)

 

今天我们来谈下百度地图的定位功能,在此之前我已经将百度地图的基本地图大概说了下,其实百度地图的基本功能还有很多的内容。感兴趣的可以到百度地图的开发者的官网看看。今天就开始来讲下百度地图中的定位功能。

今天所讲的百度地图所涉及的内容主要有:基本定位的实现,自定义定位图标,结合方向传感器定位,选择定位中的几种模式(罗盘模式,普通模式,跟随模式)。

一、基本定位的实现:

所谓定位无非就是获取到一个地方所处地球的经纬度坐标,这个反映到地图中就是一个点。但是怎么去实现一个定位呢??

首先,需要去创建一个定位客户端对象,然后给这个定位客户端对象设置监听器,并且每隔1s中就去请求一次定位,这就是所谓实时监听定位信息的变化,也就是位置发生变化,那么所处的经纬度就变化了,通过经纬度值可以得到一个经纬度对象,通过这个经纬度对象(实际上就是对应一个点),反映在地图上点的位置发生了变化。这样一来定位也是一个高耗的工作,所以我们也需要管理定位的生命周期,当我们开启应用就去开启定位,关闭应用就得关闭定位的请求。记住一点就是使用定位功能还得在AndroidManifest.xml配置一个Service。

注册service:

     <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" >
            <intent-filter>
                <action android:name="com.baidu.location.service_v2.2" >
                </action>
            </intent-filter>
        </service>

将定位的生命周期和Activity的生命周期进行绑定:

 @Override
 protected void onStart() {
  myLocationClient.start();//将定位与Activity生命周期进行绑定,开启定位
  super.onStart();
 }
 @Override
 protected void onStop() {
  myLocationClient.stop();//将定位与Activity生命周期进行绑定,关闭定位
  super.onStop();
 }
 

初始化定位功能:

<pre class="java" name="code">/**
	 * @author Mikyou
	 * 初始化定位功能
	 * */
	private void initMapLocation() {
		myLocationClient=new LocationClient(this);//创建一个定位客户端对象
		myListener=new MyLocationListener();//创建一个定位事件监听对象
		myLocationClient.registerLocationListener(myListener);//并给该定位客户端对象注册监听事件
		//对LocaitonClient进行一些必要的设置
		LocationClientOption option=new LocationClientOption();
		option.setCoorType("bd09ll");//设置坐标的类型
		option.setIsNeedAddress(true);//返回当前的位置信息,如果不设置为true,默认就为false,就无法获得位置的信息
		option.setOpenGps(true);//打开GPS
		option.setScanSpan(1000);//表示1s中进行一次定位请求
		myLocationClient.setLocOption(option);
		useLocationOrientationListener();//调用方向传感器
	}
	/**
	 * @author Mikyou
	 * 定位结合方向传感器,从而可以实时监测到X轴坐标的变化,从而就可以检测到
	 * 定位图标方向变化,只需要将这个动态变化的X轴的坐标更新myCurrentX值,
	 * 最后在MyLocationData data.driection(myCurrentX);
	 * */
	private void useLocationOrientationListener() {
		myOrientationListener=new MyOrientationListener(MainActivity.this);
		myOrientationListener.setMyOrientationListener(new onOrientationListener() {
			@Override
			public void onOrientationChanged(float x) {//监听方向的改变,方向改变时,需要得到地图上方向图标的位置
				myCurrentX=x;
				System.out.println("方向:x---->"+x);
			}
		});		
	}

 
/**
	 * @author zhongqihong
	 * 获取位置信息的客户端对象的监听器类MyLocationListener
	 * */
	class MyLocationListener implements BDLocationListener{

		@Override
		public void onReceiveLocation(BDLocation location) {
			//得到一个MyLocationData对象,需要将BDLocation对象转换成MyLocationData对象
			MyLocationData data=new MyLocationData.Builder()
			.accuracy(location.getRadius())//精度半径
			.direction(myCurrentX)//myCurrentX就是通过方向传感器监听得到的值来设置定位的方向
			.latitude(location.getLatitude())//经度
			.longitude(location.getLongitude())//纬度
			.build();
			myBaiduMap.setMyLocationData(data);
			//配置自定义的定位图标,需要在紧接着setMyLocationData后面设置
			//调用自定义定位图标
			changeLocationIcon();
			latitude=location.getLatitude();//得到当前的经度
			longtitude=location.getLongitude();//得到当前的纬度
			//toast("经度:"+latitude+"     纬度:"+longtitude);
			if (isFirstIn) {//表示用户第一次打开,就定位到用户当前位置,即此时只要将地图的中心点设置为用户此时的位置即可
				getMyLatestLocation(latitude,longtitude);//获得最新定位的位置,并且地图的中心点设置为我的位置
				isFirstIn=false;//表示第一次才会去定位到中心点
				locationTextString=""+location.getAddrStr();//这里得到地址必须需要在设置LocationOption的时候需要设置isNeedAddress为true;
				toast(locationTextString);
				locationText.setText(locationTextString);
			}
		}

二、修改自定义图标

	/**
	 * @author zhongqihong
	 * 自定义定位图标
	 * */
	private void changeLocationIcon() {
		myBitmapLocation=BitmapDescriptorFactory
				.fromResource(R.drawable.ic_launcher);//引入自己的图标
		if (isFirstIn) {//表示第一次定位显示普通模式
			MyLocationConfiguration config=new 
					MyLocationConfiguration(LocationMode.NORMAL, true, myBitmapLocation);
			myBaiduMap.setMyLocationConfigeration(config);
		}			
	}

获取最新的位置

		/**
		 * @author zhongqihong
		 * 获得最新定位的位置,并且地图的中心点设置为我的位置
		 * */
		private void getMyLatestLocation(double lat,double lng) {
			LatLng latLng=new LatLng(lat, lng);//创建一个经纬度对象,需要传入当前的经度和纬度两个整型值参数
			MapStatusUpdate msu=MapStatusUpdateFactory.newLatLng(latLng);//创建一个地图最新更新的状态对象,需要传入一个最新经纬度对象
			myBaiduMap.animateMapStatus(msu);//表示使用动画的效果传入,通过传入一个地图更新状态对象,然后利用百度地图对象来展现和还原那个地图更新状态,即此时的地图显示就为你现在的位置
		}

三、结合方向传感器来控制定位图标方向,使得整个图标会随着手机方向的转动而转动。但是如果去实时判断手机在转动呢?以及手机转动的方向和角度是多少呢?这时候就需要手机中内置的方向传感器,该方向传感器可以监测到手机在X,Y,Z轴方向上偏移量,但是我们一般都是在一个平面内转动,也就是一个用于在东南西北方向转动,所以只需要用方向传感器去实时监测X轴方向的偏移量即可,并用一个变量记录一下当前偏移值,当当前偏移值和上一次偏移值的绝对值超过一个临界值,就可以判定方向发生改变,并把该方向的偏移量myCurrent设置给MyLocationData对象即可。但是方向传感器的开启和关闭,还需要和定位服务生命保持一致,如果定位都关闭了,那就没有必要去开启方向传感器了,既然定位生命周期和Activity绑定在一起,所以也只需要把方向传感器的生命周期和Activity生命周期绑定在一起即可。

protected void onDestroy() {
		super.onDestroy();
		//在Activity执行onDestory时执行mapView(地图)生命周期管理
		myMapView.onDestroy();
	}
	@Override
	protected void onStart() {//当Activity调用onStart方法,开启定位以及开启方向传感器,即将定位的服务、方向传感器和Activity生命周期绑定在一起
		myBaiduMap.setMyLoc
  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊喵先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值