_vue-baidu-map">
当前位置:   article > 正文

vue中使用百度地图vue-baidu-map

vue-baidu-map

效果图
在这里插入图片描述

安装

npm install vue-baidu-map --save
  • 1

index.vue

<template>
  <div style="position:relative">
    <!-- :map-click="false" 禁用点击景点弹出详细信息  -->
    <baidu-map
      :center="center"
      :map-click="false"
      :zoom="zoom"
      :scroll-wheel-zoom="true"
      :min-zoom="5"
      :max-zoom="19"
      :auto-resize="true"
      @ready="handler"
      class="baidumap"
    >
      <!-- 行政区域 -->
      <bm-boundary
        v-for="(item,index) in area_list"
        :key="index"
        :name="item.name"
        :stroke-weight="2"
        :fill-color="randomColor()"
        stroke-color="none"
      />
      <!-- 圆形覆盖物 -->
      <my-overlay
        v-for="item in area_list"
        :position="{lng: item.lng, lat: item.lat}"
        :key="item.name"
        :show-text="{text:item.name,value:item.number}"
        :cirstyle="setWH(item.number)"
        text="点击我"
        @click.native="nextLevel(item)"
      />
      <!-- 右键菜单 -->
      <bm-context-menu>
        <bm-context-menu-item
          :callback="refreshHandler"
          text="刷新"
        />
      </bm-context-menu>
    </baidu-map>
  </div>

</template>
  <style type="text/css">
/* body默认会有8px的margin,清除掉便不会出现纵向滚动条 */
body {
  margin: 0;
}
/* 去掉百度地图左下方的logo和文字 */
.BMap_cpyCtrl {
  display: none;
}
.anchorBL {
  display: none;
}

.baidumap {
  /* 必须设置具体的高度,否则,百度地图无法显示 */
  height: 100vh;
}
</style>
<script>
import Vue from 'vue'
import BaiduMap from 'vue-baidu-map'
Vue.use(BaiduMap, {
  // ak 是在百度地图开发者平台申请的密钥 详见 http://lbsyun.baidu.com/apiconsole/key */
  ak: ''
})
// 百度地图按需引入(IE不支持)
// import BmBoundary from 'vue-baidu-map/components/others/Boundary.vue'
import MyOverlay from './module/MyOverlay'
export default {
  components: {
    // BmBoundary,
    MyOverlay,
  },
  data() {
    return {
      // 中心点
      center: { lng: 116.395645, lat: 39.929986 },
      zoom: 6, // 放大显示级别
      // 实例化百度地图
      map: '',
      // 百度地图类
      BMap: '',
      // 显示在界面的数据源
      area_list: [
        { lat: '39.929986', lng: '116.395645', number: 20, name: '北京市' },
        { lat: '39.143930', lng: '117.210813', number: 30, name: '天津市' },
        { lat: '38.613840', lng: '115.661434', number: 10, name: '河北省' },
        { lat: '37.866566', lng: '112.515496', number: 100, name: '山西省' },
        { lat: '43.468238', lng: '114.415868', number: 200, name: '内蒙古自治区' },
        { lat: '41.621600', lng: '122.753592', number: 150, name: '辽宁省' },
        { lat: '43.678846', lng: '126.262876', number: 40, name: '吉林省' },
        { lat: '47.356592', lng: '128.047414', number: 36, name: '黑龙江省' },
        { lat: '31.249162', lng: '121.487899', number: 12, name: '上海市' },
        { lat: '33.013797', lng: '119.368489', number: 58, name: '江苏省' },
        { lat: '29.159494', lng: '119.957202', number: 360, name: '浙江省' }
      ],
      // 当前层级
      layers: 1
    }
  },
  methods: {
    handler({ BMap, map }) {
      // 百度地图样式
      const styleJson = [
        {
          'featureType': 'water',
          'elementType': 'all',
          'stylers': {
            'color': '#021019'
          }
        },
        {
          'featureType': 'highway',
          'elementType': 'geometry.fill',
          'stylers': {
            'color': '#000000'
          }
        },
        {
          'featureType': 'highway',
          'elementType': 'geometry.stroke',
          'stylers': {
            'color': '#147a92'
          }
        },
        {
          'featureType': 'arterial',
          'elementType': 'geometry.fill',
          'stylers': {
            'color': '#000000'
          }
        },
        {
          'featureType': 'arterial',
          'elementType': 'geometry.stroke',
          'stylers': {
            'color': '#0b3d51'
          }
        },
        {
          'featureType': 'local',
          'elementType': 'geometry',
          'stylers': {
            'color': '#000000'
          }
        },
        {
          'featureType': 'land',
          'elementType': 'all',
          'stylers': {
            'color': '#08304b'
          }
        },
        {
          'featureType': 'railway',
          'elementType': 'geometry.fill',
          'stylers': {
            'color': '#000000'
          }
        },
        {
          'featureType': 'railway',
          'elementType': 'geometry.stroke',
          'stylers': {
            'color': '#08304b'
          }
        },
        {
          'featureType': 'subway',
          'elementType': 'geometry',
          'stylers': {
            'lightness': -70
          }
        },
        {
          'featureType': 'building',
          'elementType': 'geometry.fill',
          'stylers': {
            'color': '#000000'
          }
        },
        {
          'featureType': 'all',
          'elementType': 'labels.text.fill',
          'stylers': {
            'color': '#857f7f'
          }
        },
        {
          'featureType': 'all',
          'elementType': 'labels.text.stroke',
          'stylers': {
            'color': '#000000'
          }
        },
        {
          'featureType': 'building',
          'elementType': 'geometry',
          'stylers': {
            'color': '#022338'
          }
        },
        {
          'featureType': 'green',
          'elementType': 'geometry',
          'stylers': {
            'color': '#062032'
          }
        },
        {
          'featureType': 'boundary',
          'elementType': 'all',
          'stylers': {
            'color': '#1e1c1c'
          }
        },
        {
          'featureType': 'manmade',
          'elementType': 'geometry',
          'stylers': {
            'color': '#022338'
          }
        },
        {
          'featureType': 'poi',
          'elementType': 'all',
          'stylers': {
            'visibility': 'off'
          }
        },
        {
          'featureType': 'all',
          'elementType': 'labels.icon',
          'stylers': {
            'visibility': 'off'
          }
        },
        {
          'featureType': 'all',
          'elementType': 'labels.text.fill',
          'stylers': {
            'color': '#2da0c6',
            'visibility': 'on'
          }
        }
      ]
      // 百度地图样式设置
      map.setMapStyle({
        styleJson: styleJson
      })
      this.map = map // 百度地图实例
      this.BMap = BMap // 百度地图类
    },
    // 下一级
    nextLevel(data) {
      console.log('点击覆盖物时候要进行的操作')
    },

    // 设置圆形覆盖物的宽高
    setWH(value) {
      const wh = {
        width: '',
        height: ''
      }
      if (value < 30) {
        wh.width = '60px'
        wh.height = '60px'
      } else if (value > 30 && value <= 60) {
        wh.width = '80px'
        wh.height = '80px'
      } else {
        wh.width = '100px'
        wh.height = '100px'
      }
      return wh
    },
    // 规定的颜色内,随机返回
    randomColor() {
      const colorList = [
        '#FFFF99',
        '#B5FF91',
        '#94DBFF',
        '#FFBAFF',
        '#FFBD9D',
        '#C7A3ED',
        '#CC9898',
        '#8AC007',
        '#CCC007',
        '#FFAD5C'
      ]
      const colorIndex = Math.floor(Math.random() * colorList.length)
      const color = colorList[colorIndex]
      colorList.splice(colorIndex, 1)
      return color
    },

    // 百度地图刷新
    refreshHandler(e) {
      console.log('在这里执行刷新操作')
    }
  }
}
</script>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307

