今天我们来谈下百度地图的定位功能,在此之前我已经将百度地图的基本地图大概说了下,其实百度地图的基本功能还有很多的内容。感兴趣的可以到百度地图的开发者的官网看看。今天就开始来讲下百度地图中的定位功能。
今天所讲的百度地图所涉及的内容主要有:基本定位的实现,自定义定位图标,结合方向传感器定位,选择定位中的几种模式(罗盘模式,普通模式,跟随模式)。
一、基本定位的实现:
所谓定位无非就是获取到一个地方所处地球的经纬度坐标,这个反映到地图中就是一个点。但是怎么去实现一个定位呢??
首先,需要去创建一个定位客户端对象,然后给这个定位客户端对象设置监听器,并且每隔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