本文将向大家介绍如何使用百度地图API提供的驾车导航服务进行开发。

一个简单的示例

驾车导航服务根据传入的起点和终点信息给出从起点到终点的驾车路线,我们先从一个最简单的示例看起:

var map = new BMap.Map('container');

map.centerAndZoom(new BMap.Point(116.404, 39.915), 11);

var driving = new BMap.DrivingRoute(map, {

renderOptions: {

map: map

}

});

driving.search('圆明园', '西单');

上面代码很简单,先初始化地图(地图容器的html代码省略),接着实例化一个DrivingRoute类,并配置好参数(参数具体含义后续再说)。最后调用该实例的search方法进行驾车方案查询。我们会在浏览器看到如下效果:

DrivingRoute的构造函数的第一个参数制定检索的范围,这里我们传递的是map实例,也就是说驾车导航的位置会根据当前地图中心点所在的城市进行检索。当然你也可以传递一个城市名称的字符串:

var driving = new BMap.DrivingRoute("北京", {

renderOptions: {

map: map

}

});

DrivingRoute的构造函数第二个参数是可选的配置,类型为DrivingRouteOptions。这里我们只使用了renderOptions属性,这个属性值的类型为DrivingRenderOptions类,它是用来控制检索结果的呈现的,比如是否将结果线路呈现在地图上,是否将详细方案描述呈现在页面的某个位置等等。这里我们使用了map属性,即让检索结果自动展现在地图上,这样我们就会看到地图上有起点、终点以及它们之间的线路了。

其他发起检索的方式

除了使用字符串方式发起驾车检索以外,还可以使用坐标发起:

driving.search(new BMap.Point(116.404, 39.915), new BMap.Point(116.389, 39.811));

使用坐标发起检索时,起点和终点没有具体的描述,仅仅用“起点”和“终点”进行描述。

通过文档看,search还支持LocalResultPoi类型,该类型没有构造函数,但是可以通过字面量形式表示。我们可以自己构造这个类型的实例并发起驾车检索:

driving.search({title: '我的家', point: new BMap.Point(116.410, 39.915)}, {title: '你的家', point: new BMap.Point(116.400, 39.910)});

这样,API就会用开发者自定义的名称进行显示。当然通过LocalSearch获取的结果类型也是LocalResultPoi,也可以直接将结果对象传递到search方法中。

呈现设置

除了设置展现的地图以外,呈现设置中还有很多其他功能,最常用的就是将详细方案描述显示在页面上:

DOCTYPE html>

驾车导航title>

script>

head>

div>

div>

map.centerAndZoom(newBMap.Point(116.404,39.915),11);vardriving=newBMap.DrivingRoute(map, {

renderOptions: {

map: map,

panel:'panel'}

});

driving.search('圆明园','西单');script>

body>

html>

这里我们增加一个div,id为panel,接着在renderOptions中增加panel属性,把div的id传递进去。我们会看到如下效果:

API会将详细的驾车方案描述填充到id为panel的div容器中。此时点击panel中的具体方案会在图区产生交互效果。

另外,呈现设置的enableDragging如果设置为true的画,则用户可以在地图上拖拽起点、终点改变驾车方案,也可以任意拖拽修改途径点:

var driving = new BMap.DrivingRoute(map, {

renderOptions: {

map: map,

panel: 'panel',

enableDragging: true

}

});

highlightMode属性可以控制点击panel中的方案描述时展示点位置还是展示一段路线,它支持如下两个值:

BMAP_HIGHLIGHT_STEP:展现关键点

BMAP_HIGHLIGHT_ROUTE:展现路段

默认为展现关键点,如下图:

点击描述的第三项,显示一个关键点信息(根据描述,这个点就是在中关村一桥左转的位置点),也可以显示路线:

这时,再选中第三步的时候,地图展现的是一段线路(即“沿中关村北大街行驶1.6公里”这段路)。

驾车策略配置

在DrivingRouteOptions还有一个控制策略的属性drivingPolicy,它的属性值可以为以下几种:

BMAP_DRIVING_POLICY_LEAST_TIME:最少时间,默认

BMAP_DRIVING_POLICY_LEAST_DISTANCE:最短距离

BMAP_DRIVING_POLICY_AVOID_HIGHWAYS:避开高速

通过配置策略可获得不同的驾车方案。

回调函数

在DrivingRouteOptions里面还有很多回调函数属性,比如:onSearchComplete、onMarkersSet、onInfoHtmlSet、onPolylinesSet和onResultsHtmlSet。在DrivingRoute类上也有对应的设置回调的方法:setSearchCompleteCallback、setMarkersSetCallback等等。实际上不论通过配置参数传递还是通过接口设置回调,其作用都是一样的。这些回调到底有什么用处呢?

