自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳解百度地圖API之駕車導航

開發(fā) 前端
本文將向大家介紹如何使用百度地圖API提供的駕車導航服務進行開發(fā)。包括代碼實現(xiàn)和截圖展示。

本文將向大家介紹如何使用百度地圖API提供的駕車導航服務進行開發(fā)。

  一個簡單的示例

  駕車導航服務根據(jù)傳入的起點和終點信息給出從起點到終點的駕車路線,我們先從一個最簡單的示例看起:

  1.   varmap = newBMap.Map('container');  
  2.   map.centerAndZoom(newBMap.Point(116.404, 39.915), 11);  
  3.   vardriving = newBMap.DrivingRoute(map, {  
  4.   renderOptions: {  
  5.   map: map  
  6.   }  
  7.   });  
  8.   driving.search('圓明園''西單'); 

  上面代碼很簡單,先初始化地圖(地圖容器的html代碼省略),接著實例化一個DrivingRoute類,并配置好參數(shù)(參數(shù)具體含義后續(xù)再說)。最后調用該實例的search方法進行駕車方案查詢。我們會在瀏覽器看到如下效果:

  DrivingRoute的構造函數(shù)的第一個參數(shù)制定檢索的范圍,這里我們傳遞的是map實例,也就是說駕車導航的位置會根據(jù)當前地圖中心點所在的城市進行檢索。當然你也可以傳遞一個城市名稱的字符串:

  1.   vardriving = newBMap.DrivingRoute("北京", {  
  2.   renderOptions: {  
  3.   map: map  
  4.   }  
  5.   }); 

  DrivingRoute的構造函數(shù)第二個參數(shù)是可選的配置,類型為DrivingRouteOptions。這里我們只使用了renderOptions屬性,這個屬性值的類型為DrivingRenderOptions類,它是用來控制檢索結果的呈現(xiàn)的,比如是否將結果線路呈現(xiàn)在地圖上,是否將詳細方案描述呈現(xiàn)在頁面的某個位置等等。這里我們使用了map屬性,即讓檢索結果自動展現(xiàn)在地圖上,這樣我們就會看到地圖上有起點、終點以及它們之間的線路了。

  呈現(xiàn)設置

  除了設置展現(xiàn)的地圖以外,呈現(xiàn)設置中還有很多其他功能,最常用的就是將詳細方案描述顯示在頁面上:

  1.   <!DOCTYPE html> 
  2.   <html> 
  3.   <head> 
  4.   <meta charset="utf-8"/> 
  5.   <title>駕車導航</title> 
  6.   <script src="http://api.map.baidu.com/api?v=1.2"></script> 
  7. </head> 
  8.   <body> 
  9.   <div id="container"style="width:400px;height:248px"></div> 
  10.   <div id="panel"style="position:absolute;left:420px;top:10px"></div> 
  11.   <script> 
  12.   varmap =newBMap.Map('container');  
  13.   map.centerAndZoom(newBMap.Point(116.404, 39.915), 11);vardriving =newBMap.DrivingRoute(map, {  
  14.   renderOptions: {  
  15.   map: map,  
  16.   panel: 'panel'}  
  17.   });  
  18.   driving.search('圓明園', '西單');</script> 
  19.   </body> 
  20.   </html> 

  這里我們增加一個div,id為panel,接著在renderOptions中增加panel屬性,把div的id傳遞進去。我們會看到如下效果:

  API會將詳細的駕車方案描述填充到id為panel的div容器中。此時點擊panel中的具體方案會在圖區(qū)產生交互效果。

  另外,呈現(xiàn)設置的enableDragging如果設置為true的畫,則用戶可以在地圖上拖拽起點、終點改變駕車方案,也可以任意拖拽修改途徑點:

  1.   vardriving = newBMap.DrivingRoute(map, {  
  2.   renderOptions: {  
  3.   map: map,  
  4.   panel: 'panel',  
  5.   enableDragging: true 
  6.   }  
  7.   }); 

  highlightMode屬性可以控制點擊panel中的方案描述時展示點位置還是展示一段路線,它支持如下兩個值:

  BMAP_HIGHLIGHT_STEP:展現(xiàn)關鍵點

  BMAP_HIGHLIGHT_ROUTE:展現(xiàn)路段

  默認為展現(xiàn)關鍵點,如下圖:

  點擊描述的第三項,顯示一個關鍵點信息(根據(jù)描述,這個點就是在中關村一橋左轉的位置點),也可以顯示路線:

  這時,再選中第三步的時候,地圖展現(xiàn)的是一段線路(即“沿中關村北大街行駛1.6公里”這段路)。

  駕車策略配置

  在DrivingRouteOptions還有一個控制策略的屬性drivingPolicy,它的屬性值可以為以下幾種:

  BMAP_DRIVING_POLICY_LEAST_TIME:最少時間,默認

  BMAP_DRIVING_POLICY_LEAST_DISTANCE:最短距離

  BMAP_DRIVING_POLICY_AVOID_HIGHWAYS:避開高速

  通過配置策略可獲得不同的駕車方案。

  回調函數(shù)

  在DrivingRouteOptions里面還有很多回調函數(shù)屬性,比如:onSearchComplete、onMarkersSet、onInfoHtmlSet、onPolylinesSet和onResultsHtmlSet。在DrivingRoute類上也有對應的設置回調的方法:setSearchCompleteCallback、setMarkersSetCallback等等。實際上不論通過配置參數(shù)傳遞還是通過接口設置回調,其作用都是一樣的。這些回調到底有什么用處呢?

  通過回調函數(shù),開發(fā)者可獲得更多的數(shù)據(jù)資源,可以利用這些數(shù)據(jù)資源更好、更靈活的進行二次開發(fā)。下面這個示例就是利用onSearchComplete獲取數(shù)據(jù)自行添加覆蓋物和描述信息:

  1.   <!DOCTYPE html> 
  2.   <html> 
  3.   <head> 
  4.   <meta charset="utf-8"/> 
  5.   <title>駕車導航</title> 
  6.   <script src="http://api.map.baidu.com/api?v=1.2"></script> 
  7. </head> 
  8.   <body> 
  9.   <div id="container"style="width:400px;height:248px"></div> 
  10.   <div id="panel"style="position:absolute;left:420px;top:10px"></div> 
  11.   <script> 
  12.   varmap =newBMap.Map('container');  
  13.   map.centerAndZoom(newBMap.Point(116.404, 39.915), 11);vardriving =newBMap.DrivingRoute(map, {  
  14.   onSearchComplete: function(results){if(driving.getStatus() ==BMAP_STATUS_SUCCESS) {//地圖覆蓋物  
  15.   addOverlays(results);//方案描述  
  16.   addText(results);  
  17.   }  
  18.   }  
  19.   });  
  20.   driving.search('圓明園', '西單');//添加覆蓋物并設置視野  
  21.   functionaddOverlays(results) {//自行添加起點和終點varstart =results.getStart();varend =results.getEnd();  
  22.   addStart(start.point, start.title);  
  23.   addEnd(end.point, end.title);varviewPoints =[start.point, end.point];//獲取方案varplan =results.getPlan(0);//獲取方案中包含的路線for(vari =0;i <plan.getNumRoutes(); i ++) {  
  24.   addRoute(plan.getRoute(i).getPath());  
  25.   viewPoints.concat(plan.getRoute(i).getPath());  
  26.   }//設置地圖視野  
  27.   map.setViewport(viewPoints, {  
  28.   margins: [40, 10, 10, 10]  
  29.   });  
  30.   }//添加方案描述  
  31.   functionaddText(results) {varplan =results.getPlan(0);//獲取方案中包含的路線varhtmls =[];for(vari =0;i <plan.getNumRoutes(); i ++) {varroute =plan.getRoute(i);for(varj =0;j <route.getNumSteps(); j ++) {varcurStep =route.getStep(j);  
  32.   htmls.push((j +1) +'. '+curStep.getDescription() +'<br />');  
  33.   }  
  34.   }varpanel =document.getElementById('panel');  
  35.   panel.innerHTML =htmls.join('');  
  36.   panel.style.lineHeight ='1.4em';  
  37.   panel.style.fontSize ='12px';  
  38.   }//添加起點覆蓋物  
  39.   functionaddStart(point, title){  
  40.   map.addOverlay(newBMap.Marker(point, {  
  41.   title: title,  
  42.   icon: newBMap.Icon('blue.png', newBMap.Size(38, 41), {  
  43.   anchor: newBMap.Size(4, 36)  
  44.   })}));  
  45.   }//添加終點覆蓋物  
  46.   functionaddEnd(point, title){  
  47.   map.addOverlay(newBMap.Marker(point, {  
  48.   title: title,  
  49.   icon: newBMap.Icon('red.png', newBMap.Size(38, 41), {  
  50.  anchor: newBMap.Size(4, 36)  
  51.   })}));  
  52.   }//添加路線  
  53.   functionaddRoute(path){  
  54.   map.addOverlay(newBMap.Polyline(path, {  
  55.   strokeColor: '#333',  
  56.   enableClicking: false}));  
  57.   }</script> 
  58.   </body> 
  59.   </html> 

  在上面的代碼中,我們初始化DrivingRoute實例時沒有設置renderOptions,也就是說駕車導航的結果不會自動添加到地圖上,描述信息也不會展現(xiàn)在頁面中,我們通過onSearchComplete獲取數(shù)據(jù)自行添加。onSearchComplete回調函數(shù)的參數(shù)為一個DrivingRouteResult對象,通過它可以獲取數(shù)據(jù)信息。在回調函數(shù)中我們首先判斷一下檢索是否成功,如果成功則添加覆蓋物和描述信息。在添加覆蓋物完成后,我們調用了Map的setViewport方法來設置視野,以便讓結果完整展示在地圖當中。在獲取方案的時候我們調用getPlan方法并給定索引0,這表示獲取第一條駕車方案(實際上目前僅有一條駕車方案,但是以后可能會同時給出多條方案)。每個方案通過RoutePlan描述,方案中會包含若干Route對象,它表示兩點間的線路(在只有一個目的地的情況下,Route對象數(shù)量總為1),Route對象又包含若干Step,通過getStep方法可獲得,Step對象描述了每一個關鍵點的信息。

  以上代碼在瀏覽器中的效果如下:

通過接口,你還可以進一步豐富這個功能,比如增加一些點擊交互。

  需要注意的問題

  搜索沒有結果

  如果檢索關鍵字過于模糊,比如從“麥當勞”到“肯德基”,這樣API不知道從哪個麥當勞到哪個肯德基,所以此時將無法獲取導航線路。為了讓導航返回更準確的結果,建議使用坐標發(fā)起檢索。

  發(fā)起新檢索后地圖沒有清除上一次結果

  在一般情況下,你只需要一個DrivingRoute實例做檢索,同一個實例在檢索的時候會自動清除上一次檢索的結果(包括地圖覆蓋物和描述)。但是如果每次檢索都new一個新的DrivingRoute實例,那么每個實例的檢索結果都會出現(xiàn)在地圖上,無法自動清除。

原文鏈接:http://www.cnblogs.com/jz1108/archive/2011/09/23/2185444.html

【編輯推薦】

  1. 詳解百度地圖API之地圖標注
  2. 百度地圖API之如何制作駕車導航
  3. 架構師 如何從夢想變成現(xiàn)實?
  4. 談談對于企業(yè)級系統(tǒng)架構的理解
  5. 怎么成為一個軟件架構師
責任編輯:彭凡 來源: 博客園
相關推薦

2011-09-16 14:39:02

百度地圖API

2011-10-24 14:01:29

API

2011-09-29 11:00:54

百度地圖API

2011-10-09 11:07:40

百度地圖API

2011-09-16 10:37:42

地圖API

2011-10-21 10:16:25

百度地圖API

2011-10-21 09:28:25

百度地圖API

2013-04-08 14:59:54

Android學習筆記百度地圖Overlay

2012-02-01 09:33:36

百度地圖API

2021-06-15 14:33:00

高德百度騰訊

2022-03-27 10:04:23

Angular8項目vue

2011-10-21 09:11:41

百度地圖API

2011-12-29 16:18:14

API

2013-04-08 14:46:42

Android學習筆記百度地圖

2012-02-03 14:01:15

地圖

2011-05-25 14:36:17

2023-12-20 17:38:44

APIhttp鴻蒙

2014-07-25 17:12:39

數(shù)據(jù)庫WOT2014MongoDB

2013-08-22 17:08:50

2020-12-11 22:02:00

百度地圖Apollo
點贊
收藏

51CTO技術棧公眾號