請各位讀者新增一下作者的微信公眾號,以後有新的文章,將在微信公眾號直接推送給各位,非常感謝。
##1.前言
最近想完成一個網站,裡面需要使用地圖相關的內容。
經過多方考慮,決定使用百度地圖來完成,所以將整個學習歷程進行簡單的整理,方便朋友們來快速入門。
本文系作者 李鵬(MR_LP)原創,轉載請私信並在文章開頭附帶作者和原文地址連結。
違者,作者保留追究權利。
注:若程式碼中存在部分圖片無法顯示,請移步簡書.
##2.獲取金鑰
百度地圖JavaScript API是一套由JavaScript語言編寫的應用程式介面,可幫助您在網站中構建功能豐富、互動性強的地圖應用,支援PC端和移動端基於瀏覽器的地圖應用開發,且支援HTML5特性的地圖開發。
該套API免費對外開放。自v1.5版本起,您需先申請金鑰(ak)才可使用,介面(除傳送簡訊功能外)無使用次數限制。
上述話術出自百度地圖,我們從上面的描述中也可以瞭解到,我們在使用百度地圖之前首先需要去註冊一個屬於自己的金鑰。
開啟該網站後,我們需要進行以下操作。
- 登入百度賬號
- 建立應用
- 需要注意,我們當前只是進行一次測試,所以在白名單中直接書寫一個 星號即可(*)。
- 需要注意,建立的時候需要將 JavaScript API 選項進行勾選。
-
檢視 AK
- 需要注意,請勿將這個 AK 展示給其他人,因為我這裡只是給大家展示效果,所以就先不打碼了。
##3. 獲取JavaScript API服務方法
截止作者開始書寫之前,百度地圖 API 的版本為 V 2.0。
我們在獲取 API 之前需要首先完成註冊 AK 才可成功載入API JS檔案。
ak的使用方法如下:
//引數v表示您載入API的版本,使用JavaScript APIv1.4及以前版本可使用此方式引用。
http://api.map.baidu.com/api?v=1.4
//使用JavaScript APIv2.0請先申請金鑰ak,按此方式引用。
http://api.map.baidu.com/api?v=2.0&ak=您的金鑰複製程式碼
其中需要注意:
- JavaScript API v1.4及以前版本無須申請金鑰(ak)。
- 如果在實際開發中,需要獲取更高配額,請點選申請認證企業使用者。
最後,關於在引入的時候,有可能出現許可權驗證失敗。
具體導致這個問題的原因可能出自以下三種情況。
- 尚未在API控制檯申請ak,即`…ak=`;
- 金鑰設定錯誤。
- 如E4805d16520de693a3fe707cdc962045為正確的ak
- 但是設定時輸入的ak為E4805d16520de693a3fe707cdc962045xx;
- 金鑰未通過白名單,如下圖的ak在非baidu.com域名下會報錯。
- API控制檯關閉JavaScript API時會報錯;
- 錯誤的使用“服務端AK”用於 JavaScript API,JS API只支援瀏覽器型別的ak(自2016年1月15日升級)
最後附上進入 百度地圖 API javascript 的例項程式碼。
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>李鵬 -> QQ : 3206064928 (請勿非法轉載)</title>
<!--使用V2.0版本的引用方式-->
<script src="http://api.map.baidu.com/api?v=2.0&ak=bsNyezahIIgpUIjvYe51BKXzy1FXozUY&s=1" type="text/javascript" charset="utf-8"></script>
<!--
1. 如果使用JavaScript API ,需要加一個特殊欄位 (s=1):
https://api.map.baidu.com/api?v=2.0&ak=你的金鑰&s=1;
2. 對於Web API 無需加特殊欄位,直接使用 HTTPS協議訪問即可,如Geocoding:
https://api.map.baidu.com/geocoder/v2/?ak=你的祕鑰
&callback=renderReverse&location=39.983424,116.322987&output=xml&pois=1
3. 如果對資料安全要求高,建議使用 POST請求,避免把請求引數放到 URI中敏感資訊被洩露;
-->
<!--為了讓頁面以正常比例進行顯示並且禁止使用者縮放頁面的操作-->
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
</head>
<body>
</body>
</html>
<!--
我的祕鑰
應用編號 應用名稱 訪問應用(AK) 應用類別 備註資訊(雙擊更改) 應用配置
9290542 Test bsNyezahIIgpUIjvYe51BKXzy1FXozUY 瀏覽器端 設定 刪除
-->複製程式碼
##4. 關於 百度地圖 HTTPS 的說明
JavaScript API首家支援Https,已全面開放,無需申請Https服務可直接使用。
配置:
- 如果使用JavaScript API ,需要加一個特殊欄位 (s=1):
api.map.baidu.com/api?v=2.0&a… - 對於Web API 無需加特殊欄位,直接使用 HTTPS協議訪問即可,如Geocoding:
api.map.baidu.com/geocoder/v2… - 如果對資料安全要求高,建議使用 POST請求,避免把請求引數放到 URI中敏感資訊被洩露。
##5. 百度地圖的相容性
- 瀏覽器:
- IE 6.0+
- Firefox 3.6+
- Opera 9.0+
- Safari 3.0+
- Chrome
- 作業系統:
- Windows
- Mac
- Linux
- 移動平臺:
- iPhone
- Android
請各位開發者注意自己當前開發需要相容的版本。
##6. 第一個小案例
在開始之前,我們們首先通過一段例項程式碼進行效果的展示。
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>李鵬 -> QQ : 3206064928 (請勿非法轉載)</title>
<style type="text/css">
html{height:100%}
body{height:100%;margin:0px;padding:0px}
#container{height:100%}
</style>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=bsNyezahIIgpUIjvYe51BKXzy1FXozUY">
//v2.0版本的引用方式:src="http://api.map.baidu.com/api?v=2.0&ak=您的金鑰"
//v1.4版本及以前版本的引用方式:src="http://api.map.baidu.com/api?v=1.4&key=您的金鑰&callback=initialize"
</script>
</head>
<body>
<div id="container"></div>
</body>
<script type="text/javascript">
/*
建立地圖例項
* 位於BMap名稱空間下的Map類表示地圖,通過new操作符可以建立一個地圖例項。
* 其引數可以是元素id也可以是元素物件。
* 注意在呼叫此建構函式時應確保容器元素已經新增到地圖上。*/
var map = new BMap.Map("container");
/*
建立點座標
* 這裡我們使用BMap名稱空間下的Point類來建立一個座標點。
* Point類描述了一個地理座標點,其中116.404表示經度,39.915表示緯度。*/
var point = new BMap.Point(116.404, 39.915);
/*
地圖初始化
* 在建立地圖例項後,我們需要對其進行初始化,BMap.Map.centerAndZoom()方法要求設定中心點座標和地圖級別。
* 地圖必須經過初始化才可以執行其他操作。*/
map.centerAndZoom(point, 15);
/*
下面示例顯示一個地圖,等待兩秒鐘後,它會移動到新中心點。
* panTo()
* 將讓地圖平滑移動至新中心點,如果移動距離超過了當前地圖區域大小,則地圖會直跳到該點。
* zoomTo()
*
* setCenter()
*
* */
window.setTimeout(function(){
map.panTo(new BMap.Point(116.450, 39.918));
}, 1000);
/*
預設情況下地圖不支援滑鼠滾輪縮放操作,因為這樣可能會影響整個頁面的使用者體驗,
但是如果您希望在地圖中使用滑鼠滾輪控制縮放,則可以呼叫map.enableScrollWheelZoom方法來開啟。
配置選項可以在Map類參考的配置方法一節中找到。
* */
</script>
</html>複製程式碼
可以看到,我們如果需要使用百度地圖,有至少三步操作需要完成。
- 建立地圖例項
- 建立點座標
- 地圖初始化
在程式碼的最後段,放上一個方法,我們通過一個超時呼叫,在 1 秒之後,讓地圖進行平移。
需要注意一個小問題,如果跳轉的點處於當前初始的地圖的顯示範圍時,則地圖會進行平移,否則就是重新繪製當前地圖。
最後顯示效果如下:
##7. 百度地圖控制元件
這時候我們發現,我們已經在當前頁面實現了一個小的地圖,但是我們卻發現一個小問題。
為什麼我的地圖上空空一片呀。
這是因為我們還沒有向百度地圖中新增我們需要的控制元件。
地圖API中提供的控制元件有:
- Control:控制元件的抽象基類,所有控制元件均繼承此類的方法、屬性。通過此類您可實現自定義控制元件。
- NavigationControl:地圖平移縮放控制元件,PC端預設位於地圖左上方,它包含控制地圖的平移和縮放的功能。移動端提供縮放控制元件,預設位於地圖右下方。
- OverviewMapControl:縮略地圖控制元件,預設位於地圖右下方,是一個可摺疊的縮略地圖。
- ScaleControl:比例尺控制元件,預設位於地圖左下方,顯示地圖的比例關係。
- MapTypeControl:地圖型別控制元件,預設位於地圖右上方。
- CopyrightControl:版權控制元件,預設位於地圖左下方。
- GeolocationControl:定位控制元件,針對移動端開發,預設位於地圖左下方。
那麼接下來我們就開始向地圖中去新增控制元件。
###7.1 新增控制元件
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>李鵬 -> QQ : 3206064928 (請勿非法轉載)</title>
<style type="text/css">
html{height:100%}
body{height:100%;margin:0px;padding:0px}
#container{height:100%}
</style>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=bsNyezahIIgpUIjvYe51BKXzy1FXozUY"></script>
</head>
<body>
<div id="container"></div>
</body>
<script type="text/javascript" charset="utf-8">
/*
向地圖新增控制元件
* 可以使用Map.addControl()方法向地圖新增控制元件。
* 在此之前地圖需要進行初始化。
* 例如,要將標準地圖控制元件新增到地圖中,可在程式碼中新增如下內容:*/
var map = new BMap.Map("container");
map.centerAndZoom(new BMap.Point(116.404, 39.915), 11);
map.addControl(new BMap.NavigationControl());
</script>
</html>複製程式碼
實現效果如下:
我們會發現,在我們的地圖左上角出現了一個新的控制元件,我們可以通過這個控制元件去實現對地圖的方法以及縮小。
除此之外,我們還可以新增其他地圖控制元件。
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>李鵬 -> QQ : 3206064928 (請勿非法轉載)</title>
<style type="text/css">
html{height:100%}
body{height:100%;margin:0px;padding:0px}
#container{height:100%}
</style>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=bsNyezahIIgpUIjvYe51BKXzy1FXozUY"></script>
</head>
<body>
<div id="container"></div>
</body>
<script type="text/javascript" charset="utf-8">
/*
向地圖新增控制元件
* 可以使用Map.addControl()方法向地圖新增控制元件。
* 在此之前地圖需要進行初始化。
* 例如,要將標準地圖控制元件新增到地圖中,可在程式碼中新增如下內容:*/
var map = new BMap.Map("container");
map.centerAndZoom(new BMap.Point(116.404, 39.915), 11);
// map.addControl(new BMap.NavigationControl());
/*
可以向地圖新增多個控制元件。
在本例中我們向地圖新增一個平移縮放控制元件、一個比例尺控制元件和一個縮圖控制元件。
在地圖中新增控制元件後,它們即刻生效。
* */
//地圖平移縮放控制元件
map.addControl(new BMap.NavigationControl());
//比例尺控制元件
map.addControl(new BMap.ScaleControl());
//縮略地圖控制元件
map.addControl(new BMap.OverviewMapControl());
//地圖型別控制元件
map.addControl(new BMap.MapTypeControl());
map.setCurrentCity("北京"); // 僅當設定城市資訊時,MapTypeControl的切換功能才能可用
</script>
</html>複製程式碼
可以看到,我們在原始的縮放控制元件之後去新增了三個新的控制元件。
實現效果如下:
除此之外,我們還可以設定地圖空間所顯示的位置和偏移。
###7.2 控制元件的顯示位置和偏移
ControlAnchor 此常量表示控制元件的定位。
常量 | 描述 |
---|---|
BMAP_ANCHOR_TOP_LEFT | 控制元件將定位到地圖的左上角 |
BMAP_ANCHOR_TOP_RIGHT | 控制元件將定位到地圖的右上角 |
BMAP_ANCHOR_BOTTOM_LEFT | 控制元件將定位到地圖的左下角 |
BMAP_ANCHOR_BOTTOM_RIGHT | 控制元件將定位到地圖的右下角 |
例項程式碼:
//地圖平移縮放控制元件
map.addControl(new BMap.NavigationControl({
anchor:BMAP_ANCHOR_TOP_RIGHT
}));複製程式碼
除了指定停靠位置外,還可以通過偏移量來指示控制元件距離地圖邊界有多少畫素。
如果兩個控制元件的停靠位置相同,那麼控制元件可能會重疊在一起,這時就可以通過偏移值使二者分開顯示。
var opts = {offset: new BMap.Size(150, 5)}
map.addControl(new BMap.ScaleControl(opts));複製程式碼
同時,我們還可以修改控制元件的配置。
###7.3 控制元件的顯示方式
NavigationControlType此常量表示平移縮放控制元件的型別。
常量 | 描述 |
---|---|
BMAP_NAVIGATION_CONTROL_LARGE | 標準的平移縮放控制元件(包括平移、縮放按鈕和滑塊) |
BMAP_NAVIGATION_CONTROL_SMALL | 僅包含平移和縮放按鈕 |
BMAP_NAVIGATION_CONTROL_PAN | 僅包含平移按鈕 |
BMAP_NAVIGATION_CONTROL_ZOOM | 僅包含縮放按鈕 |
例項程式碼:
//地圖平移縮放控制元件
map.addControl(new BMap.NavigationControl({
//僅包含平移按鈕
type:BMAP_NAVIGATION_CONTROL_PAN
}));複製程式碼
###7.4 關於百度地圖控制元件的示例
最後放出一個關於百度定位相關控制元件的案例。
<!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 {width: 100%;height: 100%;margin:0;font-family:"微軟雅黑";}
#allmap{width:100%;height:100%;}
p{margin-left:5px; font-size:14px;}
</style>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=bsNyezahIIgpUIjvYe51BKXzy1FXozUY"></script>
<title>李鵬 -> QQ : 3206064928 (請勿非法轉載)</title>
</head>
<body>
<div id="allmap"></div>
</body>
</html>
<script type="text/javascript">
// 百度地圖API功能
var map = new BMap.Map("allmap");
map.centerAndZoom(new BMap.Point(116.404, 39.915), 11);
// 新增帶有定位的導航控制元件
var navigationControl = new BMap.NavigationControl({
// 靠左上角位置
anchor: BMAP_ANCHOR_TOP_LEFT,
// LARGE型別
type: BMAP_NAVIGATION_CONTROL_LARGE,
// 啟用顯示定位
enableGeolocation: true
});
map.addControl(navigationControl);
// 新增定位控制元件
var geolocationControl = new BMap.GeolocationControl();
geolocationControl.addEventListener("locationSuccess", function(e){
// 定位成功事件
var address = ``;
address += e.addressComponent.province;
address += e.addressComponent.city;
address += e.addressComponent.district;
address += e.addressComponent.street;
address += e.addressComponent.streetNumber;
alert("當前定位地址為:" + address);
});
geolocationControl.addEventListener("locationError",function(e){
// 定位失敗事件
alert(e.message);
});
map.addControl(geolocationControl);
</script>複製程式碼
程式碼效果如下:
##8. 後記
其實今天只是介紹了一下百度最基礎的部分。
除此之外,百度地圖還可以去使用其他的特殊操作。
- 覆蓋物
- 事件
- 地圖圖層
- 工具
- 服務
- 使用者資料圖層
- 全景圖展現
- 定製個性地圖
最後感謝百度地圖的開發工程師。
轉載請於文章開頭處註明作者和原文連結,否則保留法律追究權利。
##附錄:
A : 滑鼠滾輪縮放地圖
<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,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微軟雅黑";}
</style>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=bsNyezahIIgpUIjvYe51BKXzy1FXozUY"></script>
<title>李鵬 -> QQ : 3206064928 (請勿非法轉載)</title>
</head>
<body>
<div id="allmap"></div>
</body>
</html>
<script type="text/javascript">
// 百度地圖API功能
var map = new BMap.Map("allmap");
map.centerAndZoom("重慶",12);
map.enableScrollWheelZoom(); //啟用滾輪放大縮小,預設禁用
map.enableContinuousZoom(); //啟用地圖慣性拖拽,預設禁用
</script>複製程式碼
實現效果:
###B : 查詢顯示位置
<!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{width: 100%;height: 100%;margin:0;font-family:"微軟雅黑";font-size:14px;}
#l-map{height:300px;width:100%;}
#r-result{width:100%;}
</style>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=bsNyezahIIgpUIjvYe51BKXzy1FXozUY"></script>
<title>李鵬 -> QQ : 3206064928 (請勿非法轉載)</title>
</head>
<body>
<div id="l-map"></div>
<div id="r-result">請輸入:<input type="text" id="suggestId" size="20" value="百度" style="width:150px;" /></div>
<div id="searchResultPanel" style="border:1px solid #C0C0C0;width:150px;height:auto; display:none;"></div>
</body>
</html>
<script type="text/javascript">
// 百度地圖API功能
function G(id) {
return document.getElementById(id);
}
var map = new BMap.Map("l-map");
map.centerAndZoom("北京",12); // 初始化地圖,設定城市和地圖級別。
var ac = new BMap.Autocomplete( //建立一個自動完成的物件
{"input" : "suggestId"
,"location" : map
});
ac.addEventListener("onhighlight", function(e) { //滑鼠放在下拉選單上的事件
var str = "";
var _value = e.fromitem.value;
var value = "";
if (e.fromitem.index > -1) {
value = _value.province + _value.city + _value.district + _value.street + _value.business;
}
str = "FromItem<br />index = " + e.fromitem.index + "<br />value = " + value;
value = "";
if (e.toitem.index > -1) {
_value = e.toitem.value;
value = _value.province + _value.city + _value.district + _value.street + _value.business;
}
str += "<br />ToItem<br />index = " + e.toitem.index + "<br />value = " + value;
G("searchResultPanel").innerHTML = str;
});
var myValue;
ac.addEventListener("onconfirm", function(e) { //滑鼠點選下拉選單後的事件
var _value = e.item.value;
myValue = _value.province + _value.city + _value.district + _value.street + _value.business;
G("searchResultPanel").innerHTML ="onconfirm<br />index = " + e.item.index + "<br />myValue = " + myValue;
setPlace();
});
function setPlace(){
map.clearOverlays(); //清除地圖上所有覆蓋物
function myFun(){
var pp = local.getResults().getPoi(0).point; //獲取第一個智慧搜尋的結果
map.centerAndZoom(pp, 18);
map.addOverlay(new BMap.Marker(pp)); //新增標註
}
var local = new BMap.LocalSearch(map, { //智慧搜尋
onSearchComplete: myFun
});
local.search(myValue);
}
</script>複製程式碼
程式碼效果:
###C : 根據經緯度確定位置
<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{width: 100%;height: 100%;margin:0;font-family:"微軟雅黑";}
#allmap{height:500px;width:100%;}
#r-result{width:100%; font-size:14px;}
</style>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=bsNyezahIIgpUIjvYe51BKXzy1FXozUY"></script>
<title>李鵬 -> QQ : 3206064928 (請勿非法轉載)</title>
</head>
<body>
<div id="allmap"></div>
<div id="r-result">
經度: <input id="longitude" type="text" style="width:100px; margin-right:10px;" />
緯度: <input id="latitude" type="text" style="width:100px; margin-right:10px;" />
<input type="button" value="查詢" onclick="theLocation()" />
</div>
</body>
</html>
<script type="text/javascript">
// 百度地圖API功能
var map = new BMap.Map("allmap");
map.centerAndZoom(new BMap.Point(116.331398,39.897445),11);
map.enableScrollWheelZoom(true);
// 用經緯度設定地圖中心點
function theLocation(){
if(document.getElementById("longitude").value != "" && document.getElementById("latitude").value != ""){
map.clearOverlays();
var new_point = new BMap.Point(document.getElementById("longitude").value,document.getElementById("latitude").value);
var marker = new BMap.Marker(new_point); // 建立標註
map.addOverlay(marker); // 將標註新增到地圖中
map.panTo(new_point);
}
}
</script>複製程式碼
實現效果: