WebApp如何調(diào)用百度地圖API

一、百度地圖API的應用場景和方法
百度地圖接口有三種調(diào)用方式:
第一種是WEB瀏覽器端調(diào)用(H5);
第二種是Android;
第三種是IOS;
附上文檔地址:
第一種當你調(diào)用API時會在瀏覽器端打開百度地圖頁面(Web和WebAPP打開后樣子不同),后兩種則是直接打開移動端的百度APP應用
以上三種調(diào)用方式其實都是通過調(diào)用百度地圖來展示你要的導航或路徑規(guī)劃;如果你想在自己的應用里面嵌入地圖或者類似百度地圖功能,有兩種方法:
第一種是利用百度javascript開發(fā)文檔;
附上文檔地址:http://lbsyun.baidu.com/index.php?title=jspopular;
第二種使用組件化的百度地圖,如果你使用VUE框架可以用 vue-baidu-map這個插件,適用于React,Angular的map組件我還沒研究,直接用npm安裝也行,script標簽引入也可以;
附上文檔地址:https://dafrok.github.io/vue-baidu-map/#/zh/index
不管以上那種方法,只要你想要調(diào)用百度地圖API,就必須登錄以下網(wǎng)址申請秘鑰ak:
https://passport.baidu.com/v2/?login&u=http%3A%2F%2Flbsyun.baidu.com%2Fapiconsole%2Fkey%3Fapplication%3Dkey
二、功能的實現(xiàn)

1.要改變百度地圖標注ICON圖標

var map =new BMap.Map('container');  
map.centerAndZoom(new BMap.Point(116.380797, 39.918497), 18);  //其中18是地圖放大的倍數(shù)
var icon = new BMap.Icon('pin.png', new BMap.Size(20, 32), {   //(20,30)是顯示圖標的范圍,這個尺寸最好就是圖標的大小,因為無法對圖標進行縮放操作
//此處的icon路徑必須是服務器上地址,不可以使用本地的圖片(我試了好多次用本地都不可以)
    anchor: new BMap.Size(10, 30)  //偏移量
});
var mkr =new BMap.Marker(new BMap.Point(116.38075,39.918986), {  //Marker是一個用來往地圖上添加點標記的類。
    icon: icon  //Marker的構(gòu)造函數(shù)的參數(shù)為Point和MarkerOptions(可選)
});  
map.addOverlay(mkr); 

其中 上面 anchor表示 即定位點距離圖片左上角的偏移量

// 向地圖添加標注
    for( var i = 0;i < points.length; i++){
        var myIcon = new BMap.Icon("http://7xic1p.com1.z0.glb.clouddn.com/markers.png", new BMap.Size(23, 25), {
            // 指定定位位置
            offset: new BMap.Size(10, 25),
            // 當需要從一幅較大的圖片中截取某部分作為標注圖標時,需要指定大圖的偏移位置   
            imageOffset: new BMap.Size(0, 0 - i * 25) // 設置圖片偏移  
        });
        var point = new BMap.Point(points[i][0],points[i][1]);
        // 創(chuàng)建標注對象并添加到地圖 
        var marker = new BMap.Marker(point,{icon: myIcon});
        map.addOverlay(marker);
    };

2.路徑規(guī)劃

目前百度沒有向外提供多目的地路徑規(guī)劃的接口,即多目的地的最優(yōu)路徑,現(xiàn)在百度API僅有兩點之間的路徑規(guī)劃。所以這個功能目前我還沒有找到實現(xiàn)方法。

3.關(guān)閉百度默認的POI信息點。

一開始接觸地圖,我都不曉得什么是POI,最后才知道是下圖的這個東東


image.png
var map = new BMap.Map("allmap", {enableMapClick:false});//構(gòu)造底圖時,關(guān)閉底圖可點功能

4.地址轉(zhuǎn)碼

WGS84:為一種大地坐標系,也是目前廣泛使用的GPS全球衛(wèi)星定位系統(tǒng)使用的坐標系。
GCJ02:又稱火星坐標系,是由中國國家測繪局制訂的地理信息系統(tǒng)的坐標系統(tǒng)。由WGS84坐標系經(jīng)加密后的坐標系。
BD09:為百度坐標系,在GCJ02坐標系基礎(chǔ)上再次加密。其中bd09ll表示百度經(jīng)緯度坐標,bd09mc表示百度墨卡托米制坐標。
非中國地區(qū)地圖,服務坐標統(tǒng)一使用WGS84坐標。
如果你是用的手機自帶GPS定位,則使用WGS84坐標,而百度對外接口的坐標系為BD09坐標系,所以如果你調(diào)用的是手機GPS定位,又想讓其顯示在百度地圖上,那么必須先將原始坐標轉(zhuǎn)化成百度地圖的坐標。
參見例子:http://lbsyun.baidu.com/jsdemo.htm#a5_2

5.定位

由于不是正式的app形式,只能通過html5的地理定位方法去獲取。html5 geolocation 特性可以實現(xiàn)瀏覽器定位,百度API對其進行了封裝,代碼如下:

var geolocation = new BMap.Geolocation(); //實例化瀏覽器定位對象。
    geolocation.getCurrentPosition(function(r) {
        if(this.getStatus() == BMAP_STATUS_SUCCESS) {
        var mk = new BMap.Marker(r.point);
            getAddress(r.point);
        } else {
            alert('failed' + this.getStatus());
        }
    });
    //獲取地址信息,設置地址label
    function getAddress(point) {
        var gc = new BMap.Geocoder();
        gc.getLocation(point, function(rs) {
            console.log(point)
        var addComp = rs.addressComponents;
            var address = addComp.province + addComp.city + addComp.district + addComp.street +           addComp.streetNumber; //獲取地址
      //console.log(addComp.province + addComp.city);

      });
}
//關(guān)于狀態(tài)碼

