vue中引入百度地圖:一個小白的vue插件探索之路

1. 相關(guān)文檔和工具

百度地圖插件地址(插件文檔在github項目代碼里霉猛,可下載下來運行項目閱讀)
百度地圖 javascript API(插件的文檔有些并未解釋完全屋灌,需要結(jié)合官方API文檔閱讀)
密鑰申請(必須要申請開發(fā)者密鑰才可以使用百度地圖)
坐標(biāo)拾取器(用來獲取地圖上點的經(jīng)緯度)

2.引入

效果圖

步驟:

  1. 注冊組件
  2. 初始化地圖
  3. 添加縮放控件
  4. 添加地圖類型控件
  5. 添加點
  6. 添加線
  7. 添加信息窗體
  8. 添加外部浮層

2.1 安裝注冊組件

安裝組件

$ npm install vue-baidu-map --save

注冊組件

<template>
 // ak 是在百度地圖開發(fā)者平臺申請的密鑰 詳見 http://lbsyun.baidu.com/apiconsole/key */
  <baidu-map class="bm-view" ak="YOUR_APP_KEY">
  </baidu-map>
</template>

<script>
import BaiduMap from 'vue-baidu-map/components/map/Map.vue'
export default {
  components: {
    BaiduMap
  }
}
</script>

<style>
.bm-view {
  width: 100%;
  height: 300px;
}
</style>

可全局注冊,也可局部注冊,因為我只有一個頁面用到地圖煤搜,所以采用局部注冊

2.2 初始化地圖

<template>
  <baidu-map id="baidumap" class="map" ak="KbGbuk~~~BWmEjf"   
               :center="map.center"
               :zoom="map.zoom"
               :scroll-wheel-zoom="map.scroll">
   </baidu-map>
</template>
<script>
 import BaiduMap from 'vue-baidu-map/components/map/Map.vue'//用什么引入什么就好,路徑在下載的github項目中可以看到
 export default {
        name: "Map",
        components: {
            BaiduMap
        }, 
        data() {
            return {
                map: {
                    center: {lng: 112.127671, lat: 32.015287},//'襄陽市',地圖的中心點坐標(biāo)
                    zoom: 15,//1-18徙鱼,數(shù)值越大離地面越近宅楞,地圖實際面積越小
                    scroll: true //支持滾動鼠標(biāo)縮放
                }
          }
      }
}
</script>
<style lang="stylus" scoped>
    .map
        width auto
        height 750px //寬高一定要設(shè)置
        margin 0 20px 20px 20px
</style>

2.3 添加縮放控件

<template>
  <baidu-map id="baidumap" class="map" ak="KbGbuk~~~BWmEjf"   
               :center="map.center"
               :zoom="map.zoom"
               :scroll-wheel-zoom="map.scroll">
       <!-- 縮放控件,所有地圖的組件都要寫在 baidu-map組件內(nèi)-->
       <bm-navigation anchor="BMAP_ANCHOR_TOP_LEFT"></bm-navigation>
   </baidu-map>
</template>
<script>
 import BaiduMap from 'vue-baidu-map/components/map/Map.vue'
 import BmNavigation from 'vue-baidu-map/components/controls/Navigation.vue'//引入縮放控件
 export default {
        name: "Map",
        components: {
            BaiduMap, BmNavigation//注冊組件
        }, 
      ...
}
</script>

關(guān)于anchor屬性袱吆,插件文檔中的說明是


但文檔中并未說明ControlAnchor類型是什么厌衙,此時要用到百度地圖 javascript API,找到官方文檔解釋:

后面的操作就同理啦绞绒,插件文檔中沒有詳細(xì)說明的東西都可以去官方API文檔中查找婶希,畢竟插件也是在官方j(luò)s的基礎(chǔ)上寫的嘛(我真厲害哈哈O(∩_∩)O)

2.4 添加地圖類型控件

