【進(jìn)階系列】地理位置專(zhuān)題

1????Geolocation簡(jiǎn)介

????????HTML5 Geolocation(地理定位)用于定位用戶(hù)的位置邀层。


1.1??定位用戶(hù)的位置

????????HTML5 Geolocation API 用于獲得用戶(hù)的地理位置癣猾。

????????鑒于該特性可能侵犯用戶(hù)的隱私脚线,除非用戶(hù)同意濒生,否則用戶(hù)位置信息是不可用的冕屯。

1.2??瀏覽器支持

????????Internet Explorer 9磺送、Firefox必尼、Chrome、Safari 以及 Opera 支持地理定位抒倚。

? ??????注釋?zhuān)?/b>對(duì)于擁有 GPS 的設(shè)備褐着,比如 iPhone,地理定位更加精確托呕。

2????接口API

2.1??獲取地理位置方法getCurrentPosition()

????????請(qǐng)使用 getCurrentPosition() 方法來(lái)獲得用戶(hù)的位置含蓉。

????????下例是一個(gè)簡(jiǎn)單的地理定位實(shí)例,可返回用戶(hù)位置的經(jīng)度和緯度项郊。

實(shí)例

<script>

? var x=document.getElementById("demo");


? function getLocation()?? {??

????if (navigator.geolocation) {????

? ????navigator.geolocation.getCurrentPosition(showPosition);????

????}??

????else{

? ????x.innerHTML="Geolocation is not supported by this browser.";

????}??

? }


? function showPosition(position)??

? {

????????x.innerHTML="Latitude: " +position.coords.latitude +?? "<br/>Longitude: " + position.coords.longitude;??

? }

</script>

親自試一試

例子解釋?zhuān)?/p>

·?????檢測(cè)是否支持地理定位

·?????如果支持馅扣,則運(yùn)行 getCurrentPosition() 方法。如果不支持着降,則向用戶(hù)顯示一段消息差油。

·?????如果getCurrentPosition()運(yùn)行成功,則向參數(shù)showPosition中規(guī)定的函數(shù)返回一個(gè)coordinates對(duì)象

·?????showPosition() 函數(shù)獲得并顯示經(jīng)度和緯度

上面的例子是一個(gè)非橙味矗基礎(chǔ)的地理定位腳本蓄喇,不含錯(cuò)誤處理。

2.2??getCurrentPosition()處理錯(cuò)誤和拒絕

????????getCurrentPosition() 方法的第二個(gè)參數(shù)用于處理錯(cuò)誤交掏。它規(guī)定當(dāng)獲取用戶(hù)位置失敗時(shí)運(yùn)行的函數(shù):

實(shí)例

function showError(error)??

{??

? switch(error.code)????

? {????

? ? case error.PERMISSION_DENIED:??????

? ? ? ? x.innerHTML="User denied the request for Geolocation."??????

? ? ? ? break;????

????case error.POSITION_UNAVAILABLE:??????

? ? ? ? x.innerHTML="Locationinformation is unavailable."??????

? ? ? ? break;????

????case error.TIMEOUT:??????

? ? ? ? x.innerHTML="Therequest to get user location timed out."??????

? ? ? ? break;????

????case error.UNKNOWN_ERROR:??????

? ? ? ? x.innerHTML="Anunknown error occurred."??????

? ? ? ? break;????

? }??

}

親自試一試

錯(cuò)誤代碼:

·?????Permission denied - 用戶(hù)不允許地理定位

·?????Position unavailable - 無(wú)法獲取當(dāng)前位置

·?????Timeout - 操作超時(shí)

2.3??在地圖中顯示結(jié)果

????????如需在地圖中顯示結(jié)果妆偏,您需要訪問(wèn)可使用經(jīng)緯度的地圖服務(wù),比如谷歌地圖或百度地圖:

實(shí)例

function showPosition(position)

{

? var latlon=position.coords.latitude+","+position.coords.longitude;?

? var img_url="http://maps.googleapis.com/maps/api/staticmap?center="+latlon+"&zoom=14&size=400x300&sensor=false";?

? document.getElementById("mapholder").innerHTML="<imgsrc='"+img_url+"' />";

}

親自試一試

????????在上例中盅弛,我們使用返回的經(jīng)緯度數(shù)據(jù)在谷歌地圖中顯示位置(使用靜態(tài)圖像)钱骂。

谷歌地圖腳本

????????上面的鏈接向您演示如何使用腳本來(lái)顯示帶有標(biāo)記叔锐、縮放和拖曳選項(xiàng)的交互式地圖。

2.4??給定位置的信息

????????本頁(yè)演示的是如何在地圖上顯示用戶(hù)的位置见秽。不過(guò)愉烙,地理定位對(duì)于給定位置的信息同樣很有用處。

案例:

·?????更新本地信息

·?????顯示用戶(hù)周?chē)呐d趣點(diǎn)

·?????交互式車(chē)載導(dǎo)航系統(tǒng) (GPS)

? ??getCurrentPosition() 方法 - 返回?cái)?shù)據(jù)

????????若成功解取,則 getCurrentPosition() 方法返回對(duì)象步责。始終會(huì)返回latitude、longitude 以及 accuracy 屬性肮蛹。如果可用勺择,則會(huì)返回其他下面的屬性。

2.5??watchPosition()方法

????watchPosition() - 返回用戶(hù)的當(dāng)前位置伦忠,并繼續(xù)返回用戶(hù)移動(dòng)時(shí)的更新位置(就像汽車(chē)上的 GPS)省核。

????clearWatch() - 停止 watchPosition() 方法

????????下面的例子展示 watchPosition() 方法。您需要一臺(tái)精確的 GPS 設(shè)備來(lái)測(cè)試該例(比如iPhone):

實(shí)例

<script>

? var x=document.getElementById("demo");

? function getLocation()??

? {??

????if (navigator.geolocation)???? ??

????{

? ? ? ? navigator.geolocation.watchPosition(showPosition);????

????}??

????else

????{

? ????????x.innerHTML="Geolocation is not supported by this browser.";

????}

? }

? function showPosition(position)??

? {??

????????x.innerHTML="Latitude: " +position.coords.latitude +?? "<br/>Longitude: " + position.coords.longitude;??

? }

</script>

親自試一試


2.6??clearWatch()方法


3????基于百度地圖API

3.1??使用步驟

3.1.1????引用百度地圖API文件

????????引用百度地圖API文件 使用移動(dòng)瀏覽器版JSAPI需要引用如下文件:

<scriptsrc="http://api.map.baidu.com/api?type=quick&ak=您的密鑰&v=1.0"type="text/javascript"></script>?

申請(qǐng)ak請(qǐng)?jiān)L問(wèn)如下頁(yè)面:http://lbsyun.baidu.com/apiconsole/key昆码。


3.1.2????創(chuàng)建地圖實(shí)例

var map = newBMap.Map("l-map");??

? ????????位于BMap命名空間下的Map類(lèi)表示地圖气忠,通過(guò)new操作符可以創(chuàng)建一個(gè)地圖實(shí)例。其參數(shù)可以是元素id也可以是元素對(duì)象赋咽。????

????????注意在調(diào)用此構(gòu)造函數(shù)時(shí)應(yīng)確保容器元素已經(jīng)添加到地圖上旧噪。

3.1.3????創(chuàng)建點(diǎn)坐標(biāo)

var point = newBMap.Point(116.404, 39.915);??

????????這里我們使用BMap命名空間下的Point類(lèi)來(lái)創(chuàng)建一個(gè)坐標(biāo)點(diǎn)。Point類(lèi)描述了一個(gè)地理坐標(biāo)點(diǎn)脓匿,其中116.404表示經(jīng)度淘钟,39.915表示緯度。

