Vue:如何在地图上添加自定义覆盖物(点)

首发日期:2019-1-25git


如何在地图上添加自定义覆盖物(点)



此文重点是在地图上标点,因此就省去引入百度地图的步骤了。


先给一下最终的效果。
github


这个效果主要是利用百度地图的“覆盖物”来实现的。
因为我作的这个要求显示不一样的颜色来表明不一样的所属者,因此就作的麻烦一点。api


若是你的需求不要求特别显示,那么可使用bm-marker
函数

代码大体以下:字体

<baidu-map  class="bm-view"  ak="省略" :center="省略">
     <bm-marker v-for="item in 省略"  :key="item.省略" :position="{lng: item.longitude, lat: item.latitude}" ></bm-marker>
</baidu-map>
  • 上面的代码中position里面的值是经纬度。有了经纬度来可以标上点。
  • ak是你申请的百度api的key
  • center是城市中心




若是你但愿使用特别的图标来给标上所有点,那么也可使用bm-marker,它里面有一个icon属性,icon里面的图片能够用来标点:this

<baidu-map  class="bm-view"  ak="省略" :center="省略">
    <bm-marker v-for="item in 省略"  :key="item.省略" :position="{lng: item.longitude, lat: item.latitude}"  :icon="{url: 'https://www.cnblogs.com/images/cnblogs_com/progor/1390402/o_bike2.png', size: {width: 32, height: 32}}"></bm-marker>
</baidu-map>
  • icon中的url是图片的url路径。




若是你想要显示多种覆盖物,那么你可使用overlay。(要封装,由于封装以后才能传值进去指定显示什么覆盖物)
简单的overlay是这样子的:
url

为何能够基于这个组件来封装是由于这个组件有如下几个好处:code

  1. 能够定制文本内容
  2. 它自己是一个元素,而不是一个图片,(上面的“打点物”都是图片(小红点不肯定是否是,多是一个字体图标的东西)),由于是元素,因此咱们可以使用border,background,color等等样式来处理这个元素。


需求实现步骤:
1.定义一个MyOverLay:component

<template>
  <bm-overlay
    ref="customOverlay"
    :class="{sample: true}"
    :style="pointColor"
    pane="labelPane"
    @draw="draw">
  </bm-overlay>
</template>

<script>
import { BmOverlay } from 'vue-baidu-map'
export default {
  props: ['text', 'position', 'color'], // 用来接受传入的值,用来定制样式
  components: {
    BmOverlay
  },
  watch: {
    position: {
      handler () {
        this.$refs.customOverlay.reload()  // 当位置发生变化时,从新渲染,内部会调用draw
      },
      deep: true
    }
  },
  data () {
    return {
      pointColor: ''
    }
  },
  mounted () {
    this.pointColor = this.color // 这里我是用来获取传入的值来定义样式的,可能有点多余了,pointColor是组件中绑定的样式,color是传进来的样式。【这样就能够根据传入的样式来显示不一样样子的点了】
  },
  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 {
  width: 32px;
  height: 32px;
  line-height: 32px;
  border-radius: 32px;
  background: rgba(0,0,0,0.5);
  overflow: hidden;
  box-shadow: 0 0 5px #000;
  color: #fff;
  text-align: center;
  position: absolute;
}
.sample.active {
  background: rgba(0,0,0,0.75);
  color: #fff;
}
</style>


2.使用MyOverLay,传给它须要的值:

<baidu-map  class="bm-view"  ak="省略" :center="省略">
    <my-overlay
                v-for="item in 省略"  :key="item.省略" :position="{lng: item.longitude, lat: item.latitude}"
                :text="item.省略"
                :color='省略(这里能够处理一下从而给每个组件实例都传入自定义的值)'
               >
              </my-overlay>
</baidu-map>

想了解更多,能够查看Vue百度地图api的官网:https://dafrok.github.io/vue-baidu-map/#/

相关文章
相关标签/搜索