vue引入百度地图案例

使用

  • 项目执行命令 npm i vue-baidu-map --save或者cnpm i vue-baidu-map --save
  • 全局注册(在main.js)
import BaiduMap from 'vue-baidu-map';```
 Vue.use(BaiduMap, {
    /* Visit http://lbsyun.baidu.com/apiconsole/key for details about app key. */
    ak: 'YOUR_APP_KEY'
 })

在vue组件里面如果就这么使用会报 BMap is not defined , so...... 新建js文件

//map.js
export function MP(ak) {
    return new Promise(function(resolve, reject) {
      window.onload = function() {
        resolve(BMap)
      }
      var script = document.createElement('script')
      script.type = 'text/javascript'
      script.src =
        'http://api.map.baidu.com/api?v=2.0&ak=' + ak + '&callback=init'
      script.onerror = reject
      document.head.appendChild(script)
    })
  }

在自己创建的地图组建中进行引入

import { MP } from './../../map.js'
mounted () {
    this.$nextTick(function () {
      var _this = this;
      //写入自己的ak
      MP(_this.ak).then(BMap => {
        //在此调用api
        this.map()//这是我自定义的

      })
    })
  },
  methods:{
     map(){
       
     } 
  }

我把会用到的百度地图的方法罗列一下,方便大家可以快速运用百度地图
var map = new BMap.Map("BaiduMap") ; // 创建Map实例
map.centerAndZoom(new BMap.Point(116.404, 39.915), 10); // 初始化地图,设置中心点坐标和地图级别
map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
var point = new BMap.Point(117.333964, 39.9093); // 创建点坐标
var marker = new BMap.Marker(point); //创建标注
map.addOverlay(marker);// 将标注添加到地图中
map.clearOverlays(); //清除地图上所有覆盖物


效果图

实现 高亮选取区域 以及 简单搜索功能;
高亮选取区域:

   data(){
      return{
         districtLoading :0,
         bList : []
     }
   }
    //获取行政区域边界     
    getBoundary(){
       this.addDistrict(this.ruleForm.area)
     },
    //添加行政区域
     addDistrict(districtName){
       let _this = this;
      //使用计数器来控制加载过程
       this.districtLoading ++;//控制加载过程
       var bdary = new BMap.Boundary();
       bdary.get(districtName,function(rs){//获取行政区域
         var count = rs.boundaries.length;//行政区域点的个数
         for(let i =0;i<count;i++){
           _this.bList.push({ points: rs.boundaries[i], name: districtName });
         };
         _this.districtLoading --;//加载完成区域点后计数器-1
         if(_this.districtLoading  == 0){
           _this.drawBoundary()//全加载完成后画端点
         }
       })
     },
     //画边界
     drawBoundary(){
       let _this = this;
       var pointArray = [];//包括所有区域的点数组
       for(let i=0;i<this.bList.length;i++){//循环添加
         var ply = new BMap.Polygon(_this.bList[i].points,{//多边形层及显示
            strokeWeight:2,//边框宽度
            trokeColor: '#0027EB',//边框颜色
            // fillColor:'00ffff'//填充颜色
         }); //建立多边形覆盖物
         ply.name = _this.bList[i].name;
         _this.map.addOverlay(ply);
         //将点增加到视野范围内
         var path = ply.getPath();
         pointArray = pointArray.concat(path);
       }
       this.map.setViewport(pointArray)//调整视野 
     },

然后就是搜索的实现(多条件)
点击查询,拿到搜索条件的value值,过滤坐标数组(无论是接口获取到的还是自己定义的)

//HTML
<template>
  <div class="maps">
    <div class="map-distribute">
        <div class="map-search">
            <p class="title">地址查询</p>
            <a-tabs type="card">
             <a-tab-pane key="1" tab="查询">
              <a-form-model 
                :model="ruleForm" 
                :label-col="{ span: 5}"
                :wrapper-col="{ span: 14 }"
               >
                <a-form-model-item label="单位名称:">
                  <a-input v-model="ruleForm.name" />
                </a-form-model-item>
                <a-form-model-item label="资质等级:">
                  <a-select :value="ruleForm.grade" :default-value="gradeList[0]"  @change="handleChange">
                    <a-select-option v-for="(item,index) in gradeList" :key="index" :value="item">
                      {{item}}
                    </a-select-option>
                  </a-select>
                </a-form-model-item>
                <a-form-model-item label="资质编号:">
                  <a-input v-model="ruleForm.number" />
                </a-form-model-item>
                <a-form-model-item label="所在省市:">
                  <a-select  @change="handleChange2" :value="ruleForm.area">
                    <a-select-option v-for="(v,i) in areaList" :key="i" :value="v">{{ v }} </a-select-option>
                  </a-select>
                </a-form-model-item>
                <a-form-model-item :wrapper-col="{ span: 14, offset: 4 }">
                  <a-button type="primary" @click="onSubmit(ruleForm)" style="margin:auto; width:100px; border:none; background:#D71619; color:#fff">查询</a-button>
                </a-form-model-item>
              </a-form-model>
             </a-tab-pane>
                <a-tab-pane key="2" tab="图例">
                  <div class="map-logo"><img src="../../assets/images/sga.png" alt="" /><span>甲级测绘资质单位</span></div>
                  <div class="map-logo"><img src="../../assets/images/sgb.png" alt="" /><span>乙级测绘资质单位</span></div>
                  <div class="map-logo"><img src="../../assets/images/sgc.png" alt="" /><span>丙级测绘资质单位</span></div>
                  <div class="map-logo"><img src="../../assets/images/sgd.png" alt="" /><span>丁级测绘资质单位</span></div>
             </a-tab-pane>
            </a-tabs>
        </div>
        <div class="space-map">
            <div id="BaiduMap" ref="allmap"></div>
        </div>
   </div>
 </div>
</template>
//js
import { MP } from '../../js/map' 
import jia from '../../assets/images/sga.png'//地图自定义标注图标
import yi from '../../assets/images/sgb.png'//地图自定义标注图标
import bing from '../../assets/images/sgc.png'//地图自定义标注图标
import ding from '../../assets/images/sgd.png'//地图自定义标注图标
export default {
 name:"maps",
 data(){
     return{
       jia,
       yi,
       bing,
       ding,
       map:null,
       districtLoading:0,
       bList:[],
       dialogMap: true,
       mapGetshow: true,
       gradeList:["任意等级","甲级","乙级","丙级","丁级"],
       areaList:["北京","河北","上海","新疆","广东","天津"],
       ruleForm:{
         name:'',
         grade:'任意等级',
         number:'',
         area:'北京',
       },
      icon:'',
       data: [
        { x: 116.3964, y: 39.9093, name: '甲', area:'北京',grade:'甲级', number:'1'},
        { x: 117.333964, y: 39.9093, name: '乙', area:'天津',grade:'乙级', number:'2'},
        { x: 116.321568, y: 39.88648, name: '乙',area:'北京',grade:'乙级', number:'3'},
        { x: 116.495243, y: 40.756839, name: '丙', area:'北京',grade:'丙级', number:'4'},
        { x: 116.484243, y: 39.746539, name: '丁',  area:'北京',grade:'丁级', number:'5'}
       ] ,
       newData:[]
     }
 },
 mounted(){
     this.$nextTick(function () {
      var _this = this;
      MP(_this.ak).then(BMap => {
        this.map = new BMap.Map("BaiduMap");// 创建Map实例
        var point = new BMap.Point(116.3964, 39.9093);// 初始化地图
        this.map.centerAndZoom(point,10);//设置中心点坐标和地图级别
        this.map.enableScrollWheelZoom();//开启鼠标滚轮缩放
        this.drawMap(this.data)
        this.getBoundary()    
      })
    })
 },
 methods:{
     handleChange(value){
      this.ruleForm.grade = value;
     },
     handleChange2(value){
       this.ruleForm.area= value;
     },
     onSubmit({ name, number, grade, area}){
       console.log(name, number, grade, area)
          let _this = this;
          this.map.clearOverlays(); //清除地图上所有覆盖物
          if(grade == '任意等级'){
            this.newData = this.data.filter( item => {
              let matchArea = true;
              if(area){
                matchArea = item.area== area
              }
              return matchArea
            })
             console.log(this.newData)
          }
          else{
            this.newData = this.data.filter( item =>{
              let matchName = true;
              let matchNumber = true;
              let matchGrade = true;
              let matchArea = true;
              if(name){
                matchName = item.name == name
              }
              if(number){
                matchNumber = item.number == number
              }
              if(grade){
                matchGrade = item.grade == grade
              }
              if(area){
                matchArea = item.area== area
              }
              console.log(matchName,matchNumber,matchGrade,matchArea)
              return matchName && matchNumber && matchGrade && matchArea 
            })
            console.log(this.newData)
          }
          this.getBoundary()  
          this.drawMap(this.newData)
     },
     drawMap(pointList){
      let _this = this;
      pointList.forEach((v,i)=>{
        if(_this.ruleForm.area== v.area){
          let pointNumber = new BMap.Point(v.x,v.y)//创建point
          if(v.grade == '甲级'){
            _this.icon = jia
          }
          if(v.grade == "乙级"){
             _this.icon = yi
          }
          if(v.grade == "丙级"){
             _this.icon = bing
          }
          if(v.grade == "丁级"){
             _this.icon = ding
          }
          let content = `
            <div>
              <p>单位名称:${ v.name }</p>
              <p>资质等级:${ v.grade }</p>
              <p>资质证号:${ v.number}</p>
            </div>
          `
          let infoWindow = new BMap.InfoWindow(content ,{//信息窗口
            width:150,
           // height:100,
            title:"这是"+v.name//窗口标题
          })
          // var label = new BMap.Label(v.name,{//把data的name加入地图
          //   offset:new BMap.Size(25,5)
          // })
          var deviceSize = new BMap.Size(48,48)
          var deviceIcon = new BMap.Icon(_this.icon,deviceSize,{
            imageSize:deviceSize  
          })
          markerFun(pointNumber, infoWindow, deviceIcon)//markerFun(pointNumber, infoWindow, label, deviceIcon)
          }
      });
      function markerFun(points,infoWindow,deviceIcon){//function markerFun(points,infoWindow,label,deviceIcon){
        let markers = new BMap.Marker(points,{icon:deviceIcon});// 创建标注
        _this.map.addOverlay(markers);//把标注添加到地图中
        // markers.setLabel(label);//把data中name添加到地图
        markers.addEventListener('click',function(event){//标注点击事件
          _this.map.openInfoWindow(infoWindow,points);//参数:窗口、点  根据点击的点出现对应的窗口
        })
      }
      var geolocation = new BMap.Geolocation();
      geolocation.getCurrentPosition(function(r){
        if (this.getStatus() == BMAP_STATUS_SUCCESS) {
          var mk = new BMap.Marker(r.point);
          _this.map.addOverlay(mk);
          _this.map.panTo(r.point);
        } else {
          // alert('failed' + this.getStatus());
        }

      })
     },
     getBoundary(){//获取行政区域边界
       this.addDistrict(this.ruleForm.area)
     },
     //行政区域
     addDistrict(districtName){
       let _this = this;
       this.districtLoading ++;//控制加载过程
       var bdary = new BMap.Boundary();
       bdary.get(districtName,function(rs){//获取行政区域
         var count = rs.boundaries.length;//行政区域个数
         for(let i =0;i<count;i++){
           _this.bList.push({ points: rs.boundaries[i], name: districtName });
         };
         _this.districtLoading --;//加载完成区域点后计数器-1
         if(_this.districtLoading  == 0){
           _this.drawBoundary()//全加载完成后画端点
         }
       })
     },
     //画边界
     drawBoundary(){
       let _this = this;
       var pointArray = [];//包括所有区域的点数组
       for(let i=0;i<this.bList.length;i++){//循环添加
         var ply = new BMap.Polygon(_this.bList[i].points,{//多边形层及显示
            strokeWeight:2,
            trokeColor: '#0027EB',
           fillOpacity:0.01,//遮罩隐藏
            // fillColor:'00ffff',
         });
         ply.name = _this.bList[i].name;
         _this.map.addOverlay(ply);
         var path = ply.getPath();
         pointArray = pointArray.concat(path);
       }
       this.map.setViewport(pointArray)//调整视野 
       this.bList = []//清空区域点数组
     },
  }
}

去掉百度地图logo:百度地图的Logo是使用css样式放上去的,我们可以使用css样式覆盖掉

<style scoped>
@deep: ~'>>>';
@{deep} .BMap_cpyCtrl {
 display: none;
}
@{deep} .anchorBL {
 display: none;
}
</style>
``
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345