在上一篇博客中我为大家已经介绍了百度地图最基本的功能:百度地图的显示,如果还没看的朋友可以去看看我的上一篇博客,百度地图之百度地图的显示。接下来,今天这篇博客我将为大家进一步介绍百度地图的基本功能之一:百度地图的定位功能。
百度地图定位SDK是为移动应用开发者提供的一个简单易用的服务接口,通过使用百度定位SDK,开发者就可以很容易的实现智能,精准,高效的定位。
百度地图定位的实现方式有三种:1.GPS定位2.基站定位3.WI-FI定位,开发者可以自行去调整合理的实现方式,为我们的用户能够实现最好的操作环境。在选择之前我们先来简单了解一下这三种方式的区别:GPS定位就是用全球卫星定位系统GPS来进行定位的,其精确度最高,但是唯一的一个缺点就是必须要在空旷,上面没有遮挡物的地方进行定位,所以如果在室内可能造成定位失败的情况;基站定位是基于移动运营网的基站的定位方式,具体就是通过测量移动设备周围多个基站的信号,得到不同基站下信号的到达时间差,通过特定的算法公式去算出移动设备的位置,这种方式是这三种实现方式中精确度最低的,误差比较大;最后一种定位方式:WI-FI定位,该方式是利用无线路由器的热点通过计算我们移动设备的距离去进行定位的,这种定位方式与基站定位有点类似,都是依靠信号计算距离从而实现定位的,但WI-FI要比基站定位精确度要高一点。知道了原理我们再来总结一下这三种定位方式的区别:1.精确度:GPS>WI-FI>基站2.覆盖率:基站>WI-FI>GPS(室内不可用)。
下面正式进入代码环节,我们先来看看效果图:中间那个绿点就是我当前的位置。
有句话说的好:工欲善其事,必先利其器,我们需要做好充分的准备工作才能实现我们最终的定位功能。
1.在application标签中声明service组件,每个app拥有自己单独的定位service
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
</service>
2.权限的声明:上一篇已经申明过了,这次就不需要申明了
<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!-- 用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET" />
<!—SD卡读取权限,用户写入离线定位数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
<!--允许应用读取低级别的系统日志文件 -->
<uses-permission android:name="android.permission.READ_LOGS"></uses-permission>
3.在Application标签中加入key
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="key" />//key:开发者申请的key
废话不多说,贴上代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
/**
*<strong> 初始化SDK,参数必须为getApplicationContext():整个应用程序的Context</strong>
*/
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
//MapView的声明
mMap_view = (MapView) findViewById(R.id.gps_map);
//地图实例
mBaiduMap = mMap_view.getMap();
//此处需要注意:LocationClient类必须在主线程中声明。需要Context类型的参数,推荐用getApplicationConext获取全进程有效的context
mLocationClient = new LocationClient(this);
//实现BDLocationListener接口:定位的监听器用来接收异步返回的定位结果
myListener = new MyLocationListener();
//注册监听函数
mLocationClient.registerLocationListener(myListener);
initData();
}
这个部分比较简单,都是写初始化的东西,其中包括:初始化SDK,百度地图的实例:BaiduMap,定义LocationClient类以及监听定位接口:MyLocationListener(实现了BDLocationListener),并进行了监听
public class MyLocationListener implements BDLocationListener
{
@Override
public void onReceiveLocation(BDLocation arg0) {
// 构造定位数据
MyLocationData locData = new MyLocationData.Builder()
.latitude(arg0.getLatitude())
.longitude(arg0.getLongitude()).build();
mBaiduMap.setMyLocationData(locData);
// 第一次定位时,将地图位置移动到当前位置
if(isFirstRequest)
{
isFirstRequest = false;
LatLng ll = new LatLng(arg0.getLatitude(),
arg0.getLongitude());
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
mBaiduMap.animateMapStatus(u);
}
}
}
这个才是实现定位功能的核心代码,也就是说定位所依靠的地理位置的坐标就是通过该类来实现的。
public void initData()
{
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);//设置定位模式:高精度定位模式,低功耗定位模式和仅用设备定位模式
option.setOpenGps(true);// 打开gps:默认不打开
option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02
option.setScanSpan(5000);//设置发起定位请求的间隔时间为5000ms
option.setIsNeedAddress(true);//返回的定位结果包含地址信息
mLocationClient.setLocOption(option);
}
这里面主要是用来设置定位SDK的定位方式。
其中包括定位模式,是否需要设备方向信息,是否需要地址信息,返回的坐标的类型,定位时间间隔等等,
其中定位模式分为:Hight_Accuracy高精度、Battery_Saving低功耗、Device_Sensors仅设备(GPS)
高精度定位模式:这种定位模式下,会同时使用网络定位和GPS定位,优先返回最高精度的定位结果;
低功耗定位模式:这种定位模式下,不会使用GPS,只会使用网络定位(Wi-Fi和基站定位);
仅用设备定位模式:这种定位模式下,不需要连接网络,只使用GPS进行定位,这种模式下不支持室内环境的定位;
其余比较简单就不一一介绍了
@Override
protected void onStart() {
//开启定位图层
mBaiduMap.setMyLocationEnabled(true);
if (!mLocationClient.isStarted())
{
mLocationClient.start();
}
super.onStart();
}
@Override
protected void onStop() {
// 关闭图层定位
mBaiduMap.setMyLocationEnabled(false);
super.onStop();
}
最后别忘了启动和停止Acitivity的时候开启和关闭定位图层。
下一篇我将为大家介绍:百度地图的覆盖物