wujingjing
2024-11-12 91fbe6ea41b0451a17aa1f6654faa9806b7f1817
src/components/chat/chatComponents/mapCom/MapCom.vue
@@ -1,19 +1,130 @@
<template>
   <div ref="containerRef" class="h-[70vh]"></div>
   <div class="h-[70vh] relative">
      <div ref="containerRef" class="h-full"></div>
      <div v-if="bottomBarIsShow" class="absolute w-full bottom-0 bg-white border-gray-300 border border-solid">
         <div
            class="w-28 h-5 absolute left-1/2 -translate-x-1/2 -translate-y-[100%] cursor-pointer bg-[#4974f3] rounded-t-lg flex-center"
            @click="toggleShowChart"
         >
            <div
               class="ywifont -rotate-90 text-white !text-[13px]"
               :class="{ 'ywicon-zuoyoujiantou': chartIsShow, 'ywicon-zuoyoujiantou1': !chartIsShow }"
            ></div>
         </div>
         <RecordSet v-if="chartIsShow" chartHeight="23vh" :data="CHART_DATA" class="mt-2" />
      </div>
   </div>
</template>
<script setup lang="ts">
import { onMounted, ref } from 'vue';
import { chatComProps } from '../common';
import RecordSet from '../summaryCom/components/recordSet/RecordSet.vue';
import { CHART_DATA } from './TestData';
import monitorPointPic from './img/monitor-point.svg';
import type { MapData } from './types';
import type { GaoDePosition, LabelMarkerData } from '/@/model/map/GaoDeMap';
import { GaoDeMap } from '/@/model/map/GaoDeMap';
let gaoDeMap = new GaoDeMap();
const containerRef = ref<HTMLDivElement>(null);
const props = defineProps(chatComProps) as {
   data: MapData;
};
const createInfoWindow = () => {
   const dom = `<div class="w-48 bg-white p-1 flex flex-col border-blue-500 border-solid border">
         <div class="bg-[#ca0dab] flex py-1 text-white px-5">
            <div class="pointer-title  text-nowrap overflow-hidden text-ellipsis mx-auto"></div>
         </div>
      </div>`;
   // const dom = `<div class="w-32 bg-white p-1 flex flex-col border-blue-500 border-solid border">
   //    <div class="bg-[#ca0dab] flex-center py-1 text-white">
   //       水月五
   //    </div>
   //    <div class="flex flex-col mt-2">
   //       <div class="flex w-full text-blue-800">
   //          <div class="overflow-hidden text-nowrap overflow-ellipsis self-end flex-auto text-right">
   //             0.72332
   //          </div>
   //          <div class="flex-0 ml-4">
   //             m
   //          </div>
   //       </div>
   //    </div>
   // </div>`;
   return dom;
};
const updateInfoWindow = (title: string) => {
   const pointerTitle = infoWindow.dom.querySelector('.pointer-title');
   pointerTitle.innerHTML = title +'';
};
const addMarkerLayer = () => {
   const dataList = (props.data?.values ?? []).map<LabelMarkerData>((item) => ({
      position: [item.posx, item.posy],
      textColor: item.color,
      extData: item,
      title: item.title,
   }));
   gaoDeMap.addMarkerLayer(dataList, {
      markerOpt: {
         icon: {
            url: monitorPointPic,
            size: 30,
         },
         click(e, label) {
            if (!bottomBarIsShow.value) {
               bottomBarIsShow.value = true;
            }
            if (!chartIsShow.value) {
               chartIsShow.value = true;
            }
            infoWindow.open(gaoDeMap.map, label.getPosition() as any);
            const extData = label.getExtData();
            updateInfoWindow(extData.title);
         },
      },
      layerOpt: {
         // allowCollision:false
      },
   });
};
const bottomBarIsShow = ref(false);
const chartIsShow = ref(true);
const toggleShowChart = () => {
   chartIsShow.value = !chartIsShow.value;
};
let infoWindow: AMap.InfoWindow;
onMounted(async () => {
   await gaoDeMap.init({
      container: containerRef.value,
      aMapOption: {
         resizeEnable: true,
      },
   });
   gaoDeMap.zoomToRect([116.319665, 39.855919], [116.468324, 39.9756]);
   const southWest: GaoDePosition = [props.data.minx, props.data.miny];
   const northEast: GaoDePosition = [props.data.maxx, props.data.maxy];
   gaoDeMap.zoomToRect(southWest, northEast);
   gaoDeMap.applyBasicPlugins();
   addMarkerLayer();
   infoWindow = new AMap.InfoWindow({
      content: createInfoWindow(),
      offset: [3,-34],
      closeWhenClickMap: true,
   });
});
</script>
<style scoped lang="scss"></style>
<style scoped lang="scss">
:deep(.amap-info-content) {
   padding: 0;
}
</style>