地圖初始化?

map.centerAndZoom(point, 14);?

????????在創(chuàng)建地圖實(shí)例后陪毡,我們需要對(duì)其進(jìn)行初始化米母,BMap.Map.centerAndZoom()方法要求設(shè)置中心點(diǎn)坐標(biāo)和地圖級(jí)別。 地圖必須經(jīng)過(guò)初始化才可以執(zhí)行其他操作毡琉。

3.1.4????地圖縮放與移動(dòng)

????????地圖被實(shí)例化并完成初始化以后铁瞒,就可以對(duì)地圖進(jìn)行進(jìn)行各種操作,如縮放桅滋、拖拽慧耍。

1.移動(dòng)地圖方法

map.enableDragging();?

????????以上方法默認(rèn)開(kāi)啟,即無(wú)論設(shè)置還是不設(shè)置該方法丐谋,均可用手指拖動(dòng)地圖實(shí)現(xiàn)地圖的移動(dòng)芍碧。 除以上方法外,以下兩個(gè)方法也可以通過(guò)改變地圖中心點(diǎn)實(shí)現(xiàn)地圖的移動(dòng)号俐。

map.setCenter(new BMap.Point(116.409, 39.918));???? 
map.panTo(new BMap.Point(116.409, 39.918));

2.縮放地圖方法

map.addControl(new BMap. ZoomControl ());

????????您除了可以在地圖上雙指縮放地圖外师枣,還可以通過(guò)添加縮放控件、操作縮放控件實(shí)現(xiàn)地圖的縮放萧落。

3.1.5???? 地圖的運(yùn)行和調(diào)試

????????如上代碼保存時(shí)践美,選擇utf-8的編碼方式且后綴名存為html,之后將html頁(yè)面放置到apache等網(wǎng)絡(luò)服務(wù)器上找岖,通過(guò)手機(jī)瀏覽器訪問(wèn)相應(yīng)地址即可顯示如下地圖:

????????如果要調(diào)試代碼陨倡,可以在PC端模擬移動(dòng)端瀏覽器進(jìn)行。以下以chrome瀏覽器為例說(shuō)明PC端設(shè)置方式:

????1. chrome瀏覽器下F12快捷鍵彈出如下調(diào)試工具:

????2. 點(diǎn)擊如上圖右下角紅框內(nèi)的設(shè)置圖標(biāo)许布,彈出設(shè)置面板:

????????第一個(gè)紅框用于設(shè)置PC端模擬的手機(jī)型號(hào)兴革,如iOS4或者Android;第二個(gè)紅框選擇后蜜唾,可以用鼠標(biāo)模擬手指拖拽地圖杂曲。

3.1.6????百度示例代碼

<!DOCTYPE html>?

<html>?

? <head>?

? ? <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />?

????<meta name="viewport" content="initial-scale=1.0,user-scalable=no" />?

????<style type="text/css">?

? ? ? body, html,#l-map

? ? ? {

????????width:100%;height: 100%;overflow: hidden;hidden;margin:0;

? ? ? }?

????</style>?

????<script type="text/javascript" src="http://api.map.baidu.com/api?type=quick&ak=您的密鑰&v=1.0">????</script>?

????<title>顯示地圖</title>?

? </head>?

? <body>?

??????????? <div id="l-map"></div>?

? </body>

</html>?

<script type="text/javascript">?

? var map = newBMap.Map("l-map");?

? map.centerAndZoom(newBMap.Point(116.404, 39.915), 14);?

</script>

3.2??高級(jí)API

Class:極速版JS總類(lèi)/極速版核心類(lèi)

http://developer.baidu.com/map/reference/index.php?title=Class:%E6%9E%81%E9%80%9F%E7%89%88JS%E6%80%BB%E7%B1%BB/%E6%9E%81%E9%80%9F%E7%89%88%E6%A0%B8%E5%BF%83%E7%B1%BB

3.2.1????縮放、比例尺控件

3.2.1.1?添加袁余、刪除控件

????????地圖上的控件包括:縮放控件擎勘、比例尺控件和自定義控件。您可以通過(guò)addControl颖榜、removeControl方法添加棚饵、刪除地圖控件。

????1. 可以同時(shí)在地圖上添加縮放控件和比例尺控件掩完。

var map = newBMap.Map("l-map");??

map.centerAndZoom(newBMap.Point(116.404, 39.915), 14);??????

var zoomControl=new BMap.ZoomControl();??

map.addControl(zoomControl);//添加縮放控件??

var scaleControl=new BMap.ScaleControl();??

map.addControl(scaleControl);//添加比例尺控件??

????2. 刪除控件方法如下:

map.removeControl(zoomControl);//刪除縮放控件??

map.removeControl(scaleControl);? //刪除比例尺控件

3.2.1.2?控制控件位置

????????初始化控件時(shí)噪漾,可提供一個(gè)可選參數(shù),其中的anchor和offset屬性共同控制控件在地圖上的位置且蓬。

????????控件托琅穑靠位置:

????????anchor表示控件的停靠位置恶阴,即控件驼┦ぃ靠在地圖的哪個(gè)角。當(dāng)?shù)貓D尺寸發(fā)生變化時(shí)存淫,控件會(huì)根據(jù)驮耪叮靠位置的不同來(lái)調(diào)整自己的位置。

????????anchor允許的值為:

????BMAP_ANCHOR_TOP_LEFT 表示控件定位于地圖的左上角桅咆。

????BMAP_ANCHOR_TOP_RIGHT 表示控件定位于地圖的右上角括授。

????BMAP_ANCHOR_BOTTOM_LEFT 表示控件定位于地圖的左下角。

????BMAP_ANCHOR_BOTTOM_RIGHT 表示控件定位于地圖的右下角岩饼。

3.2.1.3?控件位置偏移

????????除了指定图孕椋靠位置外,還可以通過(guò)偏移量來(lái)指示控件距離地圖邊界有多少像素籍茧。如果兩個(gè)控件的桶媸觯靠位置相同,那么控件可能會(huì)重疊在一起寞冯,這時(shí)就可以通過(guò)偏移值使二者分開(kāi)顯示渴析。本示例將比例尺放置在地圖的左下角晚伙,由于API默認(rèn)會(huì)有版權(quán)信息,因此需要添加一些偏移值以防止控件重疊俭茧。

var opts ={offset: new BMap.Size(70, 5)}??????

map.addControl(newBMap.ScaleControl(opts));?

3.2.1.4?自定義控件

????????百度地圖API允許您通過(guò)繼承Control來(lái)創(chuàng)建自定義地圖控件咆疗。要?jiǎng)?chuàng)建可用的自定義控件,您需要做以下工作:

????????定義一個(gè)自定義控件的構(gòu)造函數(shù)母债。?設(shè)置自定義控件構(gòu)造函數(shù)的prototype屬性為Control的實(shí)例午磁,以便繼承控件基類(lèi)。?實(shí)現(xiàn)initialize()方法并提供defaultAnchor和defaultOffset屬性毡们。

3.2.1.4.1 定義構(gòu)造函數(shù)并繼承Control

????????首先您需要定義自定義控件的構(gòu)造函數(shù)迅皇,并在構(gòu)造函數(shù)中提供defaultAnchor和defaultOffset兩個(gè)屬性,以便API正確定位控件位置衙熔,接著讓其繼承于Control登颓。在下面的示例中我們定義一個(gè)名為ZoomControl的控件,每一次點(diǎn)擊將地圖放大兩個(gè)級(jí)別青责。它具有文本標(biāo)識(shí)挺据,而不是平移縮放控件中使用的圖形圖標(biāo)。

