首先安装 @amap/amap-jsapi-loader
官网教程
mapContainer.vue
<template> <div class="container-map" :style="styleObj"> <!-- @change="changeInput" type="text" --> <a-input id='tipinput' v-model:value="inputValue" @change="changeInput"></a-input> <div id="container" ref="container" tabindex="0"></div> <div id="panel"></div> </div> </template> <script setup> import { onMounted, onUnmounted, getCurrentInstance, ref, inject, watch, toRefs, reactive } from 'vue' import { useRouter } from 'vue-router' import AMapLoader from '@amap/amap-jsapi-loader'; import { keyGD, passwordGD } from "@/core/gaodekey.js"; import { message } from "ant-design-vue"; import utils from "@/core/utils.js"; const router = useRouter() const container = ref(null) let mapObj = null let placeSearch = {} let mapModule = null let autoComplete = null const inputValue = ref('') // 当前位置 const currentPosition = ref({}) watch( () => props.value, (n) => { if (!n) { inputValue.value = undefined; } else { inputValue.value = n; } }, { immediate: true } ); const emits = defineEmits(["getPosition", 'addMarker']); const props = defineProps({ replenishmentMapList: { type: Array, default: () => [], }, styleObj: { type: Object, default: () => { } }, value: {}, }) const changeInput = (target) => { setTimeout(() => { emits("update:value", target.target._value); }, 500) } // 添加点位 const addMarker = (pointArray) => { // console.log(pointArray, "pointArray") clearMap() // 创建不同显示的icon pointArray.forEach((marker) => { new AMap.Marker({ map: mapObj, position: [marker.lng, marker.lat], icon: new mapModule.Icon({ image: marker.icon || '', size: [25, 34], imageSize: [25, 34] }), offset: new AMap.Pixel(-13, -30) }); }) // 移动点位中心点 mapObj.setFitView(); } // 清除地图所有覆盖物 const clearMap = () => { mapObj.clearMap(); } // 初始化地图 const initMap = () => { AMapLoader.load({ key: keyGD, // 申请好的Web端开发者Key,首次调用 load 时必填 version: '2.0',// 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15 plugins: ["AMap.AutoComplete", "AMap.PlaceSearch", "AMap.Geolocation"], }) .then((AMap) => { console.log(AMap, 'AMap') // 保存AMap实例 mapModule = AMap const map = new AMap.Map('container', { // 设置地图容器id // viewMode: '3D', // 默认2d地图模式 zoom: 12, // 初始化地图级别 zooms: [5, 30], // 可以设置初始化当前位置 // center: [116.397428, 39.90923], resizeEnable: true }) mapObj = map let geolocation = new AMap.Geolocation({ enableHighAccuracy: true,//是否使用高精度定位,默认:true timeout: 10000, //超过10秒后停止定位,默认:5s position: 'RB', //定位按钮的停靠位置 offset: [10, 20], //定位按钮与设置的停靠位置的偏移量,默认:[10, 20] zoomToAccuracy: true, //定位成功后是否自动调整地图视野到定位点 }); mapObj.addControl(geolocation) geolocation.getCurrentPosition((status, result) => { if (status == 'complete') { console.log(result, 'result你好') const { lng, lat } = result.position currentPosition.value = { lng, lat } emits('getPosition', [lng, lat]) addMarker([{ lng, lat }]) } else { message.error('定位失败') } }) // 搜索功能 toSearch() }) .catch((e) => { console.log(e) }) } const select = (e) => { const { poi } = e debugger const poiName = e.poi.name placeSearch.setCity(e.poi.adcode) // 获取当前的坐标 115.644865,40.223472 // lng lat const { lng, lat } = e.poi.location autoComplete.search(poiName, function (status, result) { if (status === 'complete' && result.info === 'OK') { console.log(result, 'result') addMarker([{ lng, lat }]) // 获取搜索到的点位 emits('getPosition', [lng, lat]) emits('getPositionInfo', poi) } }) // 关键字查询查询 } const toSearch = () => { const autoOptions = { // input 为绑定输入提示功能的input的DOM ID,注意这个id要个搜索输入框的id一致 input: 'tipinput' } autoComplete = new AMap.AutoComplete(autoOptions) placeSearch = new AMap.PlaceSearch( { map: mapObj, //展现结果的地图实例 } ) // console.log(placeSearch, 'placeSearch') autoComplete.on('select', select)// 注册监听,当选中某条记录时会触发 } onMounted(() => { window._AMapSecurityConfig = { securityJsCode: passwordGD // 申请key对应的秘钥 -> 注意了,如果不搭配密钥使用,搜索将没有结果 } initMap() // 初始化地图 }) onUnmounted(() => { map?.destroy(); }) // watch(propData,(newVal,oldVal)=>{}) defineExpose({ addMarker, }) </script> <style scoped> .container-map { padding: 0px; margin: 0px; width: 50%; height: 500px; #container { width: 100%; height: 100%; } } </style>