聲明:轉載自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中完成,關鍵代碼如上