MyOverlay.vue

<template>
  <bm-overlay
    ref="customOverlay"
    :class="{sample: true}"
    :style="cirstyle"
    pane="labelPane"
    @draw="draw"
  >
    <div>{{ showText.text }}</div>
    <div>{{ showText.value }}</div>

  </bm-overlay>
</template>
<script>
import { BmOverlay } from 'vue-baidu-map'
export default {
  components: {
    BmOverlay
  },
  props: {
    text: {
      type: String,
      required: true
    },
    // 覆盖物上面的文本
    showText: {
      type: Object,
      required: true
    },
    // 经纬度
    position: {
      type: Object,
      required: true
    },
    // 圆形覆盖物的样式
    cirstyle: {
      type: Object,
      required: true
    }
  },
  watch: {
    position: {
      handler() {
        this.$refs.customOverlay.reload() // 当位置发生变化时,重新渲染,内部会调用draw
      },
      deep: true
    }
  },
  methods: {
    // 这是百度地图的重绘函数,用于维持覆盖物的位置(这里的值貌似会影响拖拉时的偏移度)
    draw({ el, BMap, map }) {
      const { lng, lat } = this.position
      const pixel = map.pointToOverlayPixel(new BMap.Point(lng, lat))
      el.style.left = pixel.x - 16 + 'px'
      el.style.top = pixel.y - 16 + 'px'
    }
  }
}
</script>

<style>
.sample {
  background: #2d8bda;
  color: #fff;
  text-align: center;
  padding: 10px;
  position: absolute;
  border-radius: 50%;
}
.sample.active {
  background: rgba(0, 0, 0, 0.75);
  color: #fff;
}
.sample div {
  box-sizing: border-box;
  width: 100%;
  height: 50%;
  margin: 0 auto;
  text-align: center;
}
.sample div:nth-of-type(1) {
  border-bottom: 1px solid white;
  z-index: 1;
}
.sample div:nth-of-type(2) {
  z-index: 2;
  color: #ff9933;
  padding-top: 0.5rem;
  font-weight: 700;
}
</style>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92

扩展

自定义vue-baidu-map 组件的信息窗体infowindow(百度地图信息窗体)样式修改

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/109950
推荐阅读
相关标签
  

闽ICP备14008679号