前端百度地圖添加點(diǎn)并跳轉(zhuǎn)到百度地圖進(jìn)行導(dǎo)航完整代碼
一、需求
前端有時(shí)候需要做地圖展示,我一般用的地圖是天地圖和百度地圖,大家可以通過官網(wǎng)來制作地圖。
1.天地圖:天地圖API

可根據(jù)類參考或者代碼示例來制作地圖。
2。百度地圖:jspopularGL | 百度地圖API SDK

申請秘鑰、 展示地圖、demo參考來制作地圖。
前端需要展示地圖,添加地址的點(diǎn)位(獲取經(jīng)緯度,把點(diǎn)添加到地圖上),點(diǎn)擊點(diǎn)跳轉(zhuǎn)到app或者是官網(wǎng)上,這里用到的是百度地圖,天地圖暫時(shí)不提供導(dǎo)航服務(wù)。
下面我們對這一需求進(jìn)行實(shí)現(xiàn)。
二、展示地圖
html代碼:
<div class="map" id="map"> </div>
其中map是放地圖的容器,一定要給這個(gè)div設(shè)置寬和高,不然不顯示。
css代碼:
.map{
width: 100%;
height: 100vh;
}
.map .anchorBL {
display: none;
}其中.anchorBL是百度地圖的水印。這里將水印隱藏,水印長這樣:

js代碼:
getMap();
var map;
//展示地圖
function getMap(){
map = new BMapGL.Map('map');
var center = new BMapGL.Point(106.639958,26.645316);
map.centerAndZoom(center, 13);
map.enableScrollWheelZoom(true); //開啟鼠標(biāo)滾輪縮放
map.enableScrollWheelZoom(true);
map.setMapType(BMAP_SATELLITE_MAP);//設(shè)置地圖類型為普通衛(wèi)星地圖模式
var scaleCtrl = new BMapGL.ScaleControl(); // 添加比例尺控件
var zoomCtrl = new BMapGL.ZoomControl(); // 添加縮放控件
map.addControl(scaleCtrl);
}需要注意的是:map.setMapType(BMAP_SATELLITE_MAP);//設(shè)置地圖類型為普通衛(wèi)星地圖模式
運(yùn)行結(jié)果:

三、添加點(diǎn)覆蓋物
let address = [
{
name:'地址一',
lng:106.641252,
lat:26.652775
},
{
name:'地址二',
lng:106.629753,
lat:26.637856
}
];
//添加位置標(biāo)識(shí)
address.forEach((v,k)=>{
addMaker1(v,v.name,-100,-60,'button')
})
function addMaker1(point,name,x,y,button) {
// 創(chuàng)建圖標(biāo)
var myIcon = new BMapGL.Icon("image/pointer.png", new BMapGL.Size(30, 39));
var pointer = new BMapGL.Point(point.lng,point.lat);
var marker = new BMapGL.Marker(pointer, {
icon: myIcon
});
map.addOverlay(marker);
}
運(yùn)行結(jié)果:

四、添加信息窗口(需展示地址名稱)
function addMaker1(point,name,x,y,button) {
//...添加點(diǎn)
var opts = {
position: new BMapGL.Point(point.lng,point.lat), // 指定文本標(biāo)注所在的地理位置
offset: new BMapGL.Size(x,y) // 設(shè)置文本偏移量
};
// 創(chuàng)建文本標(biāo)注對象
let string = `<div style="display: flex;align-items: center">${name}<img class="${button}" style="width: 30px;margin-left: 10px" src="image/logo.png"/></div>`
var label = new BMapGL.Label(string, opts);
// 自定義文本標(biāo)注樣式
label.setStyle({
color: 'black',
borderRadius: '5px',
borderColor: '#ccc',
padding: '5px',
fontSize: '14px',
height: '30px',
lineHeight: '30px',
fontFamily: '微軟雅黑'
});
map.addOverlay(label)
var opts = {
width: 100, // 信息窗口寬度
height: 24, // 信息窗口高度
// title: "故宮博物院", // 信息窗口標(biāo)題
}
label.addEventListener("click",function () {
let lngNum ;
let latNum ;
function myFun(result){
//獲取當(dāng)前所在市的信息,主要為了pc端和ios系統(tǒng)獲取不到精準(zhǔn)位置用的
console.log(result)
lngNum = result.center.lng;
latNum = result.center.lat;
openBaiduMap(point.lng,point.lat,name,latNum,lngNum);//調(diào)起百度地圖
}
var myCity = new BMapGL.LocalCity();
myCity.get(myFun);
console.log(latNum)
console.log(lngNum)
}
)
}其中,點(diǎn)擊信息窗口,喚起百度地圖。
由于pc端和ios系統(tǒng)獲取不到精準(zhǔn)位置,所以需要通過var myCity = new BMapGL.LocalCity();
myCity.get(myFun);來實(shí)現(xiàn)獲取位置,只不過這個(gè)位置是大概范圍(當(dāng)前所在城市),result的打印內(nèi)容如下:

運(yùn)行結(jié)果:

五、喚起百度地圖
//喚起百度地圖
function openBaiduMap(lng, lat, address,lat11,lng11) {
var geolocation = new BMap.Geolocation();
// 開啟定位控件
geolocation.enableSDKLocation();
geolocation.getCurrentPosition(function (result) {
var queryString;
if (this.getStatus() == BMAP_STATUS_SUCCESS) {
console.log('11')
queryString = `origin=latlng:${result.point.lat},${result.point.lng}|name:我的位置&destination=latlng:${lat},${lng}|name:${address}&mode=driving&coord_type=bd09ll&src=com.mzwu.www`;
} else {
console.log('22')
queryString = `origin=latlng:${lat11},${lng11}|name:我的位置&destination=latlng:${lat},${lng}|name:${address}&mode=driving&coord_type=bd09ll&src=com.mzwu.www`;
// var queryString = `origin=latlng:28.238681,116.608768|name:我的位置&destination=latlng:${lat},${lng}|name:${address}&mode=driving&coord_type=bd09ll&src=com.mzwu.www`;
}
var app_url = `baidumap://map/direction?${queryString}`;
var web_url = `http://api.map.baidu.com/direction?${queryString}®ion=中國&output=html`;
// https://map.baidu.com/dir/%E6%88%91%E7%9A%84%E4%BD%8D%E7%BD%AE/%E5%9C%B0%E5%9D%80%E4%B8%80/@11599509.985,3557925.135,7z?querytype=nav&sn=1$$$$12127997.03,4051196.53$$%E6%88%91%E7%9A%84%E4%BD%8D%E7%BD%AE$$$$$$&en=1$$$$11871379.04,3060815.7$$%E5%9C%B0%E5%9D%80%E4%B8%80$$$$$$&c=233&version=4&route_traffic=1&mrs=1&da_src=shareurl
//嘗試喚起百度地圖App
window.location.href = app_url;
//喚起失敗打開Web版百度地圖
var startTime = Date.now();
var count = 0;
var t = setInterval(function () {
if (++count < 30) {
return;
}
if (Date.now() - startTime > 800) {
clearInterval(t);
}
if (!(document.hidden || document.webkitHidden)) {
window.location.href = web_url;
// window.open(web_url,'_bank')//瀏覽器會(huì)攔截
}
}, 20);
window.onblur = function () {
clearInterval(t);
};
});
}this.getStatus()在安卓系統(tǒng)中是BMAP_STATUS_SUCCESS,其他pc和ios獲取不到精準(zhǔn)位置。
百度地圖會(huì)打開,并從當(dāng)前位置到所選位置進(jìn)行導(dǎo)航,如圖所示:
1.pc端:打開導(dǎo)航,位置不精準(zhǔn),但可以用鼠標(biāo)拖動(dòng)來更改路線。

2.安卓:網(wǎng)頁當(dāng)前位置精準(zhǔn),打開百度地圖app同樣的。

