文章目的

项目开发所需,所以结合百度地图提供的小车平滑轨迹移动,自己写的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 百度地图走动轨迹,百度地图实现小车规划路线后平滑移动功能相关推荐

  1. android百度地图轨迹实现,android 获取GPS经纬度在百度地图上绘制轨迹

    实现将一组GPS模块获取的经纬度数据在百度地图上绘制轨迹 1.将经纬度转换成百度地图坐标 /** * 标准的GPS经纬度坐标直接在地图上绘制会有偏移,这是测绘局和地图商设置的加密,要转换成百度地图坐标 ...

  2. android 获取GPS经纬度在百度地图上绘制轨迹

    实现将一组GPS模块获取的经纬度数据在百度地图上绘制轨迹 1.将经纬度转换成百度地图坐标 /*** 标准的GPS经纬度坐标直接在地图上绘制会有偏移,这是测绘局和地图商设置的加密,要转换成百度地图坐标* ...

  3. 1200亿次日均位置服务响应、20亿公里日均轨迹里程,百度地图发布新一代人工智能地图生态全景

    12月10日,百度地图首次公布了"新一代人工智能地图"生态全景.目前,百度地图日均位置服务请求次数突破1200亿次,日均轨迹里程20亿公里,注册开发者数量达180万,服务超过50万 ...

  4. Android 百度地图之全局搜索周边搜索全国搜索城市路线规划(升级版附源码)

    这个是今年3月份做的,拿出来分享哈,之前的一篇结构单一,现在这个新增路线规划: 路线1:无地铁 路线2:时间快 路线3:少换乘 路线4:少步行 如下图: 2.地点搜索(局部搜索)如下图: 3 定位功能 ...

  5. android 百度地图 itemizedoverlay,[008] 百度地图API之ItemizedOverlay的使用(Android) .

    本篇文章主要介绍如何在百度地图上添加Overlay(即图层或覆盖物). Overlay简介 Overlay通常被译为"图层"或"覆盖物".那么对于地图而言,什么 ...

  6. android 百度地图 itemizedoverlay,[008] 百度地图API之ItemizedOverlay的使用(Android)

    本篇文章主要介绍如何在百度地图上添加Overlay(即图层或覆盖物). Overlay简介 Overlay通常被译为"图层"或"覆盖物".那么对于地图而言,什么 ...

  7. Android调用跳转百度地图、高德地图、腾讯地图进行目的地导航

    Android App跳转百度地图.高德地图.腾讯地图进行目的地导航. 先放上百度.高德.腾讯地图调起API文档地址,有些参数不懂可以参考. 百度地图:http://lbsyun.baidu.com/ ...

  8. Android百度地图和人人网简单的应用(获取路线,分享到人人)

    现在很多知名网站为广大开发者提供了开放平台,像百度,人人网等等!这里是我根据百度官方提供的百度地图的一个示例,自己写的一个小程序,有如下功能: (1)       定位当前位置(没使用GPS,定位快, ...

  9. android 百度地图 黑屏,百度地图 Fragment之间切换黑屏现象解决方案

    用过百度地图的人多很忧伤,各种bug, 已无力吐槽,最无语的可能就是会出现黑屏现象,比如一个Activity包含三个Fragment, 其中一个Fragment嵌套MapView使用,在切换这三个Fr ...

  10. android 高德地图移动卡顿_Bmap地图,比百度、高德更好用。简洁、无广告。圣诞快乐...

    图片来源网络 首先,首先,首先各位:圣诞节快乐!!! 地图对于现在生活的我们是一款必不可少的手机软件.电子地图简直就是路痴患者的福音. 但是每次一打开百度 地图,高德地图你是不是已经受够了,百度高德漫 ...

最新文章

  1. mysql mgr应用场景_悄悄告诉你 MySQL MGR 牛在哪?
  2. flask 创建基本模板
  3. C6000系列DSP的内联函数
  4. 计算机二级c在哪里学习,2017年计算机二级C语言考点学习
  5. 图解ARP协议(二)ARP攻击原理与实践
  6. Strange List CodeForces - 1471B
  7. 有什么用_app用什么软件编写
  8. 教你玩转CSS表格(table)
  9. Oracel 连接远端服务器
  10. ZBrush软件特性之Color调控板
  11. Adam:大规模分布式机器学习框架
  12. 2021SC@SDUSC山东大学软件学院软件工程应用与实践--YOLOV5代码分析(十)plots.py-2
  13. 《The Elder Scrolls V: Skyrim》百般冷门却强力职业
  14. 计算机打开文件的原理,电脑删除文件是怎么实现的?它的原理是什么?
  15. IEEE 文献下载,文献下载,知网下载
  16. Flutter高仿微信-第47篇-群聊-语音
  17. python第三方库pdf_Python使用到第三方库PyMuPDF图片与pdf相互转换
  18. 浅谈二维和三维图像数据
  19. [007]爬虫系列 | 猿人学爬虫攻防大赛 | 第二题: js 混淆 - 动态Cookie
  20. 高效深度学习:让模型更小、更快、更好!

热门文章

  1. Android实现模拟装备购买
  2. 20200608模拟赛 Endless
  3. alps interview
  4. 【5G核心网】5GC核心网之网元UDM
  5. 我的疫情时代——记在家的那个学期
  6. iOS开发之Block详解
  7. eclipse的安装及最大子数组求和
  8. MD5 32位加密
  9. 第三周项目4 穷举法
  10. 特种作业操作证2021电工作业2021年电气试验考试题库