1 高德地图定位

1.1 要使用路径规划和导航需要使用3Dmap

在build.gradle文件加入一下包

api 'com.amap.api:search:6.5.0.1'
api 'com.amap.api:location:4.3.0'
api 'com.amap.api:navi-3dmap:6.4.0_3dmap6.5.0'

1.2 初始化mapView

  private void initAMap() {if (aMap == null) {aMap = mapView.getMap();//地图设置相关UiSettings settings = aMap.getUiSettings();//去掉自带的放大缩小按钮settings.setZoomControlsEnabled(false);//支持手势缩放地图settings.setGestureScaleByMapCenter(true);//地图的触摸事件aMap.setOnMapTouchListener(this);//地图加载完的回调事件aMap.setOnMapLoadedListener(this);//地图位置变化事件aMap.setOnCameraChangeListener(this);//地图点击事件aMap.setOnMapClickListener(this);// 绑定 Marker 被点击事件aMap.setOnMarkerClickListener(markerClickListener);// 设置自定义InfoWindow样式aMap.setInfoWindowAdapter(this);mAMapNavi = AMapNavi.getInstance(getApplicationContext());mAMapNavi.addAMapNaviListener(this);}}

1.3 开启定位相关

public void startLocate() {mLocationClient = new AMapLocationClient(context);mLocationClient.setLocationListener(this);AMapLocationClientOption option=new AMapLocationClientOption();option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//多次定位获取数据option.setOnceLocation(false);option.setInterval(8*1000);mLocationClient.setLocationOption(option);mLocationClient.startLocation();}

1.4 回调到下面的onLocationChanged方法中,你可以使用自定义的回调把定位数据监听回来

 @Overridepublic void onLocationChanged(AMapLocation amapLocation) {if (amapLocation != null && amapLocation.getErrorCode() == 0) {PositionEntity entity = new PositionEntity();entity.latitue = amapLocation.getLatitude();entity.longitude = amapLocation.getLongitude();entity.city = amapLocation.getCity();if (!TextUtils.isEmpty(amapLocation.getAddress())) {entity.address = amapLocation.getAddress();}mOnLocationGetlisGetListener.onLocationGet(entity);}
}

1.4 监听到对应的onLocationGet方法中,使用一个定位的Marker标识就可以

@Override
public void onLocationGet(PositionEntity entity) {
mStartPosition = new LatLng(entity.latitue, entity.longitude);
if (mIsFirstShow) {CameraUpdate cameraUpate = CameraUpdateFactory.newLatLngZoom(mStartPosition, 17);aMap.animateCamera(cameraUpate);mIsFirstShow = false;
}
mInitialMark.setPosition(mStartPosition);
processSearchTips(entity);
}

这样就完成对应的定位信息

2.路径规划

2.1获取路径规划起始位置和终点位置的经纬度

起始信息直接使用定位的当前位置信息

对应的终点信息,可以使用随机数来确定

public static void addEmulateData(AMap amap, LatLng center) {if (markers.size() == 0) {//终点位置信息的标识BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.drawable.stable_cluster_marker_one_normal);for (int i = 0; i < 20; i++) {double latitudeDelt;double longtitudeDelt;if (i % 2 == 0) {latitudeDelt = (Math.random() - 0.5) * 0.1;longtitudeDelt = (Math.random() - 0.5) * 0.1;} else {latitudeDelt = (Math.random() - 0.5) * 0.01;longtitudeDelt = (Math.random() - 0.5) * 0.01;}MarkerOptions markerOptions = new MarkerOptions();markerOptions.icon(bitmapDescriptor);markerOptions.position(new LatLng(center.latitude + latitudeDelt, center.longitude + longtitudeDelt));Marker marker = amap.addMarker(markerOptions);markers.add(marker);}} else {for (Marker marker : markers) {double latitudeDelt = (Math.random() - 0.5) * 0.1;double longtitudeDelt = (Math.random() - 0.5) * 0.1;marker.setPosition(new LatLng(center.latitude + latitudeDelt, center.longitude + longtitudeDelt));}}
}

2.2 设置marker的点击事件,动态计算对应的路线

AMap.OnMarkerClickListener markerClickListener = new AMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(final Marker marker) {LogUtils.w("点击的Marker");LogUtils.w(marker.getPosition() + "");isClickIdentification = true;//清除原先的路径clearRoute();//增加动画startAnim(marker);new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(300);tempMark = marker;mStartPoint = new LatLonPoint(mRecordPositon.latitude, mRecordPositon.longitude);startList.add(new NaviLatLng(mRecordPositon.latitude, mRecordPositon.longitude));mPositionMark.setPosition(mRecordPositon);mEndPoint = new LatLonPoint(marker.getPosition().latitude,marker.getPosition().longitude);handleEndList(mEndPoint);//规划路径planRoute();} catch (InterruptedException e) {e.printStackTrace();}}}).start();return true;}};

2.3 路径规划路径选择

调用以下事件就可以,在对应的onCalculateRouteSuccess会返回对应的路径

mAMapNavi.calculateRideRoute(startList.get(0), endList.get(0));

返回的路径会存在多条,每个对应进行处理即可

@Override
public void onCalculateRouteSuccess(int[] ints) {if (ints.length == 1) {onCalculateRouteSuccessOld();} else {onCalculateMultipleRoutesSuccessOld(ints);}
}private void onCalculateRouteSuccessOld() {/*** 清空上次计算的路径列表。*/routeOverlays.clear();ways.clear();AMapNaviPath path = mAMapNavi.getNaviPath();/*** 单路径不需要进行路径选择,直接传入-1即可*/drawRoutes(-1, path);showMarkInfo(path);
}private void onCalculateMultipleRoutesSuccessOld(int[] ints) {//清空上次计算的路径列表。routeOverlays.clear();ways.clear();HashMap<Integer, AMapNaviPath> paths = mAMapNavi.getNaviPaths();for (int i = 0; i < ints.length; i++) {AMapNaviPath path = paths.get(ints[i]);if (path != null) {drawRoutes(ints[i], path);ways.add(path);}}changeRoute();
}

2.4 路径规划画线

画线其实也就是调用高德的api即可

 /*** 绘制路线*/private void drawRoutes(int routeId, AMapNaviPath path) {calculateSuccess = true;aMap.moveCamera(CameraUpdateFactory.changeTilt(0));//路径绘制图层RouteOverLay routeOverLay = new RouteOverLay(aMap, path, this);routeOverLay.setTrafficLine(false);routeOverLay.addToMap();routeOverlays.put(routeId, routeOverLay);    }

3 实时导航

导航其实只要调用AMapNavi的startNavi即可

mAMapNaviView.setAMapNaviViewListener(this);
//获取AMapNavi实例
mAMapNavi = AMapNavi.getInstance(this);
//添加监听回调,用于处理算路成功
mAMapNavi.addAMapNaviListener(this);//实例化语音引擎
mTtsManager = TTSController.getInstance(getApplicationContext());
mTtsManager.init();
mAMapNavi.addAMapNaviListener(mTtsManager);
mAMapNavi.startNavi(NaviType.GPS);

3.1 加入讯飞语音导航

需要实现AMapNaviListener接口,一般处理下面几个接口就可以了

@Override
public void onCalculateRouteFailure(int arg0) {if (wordList != null)wordList.addLast("路线规划失败");
}@Override
public void onGetNavigationText(int arg0, String arg1) {//导航相关的语音播报if (wordList != null)wordList.addLast(arg1);handler.obtainMessage(CHECK_TTS_PLAY).sendToTarget();
}@Override
public void onReCalculateRouteForTrafficJam() {if (wordList != null)wordList.addLast("前方路线拥堵,路线重新规划");
}@Override
public void onReCalculateRouteForYaw() {if (wordList != null)wordList.addLast("路线重新规划");
}

回调需要是用Handler来处理,主要是播报方式是队列模式。其原理就是依次将需要播报的语音放入链表中,播报过程是从头开始依次往后播报

 @Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) {case TTS_PLAY:synchronized (mTts) {if (!isPlaying && mTts != null && wordList.size() > 0) {isPlaying = true;String playtts = wordList.removeFirst();if (mTts == null) {createSynthesizer();}mTts.startSpeaking(playtts, new SynthesizerListener() {@Overridepublic void onCompleted(SpeechError arg0) {isPlaying = false;handler.obtainMessage(1).sendToTarget();}@Overridepublic void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {}@Overridepublic void onBufferProgress(int arg0, int arg1, int arg2, String arg3) {// 合成进度isPlaying = true;}@Overridepublic void onSpeakBegin() {//开始播放isPlaying = true;}@Overridepublic void onSpeakPaused() {}@Overridepublic void onSpeakProgress(int arg0, int arg1, int arg2) {//播放进度isPlaying = true;}@Overridepublic void onSpeakResumed() {//继续播放isPlaying = true;}});}}break;case CHECK_TTS_PLAY:if (!isPlaying) {handler.obtainMessage(1).sendToTarget();}break;}}

高德地图导航和路径规划相关推荐

  1. 高德地图WebAPI : 驾车路径规划

    参考API 一个demo 获取路径规划返回结果中的两点间最短驾车距离 import java.io.BufferedReader; import java.io.BufferedReader; imp ...

  2. android高德地图线路,独立路径规划-路线规划-开发指南-Android 导航SDK | 高德地图API...

    基本介绍 独立路径规划是指路径规划的结果不会自动应用于当前导航,也不会干扰当前的导航,需要手动调用API传入路径规划结果来开始导航.可用于不干扰本次导航的单独路径规划场景,比如路线预览等.适用于驾车/ ...

  3. 常用的地图导航和路径规划算法

    作者:李传学 链接:https://www.zhihu.com/question/24870090/answer/73834896 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  4. python调用高德地图api获取路径规划,然后规划好点显示在地图上(农机路径转移)

    我的博客好像跳度比较大,不少内容都涉及,但我是做ros组合导航的,其他的或者是项目设计,或者是因为兴趣,或者是随笔记下来. 无聊写来玩下的小demo,本来试图在硕士期间研究下这个课题即农机从仓库到田间 ...

  5. 基于高德地图的APP路径规划开发

    一.初始化一个APP项目 参见我的上一篇文章:https://blog.csdn.net/QiwzDeBLOG/article/details/84701746 前期准备: 我的项目名称:AmapTe ...

  6. jq高德地图API实现路径规划及起点途径点终点设置

    $(function () {init();//初始化地图plugins();//插件加载menus(); }) var map; var placeSearch; var lng1; var lat ...

  7. Android 起调第三方导航,百度地图,高德地图,腾讯地图。起调高德地图导航

    主要工具类 /*** Created by meixi on 2018/6/29.* 使用第三方导航:高德.百度..........*/ public class AmapUtil {public s ...

  8. react-native调起第三方高德地图导航URL解释

    react-native调起第三方高德地图导航URL解释 做react-native地图应用时,主要使用的是高德地图,所以在导航上也准备调起高德地图应用来完成导航功能,在高德地图API官网并没有发现高 ...

  9. 百度地图SDK导航(路径规划+实时导航)

    百度地图导航的官网:http://developer.baidu.com/map/index.php?title=android-navsdk 里面的demo写的非常详细 ,我主要说一下我个人遇到的问 ...

  10. 八叉树建立地图并实现路径规划导航

    构建语义地图时,用的是 octomap_server和 semantic_slam: octomap_generator,不过还是整理下之前的学习笔记. 一.Octomap 安装并使用Octomap_ ...

最新文章

  1. php会话的销毁和退出,销毁PHP会话
  2. 将一个3 * 4的二维数组转换为4 * 3的二维数组
  3. mybaits十六:使用choose标签实现分支选择
  4. ASP.NET Core 2.0 自定义 _ViewStart 和 _ViewImports 的目录位置
  5. C++面试宝典之STL向量容器
  6. amd u盘安装linux mint,安装Linux Mint 20后需要做的13件事
  7. Java实现俄罗斯方块小游戏。(附完整源代码)
  8. c51汇编语言教程,汇编语言入门视频教程
  9. unas 下 Transmission 下载使用体会
  10. 说说知名软件的伪装和防范(下)
  11. curl 命令详解(超详细)
  12. shader02-仿星空粒子
  13. 计算机没有显示远程桌面连接,连接远程桌面时出现:“这台计算机没有远程桌面客户端访问许可”,怎么处理?...
  14. 初中信息技术说课稿_小学信息课说课稿范文(精选6篇)
  15. CTFshow—MISC图片篇(基础操作)
  16. 7年时间,从功能测试到测试开发月薪30K,有志者事竟成
  17. labview 加密VI如何破解密码
  18. 交换机千兆和百兆对网速影响_交换机千兆和百兆对网速影响_千兆/百兆/核心/PoE/光纤交换机选型指南...
  19. RHEL 7特性说明(八):联网与认证
  20. 生产环境 遭遇 fastJson1.2.78 巨坑

热门文章

  1. xp访问贡享显示指定服务器,XP访问Win10共享打印机指定的网络名不再可用解决方法...
  2. LaTeX常用的希腊字符、数学符号、矩阵、公式、排版、中括号、大括号以及插入图片等操作手册
  3. IDEA同一个项目启动多个端口
  4. 线性代数01:函数对向量、矩阵的梯度(向量、矩阵求导)
  5. 介绍一下xgb_珍藏版 | 20道XGBoost面试题,你会几个?(上篇)
  6. matlab怎么新建文件运行不了,关于:Matlab中直接双击fig文件运行出错,而从.m文件运行却不会出错问题的一点心得...
  7. 敏捷团队章程-让团队持续敏捷
  8. Fabric.js 文档
  9. JavaScript的API文档自动生成工具jsdoc
  10. excel打开oracle,Oracle PLSQL读取(解析)Excel文档