gerson
2024-07-27 b06665e8c149df1273bf190313190bfa3de722e8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<template>
    <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="ywicon -rotate-90 text-white !text-[13px]"
                    :class="{ 'icon-zuoyoujiantou': chartIsShow, 'icon-zuoyoujiantou1': !chartIsShow }"
                ></div>
            </div>
            <RecordSet v-if="chartIsShow" :data="CHART_DATA" class="h-[23vh] 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="bg-white p-1 flex flex-col border-blue-500 border-solid border">
            <div class="pointer-title bg-[#ca0dab] flex-center py-1 text-white px-5">
                
            </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,
        },
    });
    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: new AMap.Pixel(0, -18),
        closeWhenClickMap: true,
    });
});
</script>
<style scoped lang="scss">
:deep(.amap-info-content) {
    padding: 0;
}
</style>