高德地图JS API 一些常见使用方法(急救包)🔥干货

1,027 阅读8分钟

🤖 作者简介:水煮白菜王 (juejin/csdn同名),一位资深前端劝退师 👻

✍ 记录一下平时在博客写作中 不定时更新,总结出的一些开发技巧和知识点✍。

👀 感谢支持💕💕💕

高德地图JS API 开发常见使用

使用高德地图JS API前 ,先准备创建应用,👉 如何创建 ;👉控制台

一. 引入加载方式

1. script 标签加载 JS API 脚本

通过 script 标签加载方式引入,可以通过 nginx代理 获取安全密钥和key,也可以使用明文直引直用; 不过明文方式很不建议,可以设置白名单或代码加密,防止key、密钥被盗。

// 同步加载
<script type="text/javascript">
  window._AMapSecurityConfig = {
    serviceHost: "你的代理服务器域名或地址/_AMapService",
    // 环境条件不够就直接明文暴露 (不建议)
    securityJsCode: '你的密钥',
  };
</script>
<script
  type="text/javascript"
  src="https://webapi.amap.com/maps?v=2.0&key=你申请的key值"
></script>
<script type="text/javascript">
  //地图初始化应该在地图容器div已经添加到DOM之后
  var map = new window.AMap.Map("container", {
    zoom: 12,
  });
</script>

// 异步看官方 https://lbs.amap.com/api/javascript-api-v2/guide/abc/load

插件加载方式具体要看如何引入JS API

  1. 如果你希望和 JS API 的主体同步加载某些插件,而不是异步加载,可以在 JS API 的script加载地址中添加plugin参数,将需要使用的一个或者多个插件的名称作为参数传入即可,这种用法在 JS API 加载完毕之后便可直接使用插件功能了。需要加载多个插件时,plugin参数中的插件名称之间以英文逗号,分割。
<script type="text/javascript" src="https://webapi.amap.com/maps?v=2.0&key=你申请的key值&plugin=AMap.ToolBar,AMap.Driving"></script> 
  1. 如果想要异步加载,使用script标签加载 loader.js,或者npm包 @amap/amap-jsapi-loader,在AMapLoader.load()的plugins参数数组中引入多个插件
<script src="https://webapi.amap.com/loader.js"></script>
<script type="text/javascript">
  AMapLoader.load({
    key: "「你申请的应用 Key」", //申请好的 Web 端开发者 Key,调用 load 时必填
    version: "2.0", //指定要加载的 JS API 的版本,缺省时默认为 1.4.15
    plugins: ["AMap.ToolBar", "AMap.Scale"], //需要使用的的插件列表
  }).then((AMap) => {
    const map = new AMap.Map("container"); //创建地图实例
    var toolbar = new AMap.ToolBar(); //创建工具条插件实例
    map.addControl(toolbar); //添加工具条插件到页面
    var scale = new AMap.Scale();
    map.addControl(scale);
  });
</script>

提示:渲染高德地图 注意 在所挂载的DOM要有实际宽高 、且在DOM渲染后加载地图。

2. JS API Loader加载(npm、loader.js)

可靠推荐、可全局自由封装AMapLoader

2-1.script 标签加载 Loader