//BMAP_STATUS_SUCCESS
檢索成功。對應數(shù)值“0”。

//BMAP_STATUS_CITY_LIST
城市列表。對應數(shù)值“1”。

//BMAP_STATUS_UNKNOWN_LOCATION
位置結(jié)果未知。對應數(shù)值“2”。

//BMAP_STATUS_UNKNOWN_ROUTE
導航結(jié)果未知。對應數(shù)值“3”。

//BMAP_STATUS_INVALID_KEY
非法密鑰。對應數(shù)值“4”。

//BMAP_STATUS_INVALID_REQUEST
非法請求。對應數(shù)值“5”。

//BMAP_STATUS_PERMISSION_DENIED
沒有權(quán)限。對應數(shù)值“6”。(自 1.1 新增)

//BMAP_STATUS_SERVICE_UNAVAILABLE
服務不可用。對應數(shù)值“7”。(自 1.1 新增)

//BMAP_STATUS_TIMEOUT
超時。對應數(shù)值“8”。(自 1.1 新增)

6.添加信息窗口

vue中使用采用全局注冊
全局注冊將一次性引入百度地圖組件庫的所有組件,然后在各個頁面可以直接使用

import Vue from 'vue'
import BaiduMap from 'vue-baidu-map'

Vue.use(BaiduMap, {
// ak 是在百度地圖開發(fā)者平臺申請的密鑰 詳見 http://lbsyun.baidu.com/apiconsole/key */
ak: 'YOUR_APP_KEY'
})

<baidu-map class="map" :center=center :zoom="15">
    <bm-marker :position=center animation="BMAP_ANIMATION_BOUNCE"  @click="infoWindowOpen">
      <bm-info-window :position=center :show="infoWindow.show" @close="infoWindowClose" @open="infoWindowOpen">
          <div>
            <ul class="list" v-show="point.deviceType == 1">
                <li ><i>開合狀態(tài):{{point.angle_1 | angle_1Fil}}</i></li>
              <li ><i>電壓量:{{point.battery}}V</i></li>
              </ul>         
          </div>
      </bm-info-window>
  </bm-marker>
</baidu-map>

//methods:
infoWindowClose(e) {
    this.infoWindow.show = false
},
infoWindowOpen(e) {
    this.infoWindow.show = true
},

JS API :下面代碼為多點添加信息窗體

let map = new BMap.Map("amap");
let point = new BMap.Point(this.points[0].lng, this.points[0].lat);
map.centerAndZoom(point, 15);
let pointArray = new Array();
for(let i=0;i<this.points.length;i++){
    let imgUrl = "http://*********/img/"+this.points[i].imgUrl;
    let myIcon =  new BMap.Icon(imgUrl, new BMap.Size(100, 100), {  
          //offset: new BMap.Size(10, 25), // 指定定位位置  一般只有icon圖片為雪碧圖時用到
         // imageOffset: new BMap.Size(0, 0 - 10 * 25) // 設置圖片偏移  
         });  
        let marker = new BMap.Marker(new BMap.Point(this.points[i].lng, this.points[i].lat),{icon:myIcon}); // 創(chuàng)建點
        // 創(chuàng)建信息窗口對象
        addClickHandler(this.points[i],marker);
        map.addOverlay(marker);    //增加點
        pointArray[i] = new BMap.Point(this.points[i].lng, this.points[i].lat);
        marker.addEventListener("click",attribute);
}
//讓所有點在視野范圍內(nèi)
map.setViewport(pointArray);
//獲取覆蓋物位置
function attribute(e){
    var p = e.target;
    //alert("marker的位置是" + p.getPosition().lng + "," + p.getPosition().lat);    
}   
function addClickHandler(content,marker){
    marker.addEventListener("click",function(e){
        openInfo(content,e)}
    );
}
function openInfo(content,e){
    var p = e.target;
    var point = new BMap.Point(p.getPosition().lng, p.getPosition().lat);
    var sContent ='<div>'
        +'<ul class="list">'
        +'<li style="width: 4.3rem;height: 0.78rem;line-height: 0.78rem;border-bottom: 1px solid #ccc;"><i>開合狀態(tài):' + status + '</i></li>'
        +'</ul>'
        +'</div>';
    var infoWindow = new BMap.InfoWindow(sContent); // 創(chuàng)建信息窗口對象 
    map.openInfoWindow(infoWindow,point); //開啟信息窗口
}
  

7.查詢兩點間路徑并進行導航

a.原生APP則可以直接調(diào)起百度地圖APP來實現(xiàn);
參見文檔:http://lbsyun.baidu.com/index.php?title=uri/api/android
b.WebAPP則可以調(diào)起瀏覽器百度API實現(xiàn),

http://api.map.baidu.com/direction?origin=latlng:34.264642646862,108.95108518068|name:我家&destination=大雁塔&mode=driving&region=西安&output=html&src=yourCompanyName|yourAppName
//調(diào)起百度PC或Web地圖,展示"西安市"從(lat:34.264642646862,lng:108.95108518068 )"我家"到"大雁塔"的駕車路線。

其中目的地也可以用經(jīng)緯度描述,類同origin;region參數(shù)也必須要有

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容