// 定義一個(gè)控件類(lèi)脖隶,即function?????? 
function ZoomControl(){?????????? 
??// 設(shè)置默認(rèn)捅饽停靠位置和偏移量???????? 
??this.defaultAnchor = BMAP_ANCHOR_TOP_LEFT;?????????? 
??this.defaultOffset = new BMap.Size(10, 10);?????? 
}?????? 
// 通過(guò)JavaScript的prototype屬性繼承于BMap.Control????? 
ZoomControl.prototype = new BMap.Control();???? 

3.2.1.4.2 初始化自定義控件

????????當(dāng)調(diào)用map.addControl()方法添加自定義控件時(shí),API會(huì)調(diào)用該對(duì)象的initialize()方法用來(lái)初始化控件产阱,您需要實(shí)現(xiàn)此方法并在其中創(chuàng)建控件所需的DOM元素婉称,并添加DOM事件。所有自定義控件中的DOM元素最終都應(yīng)該添加到地圖容器(即地圖所在的DOM元素)中去构蹬,地圖容器可以通過(guò)map.getContainer()方法獲得王暗。最后initialize()方法需要返回控件容器的DOM元素。

// 自定義控件必須實(shí)現(xiàn)initialize方法庄敛,并且將控件的DOM元素返回????? 
// 在本方法中創(chuàng)建個(gè)div元素作為控件的容器俗壹,并將其添加到地圖容器中????? 
ZoomControl.prototype.initialize = function(map)
{?????? 
??//創(chuàng)建一個(gè)DOM元素????? 
??var div = document.createElement("div");?????? 
??// 添加文字說(shuō)明?????? 
??div.appendChild(document.createTextNode("放大2級(jí)"));??????? 
??// 設(shè)置樣式?????? 
??div.style.cursor = "pointer";?????? 
??div.style.border = "1px solid gray";?????? 
??div.style.backgroundColor = "white";?????? 
??// 綁定事件,點(diǎn)擊一次放大兩級(jí)?????? 
??div.onclick = function(e){???????????? 
????map.setZoom(map.getZoom() + 2);?????? 
??}?????? 
??// 添加DOM元素到地圖中????? 
??map.getContainer().appendChild(div);??????? 
??return div;???? 
}?? 

添加自定義控件?

添加自定義控件與添加其他控件方法一致藻烤,調(diào)用map.addControl()方法即可绷雏。

// 創(chuàng)建控件實(shí)例?????? 
var myZoomCtrl = new ZoomControl();?????? 
// 添加到地圖當(dāng)中?????? 
map.addControl(myZoomCtrl); 

3.2.2????地圖覆蓋物

3.2.2.1?地圖覆蓋物概述

????????所有疊加或覆蓋到地圖的內(nèi)容,我們統(tǒng)稱(chēng)為地圖覆蓋物怖亭。如標(biāo)注涎显、折線、信息窗口等兴猩。覆蓋物擁有自己的地理坐標(biāo)期吓,當(dāng)您拖動(dòng)或縮放地圖時(shí),它們會(huì)相應(yīng)的移動(dòng)倾芝。地圖API提供了如下幾種覆蓋物:

????Overlay:覆蓋物的抽象基類(lèi)讨勤,所有的覆蓋物均繼承此類(lèi)的方法箭跳。

????Marker:標(biāo)注表示地圖上的點(diǎn),可自定義標(biāo)注的圖標(biāo)悬襟。

????Polyline:表示地圖上的折線衅码。

????InfoWindow:信息窗口也是一種特殊的覆蓋物,它可以展示更為豐富的文字和多媒體信息脊岳。注意:同一時(shí)刻只能有一個(gè)信息窗口在地圖上打開(kāi)。

????????可以使用map.addOverlay方法向地圖添加覆蓋物垛玻,使用map.removeOverlay 方法移除覆蓋物割捅,注意此方法不適用于InfoWindow。

3.2.2.2?標(biāo)注

????????標(biāo)注表示地圖上的點(diǎn)帚桩。API提供了默認(rèn)圖標(biāo)樣式亿驾,您也可以通過(guò)Icon類(lèi)來(lái)指定自定義圖標(biāo)。Marker的構(gòu)造函數(shù)的參數(shù)為Point和MarkerOptions(可選)账嚎。注意:當(dāng)您使用自定義圖標(biāo)時(shí)莫瞬,標(biāo)注的地理坐標(biāo)點(diǎn)將位于標(biāo)注所用圖標(biāo)的中心位置,您可通過(guò)Icon的offset屬性修改標(biāo)定位置郭蕉。

????????下面的示例向地圖中心點(diǎn)添加了一個(gè)標(biāo)注疼邀,并使用默認(rèn)的標(biāo)注樣式。

var map = new BMap.Map("l-map");?? 
map.centerAndZoom(new BMap.Point(116.404, 39.915), 14);?? 
// 創(chuàng)建標(biāo)注
var marker = new BMap.Marker(new BMap.Point(116.404, 39.915));???? 
map.addOverlay(marker);

3.2.2.2.1 定義標(biāo)注圖標(biāo)

????????通過(guò)Icon類(lèi)可實(shí)現(xiàn)自定義標(biāo)注的圖標(biāo)召锈,下面示例通過(guò)參數(shù)MarkerOptions的icon屬性進(jìn)行設(shè)置旁振,您也可以使用marker.setIcon()方法。

var map = new BMap.Map("container");?????? 
var point = new BMap.Point(116.404, 39.915);?????? 
map.centerAndZoom(point, 15);? // 編寫(xiě)自定義函數(shù)涨岁,創(chuàng)建標(biāo)注???? ?
function addMarker(point, index)
{? 
??// 創(chuàng)建圖標(biāo)對(duì)象???? ???
??var myIcon = new BMap.Icon("http://api.map.baidu.com/mapCard/img/location.gif",??????new BMap.Size(14, 23), {????????????? 
    // 指定定位位置拐袜。???? ????????
    // 當(dāng)標(biāo)注顯示在地圖上時(shí),其所指向的地理位置距離圖標(biāo)左上????? ????????
    // 角各偏移7像素和25像素梢薪。您可以看到在本例中該位置即是???? ????????
    // 圖標(biāo)中央下端的尖角位置蹬铺。????? ????????
    anchor: new BMap.Size(7, 25),?????????????? 
??});????????? 
??// 創(chuàng)建標(biāo)注對(duì)象并添加到地圖???? ???
??var marker = new BMap.Marker(point, {icon: myIcon});???????? 
??map.addOverlay(marker);??????? 
}??????? 
// 隨機(jī)向地圖添加10個(gè)標(biāo)注????? ??
var bounds = map.getBounds();??????? 
var lngSpan = bounds.getNorthEast().lng - bounds.getSouthWest().lng;??????? 
var latSpan = bounds.getNorthEast().lat- bounds.getSouthWest().lat;
for (var i = 0; i < 10; i++) 
{??????? 
??var point = new BMap.Point(bounds.getSouthWest().lng + lngSpan * (Math.random() * 0.7 + 0.15), bounds.getSouthWest().lat + latSpan * (Math.random() * 0.7 + 0.15));??????? 
??addMarker(point, i);?? 
}

監(jiān)聽(tīng)標(biāo)注事件?

????????事件方法與Map事件機(jī)制相同”玻可參考事件部分甜攀。

marker.addEventListener("click", function()
? {???????? 
????alert("您點(diǎn)擊了標(biāo)注");?????? 
??});

3.2.2.3?信息窗口

