【百度地圖】使用LocalSearch獲取返回Marker及自定義結果面板


 

聲明:轉載自http://www.haodaima.net/art/1315203

這幾天做了個關於百度地圖的小項目,之前用的google地圖,百度地圖的api有些地方設計的還是比較詭異的,在這里說一下其中的兩個小地方。

第一個是使用LocalSearch時,要獲取顯示在地圖上的所有Marker,百度地圖提供了這樣一個函數

這個函數在所有Marker被添加后調用,要取得這些Marker,在這里面進行修改,比如設置監聽器是個不錯的選擇,描述里說明可以通過LocalResultPoi對象的marker屬性,不過我們查閱API會發現,LocalResultPoi對象根本就沒有marker這個屬性,其實確實是沒有,但在這里也是可以直接用的:

1  local.setMarkersSetCallback(function(pois){
2      for(var i=0;i<pois.length;i++){
3          markerArr[i]=pois[i].marker;
4          pois[i].marker.addEventListener("infowindowopen", function(e){
5              //do something
6          })  
7      }
8  })

在這里我用一個markerArr數組存下了所有的Marker,並且為每個Marker添加了infowindowopen事件。

 

第二個問題困擾了我一下午,也沒有用我最初的想法解決,我想自定義結果面板,但是仍然想在點擊一個地點后,地圖上打開對應地點的信息窗,我的最初構想是點擊文字后,模擬觸發對應Marker的click事件,結果讓我憤慨的是,百度地圖好像並沒有提供模擬觸發事件的接口,在網上搜到了一個封裝的EventWapper對象,但是也沒有起作用,最后無奈之下,只能是利用數據接口自己來實現這個信息窗了:

 
          
 1  var local = new BMap.LocalSearch(map, {  
 2       renderOptions: {  
 3           map: map,  
 4          autoViewport: true,  
 5          selectFirstResult: false  
 6       },
 7       onSearchComplete: function(results){ 
 8           //可以得到搜索結果且搜索結果不為空 
 9           if(local.getStatus() == BMAP_STATUS_SUCCESS){
10          var html="";
11          //遍歷結果第一頁的點,自定義結果面板
12          for (var i = 0; i < results.getCurrentNumPois(); i++){  
13              var poi = results.getPoi(i);
14                  //下面根據LocalResultPoi對象的值拼html代碼,此處略
15                  title[i] = poi.title;
16                  if(poi.address)
17                      address[i] = poi.address;
18                  if(poi.phoneNumber)
19                      telephone[i] = poi.phoneNumber;
20              } 
21                          
22              //重新遍歷第一頁所有點,對結果面板中的每一條記錄添加click事件
23              for (var i = 0; i < results.getCurrentNumPois(); i++){  
24                 $("#poi" + i).click(function(){
25                     //這里用前面title、address、telephone三個數組中存放的值來拼信息窗里的html代碼,存在變量content中,然后:
26                      var info = new BMap.InfoWindow(content);
27                      //利用在第一個問題中的markerArr數組設置觸發函數,但注意數組的索引值不能用i,因為函數運行時i已不存在,因此在構造結果面板時,每個節點我添加了一個index屬性,並用下面的代碼獲取,設置屬性的代碼類似於:<div id='poi5' index='5'></div>                        
28                      markerArr[$(this).attr("index")].openInfoWindow(info);
29                 })
30              } 
31          } 
32      },
33      pageCapacity: 8  
34  });
 

這個工作在onSearchComplete中完成,關鍵代碼如上



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM