百度地图开发的学习(二)——地图定位

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

一、配置

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

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

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

sourceSets {
main {
jniLibs.srcDir 'libs'
}

3.添加service

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

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


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

 

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

1.LocationClient

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

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

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

常用方法如下:

void setLocOption(LocationClientOption locOption) 设置 LocationClientOption
void start() 启动定位sdk
void stop() 停止定位sdk
void registerLocationListener(BDLocationListener listener) 注册定位监听函数
void registerNotify(BDNotifyListener mNotify) 注册位置提醒监听
void requestNotifyLocation() NA
void removeNotifyEvent(BDNotifyListener mNotify) 取消注册的位置提醒监听
int requestOfflineLocation() 离线定位请求,异步返回,结果在locationListener中获取.

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

2.LocationClientOption

能够配置定位SDK各种参数

常用的方法:

void setCoorType(java.lang.String coorType) 获得当前设置的坐标类型
void SetIgnoreCacheException(boolean cacheException) 设置是否进行异常捕捉 true:不捕捉异常;false:捕捉异常,默认为false
void setIgnoreKillProcess(boolean killProcess) 设置是否退出定位进程 true:不退出进程; false:退出进程,默认为true
void setIsNeedAddress(boolean isNeed) 设置是否需要地址信息,默认为无地址
void setIsNeedLocationPoiList(boolean isNeedLocationPoiList) 设置是否需要返回位置POI信息,可以在BDLocation.getPoiList()中得到数据
void setLocationMode(LocationClientOption.LocationMode mode) 设置定位模式
void setNeedDeviceDirect(boolean isNeedDeviceDirect) 在网络定位时,是否需要设备方向 true:需要 ; false:不需要。
void setOpenGps(boolean openGps) 设置是否打开gps进行定位
void setProdName(java.lang.String prodName) 设置Prod字段值
void setScanSpan(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.String getAddrStr() 获取详细地址信息
double getAltitude() 获取高度信息,目前只有是GPS定位结果时才有效,单位米(还没有实现)
java.lang.String getCity() 获取城市
java.lang.String getCountry() 获取国家
double getLatitude() 获取纬度坐标
double getLongitude() 获取经度坐标
java.lang.String getProvince() 获取省份
float getSpeed() 获取速度,仅gps定位结果时有速度信息,单位公里/小时,默认值0.0f
java.lang.String getStreet() 获取街道信息
java.lang.String getTime() server返回的当前定位时间
float getRadius() 获取定位精度,默认值0.0f
float getDirection() gps定位结果时,行进的方向,单位度

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

5.MyLocationData 定位数据包

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

MyLocationData.Builder accuracy(float accuracy)
设置定位数据的精度信息,单位:米
MyLocationData build()
构建生成定位数据对象
MyLocationData.Builder direction(float direction)
设置定位数据的方向信息
MyLocationData.Builder latitude(double lat)
设置定位数据的纬度
MyLocationData.Builder longitude(double lng)
设置定位数据的经度
MyLocationData.Builder satellitesNum(int num)
设置定位数据的卫星数目
MyLocationData.Builder speed(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()));
}
}

 

posted @ 2016-04-11 00:58  天匙  阅读(1950)  评论(0编辑  收藏  举报