Vue集成地图API实现搜索与矢量图区域显示

前言

很久之前用过高德地图的API,那时候vue组件还不是很多,所以用的是js来实现的。现在我们可以使用npm来安装百度地图来更方便的完成对应的业务

一、准备

我们先来一波npm

npm install vue-baidu-map --save

二、搜搜功能

1.页面代码

html代码如下,记得替换YOUR_AK为你的ak密钥,可以在百度地图API种获取到

<template>
  <div class="map" ref="map">
      <!-- 地图搜索框 -->
      <el-input v-model="keyWord" placeholder="请输入地址来直接查找相关位置"></el-input>
      <!-- 地图实例 -->
      <baidu-map
          class="bmView"
          :scroll-wheel-zoom="true"
          :center="location"
          :zoom="zoom"
          @click="getLocationPoint"
          @ready="handler"
          ak="YOUR_AK"
      >
          <bm-view style="width: 100%; height:800px; flex: 1"></bm-view>
          <bm-local-search :keyword="keyWord" :auto-viewport="true" style="display: none"></bm-local-search>
          <!--信息窗口,show控制显示隐藏-->
          <bm-marker :position="{lng: locationInfo.lng,lat: locationInfo.lat}" >
              <bm-info-window :show="infoWindowShow" @close="infoWindowClose" @open="infoWindowOpen" style="font-size: 14px">
                  <p>当前点位:{{ locationInfo.site }}</p>
              </bm-info-window>
          </bm-marker>
      </baidu-map>
  </div>
</template>
vue代码如下,我们需要引入组件,并绑定一些事件

<script>
// 这些就是我们要用的组件了,有搜索框,信息框等等
import BaiduMap from "vue-baidu-map/components/map/Map.vue";
import BmView from "vue-baidu-map/components/map/MapView.vue";
import BmMarker from "vue-baidu-map/components/overlays/Marker.vue";
import BmLocalSearch from "vue-baidu-map/components/search/LocalSearch.vue";
import BmLabel from "vue-baidu-map/components/overlays/Label.vue";
import BmInfoWindow from 'vue-baidu-map/components/overlays/InfoWindow.vue';
export default {
  name: 'search',
  components: {
    BaiduMap,
    BmView,
    BmMarker,
    BmLocalSearch,
    BmLabel,
    BmInfoWindow,
  },
  data() {
    return {
      infoWindowShow: false,
      // 要搜索的关键词
      keyWord: '',
      BMap: null,
      // 地图显示的中心坐标
      location: {
        lng: 121.530554,
        lat: 31.085783
      },
      // 点击后的当前坐标点位的信息
      locationInfo:{
        lng: '',
        lat: '',
        siteName:'',
      },
      // 缩放,15基本上就可以看附近的一些街道了
      zoom: 15,
    }
  },
  methods: {
    handler(BMap) {
      // this.BMap = BMap;
      // this.BMap.map.setMapStyle({ styleJson: require("./map_black").default });
    },
    getLocationPoint(e) {
      // 点击地图后显示信息窗体
      this.infoWindowShow = true
      this.locationInfo.lng = e.point.lng;
      this.locationInfo.lat = e.point.lat;
      // 创建地址解析器的实例
      let geocoder= new BMap.Geocoder();
      geocoder.getLocation(e.point,rs=>{
        // 详细地址信息如下
        this.locationInfo.siteName = rs.address;
        console.log(rs.address);
        console.log(rs.addressComponents);// 结构化的地址描述
        console.log(rs.addressComponents.province); // 省
        console.log(rs.addressComponents.city); // 城市
        console.log(rs.addressComponents.district); // 区县
        console.log(rs.addressComponents.street); // 街道
        console.log(rs.addressComponents.streetNumber); // 门牌号
      });
    },
    infoWindowClose () {
      // 关闭信息窗体
      this.infoWindowShow = false
    },
    infoWindowOpen () {
      // 延迟打开
      let self = this
      setInterval(()=>{
        self.infoWindowShow = true
      },200)
    },
  },
}
</script>

2.个性化地图

在上面的methods方法中有一个方法可以获取到地图实例,我们可以在这个方法里修改地图样式

首先要在同级目录下建立一个map_black.js文件,里面可以填上地图json格式的样式

然后在下面方法中直接setMapStyle设置格式

handler(BMap) {
  // this.BMap = BMap;
  // this.BMap.map.setMapStyle({ styleJson: require("./map_black").default });
},
map_black.js文件如下






export default [{
  "featureType": "land",
  "elementType": "geometry",
  "stylers": {
    "color": "#242f3eff"
  }
}, {
  "featureType": "manmade",
  "elementType": "geometry",
  "stylers": {
    "color": "#242f3eff"
  }
},
...
...

很多很多,就不全部复制了,大家可以到开发平台中自己调整个性化地图然后复制json格式数据

三,区域显示

1.主要代码

下面我只展示区域显示,所以用到的组件很少,只是多了一个bm-polygon

<baidu-map
      class="bmView"
      :scroll-wheel-zoom="true"
      :center="location"
      :zoom="zoom"
      @click="getLocationPoint"
      @ready="handler"
      ak="YOUR_AK"
  >
      <bm-view style="width: 100%; height:810px; flex: 1; "></bm-view>
      <bm-polygon
          :path="p.paths"
          v-for="(p,index) of polygonList"
          :key="index"
          :stroke-color="p.strokeColor"
          :fill-color="p.fillColor"
          :fill-opacity="0.5"
          :stroke-opacity="0.8"
          :stroke-weight="2"
      />
  </baidu-map>


2.主要数据

记得引用下对应的组件,下面只是data中的数据,里面带了自定义的区域颜色

// 引入
import BmPolygon from 'vue-baidu-map/components/overlays/Polygon.vue';
...
components: {
  ...
    BmPolygon,
  },


// 区域数据
polygonList: [
   {
     strokeColor: 'red',
     fillColor: 'pink',
     paths: [
       {lat: '37.796849',lng: '112.611435'},
       {lat: '37.792115',lng: '112.611004'},
       {lat: '37.792229',lng: '112.62164'},
       {lat: '37.79759',lng: '112.62164'}
     ]
   },
   {
     strokeColor: 'orange',
     fillColor: 'yellow',
     paths: [
       {lat: '37.796149',lng: '112.611135'},
       {lat: '37.791315',lng: '112.610004'},
       {lat: '37.792029',lng: '112.62064'},
       {lat: '37.78759',lng: '112.62164'}
     ]
   }
 ],

总结

大家自己改改样式改改数据,看下效果

搜索,点击显示坐标



自定义电子围栏区域显示





作者:小码哥

欢迎关注微信公众号 :码出宇宙

扫描添加好友邀你进技术交流群,加我时注明【姓名+公司(学校)+职位】