3.ios:網(wǎng)頁當(dāng)前位置只能獲取市,但打開百度地圖app是精準(zhǔn)的。
六、完整代碼
記得申請秘鑰哦!?。?!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
.map{
width: 100%;
height: 100vh;
}
.map .anchorBL {
display: none;
}
</style>
</head>
<body>
<div>
<div class="map" id="map">
</div>
</div>
<script type="text/javascript" src="jquery.min.js"></script>
<script src="http://api.map.baidu.com/api?v=3.0&ak=您的秘鑰"></script>
<script src="http://api.map.baidu.com/api?type=webgl&v=1.0&ak=您的秘鑰"></script>
<script type="text/javascript"src="http://developer.baidu.com/map/jsdemo/demo/convertor.js"></script>
<script type="text/javascript">
getMap();
var map;
//展示地圖
function getMap(){
map = new BMapGL.Map('map');
var center = new BMapGL.Point(106.639958,26.645316);
map.centerAndZoom(center, 13);
map.enableScrollWheelZoom(true); //開啟鼠標(biāo)滾輪縮放
map.enableScrollWheelZoom(true);
map.setMapType(BMAP_SATELLITE_MAP);//設(shè)置地圖類型為普通衛(wèi)星地圖模式
var scaleCtrl = new BMapGL.ScaleControl(); // 添加比例尺控件
var zoomCtrl = new BMapGL.ZoomControl(); // 添加縮放控件
map.addControl(scaleCtrl);
}
let address = [
{
name:'地址一',
lng:106.641252,
lat:26.652775
},
{
name:'地址二',
lng:106.629753,
lat:26.637856
}
];
//添加位置標(biāo)識(shí)
address.forEach((v,k)=>{
addMaker1(v,v.name,-100,-60,'button')
})
function addMaker1(point,name,x,y,button) {
// 創(chuàng)建圖標(biāo)
var myIcon = new BMapGL.Icon("image/pointer.png", new BMapGL.Size(30, 39));
var pointer = new BMapGL.Point(point.lng,point.lat);
var marker = new BMapGL.Marker(pointer, {
icon: myIcon
});
map.addOverlay(marker);
var opts = {
position: new BMapGL.Point(point.lng,point.lat), // 指定文本標(biāo)注所在的地理位置
offset: new BMapGL.Size(x,y) // 設(shè)置文本偏移量
};
// 創(chuàng)建文本標(biāo)注對象
let string = `<div style="display: flex;align-items: center">${name}<img class="${button}" style="width: 30px;margin-left: 10px" src="image/logo.png"/></div>`
var label = new BMapGL.Label(string, opts);
// 自定義文本標(biāo)注樣式
label.setStyle({
color: 'black',
borderRadius: '5px',
borderColor: '#ccc',
padding: '5px',
fontSize: '14px',
height: '30px',
lineHeight: '30px',
fontFamily: '微軟雅黑'
});
map.addOverlay(label)
var opts = {
width: 100, // 信息窗口寬度
height: 24, // 信息窗口高度
// title: "故宮博物院", // 信息窗口標(biāo)題
}
label.addEventListener("click",function () {
let lngNum ;
let latNum ;
function myFun(result){
console.log(result)//獲取當(dāng)前所在市的信息,主要為了pc端和ios系統(tǒng)獲取不到精準(zhǔn)位置用的
lngNum = result.center.lng;
latNum = result.center.lat;
openBaiduMap(point.lng,point.lat,name,latNum,lngNum);//調(diào)起百度地圖
}
var myCity = new BMapGL.LocalCity();
myCity.get(myFun);
}
)
}
//喚起百度地圖
function openBaiduMap(lng, lat, address,lat11,lng11) {
var geolocation = new BMap.Geolocation();
// 開啟定位控件
geolocation.enableSDKLocation();
geolocation.getCurrentPosition(function (result) {
var queryString;
if (this.getStatus() == BMAP_STATUS_SUCCESS) {
console.log('11')
queryString = `origin=latlng:${result.point.lat},${result.point.lng}|name:我的位置&destination=latlng:${lat},${lng}|name:${address}&mode=driving&coord_type=bd09ll&src=com.mzwu.www`;
} else {
console.log('22')
queryString = `origin=latlng:${lat11},${lng11}|name:我的位置&destination=latlng:${lat},${lng}|name:${address}&mode=driving&coord_type=bd09ll&src=com.mzwu.www`;
// var queryString = `origin=latlng:28.238681,116.608768|name:我的位置&destination=latlng:${lat},${lng}|name:${address}&mode=driving&coord_type=bd09ll&src=com.mzwu.www`;
}
var app_url = `baidumap://map/direction?${queryString}`;
var web_url = `http://api.map.baidu.com/direction?${queryString}®ion=中國&output=html`;
// https://map.baidu.com/dir/%E6%88%91%E7%9A%84%E4%BD%8D%E7%BD%AE/%E5%9C%B0%E5%9D%80%E4%B8%80/@11599509.985,3557925.135,7z?querytype=nav&sn=1$$$$12127997.03,4051196.53$$%E6%88%91%E7%9A%84%E4%BD%8D%E7%BD%AE$$$$$$&en=1$$$$11871379.04,3060815.7$$%E5%9C%B0%E5%9D%80%E4%B8%80$$$$$$&c=233&version=4&route_traffic=1&mrs=1&da_src=shareurl
//嘗試喚起百度地圖App
window.location.href = app_url;
//喚起失敗打開Web版百度地圖
var startTime = Date.now();
var count = 0;
var t = setInterval(function () {
if (++count < 30) {
return;
}
if (Date.now() - startTime > 800) {
clearInterval(t);
}
if (!(document.hidden || document.webkitHidden)) {
window.location.href = web_url;
// window.open(web_url,'_bank')//瀏覽器會(huì)攔截
}
}, 20);
window.onblur = function () {
clearInterval(t);
};
});
}
</script>
</body>
</html>總結(jié)
到此這篇關(guān)于前端百度地圖添加點(diǎn)并跳轉(zhuǎn)到百度地圖進(jìn)行導(dǎo)航的文章就介紹到這了,更多相關(guān)前端百度地圖添加點(diǎn)跳進(jìn)行導(dǎo)航內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS正則表達(dá)式替換字符串replace()方法實(shí)例代碼
正則表達(dá)式是用于匹配字符串中字符組合的模式,在js中正則表達(dá)式是對象,這篇文章主要給大家介紹了關(guān)于JS正則表達(dá)式替換字符串replace()方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
JavaScript中異步與回調(diào)的基本概念及回調(diào)地獄現(xiàn)象
這篇文章主要介紹了JavaScript中異步與回調(diào)的基本概念,以及回調(diào)地獄現(xiàn)象,本文主要介紹了異步和回調(diào)的基本概念,二者是JavaScript的核心內(nèi)容,需要所有熱愛JS的小伙伴深入了解,需要的朋友可以參考下2022-07-07
JS+CSS實(shí)現(xiàn)的經(jīng)典tab選項(xiàng)卡效果代碼
這篇文章主要介紹了JS+CSS實(shí)現(xiàn)的經(jīng)典tab選項(xiàng)卡效果代碼,通過簡單的鼠標(biāo)事件觸發(fā)js函數(shù)實(shí)現(xiàn)針對頁面元素的遍歷與樣式變換功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09
深入了解Javascript的事件循環(huán)機(jī)制
單線程的同步等待極大影響效率,任務(wù)不得不一個(gè)一個(gè)等待執(zhí)行,對于網(wǎng)頁應(yīng)用是無法接受的。所以Javascript使用事件循環(huán)機(jī)制來解決異步任務(wù)的問題。本文就來講講Javascript的事件循環(huán)機(jī)制,希望對你有所幫助2022-09-09
JS實(shí)現(xiàn)點(diǎn)擊鏈接取消跳轉(zhuǎn)效果的方法
有時(shí)候我們僅僅希望將鏈接<a>作為一個(gè)按鈕使用,但是在默認(rèn)狀態(tài)下,點(diǎn)擊鏈接會(huì)出現(xiàn)跳轉(zhuǎn)效果,下面就通過代碼實(shí)例,介紹一下如何實(shí)現(xiàn)此效果2014-01-01

