From 22f9f05b3f1c452325b04f0a5ed9c5f4ad992f3b Mon Sep 17 00:00:00 2001
From: zhanghua <314079846@qq.com>
Date: 星期四, 16 一月 2025 22:33:29 +0800
Subject: [PATCH] 地图上项目查询

---
 src/views/components/Map/index.vue |  982 ++++++++++++++++++++++++++++++---------------------------
 1 files changed, 513 insertions(+), 469 deletions(-)

diff --git a/src/views/components/Map/index.vue b/src/views/components/Map/index.vue
index a9fee43..c81f182 100644
--- a/src/views/components/Map/index.vue
+++ b/src/views/components/Map/index.vue
@@ -1,33 +1,33 @@
 <template>
-    <div :id="id" ref="contentRef" style="height: 100%; width: 100%">
-        <div
-            v-if="isShowControl"
-            :class="controlPosition"
-            class="control-container bottom-right"
-        >
-            <div
-                v-for="item in controlMapping"
-                :key="item.id"
-                class="control-content"
-            >
-                <template v-if="item.children">
-                    <div
-                        v-for="child in item.children"
-                        :key="child.id"
-                        class="control-item"
-                        @click="child.event"
-                    >
-                        <img :src="child.img" />
-                    </div>
-                </template>
-                <template v-else>
-                    <div class="control-item" @click="item.event">
-                        <img :src="item.img" />
-                    </div>
-                </template>
-            </div>
-        </div>
+  <div :id="id" ref="contentRef" style="height: 100%; width: 100%">
+    <div
+      v-if="isShowControl"
+      :class="controlPosition"
+      class="control-container bottom-right"
+    >
+      <div
+        v-for="item in controlMapping"
+        :key="item.id"
+        class="control-content"
+      >
+        <template v-if="item.children">
+          <div
+            v-for="child in item.children"
+            :key="child.id"
+            class="control-item"
+            @click="child.event"
+          >
+            <img :src="child.img" />
+          </div>
+        </template>
+        <template v-else>
+          <div class="control-item" @click="item.event">
+            <img :src="item.img" />
+          </div>
+        </template>
+      </div>
     </div>
+  </div>
 </template>
 <script>
 import Location from "@/assets/images/location.png";
@@ -36,426 +36,470 @@
 import PlusImg from "@/assets/images/plus.png";
 import FullScreenImg from "@/assets/images/fullScreen.png";
 import PositionImg from "@/assets/images/position.png";
