android 百度地图走动轨迹,百度地图实现小车规划路线后平滑移动功能
文章目的
项目开发所需,所以结合百度地图提供的小车平滑轨迹移动,自己写的demo
实现效果
代码下载
下面是实现的关键步骤
集成百度地图
怎么集成自然是看百度地图开发平台提供的文档。
规划线路
看百度地图的文档,写一个规划线路的工具类(驾车的)
package com.wzhx.car_smooth_move_demo.utils;
import android.util.log;
import com.baidu.mapapi.search.route.bikingrouteresult;
import com.baidu.mapapi.search.route.drivingrouteplanoption;
import com.baidu.mapapi.search.route.drivingrouteresult;
import com.baidu.mapapi.search.route.indoorrouteresult;
import com.baidu.mapapi.search.route.masstransitrouteresult;
import com.baidu.mapapi.search.route.ongetrouteplanresultlistener;
import com.baidu.mapapi.search.route.plannode;
import com.baidu.mapapi.search.route.routeplansearch;
import com.baidu.mapapi.search.route.transitrouteresult;
import com.baidu.mapapi.search.route.walkingrouteresult;
import com.wzhx.car_smooth_move_demo.listener.ongetdrivingresultlistener;
public class routeplanutil {
private routeplansearch mrouteplansearch = routeplansearch.newinstance();
private ongetdrivingresultlistener getdrivingresultlistener;
private ongetrouteplanresultlistener getrouteplanresultlistener = new ongetrouteplanresultlistener() {
@override
public void ongetwalkingrouteresult(walkingrouteresult walkingrouteresult) {
}
@override
public void ongettransitrouteresult(transitrouteresult transitrouteresult) {
}
@override
public void ongetmasstransitrouteresult(masstransitrouteresult masstransitrouteresult) {
}
@override
public void ongetdrivingrouteresult(drivingrouteresult drivingrouteresult) {
log.e("测试", drivingrouteresult.error + ":" + drivingrouteresult.status);
getdrivingresultlistener.onsuccess(drivingrouteresult);
}
@override
public void ongetindoorrouteresult(indoorrouteresult indoorrouteresult) {
}
@override
public void ongetbikingrouteresult(bikingrouteresult bikingrouteresult) {
}
};
public routeplanutil(ongetdrivingresultlistener getdrivingresultlistener) {
this.getdrivingresultlistener = getdrivingresultlistener;
this.mrouteplansearch.setongetrouteplanresultlistener(this.getrouteplanresultlistener);
}
public void routeplan(plannode startnode, plannode endnode){
mrouteplansearch.drivingsearch((new drivingrouteplanoption())
.from(startnode).to(endnode)
.policy(drivingrouteplanoption.drivingpolicy.ecar_time_first)
.trafficpolicy(drivingrouteplanoption.drivingtrafficpolicy.route_path_and_traffic));
}
}
规划线路后需要将实时路况索引保存,为后面画图需要
// 设置路段实时路况索引
list allstep = selectedrouteline.getallstep();
mtraffictextureindexlist.clear();
for (int j = 0; j < allstep.size(); j++) {
if (allstep.get(j).gettrafficlist() != null && allstep.get(j).gettrafficlist().length > 0) {
for (int k = 0; k < allstep.get(j).gettrafficlist().length; k++) {
mtraffictextureindexlist.add(allstep.get(j).gettrafficlist()[k]);
}
}
}
要将路线规划的路线上的路段再细分(切割),这样小车移动才会平滑
/**
* 将规划好的路线点进行截取
* 参考百度给的小车平滑轨迹移动demo实现。(循环的算法不太懂)
* @param routeline
* @param distance
* @return
*/
private arraylist dividerouteline(arraylist routeline, double distance) {
// 截取后的路线点的结果集
arraylist result = new arraylist<>();
mnewtraffictextureindexlist.clear();
for (int i = 0; i < routeline.size() - 1; i++) {
final latlng startpoint = routeline.get(i);
final latlng endpoint = routeline.get(i + 1);
double slope = getslope(startpoint, endpoint);
// 是不是正向的标示
boolean isyreverse = (startpoint.latitude > endpoint.latitude);
boolean isxreverse = (startpoint.longitude > endpoint.longitude);
double intercept = getinterception(slope, startpoint);
double xmovedistance = isxreverse ? getxmovedistance(slope, distance) :
-1 * getxmovedistance(slope, distance);
double ymovedistance = isyreverse ? getymovedistance(slope, distance) :
-1 * getymovedistance(slope, distance);
arraylist temp1 = new arraylist<>();
for (double j = startpoint.latitude, k = startpoint.longitude;
!((j > endpoint.latitude) ^ isyreverse) && !((k > endpoint.longitude) ^ isxreverse); ) {
latlng latlng = null;
if (slope == double.max_value) {
latlng = new latlng(j, k);
j = j - ymovedistance;
} else if (slope == 0.0) {
latlng = new latlng(j, k - xmovedistance);
k = k - xmovedistance;
} else {
latlng = new latlng(j, (j - intercept) / slope);
j = j - ymovedistance;
}
final latlng finallatlng = latlng;
if (finallatlng.latitude == 0 && finallatlng.longitude == 0) {
continue;
}
mnewtraffictextureindexlist.add(mtraffictextureindexlist.get(i));
temp1.add(finallatlng);
}
result.addall(temp1);
if (i == routeline.size() - 2) {
result.add(endpoint); // 终点
}
}
return result;
}
最后是开启子线程,对小车状态进行更新(车头方向和小车位置)
/**
* 循环进行移动逻辑
*/
public void movelooper() {
movethread = new thread() {
public void run() {
thread thisthread = thread.currentthread();
while (!exit) {
for (int i = 0; i < latlngs.size() - 1; ) {
if (exit) {
break;
}
for (int p = 0; p < latlngs.size() - 1; p++) {
// 这是更新索引的条件,这里总是为true
// 实际情况可以是:当前误差小于5米 distanceutil.getdistance(mcurrentlatlng, latlngs.get(p)) <= 5)
// mcurrentlatlng 这个小车的当前位置得自行获取得到
if (true) {
// 实际情况的索引更新 mindex = p;
mindex++; // 模拟就是每次加1
runonuithread(new runnable() {
@override
public void run() {
toast.maketext(mcontext, "当前索引:" + mindex, toast.length_short).show();
}
});
break;
}
}
// 改变循环条件
i = mindex + 1;
if (mindex >= latlngs.size() - 1) {
exit = true;
break;
}
// 擦除走过的路线
int len = mnewtraffictextureindexlist.sublist(mindex, mnewtraffictextureindexlist.size()).size();
integer[] integers = mnewtraffictextureindexlist.sublist(mindex, mnewtraffictextureindexlist.size()).toarray(new integer[len]);
int[] index = new int[integers.length];
for (int x = 0; x < integers.length; x++) {
index[x] = integers[x];
}
if (index.length > 0) {
mpolyline.setindexs(index);
mpolyline.setpoints(latlngs.sublist(mindex, latlngs.size()));
}
// 这里是小车的当前点和下一个点,用于确定车头方向
final latlng startpoint = latlngs.get(mindex);
final latlng endpoint = latlngs.get(mindex + 1);
mhandler.post(new runnable() {
@override
public void run() {
// 更新小车的位置和车头的角度
if (mmapview == null) {
return;
}
mmovemarker.setposition(startpoint);
mmovemarker.setrotate((float) getangle(startpoint,
endpoint));
}
});
try {
// 控制线程更新时间间隔
thisthread.sleep(time_interval);
} catch (interruptedexception e) {
e.printstacktrace();
}
}
}
}
};
// 启动线程
movethread.start();
}
android 百度地图走动轨迹,百度地图实现小车规划路线后平滑移动功能相关推荐
- android百度地图轨迹实现,android 获取GPS经纬度在百度地图上绘制轨迹
实现将一组GPS模块获取的经纬度数据在百度地图上绘制轨迹 1.将经纬度转换成百度地图坐标 /** * 标准的GPS经纬度坐标直接在地图上绘制会有偏移,这是测绘局和地图商设置的加密,要转换成百度地图坐标 ...
- android 获取GPS经纬度在百度地图上绘制轨迹
实现将一组GPS模块获取的经纬度数据在百度地图上绘制轨迹 1.将经纬度转换成百度地图坐标 /*** 标准的GPS经纬度坐标直接在地图上绘制会有偏移,这是测绘局和地图商设置的加密,要转换成百度地图坐标* ...
- 1200亿次日均位置服务响应、20亿公里日均轨迹里程,百度地图发布新一代人工智能地图生态全景
12月10日,百度地图首次公布了"新一代人工智能地图"生态全景.目前,百度地图日均位置服务请求次数突破1200亿次,日均轨迹里程20亿公里,注册开发者数量达180万,服务超过50万 ...
- Android 百度地图之全局搜索周边搜索全国搜索城市路线规划(升级版附源码)
这个是今年3月份做的,拿出来分享哈,之前的一篇结构单一,现在这个新增路线规划: 路线1:无地铁 路线2:时间快 路线3:少换乘 路线4:少步行 如下图: 2.地点搜索(局部搜索)如下图: 3 定位功能 ...
- android 百度地图 itemizedoverlay,[008] 百度地图API之ItemizedOverlay的使用(Android) .
本篇文章主要介绍如何在百度地图上添加Overlay(即图层或覆盖物). Overlay简介 Overlay通常被译为"图层"或"覆盖物".那么对于地图而言,什么 ...
- android 百度地图 itemizedoverlay,[008] 百度地图API之ItemizedOverlay的使用(Android)
本篇文章主要介绍如何在百度地图上添加Overlay(即图层或覆盖物). Overlay简介 Overlay通常被译为"图层"或"覆盖物".那么对于地图而言,什么 ...
- Android调用跳转百度地图、高德地图、腾讯地图进行目的地导航
Android App跳转百度地图.高德地图.腾讯地图进行目的地导航. 先放上百度.高德.腾讯地图调起API文档地址,有些参数不懂可以参考. 百度地图:http://lbsyun.baidu.com/ ...
- Android百度地图和人人网简单的应用(获取路线,分享到人人)
现在很多知名网站为广大开发者提供了开放平台,像百度,人人网等等!这里是我根据百度官方提供的百度地图的一个示例,自己写的一个小程序,有如下功能: (1) 定位当前位置(没使用GPS,定位快, ...
- android 百度地图 黑屏,百度地图 Fragment之间切换黑屏现象解决方案
用过百度地图的人多很忧伤,各种bug, 已无力吐槽,最无语的可能就是会出现黑屏现象,比如一个Activity包含三个Fragment, 其中一个Fragment嵌套MapView使用,在切换这三个Fr ...
- android 高德地图移动卡顿_Bmap地图,比百度、高德更好用。简洁、无广告。圣诞快乐...
图片来源网络 首先,首先,首先各位:圣诞节快乐!!! 地图对于现在生活的我们是一款必不可少的手机软件.电子地图简直就是路痴患者的福音. 但是每次一打开百度 地图,高德地图你是不是已经受够了,百度高德漫 ...
最新文章
- mysql mgr应用场景_悄悄告诉你 MySQL MGR 牛在哪?
- flask 创建基本模板
- C6000系列DSP的内联函数
- 计算机二级c在哪里学习,2017年计算机二级C语言考点学习
- 图解ARP协议(二)ARP攻击原理与实践
- Strange List CodeForces - 1471B
- 有什么用_app用什么软件编写
- 教你玩转CSS表格(table)
- Oracel 连接远端服务器
- ZBrush软件特性之Color调控板
- Adam:大规模分布式机器学习框架
- 2021SC@SDUSC山东大学软件学院软件工程应用与实践--YOLOV5代码分析(十)plots.py-2
- 《The Elder Scrolls V: Skyrim》百般冷门却强力职业
- 计算机打开文件的原理,电脑删除文件是怎么实现的?它的原理是什么?
- IEEE 文献下载,文献下载,知网下载
- Flutter高仿微信-第47篇-群聊-语音
- python第三方库pdf_Python使用到第三方库PyMuPDF图片与pdf相互转换
- 浅谈二维和三维图像数据
- [007]爬虫系列 | 猿人学爬虫攻防大赛 | 第二题: js 混淆 - 动态Cookie
- 高效深度学习:让模型更小、更快、更好!