????????信息窗口在地圖上方的浮動(dòng)顯示HTML內(nèi)容。信息窗口可直接在地圖上的任意位置打開(kāi)畜疾,也可以在標(biāo)注對(duì)象上打開(kāi)(此時(shí)信息窗口的坐標(biāo)與標(biāo)注的坐標(biāo)一致)赴邻。您可以使用InfoWindow來(lái)創(chuàng)建一個(gè)信息窗實(shí)例,注意同一時(shí)刻地圖上只能有一個(gè)信息窗口處于打開(kāi)狀態(tài)啡捶。

var opts = {?????????? 
??width : 100,???? // 信息窗口寬度????? ?????
??height: 50,???? // 信息窗口高度????? ?????
??title : "Hello"? // 信息窗口標(biāo)題???? ?
}
// 創(chuàng)建信息窗口對(duì)象?????? 
var infoWindow = new BMap.InfoWindow("World", opts);? ???????
// 打開(kāi)信息窗口
map.openInfoWindow(infoWindow, marker.getPosition());????? 

3.2.2.4?折線

????????Polyline表示地圖上的折線覆蓋物姥敛。它包含一組點(diǎn),并將這些點(diǎn)連接起來(lái)形成折線瞎暑。

添加折線?

????????折線在地圖上繪制為一系列直線段彤敛∮敕可以自定義這些線段的顏色、粗細(xì)和透明度墨榄。顏色可以是十六進(jìn)制數(shù)字形式(比如:#ff0000)或者是顏色關(guān)鍵字(比如:red)玄糟。 以下代碼段會(huì)在兩點(diǎn)之間創(chuàng)建6像素寬的藍(lán)色折線:

var polyline = new BMap.Polyline([new BMap.Point(116.399, 39.910),???????????????????????????????????????? new BMap.Point(116.405, 39.920)],?????????????????????????????????????? {strokeColor:"blue", strokeWeight:6, strokeOpacity:0.5});?????? 
map.addOverlay(polyline);

3.2.2.5?自定義覆蓋物

????????要?jiǎng)?chuàng)建自定義覆蓋物,您需要做以下工作:

????1袄秩、 定義一個(gè)自定義覆蓋物的構(gòu)造函數(shù)阵翎,通過(guò)構(gòu)造函數(shù)參數(shù)可以傳遞一些自由的變量。

????2之剧、 設(shè)置自定義覆蓋物對(duì)象的prototype屬性為Overlay的實(shí)例郭卫,以便繼承覆蓋物基類(lèi)。

????3背稼、 實(shí)現(xiàn)initialize方法贰军,當(dāng)調(diào)用map.addOverlay方法時(shí),API會(huì)調(diào)用此方法蟹肘。

????4词疼、 實(shí)現(xiàn)draw方法。

3.2.2.5.1 定義構(gòu)造函數(shù)并繼承Overlay

????????首先您需要定義自定義覆蓋物的構(gòu)造函數(shù)帘腹,在下面的示例中我們定義一個(gè)名為SquareOverlay的構(gòu)造函數(shù)贰盗,它包含中心點(diǎn)和邊長(zhǎng)兩個(gè)參數(shù),用來(lái)在地圖上創(chuàng)建一個(gè)方形覆蓋物竹椒。

// 定義自定義覆蓋物的構(gòu)造函數(shù)??? ???
function SquareOverlay(center, length, color)
{?????????? 
??this._center = center;?????????? 
??this._length = length;?????????? 
??this._color = color;???????? 
}?????? 
// 繼承APIBMap.Overlay????? ???
SquareOverlay.prototype = new BMap.Overlay();

3.2.2.5.2 初始化自定義覆蓋物

????????當(dāng)調(diào)用map.addOverlay方法添加自定義覆蓋物時(shí)童太,API會(huì)調(diào)用該對(duì)象的initialize方法用來(lái)初始化覆蓋物,在初始化過(guò)程中需要?jiǎng)?chuàng)建覆蓋物所需要的DOM元素胸完,并添加到地圖相應(yīng)的容器中书释。地圖提供了若干容器供覆蓋物展示,通過(guò)map.getPanes方法可以得到這些容器元素赊窥,它們包括:

??????floatPane爆惧。

??????markerMouseTarget

??????floatShadow

??????markerPane

??????mapPane

????????這些對(duì)象代表了不同的覆蓋物容器元素,它們之間存在著覆蓋關(guān)系锨能,最上一層為floatPane扯再,用于顯示信息窗口內(nèi)容,下面依次為標(biāo)注點(diǎn)擊區(qū)域?qū)又酚觥⑿畔⒋翱陉幱皩酉ㄗ琛⑽谋緲?biāo)注層、標(biāo)注層和矢量圖形層倔约。 我們自定義的方形覆蓋物可以添加到任意圖層上秃殉,這里我們選擇添加到markerPane上,作為其一個(gè)子結(jié)點(diǎn)。

// 實(shí)現(xiàn)初始化方法??? ?
SquareOverlay.prototype.initialize = function(map)
{?????? 
??// 保存map對(duì)象實(shí)例???? ?????
??this._map = map;?????????? 
??// 創(chuàng)建div元素钾军,作為自定義覆蓋物的容器???? ?????
??var div = document.createElement("div");?????????? 
??div.style.position = "absolute";?????????? 
??// 可以根據(jù)參數(shù)設(shè)置元素外觀???? ?????
??div.style.width = this._length + "px"; 
??div.style.height = this._length + "px"; 
??div.style.background = this._color;
? // div添加到覆蓋物容器中???? ?????
??map.getPanes().markerPane.appendChild(div); 
??// 保存div實(shí)例???? ?????
??this._div = div;???????? 
??// 需要將div元素作為方法的返回值鳄袍,當(dāng)調(diào)用該覆蓋物的show???? ?
??// hide方法吏恭,或者對(duì)覆蓋物進(jìn)行移除時(shí)拗小,API都將操作此元素。???? ?????
??return div;?????? 
}

3.2.2.5.3 繪制覆蓋物

????????到目前為止樱哼,我們僅僅把覆蓋物添加到了地圖上哀九,但是并沒(méi)有將它放置在正確的位置上。您需要在draw方法中設(shè)置覆蓋物的位置搅幅,每當(dāng)?shù)貓D狀態(tài)發(fā)生變化(比如:位置移動(dòng)勾栗、級(jí)別變化)時(shí),API都會(huì)調(diào)用覆蓋物的draw方法盏筐,用于重新計(jì)算覆蓋物的位置。通過(guò)map.pointToOverlayPixel方法可以將地理坐標(biāo)轉(zhuǎn)換到覆蓋物的所需要的像素坐標(biāo)砸讳。

// 實(shí)現(xiàn)繪制方法???? ?
SquareOverlay.prototype.draw = function()
{?????? 
??// 根據(jù)地理坐標(biāo)轉(zhuǎn)換為像素坐標(biāo)琢融,并設(shè)置給容器????? ????
??var position = this._map.pointToOverlayPixel(this._center);???? 
??this._div.style.left = position.x - this._length / 2 + "px";???? 
??this._div.style.top = position.y - this._length / 2 + "px";?????? 
}

3.2.2.5.4 移除覆蓋物

????????當(dāng)調(diào)用map.removeOverlay或者map.clearOverlays方法時(shí),API會(huì)自動(dòng)將initialize方法返回的DOM元素進(jìn)行移除簿寂。

3.2.2.5.5 顯示和隱藏覆蓋物

????????自定義覆蓋物會(huì)自動(dòng)繼承Overlay的show和hide方法漾抬,方法會(huì)修改由initialize方法返回的DOM元素的style.display屬性。如果自定義覆蓋物元素較為復(fù)雜常遂,您也可以自己實(shí)現(xiàn)show和hide方法纳令。

// 實(shí)現(xiàn)顯示方法????? ?
SquareOverlay.prototype.show = function()
{ ??????????
??if (this._div)
? {?????????????? 
????this._div.style.display = "";?????????? 
??}?????? 
}???????? 
// 實(shí)現(xiàn)隱藏方法??? ?
SquareOverlay.prototype.hide = function()
{?????????? 
??if (this._div)
? {?????????????? 
????this._div.style.display = "none";?????????? 
??}?????? 
}

3.2.2.5.6 自定義其他方法

????????通過(guò)構(gòu)造函數(shù)的prototype屬性,您可以添加任何自定義的方法克胳,比如下面這個(gè)方法每調(diào)用一次就能改變覆蓋物的顯示狀態(tài):

// 添加自定義方法???? ?
SquareOverlay.prototype.toggle = function()
{?????????? 
??if (this._div)
? {????????????? 
????if (this._div.style.display == "")
????{????????????????? 
??????this.hide();?????????????? 
????}????????????? 
????else {????????????????? 
??????this.show();?????????????? 
????}????????? 
??}?????? 
}

3.2.2.5.7 添加覆蓋物

? ? ? 您現(xiàn)在已經(jīng)完成了一個(gè)完整的自定義覆蓋物的編寫(xiě)平绩,可以添加到地圖上了。

// 添加自定義覆蓋物???? ??
var mySquare = new SquareOverlay(map.getCenter(), 100, "red");? 
map.addOverlay(mySquare);

3.2.3????地圖事件

3.2.3.1?地圖事件概述

????????瀏覽器中的JavaScript是“事件驅(qū)動(dòng)的”漠另,這表示JavaScript通過(guò)生成事件來(lái)響應(yīng)交互捏雌,并期望程序能夠“監(jiān)聽(tīng)”感興趣的活動(dòng)。例如笆搓,在瀏覽器中性湿,用戶(hù)的鼠標(biāo)和鍵盤(pán)交互可以創(chuàng)建在DOM內(nèi)傳播的事件。對(duì)某些事件感興趣的程序會(huì)為這些事件注冊(cè)JavaScript事件監(jiān)聽(tīng)器满败,并在接收這些事件時(shí)執(zhí)行代碼肤频。

????????百度地圖API擁有一個(gè)自己的事件模型,程序員可監(jiān)聽(tīng)地圖API對(duì)象的自定義事件算墨,使用方法和DOM事件類(lèi)似宵荒。但請(qǐng)注意,地圖API事件是獨(dú)立的,與標(biāo)準(zhǔn)DOM事件不同骇扇。

3.2.3.2?事件監(jiān)聽(tīng)

????????百度地圖API中的大部分對(duì)象都含有addEventListener方法摔竿,您可以通過(guò)該方法來(lái)監(jiān)聽(tīng)對(duì)象事件。例如少孝,BMap.Map包含click继低、dblclick等事件。在特定環(huán)境下這些事件會(huì)被觸發(fā)稍走,同時(shí)監(jiān)聽(tīng)函數(shù)會(huì)得到相應(yīng)的事件參數(shù)e袁翁,比如當(dāng)用戶(hù)點(diǎn)擊地圖時(shí),e參數(shù)會(huì)包含點(diǎn)擊點(diǎn)的地理位置point婿脸。

????????有關(guān)地圖API對(duì)象的事件粱胜,請(qǐng)參考完整的API參考文檔。

????????addEventListener方法有兩個(gè)參數(shù):監(jiān)聽(tīng)的事件名稱(chēng)和事件觸發(fā)時(shí)調(diào)用的函數(shù)狐树。在下面示例中焙压,每當(dāng)用戶(hù)點(diǎn)擊地圖時(shí),會(huì)彈出一個(gè)警告框抑钟。

var map = new BMap.Map("l-map");?????? 
map.centerAndZoom(new BMap.Point(116.404, 39.915), 11);?????? 
map.addEventListener("click", function(){????????????? 
??alert("您點(diǎn)擊了地圖涯曲。");?????? 
});

????????通過(guò)監(jiān)聽(tīng)事件還可以捕獲事件觸發(fā)后的狀態(tài)。下面示例顯示用戶(hù)拖動(dòng)地圖后地圖中心的經(jīng)緯度信息在塔。

var map = new BMap.Map("l-map");?????? 
map.centerAndZoom(new BMap.Point(116.404, 39.915), 11);?????? 
map.addEventListener("moveend", function(){????????????? 
??var center = map.getCenter();???????????? 
??alert("地圖中心點(diǎn)變更為:" + center.lng + ", " + center.lat);?????? 
});

3.2.3.3?事件參數(shù)和this

????????在標(biāo)準(zhǔn)的DOM事件模型中(DOMLevel 2 Events)幻件,監(jiān)聽(tīng)函數(shù)會(huì)得到一個(gè)事件對(duì)象e,在e中可以獲取有關(guān)該事件的信息蛔溃。同時(shí)在監(jiān)聽(tīng)函數(shù)中this會(huì)指向觸發(fā)該事件的DOM元素绰沥。 百度地圖API的事件模型與此類(lèi)似,在事件監(jiān)聽(tīng)函數(shù)中傳遞事件對(duì)象e贺待,每個(gè)e參數(shù)至少包含事件類(lèi)型(type)和觸發(fā)該事件的對(duì)象(target)徽曲。 API還保證函數(shù)內(nèi)的this指向觸發(fā)(同時(shí)也是綁定)事件的API對(duì)象。

????????例如狠持,通過(guò)參數(shù)e得到點(diǎn)擊的經(jīng)緯度坐標(biāo)疟位。

var map = new BMap.Map("l-map");?????? 
map.centerAndZoom(new BMap.Point(116.404, 39.915), 11);?????? 
map.addEventListener("click", function(e){????????????? 
??alert(e.point.lng + ", " + e.point.lat);?????? 
});

????????或者通過(guò)this得到地圖縮放后的級(jí)別。

var map = new BMap.Map("l-map");?????? 
map.centerAndZoom(new BMap.Point(116.404, 39.915), 11);?????? 
map.addEventListener("zoomend", function(){????????????? 
??alert("地圖縮放至:" + this.getZoom() + "級(jí)");?????? 
});

3.2.3.4?移除監(jiān)聽(tīng)事件

????????當(dāng)您不再希望監(jiān)聽(tīng)事件時(shí)喘垂,可以將事件監(jiān)聽(tīng)進(jìn)行移除甜刻。每個(gè)API對(duì)象提供了removeEventListener用來(lái)移除事件監(jiān)聽(tīng)函數(shù)。

????????下面示例中正勒,用戶(hù)第一次點(diǎn)擊地圖會(huì)觸發(fā)事件監(jiān)聽(tīng)函數(shù)得院,在函數(shù)內(nèi)部對(duì)事件監(jiān)聽(tīng)進(jìn)行了移除,因此后續(xù)的點(diǎn)擊操作則不會(huì)觸發(fā)監(jiān)聽(tīng)函數(shù)章贞。

var map = new BMap.Map("l-map");?????? 
map.centerAndZoom(new BMap.Point(116.404, 39.915), 11);?????? 
function showInfo(e){????????? 
??alert(e.point.lng + ", " + e.point.lat);????????? 
??map.removeEventListener("click", showInfo);?????? 
}?????? 
map.addEventListener("click", showInfo);

3.2.4????地圖圖層

3.2.4.1?地圖圖層概念

????????地圖可以包含一個(gè)或多個(gè)圖層祥绞,每個(gè)圖層在每個(gè)級(jí)別都是由若干張圖塊組成的,它們覆蓋了地球的整個(gè)表面。例如您所看到包括街道蜕径、興趣點(diǎn)两踏、學(xué)校、公園等內(nèi)容的地圖展現(xiàn)就是一個(gè)圖層兜喻,另外交通流量的展現(xiàn)也是通過(guò)圖層來(lái)實(shí)現(xiàn)的梦染。

????????目前百度地圖提供的圖層包括:

??????TrafficLayer:交通流量圖層。

3.2.4.2?添加和移除圖層

????????通過(guò)map.addTileLayer方法可向地圖添加圖層朴皆,例如下面代碼將顯示北京市的交通流量帕识。

var map = new BMap.Map("l-map");???????? // 創(chuàng)建地圖實(shí)例????? ?
var point = new BMap.Point(116.404, 39.915);? // 創(chuàng)建點(diǎn)坐標(biāo)???? ?
map.centerAndZoom(point, 15);? // 初始化地圖,設(shè)置中心點(diǎn)坐標(biāo)和地圖級(jí)別 
var traffic = new BMap.TrafficLayer();? // 創(chuàng)建交通流量圖層實(shí)例????? ?
map.addTileLayer(traffic);??????? // 將圖層添加到地圖上

????????若要從地圖上移除圖層遂铡,需要調(diào)用map.removeTileLayer方法肮疗。

map.removeTileLayer(traffic);??????????????? // 將圖層移除

3.2.4.3?自定義圖層

3.2.4.3.1 地圖坐標(biāo)系

????????在使用自定義圖層前,您需要了解百度地圖的地圖坐標(biāo)系扒接,百度地圖坐標(biāo)系涉及:

??????經(jīng)緯度球面坐標(biāo)系統(tǒng)

??????墨卡托平面坐標(biāo)系統(tǒng)

??????圖塊編號(hào)系統(tǒng)

????????經(jīng)緯度是一種利用三維空間的球面來(lái)定義地球上的空間的球面坐標(biāo)系伪货,它能夠標(biāo)示地球上任何一個(gè)位置。通過(guò)倫敦格林尼治天文臺(tái)原址的經(jīng)線為0度經(jīng)線钾怔,從0度經(jīng)線向東超歌、向西各分180度。赤道為0度緯線蒂教,赤道以北的緯線稱(chēng)為北緯、以南的稱(chēng)為南緯脆荷。在百度地圖中凝垛,東經(jīng)和北緯用正數(shù)表示,西經(jīng)和南緯用負(fù)數(shù)表示蜓谋。例如北京的位置大約是北緯39.9度梦皮,東經(jīng)116.4度,那么用數(shù)值標(biāo)示就是經(jīng)度116.6桃焕,緯度39.9剑肯。 在百度地圖中,習(xí)慣經(jīng)度在前观堂,緯度在后让网,例如:

// 創(chuàng)建點(diǎn)坐標(biāo)港令,經(jīng)度在前骏掀,緯度在后
var point = new BMap.Point(116.404, 39.915);? 

????????由于百度地圖是顯示在平面上的根欧,因此在地圖內(nèi)部系統(tǒng)中需要將球面坐標(biāo)轉(zhuǎn)換為平面坐標(biāo)隐轩,這個(gè)轉(zhuǎn)換過(guò)程稱(chēng)為投影炭臭。百度地圖使用的是墨卡托投影奶镶。墨卡托平面坐標(biāo)如下圖所示羹奉,平面坐標(biāo)與經(jīng)緯度坐標(biāo)系的原點(diǎn)是重合的鲫尊。

????????百度地圖在每一個(gè)級(jí)別將整個(gè)地圖劃分成若干個(gè)圖塊,通過(guò)編號(hào)系統(tǒng)將整個(gè)圖塊整合在一起以便顯示完整的地圖竞滓。當(dāng)?shù)貓D被拖動(dòng)或者級(jí)別發(fā)生變化時(shí)咐吼,地圖API將會(huì)根據(jù)平面坐標(biāo)計(jì)算出當(dāng)前視野內(nèi)所需顯示的圖塊的編號(hào)。百度地圖圖塊編號(hào)規(guī)則如下圖所示:

????????從平面坐標(biāo)原點(diǎn)開(kāi)始的右上方向的圖塊編號(hào)為0,0商佑,以此類(lèi)推锯茄。在最低的縮放級(jí)別(級(jí)別1)中,整個(gè)地球由 4 張圖塊組成莉御。隨著級(jí)別的增長(zhǎng)撇吞,地圖所使用的圖塊個(gè)數(shù)也隨之增多。

3.2.4.3.2 定義取圖規(guī)則

????????通過(guò)TileLayer類(lèi)開(kāi)發(fā)者可以實(shí)現(xiàn)自定義圖層礁叔。其中牍颈,TileLayer實(shí)例的getTilesUrl方法需要實(shí)現(xiàn),用來(lái)告訴API取圖規(guī)則琅关。getTilesUrl方法的參數(shù)包括tileCoord和zoom煮岁,其中tileCoord為圖塊的編號(hào)信息,zoom為圖塊的級(jí)別涣易,每當(dāng)?shù)貓D需要顯示特定級(jí)別的特定位置的圖塊時(shí)就會(huì)自動(dòng)調(diào)用此方法画机,并提供這兩個(gè)參數(shù)。使用者需要告知API特定編號(hào)和級(jí)別所對(duì)應(yīng)的圖塊的地址新症,這樣API就能正常顯示自定義的圖層了步氏。

3.2.4.3.3 添加和移除自定義圖層

????????以下代碼在每個(gè)圖塊的所有縮放級(jí)別上顯示一個(gè)簡(jiǎn)單的透明疊加層,使用浮動(dòng)紅色小水滴表示圖塊的輪廓徒爹。

var map = new BMap.Map("l-map");????????? // 創(chuàng)建地圖實(shí)例???? ?
var point = new BMap.Point(116.404, 39.915);? // 創(chuàng)建點(diǎn)坐標(biāo)???? ?
map.centerAndZoom(point,15); ?// 初始化地圖荚醒,設(shè)置中心點(diǎn)坐標(biāo)和地圖級(jí)別 ?
var tilelayer = new BMap.TileLayer();??? // 創(chuàng)建地圖層實(shí)例??? ?
tilelayer.getTilesUrl=function(){???????????? 
??// 設(shè)置圖塊路徑???? ???????????
??return "layer.gif";?????? 
};?????? 
map.addTileLayer(tilelayer);??????? // 將圖層添加到地圖上

3.2.5????地圖服務(wù)

3.2.5.1?地圖服務(wù)概述

????地圖服務(wù)是指那些提供數(shù)據(jù)信息的接口,比如本地搜索隆嗅、路線規(guī)劃等等界阁。百度地圖API提供的服務(wù)有:

??????LocalSearch:本地搜索,提供某一特定地區(qū)的位置搜索服務(wù)胖喳,比如在北京市搜索“公園”泡躯。

??????Geocoder:地址解析,提供將地址信息轉(zhuǎn)換為坐標(biāo)點(diǎn)信息的服務(wù)丽焊。

??????routeSearch:線路規(guī)劃较剃、導(dǎo)航服務(wù),調(diào)用該服務(wù)可跳轉(zhuǎn)到百度地圖webapp頁(yè)面進(jìn)行公交技健、駕車(chē)重付、步行、導(dǎo)航等操作凫乖。

????????搜索類(lèi)的服務(wù)接口需要指定一個(gè)搜索范圍确垫,否則接口將不能工作弓颈。

3.2.5.2?本地搜索