<template>
  <baidu-map id="baidumap" class="map" ak="KbGbuk~~~BWmEjf"   
               :center="map.center"
               :zoom="map.zoom"
               :scroll-wheel-zoom="map.scroll">
      <!-- 地圖類型控件 -->
       <bm-map-type :map-types="['BMAP_NORMAL_MAP', 'BMAP_HYBRID_MAP']" anchor="BMAP_ANCHOR_TOP_RIGHT"></bm-map-type>
   </baidu-map>
</template>
<script>
 import BaiduMap from 'vue-baidu-map/components/map/Map.vue'
 import BmMapType from 'vue-baidu-map/components/controls/MapType.vue'//類型組件
 export default {
        name: "Map",
        components: {
            BaiduMap,  BmMapType//注冊
        }, 
       ...
}
</script>

同理,找到官方文檔百度地圖 javascript API蓬衡,設(shè)置地圖類型:

2.5 添加點

<template>
  <baidu-map id="baidumap" class="map" ak="KbGbuk~~~BWmEjf"   
               :center="map.center"
               :zoom="map.zoom"
               :scroll-wheel-zoom="map.scroll">
      <!-- 各設(shè)備在地圖上顯示  -->
      <!-- 循環(huán)輸出點喻杈,key值一定要設(shè)置全局唯一的,不要用數(shù)組下標(biāo)狰晚;如果只顯示一個點就去掉循環(huán)-->
      <!-- 可以自定義圖標(biāo)  -->
      <!-- 設(shè)置點擊事件筒饰,點擊后打開信息窗體  -->
       <bm-marker v-for="item of deviceInfo.devicelist" :key="item._id" :position="{lng: item.lng, lat: item.lat}"
                   :icon="{url: 'https://gitee.com/hyflu4/imgs/raw/master/baidu-map-icons/ren.png', size: {width: 48, height: 32}}"
                   @click="infoWindowOpen(item,1)"
        >
        </bm-marker>
   </baidu-map>
</template>
<script>
 import BaiduMap from 'vue-baidu-map/components/map/Map.vue'//用什么引入什么就好,路徑在下載的github項目中可以看到
import BmMarker from 'vue-baidu-map/components/overlays/Marker.vue'
 export default {
        name: "Map",
        components: {
            BaiduMap,  BmMarker
        }, 
        props: ['deviceInfo'],
       ...
}
</script>

這里是循環(huán)輸出多個點壁晒,直接在marker組件上使用v-for瓷们,不需要加div來循環(huán)(來自一個小白走過的坑...)

2.6 添加線

<template>
  <baidu-map id="baidumap" class="map" ak="KbGbuk~~~BWmEjf"   
               :center="map.center"
               :zoom="map.zoom"
               :scroll-wheel-zoom="map.scroll">
      <!-- 輸出所有的點  -->
       <bm-marker v-for="item of towers" :key="item._id" :position="{lng: item.lng, lat: item.lat}"
                   :icon="{url: 'https://gitee.com/hyflu4/imgs/raw/master/baidu-map-icons/meishi.png', size: {width: 32, height: 32}}"
                   @click="infoWindowOpen(item,2)"
        >
        </bm-marker>
        <!-- 一條線,只需要path中給出組成線的點坐標(biāo)數(shù)組  -->
        <!-- 多條線秒咐,即一個二維數(shù)組谬晕,需要用到v-for  -->
        <bm-polyline v-for="(item,key) of towerLines" :key="key" :path="item" stroke-color="red" 
                  :stroke-opacity="1"   :stroke-weight="3">
        </bm-polyline>
   </baidu-map>
</template>
<script>
 import BaiduMap from 'vue-baidu-map/components/map/Map.vue'
