vue引入高德地图和常用的高德api

1,790 阅读4分钟

第一步:引入和配置

通过在index.html 里面

  <script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=你的key"></script>

key的获取参考官网 lbs.amap.com/api/javascr… 如果你需要引入高德自己的ui组件 你需要在上面的js下面引入

<script src="//webapi.amap.com/ui/1.0/main.js"></script>

第二步:更改你的webpack配置

你如果是用vue-cli3搭建的项目 那么你在你的vue.config.js里面加上


  configureWebpack: config => {
    config.externals = {
      'AMap': 'AMap',
      'AMapUI': 'AMapUI',
  }

配置 你在你的webpackjs文件 找到module.exports 加入下面的代码

  externals: {
   'AMap': 'AMap',
},

上面代码的意思是 externals 是webpack的属性 作用是来告诉webpack 在打包运行的时候,不会把下面的对象打包bundle文件下面,同时在运行的时候,而是通过外部是找这些拓展(如果是开发环境不用node_modules下面找包,生产环境不从bunble下面找),可以看出这也是我们去后期优化bunble文件过大的方向点 具体详细的介绍可以看webpack的官网https://webpack.docschina.org/configuration/externals/

AMap是高德js暴露出来的js对象

AMapUI是高德ui组件的js对象

第三步:引入高德对象

如果你是 vue+js 的写法 就是按照

import AMap from 'AMap'
import AMapUI from 'AMapUI'

这样来引入 如果你是vue+ts的写法 按照上面的方法引入 会报错 会提示你上述模块找不到 这个时候 换一种写法

declare let AMap: any
declare let AMapUI: any

ts使用declare let声明变量

到此高德地图的引入已经完成了

高德地图的api

创建一个地图实例

new AMap.Map('modelMap', {
        resizeEnable: true,
        lang: 'zh_cn',
        mapStyle: 'amap://styles/5e584ac8f07795205224de2bfb350723',
        features: ['road', 'point']
      })

modelMap:一个dom元素的id

resizeEnable //是否监控地图容器尺寸变化

center:地图实例的中心点

zoom:地图的缩放比例 如果没有效果 检测一下你的center设置

mapStyle:自定义图层的样式

features:设置地图上显示的元素种类 支持'bg'(地图背景)、'point'(POI点)、'road'(道路)、'building'(建筑物)

在地图中我们可能需要在地图上绘制一些点 高德api给我们提供俩种方式添加标记,但是创建标记的方式只有一种

         marker = new AMap.Marker({
            icon: "//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png",
            position: [116.406315,39.908775],
            offset: new AMap.Pixel(-13, -30)
        });

positon:标记的经纬度 offfset的偏移量 icon 是标记的样式 icon可以换成content(自定义内容标记)如果没有此属性 使用默认标记点 分为俩种情况 1.当你需要一个个的添加 可以使用

  marker.setMap(map);

marker是你创建的标记实例 map是创建的地图实例

2.当你需要同时添加多个标记点

      markerList = workCars.map(
        (item: any) =>
          new AMap.Marker({
            content:
            "<div class='marker-img'><img width='20px' src='' /></div>", // 自定义点标记覆盖物内容
            position: item.location, // 基点位置
            offset: new AMap.Pixel(-10, -24)
          })
      )
      map.add(markerList)

把需要同时添加的标记点放在markerList这个数组里面 使用地图实例的add方法,去添加这些标记点 当同时需要清除这些点的时候

     map.remove(markerList)

是用这个方法的时候 markerList必须和add方法添加的时候是一样的,否则无法清除标记。

当使用标记点的时候 报了下面的错误Invalid Object: Pixel(NaN, NaN),请检查是否你的position的经纬度数据是否正确的

3.插件的使用 例如当我们需要去试一下一个地图搜索功能组件的时候 我们可以去利用POI搜索插件来实现这个功能

具体代码如下

    AMap.service(['AMap.PlaceSearch'], function() {
      // 构造地点查询类
      var placeSearch = new AMap.PlaceSearch({
        pageSize: 6, // 单页显示结果条数
        pageIndex: 1, // 页码
        map: self.map, // 展现结果的地图实例
        panel: 'panel', // 结果列表将在此容器中进行展示。
        autoFitView: true, // 是否自动调整地图视野使绘制的 Marker点都处于视口的可见范围
        renderStyle: 'default'
      })
      // 关键字查询
      placeSearch.search(self.mapData.keyWord, function(
        status: string,
        result: any
      ) {
        console.log(status, result)
        if (status === 'complete') {
          if (result.poiList.pois.length === 0) {
            (self.$refs.panel as HTMLElement).innerHTML = ''
            self.$message('请输入更加详细的地址')
            return
          }
          console.log(self.map.event)
          AMap.event.addListener(placeSearch, 'listElementClick', function(
            e: any
          ) {
            console.log(e)
            self.mapData.lng = e.data.location.lng
            self.mapData.lat = e.data.location.lat
            self.mapData.data = e.data
            self.circle = undefined
          })
        } else {
          self.$message({
            message: '搜索失败,请重试',
            type: 'error'
          })
          return false
        }
      })
    })

类似于这样的一个搜索界面 代码的意思 通过 通过AMap.service加载搜索服务,加载的服务可以包括服务插件列表中一个或多个 具体的插件列表见 lbs.amap.com/api/javascr…

通过回调函数 创建了一个placeSearch实例,实例的具体参数,方法可以查看https://lbs.amap.com/api/javascript-api/reference/search#m_AMap.PlaceSearch

如果你希望隐藏高德地图的logo 可以加入下面的css


.amap-logo{
  display: none !important;
}
.amap-copyright{
  opacity:0;
}

因为高德地图的api很多也很碎,看过一遍就忘了,所以做个总结,希望对你有一点帮助