1. 程式人生 > >百度地圖API詳解之地圖標註(一)

百度地圖API詳解之地圖標註(一)

本文將向大家介紹百度地圖API的標註(Marker)的使用方法和一些實現細節。

標註概述

標註(Marker)是用來表示一個點位置的可見元素,每個標註自身都包含地理資訊。比如你在西單商場位置添加了一個標註,不論地圖移動、縮放,標註都會跟隨一起移動,保證其始終指向正確的地理位置。

從上面的圖可以看出,不論地圖如何變化標註始終指向“西單商場”的位置。

如何知道某個點的座標?

上例中我們在西單商場位置添加了一個標註,那麼我是如何知道它的座標點呢?可以通過API的事件機制來獲取:

map.addEventListener('click', function(e){
console.log(e.point);
});

我們在map物件上添加了一個click事件的監聽函式,當點選地圖上某個位置時,監聽函式通過控制檯把當前點選的位置輸出出來(注意需要有控制檯的支援,比如firebug,如果沒有控制檯則可使用alert把point的lng和lat屬性輸出出來)。此外,你也可以使用API提供的座標拾取工具來完成(http://dev.baidu.com/wiki/static/map/API/tool/getPoint/),它支援檢索並且點選地圖上任意位置時會出現該位置的座標。

標註元素組成

從DOM元素構成角度看,一個完整的標註是由以下幾個部分組成的:

  • 標註點選區域
  • 標註圖示
  • 標註陰影

下面是示意圖:

在地圖API實現中,這三個DOM元素分別位於不同的容器中,這些容器可以通過map.getPanes()方法獲得,其中markerMouseTarget就是標註點選區域所在容器、markerPane為標註圖示所在容器,markerShadow為標註陰影所在圖層。你可能會在自定義覆蓋物時需要這些容器物件,這裡只需要知道Marker的各個部分是如何放置的即可。

自定義標註圖示

標註的圖示是可以自定義的,通過Icon類可以自定義標註的圖示,比如我希望使用下面這個圖片作為標註圖示:

已知這個圖示大小為20x32。我們初始化地圖,接著定義Icon,並賦給一個Marker例項:

複製程式碼 複製程式碼
var map =new BMap.Map('container');
map.centerAndZoom(new BMap.Point(116.380797, 39.918497), 18);

var icon = new BMap.Icon('pin.png', new BMap.Size(20, 32), {
anchor: new BMap.Size(10, 30)
});

var mkr =new BMap.Marker(new BMap.Point(116.38075,39.918986), {
icon: icon
});

map.addOverlay(mkr);
複製程式碼 複製程式碼

我們給定icon所需圖片的url,接著是圖片的尺寸,另外我們還增加了anchor屬性,這個是幹什麼用的呢?在自定義標註圖示時有一點需要注意的就是標註的定位點(anchor),通俗的講就是要指定圖片的哪個位置是與標註真正的位置對應在一起。我們通過下面的圖示來說明:

我們獲取到地圖上一個位置(上圖中標註下端所在的黑色小方塊),那麼我也希望我標註中間下端指向這個位置,這個就需要通過anchor來調節。anchor的意義如下圖所示:

即定位點距離圖片左上角的偏移量。

如果不給anchor的話,API會自動獲取圖片中心點作為anchor位置:

我們看到標註圖片中心的位置覆蓋在那個小方塊區域。

除了anchor之外,還有一個infoWindowAnchor屬性,它是用來控制資訊視窗開啟的位置的(注意這裡呼叫的是Marker的openInfoWindow方法,而不是Map的openInfoWindow方法),預設情況下它和icon的anchor是一個位置:

標註被InfoWindow的底角擋住了,通過infoWindowAnchor屬性就可以改變開啟位置:

var icon =new BMap.Icon('pin.png', new BMap.Size(20, 32), {
anchor: new BMap.Size(10, 30),
infoWindowAnchor: new BMap.Size(10, 0)
})

再看看效果:

尖角位置已經發生了改變。

標註拖拽

標註支援拖拽,並且可以配置是否有動畫效果,我們修改建立標註的程式碼:

var mkr =new BMap.Marker(new BMap.Point(116.38075,39.918986), {
icon: icon,
enableDragging: true,
raiseOnDrag: true
});

這裡開啟了拖拽功能以及響應的動畫效果。如果此時拖拽地圖你會得到如下效果:

通過監聽標註的dragend事件,你可以知道拖拽結束後標註的地理位置:

mkr.addEventListener('dragend', function(e){
alert(e.point.lng +', '+ e.point.lat);
})

標註陰影

為了增加立體感,可以單獨給標註新增陰影,當然你也可以把陰影直接畫在icon所用的圖片上,但是由於陰影和標註本身在一起,所以就不建議使用任何動畫效果,否則會缺乏真實感。陰影可以通過MarkerOptions的shadow屬性配置,型別也是一個Icon例項。具體使用方法和icon屬性一樣,這裡就不贅述了。