```javascript
<script src="https://webapi.amap.com/loader.js"></script>
<script type="text/javascript">
  window._AMapSecurityConfig = {
    securityJsCode: "「你申请的安全密钥」",
  };
  AMapLoader.load({
    key: "替换为你申请的 key", //申请好的 Web 端开发 Key,首次调用 load 时必填
    version: "2.0", //指定要加载的 JS API 的版本,缺省时默认为 1.4.15
    plugins: ["AMap.Scale"], //需要使用的的插件列表,如比例尺'AMap.Scale',支持添加多个如:['AMap.Scale','...','...']
    AMapUI: {
      //是否加载 AMapUI,缺省不加载
      version: "1.1", //AMapUI 版本
      plugins: ["overlay/SimpleMarker"], //需要加载的 AMapUI ui 插件
    },
    Loca: {
      //是否加载 Loca, 缺省不加载
      version: "2.0", //Loca 版本
    },
  })
    .then((AMap) => {
      var map = new AMap.Map("container"); //"container"为 <div> 容器的 id
      map.addControl(new AMap.Scale()); //添加比例尺组件到地图实例上
    })
    .catch((e) => {
      console.error(e); //加载错误提示
    });
</script>
2-2.NPM 安装 Loader
// 安装loader包
npm i @amap/amap-jsapi-loader --save
2-3.实现示例
<!-- Vue 2 Code -->
<template>
  <div id="container"></div>
</template>
<script>
import AMapLoader from "@amap/amap-jsapi-loader";

export default {
  name: "map-view",
  mounted() {
    this.initAMap();
  },
  unmounted() {
    this.map?.destroy();
  },
  methods: {
    initAMap() {
      AMapLoader.load({
        key: "", // 申请好的Web端开发者Key,首次调用 load 时必填
        version: "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
        plugins: ["AMap.Scale"], //需要使用的的插件列表,如比例尺'AMap.Scale',支持添加多个如:['...','...']
      })
        .then((AMap) => {
          this.map = new AMap.Map("container", {
            // 设置地图容器id
            viewMode: "3D", // 是否为3D地图模式
            zoom: 11, // 初始化地图级别
            center: [116.397428, 39.90923], // 初始化地图中心点位置
          });
        })
        .catch((e) => {
          console.log(e);
        });
    },
  },
};
</script>
<style scoped>
#container {
  width: 100%;
  height: 800px;
}
</style>
3.封装AMapLoader.js (重点推荐) 🚀🚀🚀

进行自由封装挂载到全局,即封装即用,快速开发

这里特别说明,对于AMap的引入使用,引入方法有多种,如何进入看环境是否支持,博主这里建议使用npm依赖安装 @amap/amap-jsapi-loader 进行自由封装成js去使用,通过接口或者nginx代理获取key和密钥,这样无论对于后期更换key、密钥来说避免重复打包、提高维护性、项目使用AMap统一性,即引即用👍

/*
 * @Author: baicaiKing
 * @Date: 2024-07-03 17:06:33
 * @LastEditors: Do not edit
 * @LastEditTime: 2024-11-19 14:35:47
 * @FilePath: \code\src\components\AMapLoader\index.js
 * @Description:  AMapLoader.js  提供使用AMap地图功能
 * @source: https://blog.csdn.net/weixin_45511682/article/details/138078974?spm=1001.2014.3001.5502
 */
/**
 * AMapLoader.js
 * @method
  ---vue.js
    initMap() {
      this.$AMapLoader().then( (AMap) => {
          this.AMap = AMap; // this.AMap是其他AMap成员函数要用到AMap地图的AMap Api
          this.map = new AMap.Map("container_map", { // <div id="container_map"></div> 你要绑定的地图容器
            viewMode: "2D",
            zoom: 11,
            ... 这里添加初始化属性
          });
       }).catch((e) => {
          console.error('AMap加载失败', e);
       });
    }
  ---
 */
import AMapLoaders from '@amap/amap-jsapi-loader';
const amapConfig = {
    version: "2.0", // 这里是2.0版本 建议使用2.0,在一定程度上规避了一些隐性bug和兼容问题👍
    plugins: [
      "AMap.Scale",
      "AMap.OverView",
      "AMap.ToolBar",
	  // .. 这里引入你所需要的插件
    ],
    AMapUI: {
      version: '1.1', // AMapUI 缺省 1.1
      plugins: [] // AMapUI ui插件
    }
  };
  
  export default function AMapLoader() {
    return new Promise((resolve, reject) => {
      if (window.AMap) {
        // console.warn("[AMap Loader]已经挂载过了");
        resolve(window.AMap);
      } else {
        console.info("[AMap Loader]加载中...");
        /*
		 * 在这里你也可以调用服务通过接口来获取、或者nginx代理获取
		 */
        const key = "" // .. 这里你的AMap key
        const securityJsCode = "" //.. 这里你的AMap密钥
        
        // 获取高德地图
        if (key && securityJsCode) {
          // 高德安全密钥
          window._AMapSecurityConfig = {
            securityJsCode: securityJsCode,
          };

          // 加载高德地图 API 和插件
          AMapLoaders.load({
            key: key,  // 高德key值
            ...amapConfig
          }).then((AMap) => {
            resolve(AMap);
            console.success( "Note:", `[AMap Loader]API 加载成功`,'success' ); //
          }).catch((e) => {
            reject(e);
            console.error("[AMap Loader]加载 API 失败:", e);
          });
        } else {
          reject(new Error('[AMap Loader]未能获取到有效的密钥'));
          console.error('[AMap Loader]未能获取到有效的密钥');
        }
      }
    });
  }

vue项目下在main.js引入AMapLoader.js挂载全局

// 挂载高德地图
import AMapLoader from "@/components/AMapLoader/index.js";
Vue.prototype.$AMapLoader = AMapLoader;

具体使用

    // 初始化地图
    initMap() {
      this.$AMapLoader()
        .then((AMap) => {
          this.AMap = AMap; // 这里的动作是其他地方需要用到this.AMap
          this.mapApi = new AMap.Map("container_map", {
            // mapStyle: "amap://styles/grey", //设置地图的显示样式
            zoom: 14,
            zooms: [14, 16],
            resizeEnable: true,
            showBuildingBlock: false, // 不显示3D楼块
            showLabel: false, // 取消地图层标注

          });
        })
        .catch((e) => {
          console.error("AMap加载失败", e);
        });
    },

二、常用api 函数 指令

1.地图生命周期
创建地图对象

在创建地图对象阶段,可通过传入地图初始化参数来设置地图的初始状态。例如:中心点、地图视图模式、地图样式等。也可创建后进行设置

var map = new AMap.Map("container_map", {
  zoom: 10, //地图级别
  center: [116.397428, 39.90923], //地图中心点
  // layers: [new AMap.TileLayer.Satellite()], //设置图层,可设置成包含一个或多个图层的数组
  // mapStyle: "amap://styles/whitesmoke", //设置地图的显示样式
  viewMode: "2D", //设置地图模式 默认2D
  terrain: false, //关闭地形图
  showBuildingBlock: false, // 不显示3D楼块
  // showLabel: false, // 取消地图层标注
  scrollWheel: true, // 开启缩放
  dragEnable: true, // 开启鼠标拖动
  showIndoorMap: false,
  doubleClickZoom: false, // 禁止双击
  lang: "zh_en",//可选值:en,zh_en, zh_cn 默认zh_en
  // resizeEnable: true, //是否监控地图容器尺寸变化
});

创建多个地图只需加载一次 JS API。通过增加多个 HTML 容器,可创建多个地图对象。

<div id="containerOne" style="width:500px; height:300px"></div>
<div id="containerTwo" style="width:500px; height:300px"></div>
// 创建多个地图对象
var mapOne = new AMap.Map('containerOne');
var mapTwo = new AMap.Map('containerTwo');
地图加载完成

地图加载完成后会触发complete事件,可以在这个事件中执行一些地图的其他操作,例如:添加覆盖物、绑定交互事件。根据需求,自动定位到某个城市或显示某些标记点等 这个complete事件有时会引环境问题回调失败。建议直接不用

map.on('complete', function(){
  //地图图块加载完成后触发
});
销毁地图对象
//解绑地图的点击事件
map.off("click", clickHandler);
//销毁地图,并清空地图容器
map.destroy();
//地图对象赋值为null
map = null
//清除地图容器的 DOM 元素
document.getElementById("container").remove(); //"container" 为指定 DOM 元素的id
2.点标记 Marker

地图开发常用的Marker点标记:普通Marker、海量点LabelMarker;

// 普通点标记Marker
const marker = new AMap.Marker({
  position: new AMap.LngLat(116.39, 39.9),
  offset: new AMap.Pixel(-10, -10),
  icon: "//vdata.amap.com/icons/b18/1/2.png", //添加 icon 图标 URL
  title: "北京",
});
map.add(marker);
}

这里不过多介绍海量点标记,常用开中使用中大部分使用普通点Marker,数据量过大使用海量点LabelMarker即可。 使用海量点标记需要注意先创建 LabelsLayer 图层,将创建的海量点LabelMarker添加到LabelsLayer图层中,具体实现可阅读 「JS API海量点LabelMarker」 还有 「JS API普通点Marker」

3.渲染行政区边界AMap.Polygon

AMap.Polygon用于构造多边形对象,通过PolygonOptions指定多边形样式

new AMap.Polygon(opts: PolygonOptions)

具体实现可阅读 「JS API AMap.Polygon」

4.使用AMap.MouseTool绘制

AMap.MouseTool 插件主要通过用户在地图图面的鼠标操作,绘制相应的点、线、面覆盖物;或者进行图面的距离测量、面积量测、拉框放大、拉框缩小等

map.plugin(["AMap.MouseTool"],function(){
   var mousetool = new AMap.MouseTool(map);
   // 使用鼠标工具,在地图上画标记点
   mousetool.marker();
});

具体实现可阅读 「JS API AMap.MouseTool绘制」

5.设置层级、中心点 setZoomAndCenter
map.setZoom(12);
var position = [116.681212,39.852698]; 
map.setCenter(position );
map.setZoomAndCenter(12, position);
6.自动缩放视野 setFitView
map.setFitView()
7.平移 panTo

官方案例有过渡效果 但实际使用没有, 不影响使用

map.panTo([116.405467, 39.907761]);
8.限制地图区域 setLimitBounds

设置 Map 的限制区域,设定区域限制后,传入参数为限制的 Bounds。地图仅在区域内可拖拽

var map = new AMap.Map("container_map", {
  zoom: 10, //地图级别
  terrain: false, //关闭地形图
  showBuildingBlock: false, // 不显示3D楼块
  // showLabel: false, // 取消地图层标注
});
// 先获取当前地图视图范围/可视区域 getBounds
var bounds = map.getBounds();
// 获取限制的Bounds的范围值传入设定区域限制
map.setLimitBounds(bounds);
9.图片图层 AMap.ImageLayer

图片图层类,将图片作为图层添加在地图上,图片图层会随缩放级别而自适应缩放。可以用于小块区域进行叠加在地图上,如果图片设计过于精细, 堪比json效果👍。

const imageLayer = new AMap.ImageLayer({
   url: require("@/assets/img/good.png"),
   bounds: new AMap.Bounds(
        [118.766124,31.97475],
        [118.776359,31.982459]
   ),
   zooms: [14, 20],
});
var map = new AMap.Map("container_map", {
  zooms: [14, 20],
  center: [118.769418,31.978143],
  terrain: false, //关闭地形图
  showBuildingBlock: false, // 不显示3D楼块
  // showLabel: false, // 取消地图层标注
});

在这里插入图片描述

三、隐藏一些样式

1.解决初始加载地图可能出现的白屏闪烁
::v-deep  .amap-container {
    background-color: transparent !important;
}
2.隐藏logo,版权标识
::v-deep .amap-logo{
    display: none !important;
}
::v-deep .amap-copyright{
  display: none !important;
}

四、地图自定义样式

可使用官方提供的自定义地图(省时省力)map.setMapStyle("amap://styles/whitesmoke");

// 地图创建之后使用
var map = new AMap.Map("container", {
  zoom: 10, //设置地图的缩放级别
});
map.setMapStyle("amap://styles/whitesmoke");

可自行创建定制地图 👉传送门 创建定制地图的可分享复制给其他账号 提示:使用自定义地图id需要配合该账号下key、密钥才能使用,。

map.setMapStyle("amap://styles/你的自定义地图id");

其他

1.AMap官方坐标拾取器

开发可能会用到坐标拾取器, 采点找位置包方便的。 👉地址 在这里插入图片描述

后面会持续更新 官方文档

在这里插入图片描述

如果你觉得这篇文章对你有帮助,请点赞 👍、收藏 👏 并关注我!👀