vue使用高德地图开发遇到的问题

635 阅读1分钟

做业务开发使用到高德地图,把遇到的问题和基础使用流程整理一下。

基础使用流程

通过npm的方式

1. 安装npm

npm i amap/amap-jsapi-loader -S

高德开放平台官网提供的地图 JSAPI 的加载器 www.npmjs.com/package/@am…

2. 引入

import AMapLoader from '@amap/amap-jsapi-loader'

3. 初始化

 <>
    <div id="amap"></div>
    
     AMapLoader.load({
        key: '', // 申请的key
        version: '1.4.15'
      })
        .then(AMap => {
          // 创建地图实例
          map = new AMap.Map('amap', { //其他配置 })
          // 加载插件
          AMap.plugin(['AMap.ToolBar', 'AMap.Geocoder'], () => {
            map.addControl(new AMap.ToolBar())
            geocoder = new AMap.Geocoder()
          })
          // 绑定事件
          map.on('click', this.clickMap)
        })
        .catch(e => {
          throw '地图加载失败,请重新加载'
        })
 </>

结束地图实例以及加载完成。

遇到的问题

1. 使用插件

lbs.amap.com/api/javascr…

    // 异步加载插件
    AMap.plugin(['AMap.ToolBar', 'AMap.Geocoder'], () => {
            // 添加插件
            map.addControl(new AMap.ToolBar())
            // 把插件实例赋值给变量
            geocoder = new AMap.Geocoder()
    })

2. 判断是否在国内,通过逆编码通过坐标获取地址,国外会解析失败。

// 重点:逆编码需要配合秘钥使用
window._AMapSecurityConfig = {
  securityJsCode: '秘钥'
}
clickMap(e) {
      let lng = e.lnglat.getLng()
      let lat = e.lnglat.getLat()
      geocoder.getAddress(e.lnglat, (status, result) => {
        // 判断是否为国内
        if (status === 'complete') {}
      }
 }

3. 添加一个marker标准写法

  getMarkerData({ lng, lat }) {
      var marker = new AMap.Marker({
        // 标准的经纬度数据对象,不用new AMap.LngLat 也可以。
        position: new AMap.LngLat(lng, lat),
        icon: 'https://lf3-static.bytednsdoc.com/obj/eden-cn/fyylqeh7pldnuhpqnuhd/anchor.png',
        // 偏移量:定位到icon的箭头
        offset: new AMap.Pixel(-16, -30),
        // 自定义数据
        extData: {
          id: `${lng}${lat}`
        }
      })
      marker.on('click', this.clickMarker)
      return marker
},

4. 如何获取一个marker的信息

clickMarker(e) {
      // 获取自定义数据
      let id = e.target.getExtData().id
      let item = submitData.find(item => item.id === id)
      currentMarker = item
      // 显示信息框
      this.openInfoWindow(currentMarker)
      currentMarker.circle.setOptions({
        strokeColor: '#F33',
        fillColor: '#ee2200'
      })
},

5. 信息窗口:使用vue组件

<>
    <div>
       // 引入组件,使用组件。
       // 注意只能v-show,因为需要dom
       <info-window  
           v-show="showInfoWindow"
          ref="infoWindow">
       </info-window>
    </div>
    
    - 
    // 创建一个自定义内容的 infowindow 实例
      let infoWindow = new AMap.InfoWindow({
        offset: new AMap.Pixel(0, -30),
        // 使用组件
        content: this.$refs['infoWindow'].$el,
        isCustom: true,
        autoMove: true
      })
      infoWindow.open(map, [lng, lat])
</>

6. 改变遮盖物数据

currentMarker.circle.setOptions({
        strokeColor: '#3989FA',
        fillColor: '#3989FA'
})