Bootstrap

vue3 高德地图使用方法

  • 高德地图(AMap)提供了丰富的在线地图服务和功能,常用于Web和移动应用中的地理位置展示和导航。
  • 一、准备工作
  • 注册高德地图开发者账号:
  • 访问 高德地图官网,注册并登录开发者账号。
  • 创建应用并获取API Key:
  • 在控制台创建新的应用,获取应用对应的API Key(也称为开发者密钥)。
  • 二、安装高德地图依赖
  • npm install @amap/amap-jsapi-loader
    # or
    pnpm add @amap/amap-jsapi-loader
    # or
    yarn add @amap/amap-jsapi-loader

  •  三、创建组件 src/components/Map.vue 并在页面中引用相关API
  • 四、引入依赖
  • import AMapLoader from '@amap/amap-jsapi-loader'; 

    2.添加Key值,在高德地图创建应用时获取的API Key,复制后将Key 值添加 到组件,就可以使用了

  •  AMapLoader.load({
          key: '你的应用key', // 申请好的Web端开发者Key,首次调用 load 时必填
          version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
          plugins: [], // 需要使用的的插件列表,如比例尺'AMap.Scale'等
        })
          .then(AMap => {
              //JS API 加载完成后获取的AMAP对象
            })
          .catch((e)=>{
            console.log(e) //加载错误提示
            });

  • 五、地图初始化,在回调函数中创建基本图层数据
  • let map = new AMap.Map('map', {
              //设置地图容器id
              zoom: 15, //初始化地图层级
              viewMode: '3D', //是否为3D地图模式
              center: [104.065735, 30.659462], //初始化地图中心点位置
              dragEnable: true, //鼠标拖拽
              scrollWheel: true, //鼠标滚轮放大缩小
              doubleClickZoom: true, //双击放大缩小
              keyboardEnable: true, //键盘控制放大缩小移动旋转
            });
  • 六、引入地图控件
  • let map = new AMap.Map('map', {
              //设置地图容器id
              zoom: 15, //初始化地图层级
              viewMode: '3D', //是否为3D地图模式
              center: [104.065735, 30.659462], //初始化地图中心点位置
              dragEnable: true, //鼠标拖拽
              scrollWheel: true, //鼠标滚轮放大缩小
              doubleClickZoom: true, //双击放大缩小
              keyboardEnable: true, //键盘控制放大缩小移动旋转
            });
  • 七、创建 Marker 对象(标记点)
  • data.map(e => {
              marker.push(
                new AMap.Marker({
                  map: map, //将m1这个点添加到map地图里
                  position: e.position,
                  title: e.title,
                  id: e.id,
                }),
              );
            });
            //这里是循环添加点击事件,将每一个点都注册一变
            for (var i = 0; i < marker.length; i++) {
              marker[i].on('click', clickHandler);
            }
            //将创建的点标记添加到已有的地图实例:
            map.add(marker);
  • 八、标记点之间绘制线
  • // 线
            var line = new AMap.Polyline({
              strokeColor: '#80d8ff', //描边的颜色
              isOutline: true, //包含轮廓
              lineJoin: 'bevel', //折线拐点连接处样式
              outerlineColor: 'white',
              strokeStyle: 'solid', //线样式
              lineCap: 'round', //线端点样式
              showDir: true, //是否显示方向箭头
              strokeWeight: 6, //线的宽度
            });
            line.setMap(map);
  • 九、绘制标记点范围
  • // 让地图根据覆盖调整地图显示区域
            // map.setFitView();
            marker.map(e => {
              circleMarker.push(
                new AMap.Circle({
                  center: e.getPosition(), //圆心
                  radius: 200, //半径
                  strokeColor: '#FF33FF', //轮廓线颜色
                  strokeStyle: 'dashed',
                  strokeDasharray: [10, 10],
                  strokeWeight: 2, //轮廓线宽度
                  strokeOpacity: 0.5, //轮廓线透明度
                  fillColor: 'rgba(0,0,215,0.5)', //多边形填充颜色
                  fillOpacity: 0.5, //多边形填充透明度
                  zIndex: 10, //多边形覆盖物的叠加顺序
                  cursor: 'pointer', //鼠标悬停时的鼠标样式
                }),
              );
            });
            for (var i = 0; i < circleMarker.length; i++) {
              //圆形 circleMarker 对象添加到 Map
              map.add(circleMarker[i]);
            }
  • 十、最终页面实现效果

 

完整代码 :
<template>
  <div>
    <div id="map"></div>
  </div>
</template>

