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