import BmMarker from 'vue-baidu-map/components/overlays/Marker.vue'
import BmPolyline from 'vue-baidu-map/components/overlays/Polyline.vue'
 export default {
        name: "Map",
        components: {
            BaiduMap,  BmMarker,BmPolyline
        }, 
        props: ['deviceInfo', 'towerlineInfo'],
        data() {
            return {
                map: {
                    center: {lng: 112.127671, lat: 32.015287},//'襄陽市',地圖的中心點坐標(biāo)
                    zoom: 15,//1-18携取,數(shù)值越大離地面越近攒钳,地圖實際面積越小
                    scroll: true //支持滾動鼠標(biāo)縮放
                },
                towerLines: [],
                towers: []
          }
        }
}
</script>
  • 線是由多個點組成的,因此只要給出點的數(shù)組就能畫出線啦~
  • 線和點是分開的雷滋,當(dāng)需要既顯示點不撑,又顯示點連成的線時,還是需要分成點和線
  • 這里給出線的數(shù)據(jù)結(jié)構(gòu)以供參考:
towerLines:[
  [{lng:'12.12',lat:'13.13'},{lng:'13.13',lat:'14.14'},{lng:'14.14',lat:'15.15}],//第一條線
  [{lng:'12.12',lat:'13.13'},{lng:'13.13',lat:'14.14'},{lng:'14.14',lat:'15.15}],//第二條線
]

2.7 添加信息窗體

<template>
    <baidu-map id="baidumap" class="map" ak="KbGbuknrQ3M9Ms9uwb260MpQAdBWmEjf"
               :center="map.center"
               :zoom="map.zoom"
               :scroll-wheel-zoom="map.scroll"
    >
        <bm-info-window :show="infoWindow.show" :position="infoWindow.position"
                        class="info-window"
                        @open="infoWindowOpen"
                        @close="infoWindowClose">
            <!--此處是自定義窗體內(nèi)容惊豺,你也可以用{{}}的方式直接輸出內(nèi)容-->
            <div class="info-Window-name">{{infoWindow.title}}</div>
            <div v-for="(item,key) of infoWindow.contents" :key="key">{{item}}</div>
        </bm-info-window>
    </baidu-map>
</template>
<script>
    import BaiduMap from 'vue-baidu-map/components/map/Map.vue'
    import BmInfoWindow from 'vue-baidu-map/components/overlays/InfoWindow.vue'
    export default {
        name: "Map",
        components: {
            BaiduMap,BmInfoWindow
        },
        props: ['deviceInfo', 'towerlineInfo'],
        data() {
            return {
                map: {
                    center: {lng: 112.127671, lat: 32.015287},//'襄陽市',
                    zoom: 15,//1-18
                    scroll: true
                },
                infoWindow: {
                    show: false,
                    position: {},
                    title: '',
                    contents: []
                },
            }
        },

        methods: {
            clickDevice(data) {
                this.infoWindow.position = {lng: data.lng, lat: data.lat}
                this.infoWindow.title = data.devicename
                this.infoWindow.contents = []
                this.infoWindow.contents.push(
                    '等級:' + data.elecstrength,
                    '狀態(tài):' + (data.isarmclose ? '已抵達(dá)' : '已離開'),
                    '經(jīng)度:' + data.lng,
                    '緯度:' + data.lat   
                )
            },
            clickTower(data) {
                this.infoWindow.position = {lng: data.lng, lat: data.lat}
                this.infoWindow.title = data.towername
                this.infoWindow.contents = []
                this.infoWindow.contents.push(
                    '線路名稱:' + data.linename,
                    '線路等級:' + data.vlevel,
                    '經(jīng)度:' + data.lng,
                    '緯度:' + data.lat
                )
            },
            infoWindowClose() {
                this.infoWindow.show = false
            },
          //type不同燎孟,初始化數(shù)據(jù)的方法不同
            infoWindowOpen(data,type) {
                this.infoWindow.show = true
                switch (type) {
                    case 1:
                        this.clickDevice(data)
                        break
                    case 2:
                        this.clickTower(data)
                        break
                }
            },
        },
    }
</script>

<style lang="stylus" scoped>
    .map
        width auto
        height 750px
        margin 0 20px 20px 20px
        position relative
        .info-window
            font-size 12px
            .info-Window-name
                font-weight bold
                text-align center
</style>

  • tips: 此處有兩種類型的點,但我使用了同一個窗體顯示數(shù)據(jù)尸昧,因為在使用兩個窗體顯示數(shù)據(jù)時揩页,兩個窗體在切換時必須要先關(guān)掉上個窗體才能打開下個窗體,體驗不太好

2.8 添加外部浮層

<baidu-map id="baidumap" class="map" ak="KbGbuk~~~BWmEjf"   
               :center="map.center"
               :zoom="map.zoom"
               :scroll-wheel-zoom="map.scroll">
        <div class="sum-message">
            當(dāng)前人數(shù)<span class="sum-message-num" style="color:#66b1ff;">{{deviceInfo.totalnum}}</span>個,
            在線人數(shù)<span class="sum-message-num" style="color:#00a84b;" >{{deviceInfo.onlinenum}}</span>個爆侣,
            離線人數(shù)<span class="sum-message-num" style="color:#cdcdcd;">{{deviceInfo.offlinenum}}</span>個萍程,
            礦工人數(shù)<span class="sum-message-num" style="color:#d81e06;">{{deviceInfo.warmnum}}</span>個
        </div>
 </baidu-map>
<style lang="stylus" scoped>
    .map
        width auto
        height 750px //寬高一定要設(shè)置
        margin 0 20px 20px 20px
        position relative
         .sum-message
            position absolute
            left 50%
            top 0
            transform translateX(-50%);
            z-index 1
            background-color rgba(255, 255, 255, 0.8)
            border-radius 8px
            padding 0 10px
            width auto
            height 40px
            line-height 40px
            .sum-message-num
                font-size 18px
                padding 0 3px
                font-weight bold
</style>

讓浮層可以居中顯示的關(guān)鍵代碼:

    .map
        position relative
         .sum-message
              position absolute
              left 50%
              top 0
              transform translateX(-50%);

3 心得

雖然自己已經(jīng)用過第三方插件,比如element-ui和swiper兔仰,但是都是按照別人的文章指引茫负,總是糊里糊涂的在用,仿佛插件是個很神秘的東西乎赴。
這次忍法,通過百度地圖插件的引入過程,我終于揭開了插件這個神秘的面紗榕吼,我看到了源碼饿序、文檔,雖然沒有看太懂羹蚣,但是也讓我不再“畏懼”插件原探,至少讓我懂得:vue的插件也就是用vue寫的一些組件罷了!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末顽素,一起剝皮案震驚了整個濱河市咽弦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胁出,老刑警劉巖型型,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異全蝶,居然都是意外死亡输莺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門裸诽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人型凳,你說我怎么就攤上這事丈冬。” “怎么了甘畅?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵埂蕊,是天一觀的道長。 經(jīng)常有香客問我疏唾,道長蓄氧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任槐脏,我火速辦了婚禮喉童,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘顿天。我一直安慰自己堂氯,他們只是感情好蔑担,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咽白,像睡著了一般啤握。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晶框,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天排抬,我揣著相機(jī)與錄音,去河邊找鬼授段。 笑死蹲蒲,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的畴蒲。 我是一名探鬼主播悠鞍,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼模燥!你這毒婦竟也來了咖祭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤蔫骂,失蹤者是張志新(化名)和其女友劉穎么翰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辽旋,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡浩嫌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了补胚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片码耐。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖溶其,靈堂內(nèi)的尸體忽然破棺而出骚腥,到底是詐尸還是另有隱情,我是刑警寧澤瓶逃,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布束铭,位于F島的核電站,受9級特大地震影響厢绝,放射性物質(zhì)發(fā)生泄漏契沫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一昔汉、第九天 我趴在偏房一處隱蔽的房頂上張望懈万。 院中可真熱鬧,春花似錦、人聲如沸钞速。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渴语。三九已至苹威,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間驾凶,已是汗流浹背牙甫。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留调违,地道東北人窟哺。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像技肩,于是被迫代替她去往敵國和親且轨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354