一、在高德开发平台,获取Key(已有可跳过);

高德开发者平台—链接地址

1、控制台——我的应用——创建应用——添加key

 创建应用

 新建应用

 

 选择web端(JS平台)

 last:到这里的 key 就有了,还得到了一个安全密钥;

 二、引入vue-amap

1、安装

npm install -S vue-amap

 2、在 main.js 里引入

其中更多的插件,请参考: 插件的使用-入门-教程-地图 JS API | 高德地图API (amap.com)

import VueAMap from 'vue-amap';

Vue.use(VueAMap);
 // 初始化高德地图的 key 和插件
VueAMap.initAMapApiLoader({
  key: "这里填写自己的key", // "key"
  plugin: [
    'AMap.Autocomplete', // 输入提示插件
    'AMap.PlaceSearch', // POI搜索插件
    'AMap.Scale', // 右下角缩略图插件 比例尺
    'AMap.OverView', // 地图鹰眼插件
    'AMap.ToolBar', // 地图鹰眼插件
    'AMap.MapType', // 地图类型切换插件,可用于切换卫星地图
    'AMap.PolyEditor', // 多边形编辑器,绘制和编辑折现
    'AMap.CircleEditor', // 圆编辑插件
    'AMap.Geolocation', // 定位控件,用来获取和展示用户主机所在的经纬度位置
    'AMap.Geocoder' // 逆地理编码,通过经纬度获取地址所在位置详细信息
    // 按实际需求添加插件
  ],
  v: '1.4.4', // amap版本(默认1.4.4)
  // uiVersion: '1.0' // 地图ui版本(忽略,就是不配置)
});

//高德的安全密钥
window._AMapSecurityConfig = {
	securityJsCode:"这里填写得到的安全密钥" // "安全密钥",
}

3、HTML部分:编写容器


<template>
  <div>
    <el-main>
      <el-card>
        <div class="amap-page-container">
          <!-- 搜索框 -->
          <el-amap-search-box
            class="search-box"
            :search-option="searchOption"
            :on-search-result="onSearchResult"
          ></el-amap-search-box>
          <!-- 地图 -->
          <el-amap
            ref="map"
            vid="amapDemo"
            :amap-manager="amapManager"
            :center="center"
            :zoom="zoom"
            :plugin="plugin"
            :events="events"
            class="amap-demo"
          >
            <!-- 标记 -->
            <el-amap-marker
              v-for="(marker, index) in markers"
              :key="'marker' + index"
              :position="marker.position"
            />
            <!-- 位置名称显示 -->
            <el-amap-text
              v-for="(marker, index) in markers"
              :key="'text' + index"
              :text="marker.text"
              :offset="marker.offset"
              :position="marker.position"
            />
          </el-amap>

        </div>
      </el-card>
    </el-main>
  </div>
</template>

4、Script 部分:

引入 AMapManager

import { AMapManager } from "vue-amap";
<script>
import { AMapManager } from "vue-amap";
let amapManager = new AMapManager();
export default {
  data() {
    const self = this;
    return {
      address: null,
      searchKey: "北京",
      amapManager,
      markers: [],
      marker: "",
      searchOption: {
        // city: "北京", //搜索范围
        // citylimit: true, //限制搜索范围
        city: "",
        citylimit: false, // 不限制搜索范围搜索,比如想全国搜索
      },
      zoom: 12,
      lng: "",
      lat: "",
      center: [116.377809, 39.878726],
      // locate:false,
      loaded: false,
      events: {
        init: (o) => {
          o.getCity((result) => {
            console.log(result);
            let par = document.getElementsByClassName("search-box-wrapper")[0];
            console.log(par.firstChild);
            par.firstChild.setAttribute(
              "placeholder",
              "您可以在这里输入要搜索的地址"
            );
            console.log(result);
            //todo 定位到搜索位置
            this.searchOption.city = result.city;
          });
        },
        moveend: () => {},
        zoomchange: () => {},
        click: (e) => {
          let { lng, lat } = e.lnglat
          self.lng = lng
          self.lat = lat

          // 这里通过高德 SDK 完成。
          var geocoder = new AMap.Geocoder({
            radius: 1000,
            extensions: 'all'
          })
          geocoder.getAddress([lng, lat], function (status, result) {
            if (status === 'complete' && result.info === 'OK') {
              if (result && result.regeocode) {
                console.log(result);
                self.address = result.regeocode.formattedAddress
                self.markers = [];
                  const obj = {
                    position: [lng, lat],
                    text: result.regeocode.formattedAddress,
                    offset: [0, 30],
                  };
                  self.markers.push(obj);
                  // self.sure();
                self.$nextTick()
              }
            }
          })
        },
      },
      // 一些工具插件
      plugin: [
        {
          // 定位
          pName: "Geolocation",
          events: {
            init(o) {
              // o 是高德地图定位插件实例
              o.getCurrentPosition((status, result) => {
                // console.log(JSON.stringify(result));
                if (result && result.position) {
                  self.lng = result.position.lng;
                  self.lat = result.position.lat;
                  self.address = result.formattedAddress;
                  self.center = [self.lng, self.lat];
                  //   console.log(self.center, 99666);
                  let o = amapManager.getMap();
                  if (!self.marker) {
                    self.marker = new AMap.Marker({
                      position: self.center,
                    });
                    self.marker.setMap(o);
                  }
                  self.marker.setPosition(self.center);
                }else{
                  self.$message.error("位置信息,获取失败!")
                }
              });
            },
          },
        },
        {
          // 工具栏
          pName: "ToolBar",
          // locate:true, // 定位
          // direction:true, // 方向键盘是否可见
          liteStyle: true, // 精简模式

          // position:"RB", // 位置,默认为LT 代表 左上方
        },
        // "Scale", // 比例尺
        {
          // 地图类型
          pName: "MapType",
          defaultType: 0,
          events: {
            init(o) {
              console.log(o);
            },
          },
        },
      ],
    };
  },
  created(){
    // this.searchByHand()
  },
  methods: {
    onSearchResult(pois) {
      if (pois.length > 0) {
        console.log(pois);
        let { lng, lat, name, location, address } = pois[0];
        //?显示
        this.markers = [];
        const obj = {
          position: [lng, lat],
          text: address+name,
          offset: [0, 30],
        };
        this.markers.push(obj);
        this.address = address + name;
        
        let center = [lng, lat];
        this.lng = lng;
        this.lat = lat;
        this.center = [lng, lat];
        let o = amapManager.getMap();
        if (!this.marker) {
          this.marker = new AMap.Marker({
            position: center,
          });
          this.marker.setMap(o);
        }
        this.marker.setPosition(center);
      }
    },
  },
};
</script>

5、Style部分(自己根据实际场景调试)

<style lang="less" scoped>
.amap-demo {
  height: calc(100vh - 165px);
}

.search-box {
  position: absolute;
  top: 25px;
  right: 120px;
}
.amap-page-container {
  position: relative;
}
</style>>

 最后的效果图:

附官方文档:准备-入门-教程-地图 JS API|高德地图API (amap.com)

文章是一个测试demo;希望大家积极指出文章中的不足之处,有经验的小伙伴,也可以把你的见解分享出来;

Logo

前往低代码交流专区

更多推荐