你的位置:首页 > 操作系统

[操作系统]百度地图开发的学习(二)——地图定位


定位是地图开发的必经重要的环节,我也在不断学习中,就自己了解写一下这些。

一、配置

1.百度的定位是有自己jar包和so文件的,所以记得将它们配置到对应的文件夹中并加载进工程里。具加载方法在学习一里面就有了,这里就不细讲了。

2.在百度的配置方法中导入完库文件后,还要进行声明libs源文件

如果是将jar包和so文件全部放入libs文件中,就需要这样的声明了,本人也试过,但是格式有点偏差,build.gradle会报错,改成下面这样就可以了。

sourceSets {
main {
jniLibs.srcDir 'libs'
}

3.添加service

location的服务是作为service来开启的,需要添加进AndroidMainfest.

<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
</service>


4.添加权限
之前学习一中已经把后续的所需权限包含进来,所以可以参考之前的,这里就不附上了。

 

二、熟悉主要的使用的定位的类

1.LocationClient

这是一个定位服务的类,相当于定义一个有定位服务的客户端,而且只能在主线程中启动

它的有两个构造函数,都需要传入全局的context,建议用getApplicationContext传入

这两个构造函数区别:是否在创建过程中之前是否定义了配置定位参数的locationClientOption。如果采用第一个构造方法,那么在后面也需要使用setLocOption来补充。

常用方法如下:

voidsetLocOption(LocationClientOption locOption)设置 LocationClientOption
voidstart()启动定位sdk
voidstop()停止定位sdk
voidregisterLocationListener(BDLocationListener listener)注册定位监听函数
voidregisterNotify(BDNotifyListener mNotify)注册位置提醒监听
voidrequestNotifyLocation()NA
voidremoveNotifyEvent(BDNotifyListener mNotify)取消注册的位置提醒监听
intrequestOfflineLocation()离线定位请求,异步返回,结果在locationListener中获取.

一般在构造完和设置参数后吗,就可以调用start方法,启动定位服务。

2.LocationClientOption

能够配置定位SDK各种参数

常用的方法:

voidsetCoorType(java.lang.String coorType)获得当前设置的坐标类型
voidSetIgnoreCacheException(boolean cacheException)设置是否进行异常捕捉 true:不捕捉异常;false:捕捉异常,默认为false
voidsetIgnoreKillProcess(boolean killProcess)设置是否退出定位进程 true:不退出进程; false:退出进程,默认为true
voidsetIsNeedAddress(boolean isNeed)设置是否需要地址信息,默认为无地址
voidsetIsNeedLocationPoiList(boolean isNeedLocationPoiList)设置是否需要返回位置POI信息,可以在BDLocation.getPoiList()中得到数据
voidsetLocationMode(LocationClientOption.LocationMode mode)设置定位模式
voidsetNeedDeviceDirect(boolean isNeedDeviceDirect)在网络定位时,是否需要设备方向 true:需要 ; false:不需要。
voidsetOpenGps(boolean openGps)设置是否打开gps进行定位
voidsetProdName(java.lang.String prodName)设置Prod字段值
voidsetScanSpan(int scanSpan)设置扫描间隔,单位是毫秒 当<1000(1s)时,定时定位无效

常用的设置有定位模式、定位坐标系、扫描时间间隔、返回地址结果、是否打开GPS、定位模式。

定位模式(默认高精度):

(1)高精度定位模式(Hight_Accuracy):同时使用网络定位和GPS定位,优先返回最高精度的定位结果。

(2) 低功耗定位模式(Battery_Saving):不使用GPS,只使用网络定位(WiFi和基站)。

(3)仅用设备定位模式(Device_Sensors): 不适用网络定位,只使用GPS进行定位。但是此模式下不支持室内环境的定位。

定位坐标系(建议采用bd09ll,百度地图用自己坐标比较准。。。):

(1)返回国测局经纬度坐标系:gcj02

(2)返回百度墨卡托坐标系 :bd09

(3)返回百度经纬度坐标系 :bd09ll

关于坐标系的一些了解我也会在下一篇blog里面说到。。。

扫描时间间隔(单位:ms):设置扫描间隔,单位是毫秒 当<1000(1s)时,定时定位无效

返回定位结果:设置是否需要地址信息,默认无地址

是否打开GPS:定位一般都需要开启

3. BDLocationListener 定位请求回调接口

在设置完定位参数过后,需要设置监听事件,主要是重写onReceiveLocation(BDLocation location)函数,实现对于location结果的处理。

4.BDLocation 内部封装了经纬度、半径等属性。

常用的方法:

java.lang.StringgetAddrStr()获取详细地址信息
doublegetAltitude()获取高度信息,目前只有是GPS定位结果时才有效,单位米(还没有实现)
java.lang.StringgetCity()获取城市
java.lang.StringgetCountry()获取国家
doublegetLatitude()获取纬度坐标
doublegetLongitude()获取经度坐标
java.lang.StringgetProvince()获取省份
floatgetSpeed()获取速度,仅gps定位结果时有速度信息,单位公里/小时,默认值0.0f
java.lang.StringgetStreet()获取街道信息
java.lang.StringgetTime()server返回的当前定位时间
floatgetRadius()获取定位精度,默认值0.0f
floatgetDirection()gps定位结果时,行进的方向,单位度

常获取的信息:经纬度、精度范围、行进的方向

5.MyLocationData 定位数据包

之前的类完成地图的定位和监听响应,如果要在地图中显示出来,就需要构造定位数据包,来显示当前定位位置。

MyLocationData.Builderaccuracy(float accuracy)设置定位数据的精度信息,单位:米
MyLocationDatabuild()构建生成定位数据对象
MyLocationData.Builderdirection(float direction)设置定位数据的方向信息
MyLocationData.Builderlatitude(double lat)设置定位数据的纬度
MyLocationData.Builderlongitude(double lng)设置定位数据的经度
MyLocationData.BuildersatellitesNum(int num)设置定位数据的卫星数目
MyLocationData.Builderspeed(float speed)设置定位数据的速度

这些方法常用的就是精度、经纬度、方向,对应数据获取可以BDLocation的方法获取。

6.MyLocationConfiguration 配置定位图层

构造函数MyLocationConfiguration(MyLocationConfiguration.LocationMode mode, boolean enableDirection, BitmapDescriptor customMarker)

显示方式(LocationMode):

有了上面几个基本的类就能简单的使用定位服务啦。

 还有什么类需要查找的也可以到官网去搜索

http://wiki.lbsyun.baidu.com/cms/androidloc/doc/v6_0_3/doc/index.html

 

核心的代码附上:

mLocClient = new LocationClient(this);//定义定位客户端
mLocClient.registerLocationListener(myListener);//设置监听事件
LocationClientOption option = new LocationClientOption();//设置参数
option.setOpenGps(true); // 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000);//设施扫描间隔时间
mLocClient.setLocOption(option);//将参数添加进客户端
mLocClient.start();//开启客户端

public class MyLocationListenner implements BDLocationListener {

@Override
public void onReceiveLocation(BDLocation location) {
// map view 销毁后不在处理新接收的位置
if (location == null || mMapView == null) {
return;
}
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
.direction(100)
          .latitude(location.getLatitude())
.longitude(location.getLongitude())
          .build();
mBaiduMap.setMyLocationData(locData);
     if (isFirstLoc) {
  isFirstLoc = false;
  LatLng ll = new LatLng(location.getLatitude(),
     location.getLongitude());
  //mToast = Toast.makeText(LocationDemo.this, "第一次位置:"+ll.latitude +"|"+ ll.longitude, Toast.LENGTH_SHORT);
  //mToast.show();
   MapStatus.Builder builder = new MapStatus.Builder();
  builder.target(ll).zoom(18.0f);
   mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
}
}