????????BMap.LocalSearch提供本地搜索服務(wù),在使用本地搜索時(shí)需要為其設(shè)置一個(gè)檢索區(qū)域删掀,檢索區(qū)域可以是BMap.Map對(duì)象翔冀、BMap.Point對(duì)象或者是省市名稱(chēng)(比如:"北京市")的字符串。BMap.LocalSearch構(gòu)造函數(shù)的第二個(gè)參數(shù)是可選的披泪,您可以在其中指定結(jié)果的呈現(xiàn)纤子。BMap.RenderOptions類(lèi)提供了若干控制呈現(xiàn)的屬性,其中map指定了結(jié)果所展現(xiàn)的地圖實(shí)例款票,panel指定了結(jié)果列表的容器元素控硼。

var map = new BMap.Map("l-map");?????? 
map.centerAndZoom(new BMap.Point(116.404, 39.915), 11);?????? 
var local = new BMap.LocalSearch(map, {???????????? 
??renderOptions:{map: map}?????? 
});?????? 
local.search("天安門(mén)");

????????另外,BMap.LocalSearch還提包含searchNearby和searchInBounds方法艾少,為您提供周邊搜索和范圍搜索服務(wù)卡乾。

3.2.5.2.1 配置搜索

????????BMap.LocalSearch提供了若干配置方法,通過(guò)它們可以自定義搜索服務(wù)的行為以滿(mǎn)足您的需求缚够。 在下面的示例中幔妨,我們調(diào)整每頁(yè)顯示8個(gè)結(jié)果,并且根據(jù)結(jié)果點(diǎn)位置自動(dòng)調(diào)整地圖視野谍椅,不顯示第一條結(jié)果的信息窗口:

var map = new BMap.Map("l-map");?? 
map.centerAndZoom(new BMap.Point(116.404, 39.915), 14);?? 
var local = new BMap.LocalSearch("北京市",{renderOptions: {map: map,autoViewport: true},pageCapacity: 8});?????? 
local.search("中關(guān)村");

3.2.5.2.2 結(jié)果面板

????????通過(guò)設(shè)置BMap.LocalSearchOptions.renderOptions.panel屬性误堡,可以為本地搜索對(duì)象提供一個(gè)結(jié)果列表容器,搜索結(jié)果會(huì)自動(dòng)添加到容器元素中雏吭。請(qǐng)看下面示例:

var map = new BMap.Map("l-map");?? 
map.centerAndZoom(new BMap.Point(116.404, 39.915), 11);?? 
var local = new BMap.LocalSearch(map,{renderOptions: {map: map,panel: "results"}};?????? 
local.search("中關(guān)村");

3.2.5.2.3 數(shù)據(jù)接口

????????除了搜索結(jié)果會(huì)自動(dòng)添加到地圖和列表外锁施,您還可以通過(guò)數(shù)據(jù)接口獲得詳細(xì)的數(shù)據(jù)信息,結(jié)合地圖API您可以自行向地圖添加標(biāo)注和信息窗口杖们。BMap.LocalSearch和BMap.LocalSearchOptions類(lèi)提供了若干設(shè)置回調(diào)函數(shù)的接口沾谜,通過(guò)它們可得到搜索結(jié)果的數(shù)據(jù)信息。例如胀莹,通過(guò)onSearchComplete回調(diào)函數(shù)參數(shù)可以獲得BMap.LocalResult對(duì)象實(shí)例,它包含了每一次搜索結(jié)果的數(shù)據(jù)信息婚温。 當(dāng)回調(diào)函數(shù)被執(zhí)行時(shí)描焰,您可以使用BMap.LocalSearch.getStatus()方法來(lái)確認(rèn)搜索是否成功或者得到錯(cuò)誤的詳細(xì)信息。

????????在下面這個(gè)示例中栅螟,通過(guò)onSearchComplete回調(diào)函數(shù)得到第一頁(yè)每條結(jié)果的標(biāo)題和地址信息荆秦,并輸出到頁(yè)面上:

var map = new BMap.Map("l-map");?????? 
map.centerAndZoom(new BMap.Point(116.404, 39.915), 11);?????? 
var options = {???????????? 
??onSearchComplete: function(results){???????????????? 
????if (local.getStatus() == BMAP_STATUS_SUCCESS){?????????????????????? ???// 判斷狀態(tài)是否正確????? ?????????????????
??????var s = [];?????????????????????? 
??????for (var i = 0; i < results.getCurrentNumPois(); i ++)
? ????{?????????????????????????? 
????????s.push(results.getPoi(i).title + ", " + results.getPoi(i).address);?????????????????????? 
??????}??????????????????? 
??????document.getElementById("log").innerHTML = s.join("<br>"); 
????}???????????? 
??}??????? 
};?????? 
var local = new BMap.LocalSearch(map, options);?????? 
local.search("公園");

3.2.5.2.4 周邊搜索

????????通過(guò)周邊搜索服務(wù),您可以在某個(gè)地點(diǎn)附近進(jìn)行搜索力图,也可以在某一個(gè)特定結(jié)果點(diǎn)周?chē)M(jìn)行搜索步绸。

????????下面示例展示如何在前門(mén)附近搜索小吃:

var map = new BMap.Map("l-map");?????? 
map.centerAndZoom(new BMap.Point(116.404, 39.915), 11);?????? 
var local = new BMap.LocalSearch(map, { renderOptions:{map: map, autoViewport: true}});?????? 
local.searchNearby("小吃", "前門(mén)");

3.2.5.2.5 矩形范圍搜索

????????矩形范圍搜索將根據(jù)您提供的視野范圍提供搜索結(jié)果。注意:當(dāng)搜索范圍過(guò)大時(shí)可能會(huì)出現(xiàn)無(wú)結(jié)果的情況吃媒。

????????下面示例展示在當(dāng)前地圖視野范圍內(nèi)搜索銀行:

var map = new BMap.Map("l-map");?????? 
map.centerAndZoom(new BMap.Point(116.404, 39.915), 14);????? 
var local = new BMap.LocalSearch(map,{ renderOptions:{map: map}})瓤介;
local.searchInBounds("銀行", map.getBounds());

3.2.5.3?線路規(guī)劃吕喘、導(dǎo)航

????????BMap.RouteSearch類(lèi)提供線路規(guī)劃、導(dǎo)航服務(wù)刑桑。通過(guò)使用該類(lèi)的routeCall方法氯质,便可在手機(jī)瀏覽器端調(diào)起百度地圖webapp(http://map.baidu.com/mobile/webapp/index/index?),利用百度地圖webapp精準(zhǔn)的定位祠斧、html5導(dǎo)航及線路規(guī)劃功能實(shí)現(xiàn)“到這去”等功能闻察。

????????下面示例展示了如何使用駕車(chē)導(dǎo)航服務(wù):

var map = new BMap.Map("l-map");?????? 
map.centerAndZoom(new BMap.Point(116.404, 39.915), 14);?????? 
var routeSearch=new BMap.RouteSearch();?? 
var start = {latlng:new BMap.Point(116.404, 39.915),name:"故宮"};?? 
var end = {latlng:new BMap.Point(116.380825,39.915455), name:"肯德基(漢光店)" }琢锋;?? 
var opts = {mode:BMAP_MODE_DRIVING, //公交辕漂、駕車(chē)、導(dǎo)航均修改該參數(shù)
? region:"北京"
}吴超;
var ss = new BMap.RouteSearch();?? 
routeSearch.routeCall(start,end,opts);

3.2.5.4?地理編碼

????????地理編碼能夠?qū)⒌刂沸畔⑥D(zhuǎn)換為地理坐標(biāo)點(diǎn)信息钉嘹。

3.2.5.4.1 根據(jù)地址描述獲得坐標(biāo)

