Newer
Older
smartwell_front / src / views / home / well / components / map.vue
lyg on 9 Aug 4 KB 闸井地图联动
<!--
  Description: 闸井监测-地图
  Author: 李亚光
  Date: 2023-07-08
 -->
<script lang="ts" setup name="AlarmMap">
import detailInfo from './detailInfoDialog.vue'
import AMap from '@/components/map/index.vue'

const $props = defineProps({
  height: {
    type: Number,
    default: 0,
  },
  data: {
    type: Array,
    default: () => ([]),
  },
})
// 地图实例
const mapRef = ref()
const publicPath = window.location.origin
console.log(publicPath, 'publicPath')
// 初次加载标识
const pageIsFirst = ref(true)
// 绘制标记点
const drawMarker = () => {
  const style = [
    {
      url: `${publicPath}/image/well/闸井-正常.png`, // 图标地址
      anchor: new mapRef.value.AMap.Pixel(4, 4), // 图标显示位置偏移量,基准点为图标左上角
      size: new mapRef.value.AMap.Size(20, 20), // 图标的尺寸
      zIndex: 99, // 每种样式图标的叠加顺序,数字越大越靠前
    },
    {
      url: `${publicPath}/image/well/闸井-异常.png`, // 图标地址
      anchor: new mapRef.value.AMap.Pixel(4, 4), // 图标显示位置偏移量,基准点为图标左上角
      size: new mapRef.value.AMap.Size(20, 20), // 图标的尺寸
      zIndex: 99, // 每种样式图标的叠加顺序,数字越大越靠前
    },
    {
      url: `${publicPath}/image/well/闸井-离线.png`, // 图标地址
      anchor: new mapRef.value.AMap.Pixel(4, 4), // 图标显示位置偏移量,基准点为图标左上角
      size: new mapRef.value.AMap.Size(20, 20), // 图标的尺寸
      zIndex: 99, // 每种样式图标的叠加顺序,数字越大越靠前
    },
    {
      url: `${publicPath}/image/well/闸井-未部署.png`, // 图标地址
      anchor: new mapRef.value.AMap.Pixel(4, 4), // 图标显示位置偏移量,基准点为图标左上角
      size: new mapRef.value.AMap.Size(20, 20), // 图标的尺寸
      zIndex: 99, // 每种样式图标的叠加顺序,数字越大越靠前
    },
  ]
  // (0:未监控,1:正常,2:异常,3:离线)
  const styleDict = {
    0: 3,
    1: 0,
    2: 1,
    3: 2,
  } as { [key: string]: number }
  const data = $props.data.filter((item: any) => item.lngGaode && item.latGaode).map((item: any) => ({
    lnglat: [item.lngGaode, item.latGaode],
    name: item.ledgerName,
    style: item.monitorState ? styleDict[item.monitorState] : 3,
    id: item.id,
  }))
  mapRef.value.addMassMarks({
    path: data,
    zIndex: 111,
    zooms: [10.5, 20],
    style,
  })
  //
  if (pageIsFirst.value) {
    mapRef.value.map.setCenter([116.397428, 39.90923])
  }
  else {
    mapRef.value.map.setFitView()
  }
  mapRef.value.map.setZoom(10.5)
}
// 点标记弹窗
const detail = ref()
const detailRef = ref()
const massMarksClick = (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.event.data.lnglat)
  // 初始化信息窗口
  console.log(data.event.target)
  detailRef.value.initDialog({
    overlay: data.event.target,
    infoWindow: detail.value,
    info: data.event.data,
  })
}

// 打开信息窗体
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({
      // overlay: data.event.target,
      infoWindow: detail.value,
      info: data,
      map: mapRef.value.map,
    })
    mapRef.value.map.setCenter(data.lnglat)
    // mapRef.value.map.setZoom(15)
  })
}

// 地图绘制完毕
const completeMap = () => {
  console.log($props.data, '地图绘制完毕')
  // 绘制海量点
  drawMarker()
  pageIsFirst.value = false
}
watch(() => $props.data, (newVal) => {
  if (pageIsFirst.value) { return }
  mapRef.value.removeMassMarks()
  if (detailRef.value) {
    detailRef.value.close()
  }
  if (newVal.length) {
    // 清空标记点重新绘制
    drawMarker()
  }
}, {
  deep: true,
})
defineExpose({ openInfoDetail })
</script>

<template>
  <div :style="`height: ${$props.height}px`" class="map-container">
    <!-- 设备信息窗体 -->
    <detail-info ref="detailRef" />
    <!-- 地图 -->
    <a-map ref="mapRef" @complete="completeMap" @massMarksClick="massMarksClick" />
  </div>
</template>

<style lang="scss" scoped>
.map-container {
  width: 100%;
}
</style>