通过回调函数,开发者可获得更多的数据资源,可以利用这些数据资源更好、更灵活的进行二次开发。下面这个示例就是利用onSearchComplete获取数据自行添加覆盖物和描述信息:

DOCTYPE html>

驾车导航title>

script>

head>

div>

div>

map.centerAndZoom(newBMap.Point(116.404,39.915),11);vardriving=newBMap.DrivingRoute(map, {

onSearchComplete:function(results){if(driving.getStatus()==BMAP_STATUS_SUCCESS) {//地图覆盖物addOverlays(results);//方案描述addText(results);

}

}

});

driving.search('圆明园','西单');//添加覆盖物并设置视野functionaddOverlays(results) {//自行添加起点和终点varstart=results.getStart();varend=results.getEnd();

addStart(start.point, start.title);

addEnd(end.point, end.title);varviewPoints=[start.point, end.point];//获取方案varplan=results.getPlan(0);//获取方案中包含的路线for(vari=0; i

addRoute(plan.getRoute(i).getPath());

viewPoints.concat(plan.getRoute(i).getPath());

}//设置地图视野map.setViewport(viewPoints, {

margins: [40,10,10,10]

});

}//添加方案描述functionaddText(results) {varplan=results.getPlan(0);//获取方案中包含的路线varhtmls=[];for(vari=0; i

htmls.push((j+1)+'.'+curStep.getDescription()+'');

}

}varpanel=document.getElementById('panel');

panel.innerHTML=htmls.join('');

panel.style.lineHeight='1.4em';

panel.style.fontSize='12px';

}//添加起点覆盖物functionaddStart(point, title){

map.addOverlay(newBMap.Marker(point, {

title: title,

icon:newBMap.Icon('blue.png',newBMap.Size(38,41), {

anchor:newBMap.Size(4,36)

})}));

}//添加终点覆盖物functionaddEnd(point, title){

map.addOverlay(newBMap.Marker(point, {

title: title,

icon:newBMap.Icon('red.png',newBMap.Size(38,41), {

anchor:newBMap.Size(4,36)

})}));

}//添加路线functionaddRoute(path){

map.addOverlay(newBMap.Polyline(path, {

strokeColor:'#333',

enableClicking:false}));

}script>

body>

html>

在上面的代码中,我们初始化DrivingRoute实例时没有设置renderOptions,也就是说驾车导航的结果不会自动添加到地图上,描述信息也不会展现在页面中,我们通过onSearchComplete获取数据自行添加。onSearchComplete回调函数的参数为一个DrivingRouteResult对象,通过它可以获取数据信息。在回调函数中我们首先判断一下检索是否成功,如果成功则添加覆盖物和描述信息。在添加覆盖物完成后,我们调用了Map的setViewport方法来设置视野,以便让结果完整展示在地图当中。在获取方案的时候我们调用getPlan方法并给定索引0,这表示获取第一条驾车方案(实际上目前仅有一条驾车方案,但是以后可能会同时给出多条方案)。每个方案通过RoutePlan描述,方案中会包含若干Route对象,它表示两点间的线路(在只有一个目的地的情况下,Route对象数量总为1),Route对象又包含若干Step,通过getStep方法可获得,Step对象描述了每一个关键点的信息。

以上代码在浏览器中的效果如下:

通过接口,你还可以进一步丰富这个功能,比如增加一些点击交互。

需要注意的问题

搜索没有结果

如果检索关键字过于模糊,比如从“麦当劳”到“肯德基”,这样API不知道从哪个麦当劳到哪个肯德基,所以此时将无法获取导航线路。为了让导航返回更准确的结果,建议使用Point类型或LocalSearchPoi类型发起检索。

发起新检索后地图没有清除上一次结果

在一般情况下,你只需要一个DrivingRoute实例做检索,同一个实例在检索的时候会自动清除上一次检索的结果(包括地图覆盖物和描述)。但是如果每次检索都new一个新的DrivingRoute实例,那么每个实例的检索结果都会出现在地图上,无法自动清除。

