Vue中Baidu地圖API提取整合

看了很多文章對Vue中如何使用寫的都很亂,下面貼一下自己做了簡單的方法提取,還有開發過程中遇到的神坑。

注意事項
  • 首先要在index.html 的head標簽中要掛載<script type="text/javascript" src="http://api.map.baidu.com/getscript?v=2.0&ak=str&t=20170517145936"></script>str為申請獲得的一段字符串,v為版本也需要添加上。
  • 百度地圖中如果需要添加實時交通,這類懸浮框的控件,需要另外引入CSS、JS文件,如:TrafficControl_min.jsTrafficControl_min.css,熱地圖需引入heatmap.js
  • 百度地圖熱力圖,需要大量坐標才能生成不同色塊,methods方法中的addHot是我自己寫的隨機生成坐標點函數,根據地圖中心點來計算。

正文

Vue實例上的methods存儲各個空間的方法,在mounted中進行初始化渲染。

功能目錄
  • addLineVideo --地圖中心處生成牽引線,線條起始及終點位置固定,自己寫的比較粗糙。
  • mapMoveSelf--地圖縮放及視覺中心點地理位置重置。
  • addIcon-- 地圖上的圖標。
  • addMenu-- 添加放大縮小控件
  • addLocaPosition-- 添加定位控件
  • addControl -- 添加工具條,比例尺控件
  • addControlCityList -- 添加城市下拉列表控件
  • addLine -- 添加曲線
  • addCustControl -- 自定義放大縮小懸浮控件
  • addLoad -- 實時路況 需要引入額外文件
  • addHot -- 熱力圖 需要引入額外文件
