前端百度地圖添加點并跳轉(zhuǎn)到百度地圖進(jìn)行導(dǎo)航完整代碼
一、需求
前端有時候需要做地圖展示,我一般用的地圖是天地圖和百度地圖,大家可以通過官網(wǎng)來制作地圖。
1.天地圖:天地圖API
可根據(jù)類參考或者代碼示例來制作地圖。
2。百度地圖:jspopularGL | 百度地圖API SDK
申請秘鑰、 展示地圖、demo參考來制作地圖。
前端需要展示地圖,添加地址的點位(獲取經(jīng)緯度,把點添加到地圖上),點擊點跳轉(zhuǎn)到app或者是官網(wǎng)上,這里用到的是百度地圖,天地圖暫時不提供導(dǎo)航服務(wù)。
下面我們對這一需求進(jìn)行實現(xiàn)。
二、展示地圖
html代碼:
<div class="map" id="map"> </div>
其中map是放地圖的容器,一定要給這個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é)果:
三、添加點覆蓋物
let address = [ { name:'地址一', lng:106.641252, lat:26.652775 }, { name:'地址二', lng:106.629753, lat:26.637856 } ]; //添加位置標(biāo)識 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) { //...添加點 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) } ) }
其中,點擊信息窗口,喚起百度地圖。
由于pc端和ios系統(tǒng)獲取不到精準(zhǔn)位置,所以需要通過var myCity = new BMapGL.LocalCity();
myCity.get(myFun);來實現(xiàn)獲取位置,只不過這個位置是大概范圍(當(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')//瀏覽器會攔截 } }, 20); window.onblur = function () { clearInterval(t); }; }); }
this.getStatus()在安卓系統(tǒng)中是BMAP_STATUS_SUCCESS,其他pc和ios獲取不到精準(zhǔn)位置。
百度地圖會打開,并從當(dāng)前位置到所選位置進(jìn)行導(dǎo)航,如圖所示:
1.pc端:打開導(dǎo)航,位置不精準(zhǔn),但可以用鼠標(biāo)拖動來更改路線。
2.安卓:網(wǎng)頁當(dāng)前位置精準(zhǔn),打開百度地圖app同樣的。
3.ios:網(wǎng)頁當(dāng)前位置只能獲取市,但打開百度地圖app是精準(zhǔn)的。
六、完整代碼
記得申請秘鑰哦?。。。?/p>
<!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)識 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')//瀏覽器會攔截 } }, 20); window.onblur = function () { clearInterval(t); }; }); } </script> </body> </html>
總結(jié)
到此這篇關(guān)于前端百度地圖添加點并跳轉(zhuǎn)到百度地圖進(jìn)行導(dǎo)航的文章就介紹到這了,更多相關(guān)前端百度地圖添加點跳進(jìn)行導(dǎo)航內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS正則表達(dá)式替換字符串replace()方法實例代碼
正則表達(dá)式是用于匹配字符串中字符組合的模式,在js中正則表達(dá)式是對象,這篇文章主要給大家介紹了關(guān)于JS正則表達(dá)式替換字符串replace()方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07JavaScript中異步與回調(diào)的基本概念及回調(diào)地獄現(xiàn)象
這篇文章主要介紹了JavaScript中異步與回調(diào)的基本概念,以及回調(diào)地獄現(xiàn)象,本文主要介紹了異步和回調(diào)的基本概念,二者是JavaScript的核心內(nèi)容,需要所有熱愛JS的小伙伴深入了解,需要的朋友可以參考下2022-07-07JS+CSS實現(xiàn)的經(jīng)典tab選項卡效果代碼
這篇文章主要介紹了JS+CSS實現(xiàn)的經(jīng)典tab選項卡效果代碼,通過簡單的鼠標(biāo)事件觸發(fā)js函數(shù)實現(xiàn)針對頁面元素的遍歷與樣式變換功能,具有一定參考借鑒價值,需要的朋友可以參考下2015-09-09深入了解Javascript的事件循環(huán)機(jī)制
單線程的同步等待極大影響效率,任務(wù)不得不一個一個等待執(zhí)行,對于網(wǎng)頁應(yīng)用是無法接受的。所以Javascript使用事件循環(huán)機(jī)制來解決異步任務(wù)的問題。本文就來講講Javascript的事件循環(huán)機(jī)制,希望對你有所幫助2022-09-09JS實現(xiàn)點擊鏈接取消跳轉(zhuǎn)效果的方法
有時候我們僅僅希望將鏈接<a>作為一個按鈕使用,但是在默認(rèn)狀態(tài)下,點擊鏈接會出現(xiàn)跳轉(zhuǎn)效果,下面就通過代碼實例,介紹一下如何實現(xiàn)此效果2014-01-01