高德地图封装使用

海龙2024-9-4编程JS/TS

组件封装使用

jsCode与key需要在高德开放平台里去按指南拿到

https://lbs.amap.com/api/javascript-api/guide/abc/prepareopen in new window

在index.html里放jsCode

   window._AMapSecurityConfig = {
              securityJsCode:'',
          }
<script setup lang="ts">
import AMapLoader from '@amap/amap-jsapi-loader'
import { ref, onMounted, shallowRef } from 'vue'
// 获取div
const mapRef = ref()
// 接收传入的map配置对象
interface PropsType {
  options?: {
    [key: string]: any
  }
  plugins?: any[]
  // 也可以是一个函数来返回上面的两个内容 函数会接收AMap类
  optionsFunc?(AMap?: any, callback?: any): Pick<PropsType, 'options'>
}
const props = defineProps<PropsType>()

// emit事件
const emit = defineEmits<{
  (e: 'mapClick', ev: any): void
}>()
// 创建map对象
let map = shallowRef<any>({})
// 页面挂载后  初始化地图
onMounted(() => {
  AMapLoader.load({
    key: '', // 申请好的Web端开发者Key,首次调用 load 时必填
    version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
    plugins: props.plugins || [], // 需要使用的的插件列表,如比例尺'AMap.Scale'等
    AMapUI: {
      //重点就是这个
      version: '1.1',
      plugins: ['geo/DistrictExplorer']
    }
  })
    .then((AMap) => {
      let afterCallback: any
      if (props.optionsFunc) {
        // 这里使用了一下高阶函数 传入一个函数来接受一个函数  接收到的函数会再创建完map后面执行
        const mapData = props.optionsFunc(AMap,
                                          (callback: any) => (afterCallback = callback)
                                         )
        map.value = new AMap.Map(mapRef.value, mapData.options)
      } else {
        map.value = new AMap.Map(mapRef.value, props.options)
      }
      // 执行回调函数
      afterCallback && afterCallback(map.value)
      // 写入配置对象 进行初始化

      // 触发点击事件
      map.value.on('click', function (ev: any) {
        emit('mapClick', ev)
      })
    })
    .catch((e) => {
      console.log(e)
    })
})
</script>
<template>
  <div ref="mapRef" class="map"></div>
</template>

<style scoped>
.map {
  width: 100%;
  height: 100%;
}
</style>

<script lang="ts" setup>

// 地图相关配置
function mapClick(ev: any) {
  console.log(ev)
}
// 返回 高德地图 配置对象
function mapFunc(AMap: any, callBack: any) {

  // 配置回调函数 添加点击事件
  callBack((map: any) => {

  })

  return {
    options: {
      zoom: 4,
      center: [100.858852, 40.739311],
      showIndoorMap: false,
      isHotspot: false,
      defaultCursor: 'pointer',
      touchZoomCenter: 1,
      pitch: 0,
      viewMode: '3D',
      resizeEnable: true
    }
  }
}
</script>

<template>
  <AMapVue :options-func="mapFunc" :plugins="['AMap.Scale']" @map-click="mapClick">
  </AMapVue>
</template>

注意事项

注意事项

高德地图的AMap.Circle覆盖物,直接在配置时候指定map,会导致无法显示,必须要先创建,再通过.setMap方法来绑定地图实例,才会正确显示。circleMakar覆盖物则没这个问题.这个应该是官方bug

特殊实现的经验

单独渲染某个区域不显示其他部分:

  1. 先通过区域边界查询来获取canvas折线,然后再使用mask地图配置项来绘制指定区域
  2. 官方示例:区域掩模
最后更新日期 6/24/2025, 10:29:18 AM