methods部分掛在各功能函數
mapMoveSelf(map){
    console.log(map)
    setTimeout(function(){
        map.panTo(new BMap.Point(119.906441,29.457793));
    }, 1000);
    setTimeout(function(){
        map.setZoom(14);
    },4000);
},
addIcon(map){
    var points = [
            [120.018874,29.48683],
            [119.923671,29.514494],
            [119.906441,29.457793],
            [119.965029,29.403953],
            [119.915029,29.303953],
            [119.935029,29.203953],
            [119.945029,29.453953],
            [119.765029,29.363953]
        ];
    // 向地圖添加標注
    for( var i = 0;i < points.length; i++){
    //定義新圖標
    var myIcon = new BMap.Icon(require("../../../assets/images/wifi.png"), new BMap.Size(44, 44), {
    // 指定定位位置
    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]);
    // 創建標注對象并添加到地圖 
    var marker = new BMap.Marker(point,{icon: myIcon});
    map.addOverlay(marker);
    };
    //添加新圖標的監聽事件
    marker.addEventListener('click',function(){
        var p = marker1.getPosition();//獲取位置
        // alert("點擊的位置是:" + p.lng + ',' + p.lat);
    })
},
addMenu(map){
    var menu = new BMap.ContextMenu();

    var txtMenuItem = [
        {
            text:'放大',
            callback:function(){map.zoomIn()}
        },
        {
            text:'縮小',
            callback:function(){map.zoomOut()}
        }
    ];
    for(var i=0; i < txtMenuItem.length; i++){
        menu.addItem(new BMap.MenuItem(txtMenuItem[i].text,txtMenuItem[i].callback,100));
    }
    map.addContextMenu(menu);
},
addLocaPosition(map){
    //添加定位組件
    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)
},
addControl(map){
    //添加工具條、比例尺控件
    map.addControl(new BMap.ScaleControl({anchor:BMAP_ANCHOR_TOP_LEFT}));
    map.addControl(new BMap.NavigationControl());
    map.addControl(new BMap.NavigationControl({anchor:BMAP_ANCHOR_BOTTOM_RIGHT,type:BMAP_NAVIGATION_CONTROL_SMALL}));
    map.addControl(new BMap.NavigationControl({anchor: BMAP_ANCHOR_TOP_LEFT,type: BMAP_NAVIGATION_CONTROL_LARGE,enableGeolocation: true}));
},
addControlCityList(map){
    //創建城市下拉列表控件;
    map.addControl(new BMap.CityListControl({
        anchor:BMAP_ANCHOR_BOTTOM_RIGHT,
        offset:new BMap.Size(130,23),
        //切換城市之間事件
        onChangeBefore: function(){
           alert('before');
        },
        //切換城市之后事件
        onChangeAfter:function(){
          alert('after');
        }
    }));
},
addLine(map){
    //添加曲線
    var beijingPosition=new BMap.Point(116.432045,39.910683),
    hangzhouPosition=new BMap.Point(120.129721,30.314429),
    taiwanPosition=new BMap.Point(121.491121,25.127053);
    var point = [beijingPosition,hangzhouPosition,taiwanPosition];

    var curve = new BMapLib.CurveLine(point, {strokeColor:"blue", strokeWeight:3, strokeOpacity:0.5});//創建弧線
    map.addOverlay(curve);//添加到地圖上
    curve.enableEditing();//開啟編輯功能
},
addCustControl(map){
    //創建自定義放大縮小懸浮控件
    function ZoomControl() {
    //默認停靠位置和偏移量
    this.defaultAnchor = BMAP_ANCHOR_BOTTOM_RIGHT;
    this.defaultOffset = new BMap.Size(50,23);
    }
    //通過JavaScript的prototype屬性繼承于BMap.Control
    ZoomControl.prototype = new BMap.Control();
    //自定義控件必須實現自己的initialize方法,并且將控件的DOM元素返回
    //在本方法中創建div容器,并將其添加到地圖容器中
    ZoomControl.prototype.initialize = function(map) {
        //創建一個DOM元素
        var div = document.createElement('div');
        //添加文字說明
        div.appendChild(document.createTextNode('放大兩級'));
        //添加樣式
        div.style.color = '#40C5CC'; 
        div.style.cursor = 'pointer';
        div.style.border = '3px solid gray';
        div.style.backgroundColor = '#eee';
        //綁定事件,點擊觸發
        div.onclick = function(e) {
            map.setZoom(map.getZoom() + 2);
        }
        //添加DOM元素到地圖上
        map.getContainer().appendChild(div);
        //將DOM元素返回
        return div;
    }
    //創建控件
    var myZoomCtrl = new ZoomControl();
    map.addControl(myZoomCtrl)
},
addLoad(map){
    //實時路況
    var ctrl = new BMapLib.TrafficControl({
        showPanel: true //是否顯示路況提示面板
    });      
    map.addControl(ctrl);
    ctrl.setAnchor(BMAP_ANCHOR_BOTTOM_RIGHT);  
},
mounted方法中初始化各功能部件
// 百度地圖API功能
    // 創建Map實例
    const _self= this;
    var map = new BMap.Map("XSDFXPage",{enableMapClick:true});
    // 初始化地圖,設置中心點坐標和地圖級別
    map.centerAndZoom(new BMap.Point(120.018874,29.48683), 9);
    // 添加地圖類型控件
    // map.addControl(new BMap.MapTypeControl());  
    // 設置地圖顯示的城市 此項是必須設置的
    map.setCurrentCity("浦江");    
    // 開啟鼠標滾輪縮放      
    map.enableScrollWheelZoom(true);
    // 設置定時器,對地圖進行自動移動
    // this.mapMoveSelf
    /************************************************
    添加折線
    *************************************************/
    var pointGZ = new BMap.Point(119.923671,29.514494);
    var pointHK = new BMap.Point(110.35,20.02);
    setTimeout(function(){
        var polyline = new BMap.Polyline(
              [pointGZ,pointHK],
              {strokeColor:"blue",strokeWeight:5,strokeOpacity:0.5}
          );
         map.addOverlay(polyline);
     },6000);
    _self.addLoad(map);
     _self.addControl(map);
    _self.addLocaPosition(map);
    /************************************************
    添加自定義控件類,放大ZoomControl
    *************************************************/

    /************************************************
    添加添加城市列表控件
    *************************************************/
     _self.addControlCityList(map);
    /************************************************
    添加新圖標
    *************************************************/
     _self.addIcon(map);
    /************************************************
    添加曲線
    *************************************************/

    /************************************************
    給地圖添加右鍵菜單
    *************************************************/
    _self.addMenu(map);

實用工具網站
百度地圖·JavaScript
百度地圖坐標拾取
百度地圖API

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,570評論 2 379

推薦閱讀更多精彩內容

  • 轉載 :OpenDiggawesome-github-vue 是由OpenDigg整理并維護的Vue相關開源項目庫...
    果汁密碼閱讀 23,161評論 8 124
  • 來源:github.com Vue.js開源項目速查表:https://www.ctolib.com/cheats...
    zhangtaiwei閱讀 11,651評論 1 159
  • UI組件element ★11612 - 餓了么出品的Vue2的web UI工具套件 Vux ★7503 - 基于...
    董董董董董董董董董大笨蛋閱讀 8,556評論 6 123
  • 一早起來的時候,看到天空只是有些陰沉。等待洗澡后出來,外面已經非常黑了,雨已經下得很密實了。 看看腳邊耐心等待的維...
    錦墨hhy閱讀 151評論 0 0
  • 月經期結束后要集中做倒立的體式,如肩倒立,手倒立,犁式,橋式肩倒立,孔雀起舞,倒剪式,雙腿內收直棍式,可以完全的清...
    慧懂閱讀 923評論 0 1