<!-- Description: 报警管理-报警地图 Author: 李亚光 Date: 2023-07-08 --> <script lang="ts" setup name="AlarmMap"> import detailInfo from '@/views/home/alarm/current/components/detailInfoDialog.vue' import AMap from '@/components/map/index.vue' const $props = defineProps({ height: { type: Number, default: 0, }, data: { type: Object, default: () => ({}), }, }) const emits = defineEmits(['refresh']) // 地图实例 const mapRef = ref() // 地图加载状态 const completeFlag = ref(false) // 地图加载完成 const completeMap = () => { completeFlag.value = true console.log('地图加载完成') } // 点标记弹窗 const detail = ref() const detailRef = ref() const markerClick = (data: any) => { // 定义弹窗 detail.value = new mapRef.value.AMap.InfoWindow({ closeWhenClickMap: true, // 是否在鼠标点击地图后关闭信息窗体 autoMove: true, // 是否自动调整窗体到视野内 isCustom: true, // 自定义信息窗体 content: detailRef.value.$el, // 窗体内容(vue组件) offset: new mapRef.value.AMap.Pixel(9, -5), // 偏移 }) // 打开信息窗口 detail.value.open(data.map, data.data.position) // 初始化信息窗口 detailRef.value.initDialog({ overlay: data.event.target, infoWindow: detail.value, info: $props.data, map: mapRef.value.map, type: 'device', }) setTimeout(() => { // mapRef.value.map.setFitView() // mapRef.value.map.setCenter(data.data.position) const center = JSON.parse(JSON.stringify(data.data.position)) center[1] = Number(center[1]) + 0.0035 mapRef.value.map.setCenter(center) }) } // 打开信息窗体 const openInfoDetail = (data: any) => { // mapRef.value.map.setZoom(10.5) // 定义弹窗 detail.value = new mapRef.value.AMap.InfoWindow({ closeWhenClickMap: true, // 是否在鼠标点击地图后关闭信息窗体 autoMove: true, // 是否自动调整窗体到视野内 isCustom: true, // 自定义信息窗体 content: detailRef.value.$el, // 窗体内容(vue组件) offset: new mapRef.value.AMap.Pixel(9, -5), // 偏移 }) // 打开信息窗口 setTimeout(() => { detail.value.open(mapRef.value.map, data.lnglat) // 初始化信息窗口 detailRef.value.initDialog({ infoWindow: detail.value, info: data, map: mapRef.value.map, type: 'device', }) setTimeout(() => { // mapRef.value.map.setFitView() const center = JSON.parse(JSON.stringify(data.lnglat)) center[1] = Number(center[1]) + 0.0035 mapRef.value.map.setCenter(center) }) // mapRef.value.map.setCenter(data.lnglat) }) } const refresh = () => { emits('refresh', true) } defineExpose({ mapRef, completeFlag, openInfoDetail, }) </script> <template> <div :style="`height: ${$props.height}px`" class="map-container"> <!-- 设备信息窗体 --> <detail-info ref="detailRef" @refresh="refresh" /> <a-map ref="mapRef" :zoom="14" @complete="completeMap" @markerClick="markerClick" /> </div> </template> <style lang="scss" scoped> .map-container { width: 100%; } </style>