+var infoWin;
 export default {
-    data() {
-        return {
-            zoom: 15,
-            map: null,
-            contentRef: {},
-            infoWin: {},
-            defaultMaskInfo: {},
-            mapKey: "ffb871cd7ca48883db3b04cfd00d469f",
-            controlMapping: [
-                {
-                    id: "瀹氫綅",
-                    img: PositionImg,
-                    event: this.getCurrentPosition,
-                },
-                {
-                    id: "缂╂斁",
-                    children: [
-                        {
-                            id: "鏀惧ぇ",
-                            img: PlusImg,
-                            event: this.zoomIn,
-                        },
-                        {
-                            id: "缂╁皬",
-                            img: MinusImg,
-                            event: this.zoomOut,
-                        },
-                    ],
-                },
-                {
-                    id: "鍏ㄥ睆",
-                    img: FullScreenImg,
-                    event: this.fullScreen,
-                },
-            ],
+  data() {
+    return {
+      zoom: 15,
+      map: null,
+      contentRef: {},
+      infoWin: {},
+      defaultMaskInfo: {},
+      mapKey: "ffb871cd7ca48883db3b04cfd00d469f",
+      controlMapping: [
+        {
+          id: "瀹氫綅",
+          img: PositionImg,
+          event: this.getCurrentPosition,
+        },
+        {
+          id: "缂╂斁",
+          children: [
+            {
+              id: "鏀惧ぇ",
+              img: PlusImg,
+              event: this.zoomIn,
+            },
+            {
+              id: "缂╁皬",
+              img: MinusImg,
+              event: this.zoomOut,
+            },
+          ],
+        },
+        {
+          id: "鍏ㄥ睆",
+          img: FullScreenImg,
+          event: this.fullScreen,
+        },
+      ],
+    };
+  },
+  props: {
+    id: String,
+    mapList: Array,
+    listType: Boolean,
+    isShowControl: Boolean,
+    controlPosition: Object,
+    isImmediateLoad: { type: Boolean, default: true },
+    mapType: Boolean,
+  },
+
+  created() {
+    this.defaultMaskInfo = {
+      lon: this.$props.mapList[0]?.lon
+        ? this.$props.mapList[0].lon
+        : "105.37281",
+      lat: this.$props.mapList[0]?.lat
+        ? this.$props.mapList[0].lat
+        : "30.87145",
+      name: this.$props.mapList[0]?.name ? this.$props.mapList[0].name : "鍒涘缓",
+    };
+    if (this.$props.isImmediateLoad) this.onLoad();
+  },
+  methods: {
+    async onLoad() {
+      const scripts = document.body.querySelectorAll("script");
+      if (!this.mapKey) {
+        // const res = await getDicts('map_key')
+        // mapKey = res[0].dictLabel
+        this.mapKey = "ffb871cd7ca48883db3b04cfd00d469f";
+      }
+
+      const scriptSrc = `http://api.tianditu.gov.cn/api?v=4.0&tk=${this.mapKey}`;
+      const mapScript = Array.from(scripts).find((item) => {
+        return item.getAttribute("src") === scriptSrc;
+      });
+
+      if (!mapScript) {
+        // 鍒涘缓script鏍囩
+        const script = document.createElement("script");
+        // 璁剧疆API鐨刄RL
+        script.src = scriptSrc;
+        script.type = "text/javascript";
+        // 灏唖cript鏍囩娣诲姞鍒癏TML涓�
+        document.body.appendChild(script);
+        script.onload = () => {
+          this.initTianMap();
         };
-    },
-    props: {
-        id: String,
-        mapList: Array,
-        listType: Boolean,
-        isShowControl: Boolean,
-        controlPosition: Object,
-        isImmediateLoad: { type: Boolean, default: true },
-        mapType: Boolean,
+      } else {
+        this.initTianMap();
+      }
     },
 
-    created() {
-        this.defaultMaskInfo = {
-            lon: this.$props.mapList[0]?.lon
-                ? this.$props.mapList[0].lon
-                : "105.37281",
-            lat: this.$props.mapList[0]?.lat
-                ? this.$props.mapList[0].lat
-                : "30.87145",
-            name: this.$props.mapList[0]?.name ? this.$props.mapList[0].name : "鍒涘缓",
-        };
-        if (this.$props.isImmediateLoad) this.onLoad();
+    initTianMap() {
+      var T = window.T;
+      setTimeout(async () => {
+        // this.map = new T.Map(this.id, {
+        //     projection: "EPSG:4326",
+        // });
+        this.map = new T.Map(this.id);
+        this.map.centerAndZoom(
+          new T.LngLat(this.defaultMaskInfo.lon, this.defaultMaskInfo.lat),
+          this.zoom
+        );
+        if (!this.$props.listType) {
+          // 娓呴櫎涔嬪墠鐨勬爣璁�
+          // map && map.clearOverLays()
+          //form琛ㄥ崟涓槸鍚︽湁鍧愭爣锛屾湁鍒欏畾浣嶅埌瀵瑰簲浣嶇疆锛屾病鏈夊垯浣跨敤榛樿鐨�
+          // 104.65417 28.75572 娴嬭瘯鏁版嵁
+          // 鍥涘窛鐪佸疁瀹惧競缈犲睆鍖哄ぇ瑙傛ゼ琛楅亾澶栧崡琛�71
+          if (this.$props.mapList[0].addr) {
+            const { lng: lon, lat } = await this.getGeocode(
+              this.$props.mapList[0].addr
+            );
+            this.defaultMaskInfo.lon = String(lon);
+            this.defaultMaskInfo.lat = String(lat);
+          }
+
+          this.map && this.makeDefaultMask(this.defaultMaskInfo);
+          this.addEvent(this.map, "click", (e) => this.mapClick(e));
+        } else {
+          this.$props.mapList.length && this.makeAllMask(this.$props.mapList);
+        }
+      }, 1500);
     },
-    methods: {
-        async onLoad() {
-            const scripts = document.body.querySelectorAll("script");
-            if (!this.mapKey) {
-                // const res = await getDicts('map_key')
-                // mapKey = res[0].dictLabel
-                this.mapKey = "ffb871cd7ca48883db3b04cfd00d469f";
-            }
 
-            const scriptSrc = `http://api.tianditu.gov.cn/api?v=4.0&tk=${this.mapKey}`;
-            const mapScript = Array.from(scripts).find((item) => {
-                return item.getAttribute("src") === scriptSrc;
-            });
+    zoomIn() {
+      this.map && this.map.zoomIn();
+    },
 
-            if (!mapScript) {
-                // 鍒涘缓script鏍囩
-                const script = document.createElement("script");
-                // 璁剧疆API鐨刄RL
-                script.src = scriptSrc;
-                script.type = "text/javascript";
-                // 灏唖cript鏍囩娣诲姞鍒癏TML涓�
-                document.body.appendChild(script);
-                script.onload = () => {
-                    this.initTianMap();
-                };
-            } else {
-                this.initTianMap();
-            }
-        },
+    zoomOut() {
+      this.map && this.map.zoomOut();
+    },
 
-        initTianMap() {
-            var T = window.T;
-            setTimeout(async () => {
-                // this.map = new T.Map(this.id, {
-                //     projection: "EPSG:4326",
-                // });
-                this.map = new T.Map(this.id);
-                this.map.centerAndZoom(
-                    new T.LngLat(this.defaultMaskInfo.lon, this.defaultMaskInfo.lat),
-                    this.zoom
-                );
-                if (!this.$props.listType) {
-                    // 娓呴櫎涔嬪墠鐨勬爣璁�
-                    // map && map.clearOverLays()
-                    //form琛ㄥ崟涓槸鍚︽湁鍧愭爣锛屾湁鍒欏畾浣嶅埌瀵瑰簲浣嶇疆锛屾病鏈夊垯浣跨敤榛樿鐨�
-                    // 104.65417 28.75572 娴嬭瘯鏁版嵁
-                    // 鍥涘窛鐪佸疁瀹惧競缈犲睆鍖哄ぇ瑙傛ゼ琛楅亾澶栧崡琛�71
-                    if (this.$props.mapList[0].addr) {
-                        const { lng: lon, lat } = await this.getGeocode(
-                            this.$props.mapList[0].addr
-                        );
-                        this.defaultMaskInfo.lon = String(lon);
-                        this.defaultMaskInfo.lat = String(lat);
-                    }
+    fullScreen() {
+      this.map && this.contentRef?.requestFullscreen();
+    },
 
-                    this.map && this.makeDefaultMask(this.defaultMaskInfo);
-                    this.addEvent(this.map, "click", (e) => this.mapClick(e));
-                } else {
-                    this.$props.mapList.length && this.makeAllMask(this.$props.mapList);
-                }
-            }, 1500);
-        },
+    getCurrentPosition() {
+      //   if (navigator.geolocation) {
+      //     ElMessage.warning("璇ュ姛鑳芥殏鏈紑鍙�");
+      //     // TODO 鍦板浘瀹氫綅
+      //     // navigator.geolocation.getCurrentPosition(function (position) {
+      //     //   var latitude = position.coords.latitude
+      //     //   var longitude = position.coords.longitude
+      //     //
+      //     //   moveTo(String(longitude), String(latitude))
+      //     // })
+      //   } else {
+      //     ElMessage.warning("褰撳墠娴忚鍣ㄤ笉鏀寔瀹氫綅鍔熻兘");
+      //   }
+    },
 
-        zoomIn() {
-            this.map && this.map.zoomIn();
-        },
+    moveTo(lon, lat) {
+      this.map && this.map.panTo(new T.LngLat(lon, lat));
+    },
+    // 榛樿鐨勭偣鏍囪
+    makeDefaultMask(mapInfo) {
+      const { name, lon, lat } = mapInfo;
+      const option = {
+        text: name,
+        offset: [-35, -45],
+        labelBg: "#3369FF",
+        labelColor: "#fff",
+        labelClick: this.labelClick,
+      };
+      // 娓呴櫎涔嬪墠鐨勬爣璁�
+      this.map && this.map.clearOverLays();
+      this.map.panTo(new T.LngLat(lon, lat));
+      this.makeMask(lon, lat, { labelOptions: option });
+    },
 
-        zoomOut() {
-            this.map && this.map.zoomOut();
-        },
+    // 鍦板浘鐐瑰嚮浜嬩欢
+    mapClick(e) {
+      e.originalEvent.stopPropagation();
 
-        fullScreen() {
-            this.map && this.contentRef?.requestFullscreen();
-        },
+      const { lat, lng: lon } = e.lnglat;
 
-        getCurrentPosition() {
-            if (navigator.geolocation) {
-                ElMessage.warning("璇ュ姛鑳芥殏鏈紑鍙�");
-                // TODO 鍦板浘瀹氫綅
-                // navigator.geolocation.getCurrentPosition(function (position) {
-                //   var latitude = position.coords.latitude
-                //   var longitude = position.coords.longitude
-                //
-                //   moveTo(String(longitude), String(latitude))
-                // })
-            } else {
-                ElMessage.warning("褰撳墠娴忚鍣ㄤ笉鏀寔瀹氫綅鍔熻兘");
-            }
-        },
+      this.makeDefaultMask({
+        ...this.defaultMaskInfo,
+        lon: String(lon),
+        lat: String(lat),
+      });
+      this.getReverseGeocode(e).then((addr) => {
+        this.$emit("mapClick", {
+          e,
+          addr,
+        });
+      });
+      console.log("鐐瑰嚮浜嬩欢", e);
+    },
 
-        moveTo(lon, lat) {
-            this.map && this.map.panTo(new T.LngLat(lon, lat));
-        },
+    // 閫嗗湴鐞嗙紪鐮� 鑾峰彇鍦板潃
+    getReverseGeocode(e) {
+      return new Promise((resolve) => {
+        const geocode = new T.Geocoder();
+        geocode.getLocation(e.lnglat, (result) => {
+          if (result.status === "0") {
+            resolve(result.getAddress());
+          }
+        });
+      });
+    },
 
-        // 榛樿鐨勭偣鏍囪
-        makeDefaultMask(mapInfo) {
-            const { name, lon, lat } = mapInfo
-            const option = {
-                text: name,
-                offset: [-35, -45],
-                labelBg: "#3369FF",
-                labelColor: "#fff",
-                labelClick: this.labelClick,
-            };
-            // 娓呴櫎涔嬪墠鐨勬爣璁�
-            this.map && this.map.clearOverLays();
-            this.map.panTo(new T.LngLat(lon, lat));
-            this.makeMask(lon, lat, { labelOptions: option });
-        },
+    // 鍦扮悊缂栫爜
+    getGeocode(addr) {
+      return new Promise((resolve) => {
+        const geocoder = new T.Geocoder();
+        geocoder.getPoint(addr, (result) => {
+          if (result.status === "0") {
+            resolve(result.getLocationPoint());
+          }
+        });
+      });
+    },
 
-        // 鍦板浘鐐瑰嚮浜嬩欢
-        mapClick(e) {
-            e.originalEvent.stopPropagation();
-
-            const { lat, lng: lon } = e.lnglat;
-
-            this.makeDefaultMask({
-                ...this.defaultMaskInfo,
-                lon: String(lon),
-                lat: String(lat),
-            });
-          this.getReverseGeocode(e).then((addr) => {
-            this.$emit("mapClick", {
-              e,
-              addr,
-            });
-          });
-            console.log("鐐瑰嚮浜嬩欢", e);
-        },
-
-        // 閫嗗湴鐞嗙紪鐮� 鑾峰彇鍦板潃
-        getReverseGeocode(e) {
-            return new Promise((resolve) => {
-                const geocode = new T.Geocoder();
-                geocode.getLocation(e.lnglat, (result) => {
-                    if (result.status === "0") {
-                        resolve(result.getAddress());
-                    }
-                });
-            });
-        },
-
-        // 鍦扮悊缂栫爜
-        getGeocode(addr) {
-            return new Promise((resolve) => {
-                const geocoder = new T.Geocoder();
-                geocoder.getPoint(addr, (result) => {
-                    if (result.status === "0") {
-                        resolve(result.getLocationPoint());
-                    }
-                });
-            });
-        },
-
-        // 鐢熸垚鐐逛綅鍐呭
-        // 鐢熸垚鐐逛綅鍐呭
-        generateContent(row, random) {
-            if (row) {
-                return `
+    // 鐢熸垚鐐逛綅鍐呭
+    // 鐢熸垚鐐逛綅鍐呭
+    generateContent(row, random) {
+      if (row) {
+        return `
     <div class="map-window-info">
       <div class='title-block'>
         <div class="title truncate-content">
           ${row.projectName ?? "鏆傛棤鏁版嵁"}
         </div>
         <div class='close-btn close-btn-${random}'>
-          脳
         </div>
       </div>
       <div class="detail-info">
-        <span class="truncate-content">鎬绘姇璧勶細${row.totalMoney ?? "鏆傛棤鏁版嵁"
-                    }</span>
+        <span class="truncate-content">鎬绘姇璧勶細${row.totalMoney || ""}</span>
         <span class="truncate-content">
-          椤圭洰鐘舵�侊細
+          椤圭洰鐘舵�侊細${this.showProjectStatusStr(row.projectStatus)}
         </span>
          <span class="truncate-content">
           椤圭洰鍦板潃锛�${row.projectAddr ?? "鏆傛棤鏁版嵁"}
         </span>
       </div>
     </div>`;
-            } else {
-                return `<div style="display: flex; justify-content:center; align-items:center; opacity: 0;">
+      } else {
+        return `<div style="display: flex; justify-content:center; align-items:center; opacity: 0;">
 
     </div>`;
-            }
-        },
-
-        // 鍞竴鏍囪瘑
-        getUniqueId() {
-            return Math.random().toString(36).substr(2) + Date.now();
-        },
-
-        markerMouseover(_e, infoWin, info, random) {
-            // 鐐逛綅鏍囪绉诲叆鏄剧ず涓嶅悓鍐呭
-            if (this.$props.isShowControl) {
-                infoWin.setContent(this.generateContent(info, random));
-                const contentWrapper = document.querySelector(
-                    ".tdt-infowindow-content-wrapper"
-                );
-                if (contentWrapper) {
-                    contentWrapper.style.opacity = "1";
-                }
-                // 鏌ユ壘鍒伴偅涓猧nfo 鐣岄潰
-                // const allCloseBtn = document.querySelectorAll(`.close-btn-${random}`);
-                // allCloseBtn[allCloseBtn.length - 1].onclick = (_e) => {
-                //   infoWin.setContent(generateContent());
-                // };
-            }
-        },
-
-        markerMouseout(_e, infoWin) {
-            infoWin.setContent(this.generateContent());
-            const contentWrapper = document.querySelector(
-                ".tdt-infowindow-content-wrapper"
-            );
-            if (contentWrapper) {
-                contentWrapper.style.opacity = "0";
-            }
-        },
-
-        // 鎵撴爣璁�
-        makeMask(lon, lat, options) {
-
-            const { markerOptions, labelOptions } = options;
-            console.log("options", markerOptions, labelOptions);
-            const icon = new T.Icon({
-                iconUrl: Location,
-                iconSize: new T.Point(19, 27),
-                iconAnchor: new T.Point(10, 25),
-            });
-            var marker = new T.Marker(new T.LngLat(lon, lat), {
-                icon,
-                id: markerOptions?.id,
-            });
-
-            this.map && this.map.addOverLay(marker);
-            const label = new T.Label({
-                text: labelOptions.text,
-                position: new T.LngLat(lon, lat),
-                offset: new T.Point(...labelOptions.offset),
-                id: labelOptions?.id,
-            });
-
-            labelOptions.labelBg && label.setBackgroundColor(labelOptions.labelBg);
-            labelOptions.labelColor && label.setFontColor(labelOptions.labelColor);
-            //鍒涘缓鍦板浘鏂囨湰瀵硅薄
-            if (!this.$props.mapType) {
-                this.map && this.map.addOverLay(label);
-            }
-            markerOptions?.markerClick &&
-                this.addEvent(marker, "click", (e) => markerOptions.markerClick(label, e));
-            labelOptions?.labelClick &&
-                this.addEvent(label, "click", (e) => labelOptions.labelClick(label, e));
-
-            const lnglat = new T.LngLat(lon, lat);
-            const infoWin = new T.InfoWindow(this.generateContent(), {
-                id: markerOptions?.id,
-                offset: new T.Point(0, -15),
-                closeButton: false,
-            });
-
-            infoWin.setLngLat(lnglat);
-            // 鍚戝湴鍥句笂娣诲姞淇℃伅绐楀彛
-            if (this.$props.mapType) {
-                this.map && this.map.addOverLay(infoWin);
-            }
-
-            this.addEvent(marker, "mouseover", (e) =>
-                this.markerMouseover(e, infoWin, labelOptions, this.getUniqueId())
-            );
-            this.addEvent(marker, "mouseout", (e) => this.markerMouseout(e, infoWin));
-        },
-
-        // 鏍囪鎵�鏈夌偣
-        makeAllMask(mapList) {
-            var _this = this;
-            this.mapList.map((item) => {
-                const config = {
-                    markerOptions: {
-                        id: item.id,
-                        markerClick: _this.markerClick,
-                    },
-                    labelOptions: {
-                        text: item.name,
-                        offset: [-45, -45],
-                        id: item.id,
-                        markerClick: _this.labelClick,
-                    },
-                };
-                _this.makeMask(item.lon, item.lat, config);
-            });
-        },
-
-        // 閫氱敤娣诲姞浜嬩欢鐨勬柟娉�
-        addEvent(component, name, func) {
-            // 绉诲嚭浜嬩欢
-            this.removeEvent(component, name, func);
-            // 娣诲姞浜嬩欢
-            component.addEventListener(name, func);
-        },
-
-        // 閫氱敤绉诲嚭浜嬩欢鐨勬柟娉�
-        removeEvent(component, name, func) {
-            component.removeEventListener(name, func);
-        },
-
-        //鏍囪鐐瑰嚮浜嬩欢
-        markerClick(currentLabel, e) {
-            const id = e.target.options.id;
-            this.currentLabelStyleChange(currentLabel);
-            console.log("鐐瑰嚮浜嬩欢", e, currentLabel);
-            this.getReverseGeocode(e).then((addr) => {
-                this.$emit(
-                    "markClick",
-                    id
-                        ? this.$props.mapList?.find((item) => item.id === id)
-                        : { e, addr: addr }
-                );
-            });
-        },
-
-        // label鐐瑰嚮浜嬩欢
-        labelClick(currentLabel, e) {
-            console.log("瑙﹀彂鐐瑰嚮浜嬩欢")
-            const id = e.target.options.id;
-            this.currentLabelStyleChange(currentLabel);
-            this.getReverseGeocode(e).then((addr) => {
-                this.$emit(
-                    "labelClick",
-                    id
-                        ? this.$props.mapList?.find((item) => {
-                            return String(item.id) === String(id);
-                        })
-                        : { e, addr: addr }
-                );
-            });
-        },
-
-        currentLabelStyleChange(currentLabel) {
-            this.$emit("currentLabelStyleChange", currentLabel);
-        },
-
-        resizeMap() {
-            this.map.checkResize();
-        },
+      }
     },
-    watch: {
-        listType: {
-            handler(val) {
-                if (val) {
-                    this.map && this.map.clearOverLays();
-                    if (this.$props.mapList.length && T) {
-                        this.makeAllMask(this.$props.mapList);
-                    }
-                }
-            },
-        },
+    showProjectStatusStr(status) {
+      switch (status) {
+        case "1":
+          return "鍌ㄥ椤圭洰";
+        case "2":
+          return "鍓嶆湡椤圭洰";
+        case "3":
+          return "瀹炴柦椤圭洰";
+        case "4":
+          return "绔e伐椤圭洰";
+        case "5":
+          return "寮傚父椤圭洰";
+
+        default:
+          return "寮傚父椤圭洰";
+      }
     },
+    // 鍞竴鏍囪瘑
+    getUniqueId() {
+      return Math.random().toString(36).substr(2) + Date.now();
+    },
+
+    markerMouseover(_e, info, random, markerOptions) {
+      if (infoWin) this.map.removeOverLay(infoWin);
+      // 鐐逛綅鏍囪绉诲叆鏄剧ず涓嶅悓鍐呭
+      if (this.$props.isShowControl) {
+        infoWin = new T.InfoWindow();
+        infoWin.setContent(this.generateContent(info, random));
+        infoWin.setLngLat(_e.lnglat);
+        // 鍚戝湴鍥句笂娣诲姞淇℃伅绐楀彛
+        // if (this.$props.mapType) {
+        this.map && this.map.addOverLay(infoWin);
+        // }
+
+        // const contentWrapper = document.querySelector(
+        //   ".tdt-infowindow-content-wrapper"
+        // );
+        // if (contentWrapper) {
+        //   contentWrapper.style.opacity = "1";
+        // }
+        // 鏌ユ壘鍒伴偅涓猧nfo 鐣岄潰
+        // const allCloseBtn = document.querySelectorAll(`.close-btn-${random}`);
+        // allCloseBtn[allCloseBtn.length - 1].onclick = (_e) => {
+        //   infoWin.setContent(generateContent());
+        // };
+      }
+    },
+
+    markerMouseout(_e) {
+      // infoWin.setContent(this.generateContent());
+      // const contentWrapper = document.querySelector(
+      //   ".tdt-infowindow-content-wrapper"
+      // );
+      // if (contentWrapper) {
+      //   contentWrapper.style.opacity = "0";
+      // }
+      // this.map.removeOverLay(infoWin);
+    },
+
+    // 鎵撴爣璁�
+    makeMask(lon, lat, options) {
+      if (lon && lat) {
+        const { markerOptions, labelOptions } = options;
+
+        const icon = new T.Icon({
+          iconUrl: Location,
+          iconSize: new T.Point(19, 27),
+          iconAnchor: new T.Point(10, 25),
+        });
+
+        var marker = new T.Marker(new T.LngLat(lon, lat), {
+          icon,
+          id: markerOptions?.id,
+        });
+
+        this.map && this.map.addOverLay(marker);
+        const label = new T.Label({
+          text: labelOptions.text,
+          position: new T.LngLat(lon, lat),
+          offset: new T.Point(...labelOptions.offset),
+          id: labelOptions?.id,
+        });
+
+        labelOptions.labelBg && label.setBackgroundColor(labelOptions.labelBg);
+        labelOptions.labelColor && label.setFontColor(labelOptions.labelColor);
+        //鍒涘缓鍦板浘鏂囨湰瀵硅薄
+        if (!this.$props.mapType) {
+          this.map && this.map.addOverLay(label);
+        }
+        markerOptions?.markerClick &&
+          this.addEvent(marker, "click", (e) =>
+            markerOptions.markerClick(label, e)
+          );
+        labelOptions?.labelClick &&
+          this.addEvent(label, "click", (e) =>
+            labelOptions.labelClick(label, e)
+          );
+
+        this.addEvent(marker, "mouseover", (e) =>
+          this.markerMouseover(e, options, this.getUniqueId(), markerOptions)
+        );
+        this.addEvent(marker, "mouseout", (e) => this.markerMouseout(e));
+      }
+    },
+
+    // 鏍囪鎵�鏈夌偣
+    makeAllMask(mapList) {
+      // 娓呴櫎涔嬪墠鐨勬爣璁�
+      this.map && this.map.clearOverLays();
+      var minX = mapList[0].longitude;
+      var maxX = mapList[0].longitude;
+      var minY = mapList[0].latitude;
+      var maxY = mapList[0].latitude;
+      var _this = this;
+      mapList.map((item) => {
+        const config = {
+          markerOptions: {
+            id: item.id,
+            //  markerClick: _this.markerClick,
+          },
+          labelOptions: {
+            text: item.projectName,
+            offset: [-45, -45],
+            id: item.id,
+            //   markerClick: _this.labelClick,
+          },
+          projectName: item.projectName,
+          totalMoney: item.yearInvestAmount
+            ? item.yearInvestAmount + "鍏�"
+            : "鏆傛棤鏁版嵁",
+          projectAddr: item.projectAddress,
+          projectStatus: item.usedStatus,
+        };
+        _this.makeMask(item.longitude, item.latitude, config);
+        if (item.longitude && item.longitude > maxX) {
+          maxX = item.longitude;
+        }
+        if (item.longitude && item.longitude < minX) {
+          minX = item.longitude;
+        }
+        if (item.latitude && item.latitude > maxY) {
+          maxY = item.latitude;
+        }
+        if (item.latitude && item.latitude < minY) {
+          minY = item.latitude;
+        }
+      });
+      this.moveTo(
+        (parseFloat(maxX) + parseFloat(minX)) / 2,
+        (parseFloat(maxY) + parseFloat(minY)) / 2
+      );
+    },
+
+    // 閫氱敤娣诲姞浜嬩欢鐨勬柟娉�
+    addEvent(component, name, func) {
+      // 绉诲嚭浜嬩欢
+      this.removeEvent(component, name, func);
+      // 娣诲姞浜嬩欢
+      component.addEventListener(name, func);
+    },
+
+    // 閫氱敤绉诲嚭浜嬩欢鐨勬柟娉�
+    removeEvent(component, name, func) {
+      component.removeEventListener(name, func);
+    },
+
+    //鏍囪鐐瑰嚮浜嬩欢
+    markerClick(currentLabel, e) {
+      const id = e.target.options.id;
+      this.currentLabelStyleChange(currentLabel);
+      console.log("鐐瑰嚮浜嬩欢", e, currentLabel);
+      this.getReverseGeocode(e).then((addr) => {
+        this.$emit(
+          "markClick",
+          id
+            ? this.$props.mapList?.find((item) => item.id === id)
+            : { e, addr: addr }
+        );
+      });
+    },
+
+    // label鐐瑰嚮浜嬩欢
+    labelClick(currentLabel, e) {
+      console.log("瑙﹀彂鐐瑰嚮浜嬩欢");
+      const id = e.target.options.id;
+      this.currentLabelStyleChange(currentLabel);
+      this.getReverseGeocode(e).then((addr) => {
+        this.$emit(
+          "labelClick",
+          id
+            ? this.$props.mapList?.find((item) => {
+                return String(item.id) === String(id);
+              })
+            : { e, addr: addr }
+        );
+      });
+    },
+
+    currentLabelStyleChange(currentLabel) {
+      this.$emit("currentLabelStyleChange", currentLabel);
+    },
+
+    resizeMap() {
+      this.map.checkResize();
+    },
+  },
+  watch: {
+    listType: {
+      handler(val) {
+        if (val) {
+          this.map && this.map.clearOverLays();
+          if (this.$props.mapList.length && T) {
+            this.makeAllMask(this.$props.mapList);
+          }
+        }
+      },
+    },
+  },
   beforeDestroy() {
     this.map = null;
-  }
+  },
 };
 
 // const emits = defineEmits<{
@@ -467,112 +511,112 @@
 </script>
 <style lang="scss" scoped>
 :deep(.tdt-label) {
-    border-radius: 15px;
-    color: var(--el-color-primary);
-    cursor: pointer;
+  border-radius: 15px;
+  color: var(--el-color-primary);
+  cursor: pointer;
 }
 
 // #53547f
 :deep(.tdt-bar a, .tdt-bar a:hover) {
-    border-bottom: 0;
-    color: #53547f;
+  border-bottom: 0;
+  color: #53547f;
 }
 
 :deep(.tdt-touch .tdt-control-zoom-in) {
-    font-size: 18px;
+  font-size: 18px;
 }
 
 :deep(.tdt-bar) {
-    border-radius: 3px;
-    box-shadow: 5px 0px 12px 0px rgb(0 0 0 / 0.03);
+  border-radius: 3px;
+  box-shadow: 5px 0px 12px 0px rgb(0 0 0 / 0.03);
 }
 
 .tdt-bar a.tdt-disabled,
 .tdt-bar a:hover {
-    background-color: #f4f4f4;
+  background-color: #f4f4f4;
 }
 
 .control-container {
-    position: absolute;
-    display: flex;
-    flex-direction: column;
-    gap: 10px;
-    z-index: 999;
+  position: absolute;
+  display: flex;
+  flex-direction: column;
+  gap: 10px;
+  z-index: 999;
 }
 
 .top-left {
-    top: 10px;
-    left: 10px;
+  top: 10px;
+  left: 10px;
 }
 
 .top-right {
-    top: 10px;
-    right: 10px;
+  top: 10px;
+  right: 10px;
 }
 
 .bottom-left {
-    bottom: 10px;
-    left: 10px;
+  bottom: 10px;
+  left: 10px;
 }
 
 .bottom-right {
-    bottom: 10px;
-    right: 10px;
+  bottom: 10px;
+  right: 10px;
 }
 
 .control-content {
-    border-radius: 3px;
-    box-shadow: 5px 0px 12px 0px rgb(0 0 0 / 0.03);
-    background-color: #fff;
+  border-radius: 3px;
+  box-shadow: 5px 0px 12px 0px rgb(0 0 0 / 0.03);
+  background-color: #fff;
 }
 
 .control-item {
-    box-sizing: border-box;
-    width: 30px;
-    height: 30px;
-    line-height: 28px;
-    padding: 0 9px;
+  box-sizing: border-box;
+  width: 30px;
+  height: 30px;
+  line-height: 28px;
+  padding: 0 9px;
 
-    img {
-        display: inline-block;
-    }
+  img {
+    display: inline-block;
+  }
 }
 
 .control-item:hover {
-    background-color: #f4f4f4;
+  background-color: #f4f4f4;
 }
 </style>
 <style lang="scss">
 .map-window-info {
-    padding: 0 20px;
-    width: 300px;
-    cursor: default;
+  padding: 0 20px;
+  width: 300px;
+  cursor: default;
 
-    .title {
-        color: #3369ff;
-        font-size: 18px;
-        margin-bottom: 13px;
-    }
+  .title {
+    color: #3369ff;
+    font-size: 18px;
+    margin-bottom: 13px;
+  }
 
-    .detail-info {
-        display: flex;
-        flex-direction: column;
-        color: #7e809c;
-        font-size: 12px;
-        gap: 8px;
-    }
+  .detail-info {
+    display: flex;
+    flex-direction: column;
+    color: #7e809c;
+    font-size: 12px;
+    gap: 8px;
+  }
 }
 
 .title-block {
-    display: flex;
-    justify-content: space-between;
+  display: flex;
+  justify-content: space-between;
 
-    .close-btn {
-        font-size: 18px;
-        color: #d8dde6;
-        cursor: pointer;
-        z-index: 999999;
-    }
+  .close-btn {
+    font-size: 18px;
+    color: #d8dde6;
+    cursor: pointer;
+    z-index: 999999;
+  }
 }
 
 //.tdt-control-copyright {
@@ -580,10 +624,10 @@
 //}
 
 .tdt-infowindow-tip-container {
-    opacity: 0;
+  opacity: 1;
 }
 
 .tdt-infowindow-content-wrapper {
-    opacity: 0;
+  opacity: 1;
 }
 </style>

--
Gitblit v1.8.0