????????百度地圖API提供Geocoder類(lèi)進(jìn)行地址解析,您可以通過(guò)Geocoder.getPoint()方法來(lái)將一段地址描述轉(zhuǎn)換為一個(gè)坐標(biāo)烛芬。在下面的示例中隧期,我們將獲得地址“北京市海淀區(qū)上地10街10號(hào)”的地理坐標(biāo)位置,并在這個(gè)位置上添加一個(gè)標(biāo)注赘娄。注意在調(diào)用Geocoder.getPoint()方法時(shí)您需要提供地址解析所在的城市(本例為“北京市”)仆潮。

var map = new BMap.Map("l-map");?????? 
map.centerAndZoom(new BMap.Point(116.404, 39.915), 11);?????? 
// 創(chuàng)建地址解析器實(shí)例???? ?
var myGeo = new BMap.Geocoder();?????? 
// 將地址解析結(jié)果顯示在地圖上,并調(diào)整地圖視野??? ?
myGeo.getPoint("北京市海淀區(qū)上地10街10號(hào)", function(point){??????????? ?
????if (point) {
????  map.centerAndZoom(point, 16);???????????????????? 
????  map.addOverlay(new BMap.Marker(point));???????????????? 
??  }??????????? 
}, "北京市");

3.2.5.4.2 反向地理編碼

????????反向地理編碼的過(guò)程正好相反遣臼,它根據(jù)一個(gè)坐標(biāo)點(diǎn)得到一個(gè)地址的描述性置。您可以通過(guò)Geocoder.getLocation()方法獲得地址描述。當(dāng)解析工作完成后揍堰,您提供的回調(diào)函數(shù)將會(huì)被觸發(fā)鹏浅。如果解析成功,則回調(diào)函數(shù)的參數(shù)為GeocoderResult對(duì)象屏歹,否則為null隐砸。

var map = new BMap.Map("l-map");?????? 
map.centerAndZoom(new BMap.Point(116.404, 39.915), 11);?????? 
// 創(chuàng)建地理編碼實(shí)例????? ?
var myGeo = new BMap.Geocoder();?????? 
// 根據(jù)坐標(biāo)得到地址描述??? ?
myGeo.getLocation(new BMap.Point(116.364, 39.993), function(result)? {??????????????????????? 
  if (result){??????????????????????????? 
??  alert(result.address);???????????????????????? 
  }?????? 
?});

3.2.6????API示例

http://developer.baidu.com/map/jsdemo-mobile.htm#a1_1

3.3??網(wǎng)上示例

<!DOCTYPE HTML>
<html>
? <head>
????<meta charset="utf-8" />
? ? <title>無(wú)標(biāo)題文檔</title>
? ? <script type="text/javascript" src="http://api.map.baidu.com/api?v=1.3"></script>
????<script type="text/javascript">

? ? ? ?function getLocation()
? ? ? ?{?
??????????if(navigator.geolocation){
? ? ? ? ? ? navigator.geolocation.getCurrentPosition(showMap,handleError, {enableHighAccuracy:true, maximumAge:1000});
??????????}else{
? ? ? ? ? ? alert("您的瀏覽器不支持使用HTML 5來(lái)獲取地理位置服務(wù)");
??????????}
? ? ? ?}
?
? ? ? ?function showMap(value)
? ? ? ?{
??????????var longitude = value.coords.longitude;
??????????var latitude = value.coords.latitude;
??????????var map = new BMap.Map("map");
??????????var point = new BMap.Point(longitude,latitude);????// 創(chuàng)建點(diǎn)坐標(biāo)
??????????map.centerAndZoom(point, 15);
??????????var marker = new BMap.Marker(new BMap.Point(longitude, latitude));??//創(chuàng)建標(biāo)注
??????????map.addOverlay(marker);??????????????//將標(biāo)注添加到地圖中
? ? ? ?}
?
? ? ? ?function handleError(value)
? ? ? ?{
??????????switch(value.code){
? ? ? ? ? ? case 1:
????????????????alert("位置服務(wù)被拒絕");
????????????????break;
? ? ? ? ? ? case 2:
????????????????alert("暫時(shí)獲取不到位置信息");
????????????????break;
? ? ? ? ? ? case 3:
????????????????alert("獲取信息超時(shí)");
????????????????break;
? ? ? ? ? ? case 4:
????????????????alert("未知錯(cuò)誤");
????????????????break;
? ? ? ? ? ? }
? ? ? ?}
?
? ? ? ?function init()
? ? ? ?{
??????????getLocation();
? ? ? ?}
?
? ? ? ?window.onload = init;
?
????</script>
? </head>

? <body>
?????<div id="map" style="width:600px;height:600px;"></div>
? </body>
</html>

4 參考連接

基于百度地圖的HTML5地理位置定位實(shí)例

http://blog.sina.com.cn/s/blog_68693f980100yy47.html

HTML5 地理定位

http://www.w3school.com.cn/html5/html_5_geolocation.asp

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蝙眶,隨后出現(xiàn)的幾起案子季希,更是在濱河造成了極大的恐慌,老刑警劉巖幽纷,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件式塌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡友浸,警方通過(guò)查閱死者的電腦和手機(jī)峰尝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)收恢,“玉大人武学,你說(shuō)我怎么就攤上這事祭往。” “怎么了劳淆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵链沼,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我沛鸵,道長(zhǎng)括勺,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任曲掰,我火速辦了婚禮疾捍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘栏妖。我一直安慰自己乱豆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布吊趾。 她就那樣靜靜地躺著宛裕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪论泛。 梳的紋絲不亂的頭發(fā)上揩尸,一...
    開(kāi)封第一講書(shū)人閱讀 51,610評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音屁奏,去河邊找鬼岩榆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛坟瓢,可吹牛的內(nèi)容都是我干的勇边。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼折联,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼粒褒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起诚镰,我...
    開(kāi)封第一講書(shū)人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤奕坟,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后怕享,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡镰踏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年函筋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奠伪。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡跌帐,死狀恐怖首懈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谨敛,我是刑警寧澤究履,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站脸狸,受9級(jí)特大地震影響最仑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜炊甲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一泥彤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧卿啡,春花似錦吟吝、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至官辽,卻和暖如春蛹磺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背野崇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工称开, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乓梨。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓鳖轰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親扶镀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蕴侣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,160評(píng)論 25 707
  • LBS 位置服務(wù) 基于位置的服務(wù),它是通過(guò)電信移動(dòng)運(yùn)營(yíng)商的無(wú)線電通訊網(wǎng)絡(luò)(如GSM網(wǎng)臭觉、CDMA網(wǎng))或外部定位方式(...
    景岳閱讀 970評(píng)論 1 0
  • 圣經(jīng)馬太福音第七章第三節(jié)說(shuō)——為什么看見(jiàn)你弟兄眼中有刺,卻不想自己眼中有梁木呢什乙? 看到這句話挽封,我突然想到自己,經(jīng)常...
    天長(zhǎng)水秋閱讀 7,732評(píng)論 16 4
  • 學(xué)生時(shí)代智亮,情竇初開(kāi),偶遇那個(gè)風(fēng)華正茂的男生点待,或者那個(gè)嬌羞可愛(ài)的女生阔蛉,情愫暗生,私下細(xì)細(xì)打探癞埠。走在路上状原,睡覺(jué)前,心中...
    東方熠琪閱讀 235評(píng)論 1 3
  • 在這個(gè)時(shí)代燕差,很多人都過(guò)著隨意隨大流的生活遭笋,只有少數(shù)人真正明白自己想干什么。 討論“做自己”徒探,就和討論“你希望你活成...
    嬋姐v幸福時(shí)間管理教練閱讀 232評(píng)論 0 0