百度地图开发之实现运动轨迹 一
近日想在Android平台下进行一个基于地理位置的APP开发,于是想到了利用百度地图的API进行开发。于是参考了网上的一些代码以及相关知识的分享,现在记录一下在百度地图上描绘出运动轨迹的开发过程!
首先,百度地图定位功能的一个重要的类就是 LocationClient。
此处需要注意:LocationClient类必须在主线程中声明。需要Context类型的参数。
Context需要时全进程有效的context,推荐用getApplicationConext获取全进程有效的context
public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();public void onCreate() {mLocationClient = new LocationClient(getApplicationContext()); //声明LocationClient类mLocationClient.registerLocationListener( myListener ); //注册监听函数
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
LocationClient类是定位SDK的核心类,具体方法如下: 构造类:
public LocationClient ( Context ) //须在主线程中声明
设置参数:
public void setLocOption ( LocationClientOption )
参数:配置定位SDK,详见LocationClientOption类。 说明:2.x版本以后的定位提供API接口,用以在API运行过程中,支持热切换配置参数。
注册监听函数:
public void registerLocationListener ( BDLocationListener )
参数:详见BDLocationListener类。 说明:当没有注册监听函数时,无法发起网络请求。
注册位置提醒监听事件:
public void registerNotify ( BDNotifyListener mNotify )
开启/关闭:
public void start();
public void stop();
start:启动定位SDK。
stop:关闭定位SDK。调用stop之后,设置的参数LocationClientOption仍然保留。
发起定位:
public int requestLocation()
发起定位,异步获取当前位置。因为是异步的,所以立即返回,不会引起阻塞。定位结果在ReceiveListener的方法OnReceive方法的参数中返回。
需要注意:当定位SDK从定位依据判定,位置和上一次没发生变化,而且上一次定位结果可用时,则不会发起网络请求,而是返回上一次的定位结果。 返回值:
0:正常发起了定位。
1:服务没有启动。
2:没有监听函数。
6:请求间隔过短。 前后两次请求定位时间间隔不能小于1000ms。
请求离线定位:
离线定位功能:用户请求过得基站定位结果会缓存在本地文件。离线定位结果为缓存结果,精度低于在线的定位结果。
离线定位结果没有地址信息。
public int requestOfflineLocation()
发起离线定位,异步获取当前位置。因为是异步的,所以立即返回,不会引起阻塞。定位结果在ReceiveListener的方法OnReceive方法的参数中返回。
返回值:
0:正常发起了定位。
1:服务没有启动。
2:没有监听函数。
取消监听函数:
public void unRegisterLocationListener(BDLocationListener listener)
取消监听函数。
位置提醒相关函数:
//注册位置提醒监听事件
public void registerNotify(BDNotifyListener mNotify)
//取消位置提醒监听事件
public void removeNotifyEvent(BDNotifyListener mNotify)
实现BDLocationListener接口
BDLocationListener接口有2个方法需要实现: 1.接收异步返回的定位结果,参数是BDLocation类型参数。
public class MyLocationListener implements BDLocationListener {@Overridepublic void onReceiveLocation(BDLocation location) {if (location == null)return ;StringBuffer sb = new StringBuffer(256);sb.append("time : ");sb.append(location.getTime());sb.append("\nerror code : ");sb.append(location.getLocType());sb.append("\nlatitude : ");sb.append(location.getLatitude());sb.append("\nlontitude : ");sb.append(location.getLongitude());sb.append("\nradius : ");sb.append(location.getRadius());if (location.getLocType() == BDLocation.TypeGpsLocation){sb.append("\nspeed : ");sb.append(location.getSpeed());sb.append("\nsatellite : ");sb.append(location.getSatelliteNumber());} else if (location.getLocType() == BDLocation.TypeNetWorkLocation){sb.append("\naddr : ");sb.append(location.getAddrStr());} logMsg(sb.toString());}
}
BDLocation类,封装了定位SDK的定位结果,在BDLocationListener的onReceive方法中获取。通过该类用户可以获取error code,位置的坐标,精度半径等信息。具体方法如下:
获取error code:
public int getLocType ( )
返回值:
61 : GPS定位结果
62 : 扫描整合定位依据失败。此时定位结果无效。
63 : 网络异常,没有成功向服务器发起请求。此时定位结果无效。
65 : 定位缓存的结果。
66 : 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果
67 : 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果
68 : 网络连接失败时,查找本地离线定位时对应的返回结果
161: 表示网络定位结果
162~167: 服务端定位失败
502:key参数错误
505:key不存在或者非法
601:key服务被开发者自己禁用
602:key mcode不匹配
501~700:key验证失败
如果不能定位,请记住这个返回值,并到我们的hi群或者贴吧中交流。若返回值是162~167,请发送邮件至mapapi@baidu.com反馈。
获取经纬度坐标:
public double getLatitude ( ) //获取维度
public double getLongitude ( ) //获取经度
获取定位的坐标。坐标的类型在setLocationClientOption方法中设定。
获取定位精度:
public boolean hasRadius ( ) //判断是否有定位精度半径
public float getRadius ( ) //获取定位精度半径,单位是米
获取文字描述的地址(反地理编码):
public String getAddrStr ( ) //获取反地理编码
只有使用网络定位的情况下,才能获取当前位置的反地理编码描述。
自定位SDK2.6版本之后,支持获取省/市/区分级地理信息:
public String getProvince ( ) //获取省份信息
public String getCity ( ) //获取城市信息
public String getDistrict ( ) //获取区县信息
获取手机方向信息:
public float getDirection()
//获得手机方向,范围【0-360】,手机上部正朝向北的方向为0°方向
设置定位参数
设置定位参数包括:定位模式(高精度定位模式,低功耗定位模式和仅用设备定位模式),返回坐标类型,是否打开GPS等等。
高精度定位模式:这种定位模式下,会同时使用网络定位和GPS定位,优先返回最高精度的定位结果;
低功耗定位模式:这种定位模式下,不会使用GPS,只会使用网络定位(Wi-Fi和基站定位)
仅用设备定位模式:这种定位模式下,不需要连接网络,只使用GPS进行定位,这种模式下不支持室内环境的定位
eg:
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);//设置定位模式
option.setCoorType(“bd09ll”);//返回的定位结果是百度经纬度,默认值gcj02
option.setScanSpan(5000);//设置发起定位请求的间隔时间为5000ms
option.setIsNeedAddress(true);//返回的定位结果包含地址信息
option.setNeedDeviceDirect(true);//返回的定位结果包含手机机头的方向
mLocClient.setLocOption(option);
LocationClientOption类,该类用来设置定位SDK的定位方式,具体方法如下:
设置定位模式:
//Hight_Accuracy高精度、Battery_Saving低功耗、Device_Sensors仅设备(GPS)
public void setLocationMode(LocationMode mode)
设置打开GPS:
setOpenGps( boolean )
设置是否打开gps,使用gps前提是用户硬件打开gps。默认是不打开gps的。
设置是否需要设备方向信息:
//在网络定位中,获取手机机头所指的方向
public void setNeedDeviceDirect(boolean)
设置是否需要地址信息:
使用setIsNeedAddress(boolean)
设置是否要返回地址信息,默认为无地址信息。
public void setAddrType ( String )
String 值为 all时,表示返回地址信息,其他值都表示不返回地址信息。
设置坐标类型:
设置返回值的坐标类型。
public void setCoorType ( String )
我们支持返回若干种坐标系,包括国测局坐标系、百度坐标系,需要更多坐标系请联系我们,需要深度合作。目前这些参数的代码为。因此需要在请求时指定类型,如果不指定,默认返回百度坐标系。注意当仅输入IP时,不会返回坐标。目前这些参数的代码为
返回国测局经纬度坐标系 coor=gcj02
返回百度墨卡托坐标系 coor=bd09
返回百度经纬度坐标系 coor=bd09ll
百度手机地图对外接口中的坐标系默认是bd09ll,如果配合百度地图产品的话,需要注意坐标系对应问题。
有关坐标系的更多问题,请看常见问题
设置产品线名称:
public void setProdName ( String )
设置产品线名称。强烈建议您使用自定义的产品线名称,方便我们以后为您提供更高效准确的定位服务。
设置定位时间间隔:
public void setScanSpan ( int ) //设置定时定位的时间间隔。单位ms
说明:
当所设的整数值大于等于1000(ms)时,定位SDK内部使用定时定位模式。调用requestLocation( )后,每隔设定的时间,定位SDK就会进行一次定位。如果定位SDK根据定位依据发现位置没有发生变化,就不会发起网络请求,返回上一次定位的结果;如果发现位置改变,就进行网络请求进行定位,得到新的定位结果。定时定位时,调用一次requestLocation,会定时监听到定位结果。
当不设此项,或者所设的整数值小于1000(ms)时,采用一次定位模式。每调用一次requestLocation( ),定位SDK会发起一次定位。请求定位与监听结果一一对应。
设定了定时定位后,可以热切换成一次定位,需要重新设置时间间隔小于1000(ms)即可。locationClient对象stop后,将不再进行定位。如果设定了定时定位模式后,多次调用requestLocation(),则是每隔一段时间进行一次定位,同时额外的定位请求也会进行定位,但频率不会超过1秒一次。
设置位置提醒接口:
public void registerNotify( BDNotifyListener mNotify )
LocationClient注册位置提醒监听事件
public void removeNotifyEvent( BDNotifyListener mNotify )
LocationClient取消位置提醒监听事件
发起定位请求
发起定位请求。请求过程是异步的,定位结果在上面的监听函数onReceiveLocation中获取。
if (mLocClient != null && mLocClient.isStarted())
mLocClient.requestLocation();
else
Log.d(“LocSDK5”, “locClient is null or not started”);
发起离线定位请求
发起离线定位请求。请求过程是异步的,定位结果在上面的监听函数onReceiveLocation中获取。
getLocTypte = BDLocation.TypteOfflineLocation || BDLocation.TypeOfflineLocationFail
表示是离线定位请求返回的定位结果
if (mLocClient != null && mLocClient.isStarted())
mLocClient.requestOfflineLocation();
位置提醒使用
位置提醒最多提醒3次,3次过后将不再提醒。 假如需要再次提醒,或者要修改提醒点坐标,都可通过函数SetNotifyLocation()来实现。
//位置提醒相关代码
mNotifyer = new NotifyLister();
mNotifyer.SetNotifyLocation(42.03249652949337,113.3129895882556,3000,”gps”);//4个参数代表要位置提醒的点的坐标,具体含义依次为:纬度,经度,距离范围,坐标系类型(gcj02,gps,bd09,bd09ll)
mLocationClient.registerNotify(mNotifyer);
//注册位置提醒监听事件后,可以通过SetNotifyLocation 来修改位置提醒设置,修改后立刻生效。
//BDNotifyListner实现
public class NotifyLister extends BDNotifyListener{
public void onNotify(BDLocation mlocation, float distance){
mVibrator01.vibrate(1000);//振动提醒已到设定位置附近
}
}
//取消位置提醒
mLocationClient.removeNotifyEvent(mNotifyer);
使用地理围栏服务Beta
地理围栏服务提供的是基于位置的提醒服务,相对于SDK原来提供的位置提醒功能,地理围栏服务通过SDK本身的内部逻辑,大幅度降低位置提醒服务的功耗情况。通过使用地理围栏服务,第三方APP可以在低能耗的模式下轻松实现位置提醒服务。
初始化GeofecenClient类
此处需要注意:GeofenceClient类必须在主线程中声明。需要Context类型的参数。
Context需要时全进程有效的context,推荐用getApplicationConext获取全进程有效的context。
public GeofenceClient mGeofenceClient = null;
public void onCreate() {
mGeofenceClient = new GeofenceClient(getApplicationContext();
}
实现添加和删除围栏的回调接口
添加围栏回调:OnAddBDGeofencesResultListener
实现如下:
public class AddGeofenceListener implements OnAddBDGeofencesResultListener {
@Override
public void onAddBDGeofencesResult(int statusCode, String geofenceRequestId) {
if (statusCode == BDLocationStatusCodes.SUCCESS) {
//围栏创建成功
}}}
删除围栏回调:OnRemoveBDGeofencesResultListener
实现如下:
public class RemoveFenceListener implements OnRemoveBDGeofencesResultListener {
@Override
public void onRemoveBDGeofencesByRequestIdsResult(int statusCode, String[] geofenceRequestIds) {
if (statusCode == BDLocationStatusCodes.SUCCESS) {
//围栏删除成功
}}}
实现并注册OnGeofenceTriggerListener回调接口
public class GeofenceEnterLister implements OnGeofenceTriggerListener {
@Override
public void onGeofenceTrigger(String geofenceRequestId) {
//进入围栏,围栏Id = geofenceRequestId
}
@Override
public void onGeofenceExit(String geofenceRequestId) {
//退出围栏,围栏Id = geofenceRequestId
}
//注册并开启围栏扫描服务
mGeofenceClient .registerGeofenceTriggerListener(new GeofenceEnterLister());
mGeofenceClient.start();
}
设置围栏参数
围栏参数包括:id:围栏Id、x,y:围栏坐标点经纬度、name、半径类型(目前只支持半径在500m以内的围栏)、expir:围栏的有效时间,单位毫秒(最长可以设置1个月)、coordType:坐标类型(COORD_TYPE_BD09、COORD_TYPE_BD09LL、COORD_TYPE_GCJ)、
具体如下:
BDGeofence fence = new BDGeofence.Builder().setGeofenceId(id).
setCircularRegion(x, y, type)
. setExpirationDruation(expir)
. setCoordType(coordType)
.build();
发起围栏添加和删除请求
//添加一个围栏:
mGeofenceClient.addBDGeofence(fence, new AddGeofenceListener());
//删除,指定要删除围栏的名字列表
List fences = new ArrayList();
fences.add(fenceId);
mGeofenceClient. removeBDGeofences(fences, new RemoveFenceListener());
需要注意的问题
定位SDK必须注册GPS和网络的使用权限。
使用定位SDK请保证网络连接通畅(GPS定位方式不需要连网)。
我们强烈建议您设置自己的prodName,并保管好,这样方便我们为您提供更好的定位服务。
若需要返回的定位结果里包含地址信息,请保证网络连接。
定位SDK可以返回bd09、bd09ll、gcj02三种类型坐标,若需要将定位点的位置通过百度Android地图 SDK进行地图展示,请返回bd09ll,将无偏差的叠加在百度地图上。
有的移动设备锁屏后为了省电会自动关闭网络连接,此时网络定位模式的定位失效。此外,锁屏后移动设备若进入cpu休眠,定时定位功能也失效。若您需要实现在cpu休眠状态仍需定时定位,可以用alarmManager 实现1个cpu可叫醒的timer,定时请求定位.
百度地图开发之实现运动轨迹 一相关推荐
- 百度地图开发之实现运动轨迹 二
上篇日志有介绍到开发百度地图的几个重要的类还有方法,现在就来实现在百度地图上描绘出运动轨迹,具体步骤如下: 一,在布局文件里声明百度地图的视图 二,在用百度地图时,先要将地图初始化: // 地图初始化 ...
- 使用QT嵌入百度地图开发高B格岸基监控软件
文章目录 1.简述 2.百度地图 2.1百度地图准备 2.2 百度地图开发 2.2.1实时绘制轨迹 2.2.2设定航点 3 QT软件开发 3.1使用QWebEngineView显示Html 3.2 M ...
- 用android studio测量距离,Android studio 百度地图开发(6)Marker绑定事件、计算两点距离...
Android studio 百度地图开发(6)Marker绑定事件.计算两点距离 email:chentravelling@163.com 开发环境:win7 64位,Android Studio, ...
- 基于Android的百度地图开发
参考资料: android studio获得SHA1的值,然后在百度地图移动版API官网申请key Android Studio怎么查看程序的安全码获取SHA1值? http://www.codese ...
- [android] 百度地图开发 (二).定位城市位置和城市POI搜索
一. 百度地图城市定位和POI搜索知识 上一篇文章"百度地图开发(一)"中讲述了如何申请百度APIKey及解决显示空白网格的问题.该篇文章主要讲述如何定位城市位置.定位 ...
- 通过腾讯地图、高德地图、百度地图开发接口获取坐标对应的周边相关信息
通过腾讯地图.高德地图.百度地图开发接口获取坐标对应的周边相关信息 更新: 以前出于好意暴露了个人的KEY,现已被烂用.为不影响您的业务,请使用我的KEY的朋友去申请自己的KEY,我的KEY将在不久后 ...
- C#的百度地图开发(一)发起HTTP请求
C#的百度地图开发(一)发起HTTP请求 原文:C#的百度地图开发(一)发起HTTP请求 百度地图的开发文档中给出了很多的事例,而当用到具体的语言来开发时,又会有些差异.我是使用C#来开发的.在获取相 ...
- Android 百度地图开发(三)--- 实现比例尺功能和替换自带的缩放组件
转载请注明出处:http://blog.csdn.net/xiaanming/article/details/11821523 貌似有些天没有写博客了,前段时间在忙找工作的事,面试了几家公司,表示反响 ...
- Android 百度地图开发(二)
前面我们一起了解了百度地图的申请与集成Android 百度地图开发(一),今天我们接着来学习百度地图. 今天主要来了解如下问题: 1.百度地图的生命周期控制 上一篇张我们已经在布局文件里增加了mapV ...
最新文章
- [JavaScript] 好用的 JavaScript Symbol 类型
- 纪念乔布斯,推出四期iPad、iphone赠书活动【第一期】
- Docker学习笔记 — Docker私有仓库搭建
- Gson源码解析和它的设计模式
- 算法(6)-leetcode-explore-learn-数据结构-数组字符串的双指针技巧
- 谷歌浏览器中文版_中国科学家设计超薄指尖传感器,厚度不到A4纸五分之一 / 谷歌发布地图时光机:百年前,你家街道啥样?/ AI看图说话首超人类...
- 用一句话证明你是程序员
- 用的最多的正则表达式
- powerdesigner错误提示实体属性名称唯一性_SolidWorks用保存实体创建新零件与装配体...
- mysql中权限的小知识
- html推箱子过关检测函数,HTML5推箱子实现
- Centos 防火墙开启/关闭端口
- c语言图片百叶窗特效,Flash遮罩特效实例--百叶窗效果
- c语言中各个符号的意义及作用是什么,C语言各类符号意义以及用法是什么?
- 计算机网络物理地址,4-3 查询计算机网卡物理地址的方法
- SIMULIA 官方技术论坛全年时间表新鲜出炉!
- 【高等数学】矩阵与向量组的秩和等价
- 计算机无法选择字体,电脑系统字体无法修改字体大小怎么办?
- 百度地图SDK,报167错误,经纬度定位是4.9E-324的解决办法
- [MySQL]复杂查询(进阶)