Skip to content

A Map 高德地图

该组件对高德地图的创建、初始化、销毁以及各项配置进行了封装,并提供了图层切换等内置控件。

全局配置

在全局配置组件属性。

AMap组件属性配置
ts
app.provide(A_MAP_KEY, {
  loadOptions: {
    key: '替换为你申请的 key', // 必填
    version: '2.0',
  },
  mapOptions: {
    zoom: 14,
    center: [116.397428, 39.90923],
  },
  // others props...
});

提示

使用前请在项目中设置高德地图安全密钥

基础用法

初始化配置

你可以通过传入load-options属性来配置地图的加载参数,该属性与高德地图JS API的加载参数(即AMapLoader.load方法的参数)完全一致。你还可以通过传入map-options属性来配置地图的初始化参数,该属性与高德地图初始化参数(即AMap.Map方法的参数)一一对应,唯一不同点在于对layers属性进行了改造,由于组件内部对AMap的加载和map的初始化进行了封装,只有在loaded事件中才能拿到AMapmap实例。而初始化地图时传入的layers属性往往需要使用AMap实例去创建图层,这时你可以通过一个回调函数拿到AMap实例,然后在该回调函数中创建图层并返回图层数组。同时,组件内置了defaultsatelliteroadNettraffic四种图层,直接传入字符串即可快速生成对应图层。

图层控制

你可以通过layers属性来控制图层的切换,可以传入组件内置的defaultsatelliteroadNettraffic四种图层,并且支持传入高德地图提供的任意图层对象

注意

请不要使用ref将地图或图层等对象设置为响应式数据,由于这些对象中可能存在成千上万个属性,使用ref将会深层递归将所有属性转为响应式数据,可能会造成严重的性能问题。如果业务需要将这些对象设置成响应式数据,请使用shallowRef将他们设置为浅层响应式数据。

图层控件

组件内部封装了图层切换控件,可以通过layers-control属性控制是否展示。默认展示在左下角,你可以通过deep深度选择器修改控件展示的位置。

图层控件按钮

通过传入layers-buttons属性可以生成对应的图层切换按钮,内部会根据传入的图层内容匹配对应的按钮图片,你也可以通过image属性设置按钮图片。

属性

属性名说明类型默认值
load-options高德地图JS API的加载参数,对应AMapLoader.load方法的参数AMap.LoadOptions
map-options高德地图初始化参数,对应AMap.Map方法的参数AMap.MapOptions
layers地图展示的图层AMapLayer['default']
layers-control是否展示图层切换控件booleanfalse
layers-buttons自定义图层切换按钮AMapLayerButton[]
layers-index / v-model:layers-index当前选中的图层切换按钮下标number0

事件

事件名说明类型
loaded地图加载完成后的回调Function
类型声明
ts
import AMap from './a-map.vue';
import { load } from '@amap/amap-jsapi-loader';

/**
 * 高德地图组件属性
 */
export interface AMapProps {
  /**
   * 加载配置
   */
  loadOptions?: Partial<Parameters<typeof load>[0]>;
  /**
   * 地图配置
   */
  mapOptions?: AMap.MapOptions | { layers: AMapLayer[] | AMapLayersCreate };
  /**
   * 地图图层
   */
  layers?: AMapLayer[];
  /**
   * 是否显示图层控制按钮
   */
  layersControl?: boolean;
  /**
   * 图层控制按钮
   */
  layersButtons?: AMapLayerButton[];
}

/**
 * 图层类型
 */
export type AMapLayerType = 'default' | 'satellite' | 'roadNet' | 'traffic';

/**
 * 图层
 */
export type AMapLayer =
  | AMapLayerType
  | (Required<AMap.MapOptions>['layers'][number] & { map: AMap.Map });

/**
 * 图层按钮
 */
export interface AMapLayerButton {
  name: string;
  image?: string;
  layers: AMapLayer[];
}

/**
 * 图层创建方法
 */
export type AMapLayersCreate = (AMap: AMap.NameSpace) => AMapLayer[];

/**
 * 组件事件
 */
export interface AMapEmits {
  (e: 'loaded', map: AMap.Map, AMap: AMap.NameSpace, Loca: any): void;
}

/**
 * 组件实例
 */
export type AMapInstance = InstanceType<typeof AMap>;