<script setup>
  import AMapLoader from '@amap/amap-jsapi-loader'; // 使用加载器加载JSAPI,可以避免异步加载、重复加载等常见错误加载错误
  import { shallowRef } from '@vue/reactivity';
  import { onMounted } from '@vue/runtime-core';
  const emit = defineEmits(['showEcharts']);
  const data = [
    {
      map: '',
      position: [104.065735, 30.659462],
      title: '成都',
      id: '1',
    },
    {
      map: '',
      position: [104.071009, 30.658694],
      title: '北京',
      id: '2',
    },
    {
      map: '',
      position: [104.054695, 30.655498],
      title: '上海',
      id: '3',
    },
    {
      map: '',
      position: [104.057029, 30.664587],
      title: '广州',
      id: '4',
    },
  ];
  let p = [];
  let marker = [];
  let circleMarker = [];
  const map = shallowRef(null); // 初始化地图
  function initMap() {
    AMapLoader.load({
      key: '你申请应用的key', // 申请好的Web端开发者Key,首次调用 load 时必填
      version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
      plugins: [], // 需要使用的的插件列表,如比例尺'AMap.Scale'等
    })
      .then(AMap => {
        let map = new AMap.Map('map', {
          //设置地图容器id
          zoom: 15, //初始化地图层级
          viewMode: '3D', //是否为3D地图模式
          center: [104.065735, 30.659462], //初始化地图中心点位置
          dragEnable: true, //鼠标拖拽
          scrollWheel: true, //鼠标滚轮放大缩小
          doubleClickZoom: true, //双击放大缩小
          keyboardEnable: true, //键盘控制放大缩小移动旋转
        });
        //异步加载工具条插件
        AMap.plugin(['AMap.ToolBar', 'AMap.Scale', 'AMap.Geolocation', 'AMap.HawkEye'], function () {
          //在回调函数中实例化插件
          map.addControl(new AMap.Scale()); //异步同时加载多个插件
          map.addControl(new AMap.ToolBar()); //添加工具条插件到页面
          map.addControl(new AMap.Geolocation());
          map.addControl(
            new AMap.HawkEye({
              position: 'LT', //控件停靠位置(LT/RT/LB/RB)
            }),
          );
        });
        map.setDefaultCursor('pointer'); //使用CSS默认样式定义地图上的鼠标样式(default/pointer/move/crosshair)
        // map.on('complete', function () {
        //   alert('地图加载完成!');
        // });
        data.map(e => {
          marker.push(
            new AMap.Marker({
              map: map, //将m1这个点添加到map地图里
              position: e.position,
              title: e.title,
              id: e.id,
            }),
          );
        });
        //这里是循环添加点击事件,将每一个点都注册一变
        for (var i = 0; i < marker.length; i++) {
          marker[i].on('click', clickHandler);
        }
        //将创建的点标记添加到已有的地图实例:
        map.add(marker);
        // 让地图根据覆盖调整地图显示区域
        // map.setFitView();
        marker.map(e => {
          circleMarker.push(
            new AMap.Circle({
              center: e.getPosition(), //圆心
              radius: 200, //半径
              strokeColor: '#FF33FF', //轮廓线颜色
              strokeStyle: 'dashed',
              strokeDasharray: [10, 10],
              strokeWeight: 2, //轮廓线宽度
              strokeOpacity: 0.5, //轮廓线透明度
              fillColor: 'rgba(0,0,215,0.5)', //多边形填充颜色
              fillOpacity: 0.5, //多边形填充透明度
              zIndex: 10, //多边形覆盖物的叠加顺序
              cursor: 'pointer', //鼠标悬停时的鼠标样式
            }),
          );
        });
        for (var i = 0; i < circleMarker.length; i++) {
          //圆形 circleMarker 对象添加到 Map
          map.add(circleMarker[i]);
        }
        // 线
        var line = new AMap.Polyline({
          strokeColor: '#80d8ff', //描边的颜色
          isOutline: true, //包含轮廓
          lineJoin: 'bevel', //折线拐点连接处样式
          outerlineColor: 'white',
          strokeStyle: 'solid', //线样式
          lineCap: 'round', //线端点样式
          showDir: true, //是否显示方向箭头
          strokeWeight: 6, //线的宽度
        });
        line.setMap(map);
        function compute() {
          marker.map(i => {
            p.push(i.getPosition());
          });
          var path = p;
          line.setPath(path); //绘制线
        }
        compute();
        //为地图注册click事件获取鼠标点击出的经纬度坐标
        map.on('click', function (e) {
          // console.log(e.lnglat.getLng() + ',' + e.lnglat.getLat());
          document.getElementById('lnglat').value = e.lnglat.getLng() + ',' + e.lnglat.getLat();
        });
      })
      .catch(e => {
        console.log(e);
      });
  }
  const clickHandler = function (e) {
    // console.log(e.target._originOpts);
    emit('showEcharts', true,e.target._originOpts.id);
    // alert('您在[ '+e.lnglat.getLng()+','+e.lnglat.getLat()+' ]的位置点击了地图!');
  };
  // 调用地图初始化函数:onMounted 函数会在 DOM 初始化完成后调用,建议在 mounted 函数中调用地图初始化方法
  onMounted(() => {
    initMap();
  });
</script>

<style>
  #map {
    /* margin: 50px auto; */
    width: 100%;
    height: 100vh;
  }
</style>

;