android 百度地图驾车导航,百度地图API详解之驾车导航相关推荐

  1. 百度PaddleOCR及云平台OCR API详解及示例

    百度PaddleOCR及云平台OCR API详解及示例 目录 百度PaddleOCR及云平台OCR API详解及示例 使用百度开源的PaddleOCR 多个开源代码库比较

  2. 百度地图API详解之公交导航

    原文地址:http://blog.csdn.net/sup_heaven/article/details/8461593 只是作为备忘!!! 一次调试百度地图多marker事件监听的问题,不知如何解决 ...

  3. 百度地图根据经纬度计算距离php,详解js根据百度地图提供经纬度计算两点距离...

    正常在使用百度地图时,我们可以通过BMap的实例对象提供的方法计算距离: var map = new BMap.Map('map_canvas'); map.getDistance(point1 ,p ...

  4. 我的世界服务器积分系统,我的世界PVP地图生命积分板系统原理详解

    我的世界PVP地图生命积分板系统原理详解由小编给大家带来,希望这篇我的世界PVP地图生命积分板系统原理详解,能够帮助到各位正在玩我的世界的玩家朋友们! 我的世界PVP地图生命积分板系统原理详解 大家去 ...

  5. 调用百度ai接口实现图片文字识别详解

    调用百度ai接口实现图片文字识别详解 首先先介绍一下这篇博文是干嘛的,为了不浪费大家时间.公司最近和短视频公司合作,需要监控app的截图上的文字是否符合规范,也就是确保其没有违规的文字.到网上找了一些 ...

  6. 百度AI图片识别亲测成功详解

    百度AI图片识别亲测成功详解 1.浏览器输入网址http://ai.baidu.com/或者百度一下搜索'百度ai'点击第一个. 2.点击控制台,有百度账号的直接登录,没有的注册后登录. 3.点击左侧 ...

  7. 【百度联盟峰会】李彦宏详解AI时代思维方式,算法驱动的降维攻击

     [百度联盟峰会]李彦宏详解AI时代思维方式,算法驱动的降维攻击 新智元 2017-05-23 14:51:52 李彦宏 手机 百度 阅读(20879) 评论(19) 新智元报道 来源:百度 [新 ...

  8. Android复习14【高级编程:推荐网址、抠图片上的某一角下来、Bitmap引起的OOM问题、三个绘图工具类详解、画线条、Canvas API详解(平移、旋转、缩放、倾斜)、矩阵详解】

    目   录 推荐网址 抠图片上的某一角下来 8.2.2 Bitmap引起的OOM问题 8.3.1 三个绘图工具类详解 画线条 8.3.16 Canvas API详解(Part 1) 1.transla ...

  9. 百度提前批-百度智能小程序(面经详解)

    文章目录 百度提前批-百度智能小程序(面经详解) 1.定位 2.z-index .层叠 3.作用域(scope) 4.单例模式 5.原型链 6.继承(借用构造函数,寄生组合继承,缺点是什么) 7.闭包 ...

最新文章

  1. 输出主键的值 output inserted.id
  2. 《大道至简》一书第三版,与编辑就本书写作风格的讨论
  3. matlab命令fvtool,FVTool: a finite volume toolbox for Matlab
  4. php 需要已安装且正在运行的邮件系统_php如何发送邮件?一个函数轻松搞定
  5. 详解ASP.NET页面的aspx扩展
  6. McAfee:较之中国美国黑客才最令人害怕
  7. golang 切片 接口_Go编程模式:切片,接口,时间和性能
  8. 学习算法你必须知道的一些基础知识(文末福利)
  9. Macbook pro笔记本键盘失灵了(u,i,o,j,k,l,k,m无效了)解决办法
  10. python + opencv: 解决不能读取视频的问题
  11. SAP License:创建新的库存地点
  12. poj 3258 River Hopscotch 二分
  13. [论文阅读] Prototype Augmentation and Self-Supervision for Incremental Learning
  14. 百度牵手“造王者”汉得,ToB 战场将迎大变局?| 畅言
  15. c语言利用循环结构解决密码转换,C语言课件第六章循环结构.ppt
  16. python接口自动化是什么_Python接口自动化测试(一)什么是接口?
  17. 经典问题8连:小球和盒子
  18. 易语言 — 数据类型
  19. 运维人员如何学好shell脚本编程
  20. linux常用下载工具

热门文章

  1. 经典的经济、金融、投资书籍
  2. 在SAR-Opt数据融合领域针对深度学习的SEN1-2数据集
  3. Dell 7920工作站2080ti配置Ubuntu18.04+CUDA11.7+Cudnn
  4. (二)python学习笔记之列表入门
  5. 学编程和乐高机器人的区别
  6. html表格中加函数,excel中的substitute函数
  7. R语言绘制等值线和等高线
  8. VScode调用KEIL-MDK
  9. 京东主图怎么保存原图_京东图片怎么保存
  10. Python实现梯度下降