定位是地图开发的必经重要的环节,我也在不断学习中,就自己了解写一下这些。
一、配置
1.百度的定位是有自己jar包和so文件的,所以记得将它们配置到对应的文件夹中并加载进工程里。具加载方法在学习一里面就有了,这里就不细讲了。
2.在百度的配置方法中导入完库文件后,还要进行声明libs源文件
images/loading.gif' data-original="http://images2015.cnblogs.com/blog/872827/201604/872827-20160410223534359-162360809.png" />
如果是将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来补充。
常用方法如下:
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()));
}
}
原标题:百度地图开发的学习(二)——地图定位
关键词:百度