智能穿戴、外卖路径……随着网络应用在生活的方方面面,人们需要实时了解自己的位置和行进路线等信息。百度鹰眼是一套轨迹追踪开放服务,开发者在终端集成鹰眼SDK 后,可同时管理并追踪数千万终端设备的轨迹,适用于车队管理、共享出行、外勤人员管理、智能穿戴等领域。在百度鹰眼之前,大家一直使用百度定位和百度定位的绘制覆盖物,示例代码如下:
private void drawTrackLine(BDLocation location) {
TrackLine trackLine = new TrackLine();
dot = new LatLng(location.getLatitude(), location.getLongitude());
if (startTrack == true) {
line.add(dot);
if (line.size() == 1) {
// 这里绘制起点
drawStart(line);
if (isPause != true) {
ToastUtils.showToastCentre(ClubTrackActivity.this,"轨迹已开启");
}
} else if (line.size() > 3) {
points_tem = line.subList(line.size() - 2, line.size());
dis = getDistance(line.get(line.size() - 1).longitude, line.get(line.size() - 1).latitude,
line.get(line.size() - 3).longitude, line.get(line.size() - 3).latitude);
allDis += (dis / 3);
if (line.size() % 5 == 0) {
saveTrackLine(trackLine);
}
options = new PolylineOptions().color(0xfe12b7f5).width(10)
.points(points_tem);
mBaiduMap.addOverlay(options);
}
}
}
当然现在不会使用这种方法来实现轨迹的绘制,百度鹰眼地图已经把相关需求集成到SDK,开发者直接调用API就可以实现相关功能。
注意:使用百度鹰眼功能需要良好的网络环境并且在轨迹绘制过程中要保持网络连接,如果网络中断,绘制过程也会中断。而第一种方式可以做本地缓存,没有连网也可以绘制轨迹,但是实现方式以及优化比较困难。如果需要的话可以去我以前的博客看一下:
百度地图:定位,轨迹,白板,加载崩溃,定位到非洲
鹰眼地图提供了sdk以及demo,sdk下载地址:鹰眼SDK传送门。sdk解压以后直接放到libs中就可以使用了,但是demo的编译环境为eclipse。如果需要studio环境的可以在文章尾部下载。
Android SDK
根据自己的需要进行勾选
在控制台输入指令得到
在控制台输入括号中的指令 [keytool -list -v -keystore debug.keystore]获取开发版SHA1(系统默认秘钥:android),效果如下图所示
注:debug.keystore为studio默认的keystore
在控制台输入括号中的指令 [keytool -list -v -keystore keystore的路径]获取发布版SHA1,效果如下图所示
注:keystore为你的App打包发布keystore。所以再生成发布版SHA1前需要先生成keystore。关于studio生成keystore.jks,不懂得自行百度,这里就不说了。
注:1.生成开发版SHA1和发布版SHA1是需要输入密钥,直接回车键就可以了。
2.生成发布版SHA1时直接将keystore.jks拖入控制台就可以了,不需要在手动输入路径,效果图如下:
bug现象:如果你的Demo编译到手机,但是百度地图只展示网格而且没有其他问题。
bug原因:可能你的AK值输入的不对
解决方法:重新输入AK值或者重新申请AK值。
使用鹰眼sdk不仅需要AK,还需要创建鹰眼服务用于轨迹记录和分析。创建鹰眼服务的链接:传送门。
sourceSets {
main {
jniLibs.srcDir 'libs'
}
}
注意:鹰眼SDK的JAR包和SO文件版本号保持一致,如JAR包名称是BaiduTraceSDK_v3_0_1.jar,则SO文件名称是libBaiduTraceSDK_red|v3_0_1.so, 因此,如果更新了JAR包,则需要一并更新SO文件。
<service
android:name="com.baidu.trace.LBSTraceService"
android:enabled="true"
android:process=":remote">
service>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION">uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE">uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE">uses-permission>
<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">uses-permission>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS">uses-permission>
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS">uses-permission>
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS">uses-permission>
"com.baidu.lbsapi.API_KEY"
android:value="AK" /> //key:开发者申请的Key
/**
* 轨迹服务ID
*/
public long serviceId = id;//这里是申请的鹰眼服务id
- **方案一:在位置监听接口实时绘制轨迹**
@Override
public void onLatestPointCallback(LatestPointResponse response) {
//经过服务端纠偏后的最新的一个位置点,回调
try {
if (StatusCodes.SUCCESS != response.getStatus()) {
return;
}
LatestPoint point = response.getLatestPoint();
if (null == point || CommonUtil.isZeroPoint(point.getLocation().getLatitude(), point.getLocation()
.getLongitude())) {
return;
}
LatLng currentLatLng = mapUtil.convertTrace2Map(point.getLocation());
if (null == currentLatLng) {
return;
}
if (firstLocate) {
firstLocate = false;
Toast.makeText(TracingActivity.this, "起点获取中,请稍后...", Toast.LENGTH_SHORT).show();
return;
}
//当前经纬度
CurrentLocation.locTime = point.getLocTime();
CurrentLocation.latitude = currentLatLng.latitude;
CurrentLocation.longitude = currentLatLng.longitude;
if (trackPoints == null) {
return;
}
trackPoints.add(currentLatLng);
// endTime = CommonUtil.getCurrentTime();
// ToastUtils.showToastBottom(TracingActivity.this, "差值:" + (endTime - startTime));
// queryHistoryTrack();
mapUtil.drawHistoryTrack(trackPoints, false, mCurrentDirection);//时时动态的画出运动轨迹
} catch (Exception x) {
}
}
可以实时绘制,但是问题是绘制的轨迹会由于定位问题轨迹不美观而且误差较大。
@Override
public void onLatestPointCallback(LatestPointResponse response) {
//经过服务端纠偏后的最新的一个位置点,回调
try {
if (StatusCodes.SUCCESS != response.getStatus()) {
return;
}
LatestPoint point = response.getLatestPoint();
if (null == point || CommonUtil.isZeroPoint(point.getLocation().getLatitude(), point.getLocation()
.getLongitude())) {
return;
}
LatLng currentLatLng = mapUtil.convertTrace2Map(point.getLocation());
if (null == currentLatLng) {
return;
}
if (firstLocate) {
firstLocate = false;
Toast.makeText(TracingActivity.this, "起点获取中,请稍后...", Toast.LENGTH_SHORT).show();
return;
}
//当前经纬度
CurrentLocation.locTime = point.getLocTime();
CurrentLocation.latitude = currentLatLng.latitude;
CurrentLocation.longitude = currentLatLng.longitude;
if (trackPoints == null) {
return;
}
trackPoints.add(currentLatLng);
endTime = CommonUtil.getCurrentTime();
ToastUtils.showToastBottom(TracingActivity.this, "差值:" + (endTime - startTime));
queryHistoryTrack();
// mapUtil.drawHistoryTrack(trackPoints, false, mCurrentDirection);//时时动态的画出运动轨迹
} catch (Exception x) {
}
}
可以通过查询历史轨迹筛选有价值的轨迹点进行绘制。
/**
* 查询历史轨迹
*/
private void queryHistoryTrack() {
historyTrackRequest = new HistoryTrackRequest();
ProcessOption processOption = new ProcessOption();//纠偏选项
processOption.setRadiusThreshold(50);//精度过滤
processOption.setTransportMode(TransportMode.walking);//交通方式,默认为驾车
processOption.setNeedDenoise(true);//去噪处理,默认为false,不处理
processOption.setNeedVacuate(true);//设置抽稀,仅在查询历史轨迹时有效,默认需要false
processOption.setNeedMapMatch(true);//绑路处理,将点移到路径上,默认不需要false
historyTrackRequest.setProcessOption(processOption);
trackApp.initRequest(historyTrackRequest);
/**
* 设置里程补偿方式,当轨迹中断5分钟以上,会被认为是一段中断轨迹,默认不补充
* 比如某些原因造成两点之间的距离过大,相距100米,那么在这两点之间的轨迹如何补偿
* SupplementMode.driving:补偿轨迹为两点之间最短驾车路线
* SupplementMode.riding:补偿轨迹为两点之间最短骑车路线
* SupplementMode.walking:补偿轨迹为两点之间最短步行路线
* SupplementMode.straight:补偿轨迹为两点之间直线
*/
historyTrackRequest.setSupplementMode(SupplementMode.no_supplement);
historyTrackRequest.setSortType(SortType.asc);//设置返回结果的排序规则,默认升序排序;升序:集合中index=0代表起始点;降序:结合中index=0代表终点。
historyTrackRequest.setCoordTypeOutput(CoordType.bd09ll);//设置返回结果的坐标类型,默认为百度经纬度
/**
* 设置是否返回纠偏后轨迹,默认不纠偏
* true:打开轨迹纠偏,返回纠偏后轨迹;
* false:关闭轨迹纠偏,返回原始轨迹。
* 打开纠偏时,请求时间段内轨迹点数量不能超过2万,否则将返回错误。
*/
historyTrackRequest.setProcessed(true);
historyTrackRequest.setServiceId(trackApp.serviceId);//设置轨迹服务id,Trace中的id
historyTrackRequest.setEntityName(trackApp.entityName);//Trace中的entityName
/**
* 设置startTime和endTime,会请求这段时间内的轨迹数据;
* 这里查询采集开始到采集结束之间的轨迹数据
*/
historyTrackRequest.setStartTime(startTime);
historyTrackRequest.setEndTime(endTime);
historyTrackRequest.setPageIndex(pageIndex);
historyTrackRequest.setPageSize(Constants.PAGE_SIZE);
trackApp.mClient.queryHistoryTrack(historyTrackRequest, trackListener);//发起请求,设置回调监听
}
暂时分享鹰眼轨迹实时绘制,至于实现方案要综合考量。希望可以帮你解决问题。
如果需要demo,可以点击传送门:eagleDemo