From e792d4d46e406da8d0a4ae8ad97db34a95f1c66a Mon Sep 17 00:00:00 2001 From: wujingjing <gersonwu@qq.com> Date: 星期一, 10 二月 2025 17:31:08 +0800 Subject: [PATCH] 高亮问题 --- src/model/map/OLMap.ts | 190 +++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 156 insertions(+), 34 deletions(-) diff --git a/src/model/map/OLMap.ts b/src/model/map/OLMap.ts index 810b19e..db0bbea 100644 --- a/src/model/map/OLMap.ts +++ b/src/model/map/OLMap.ts @@ -25,6 +25,9 @@ import { markRaw, ref } from 'vue'; import { MarkerOverlay } from './overlay/marker'; import { Text } from 'ol/style'; +import { Select } from 'ol/interaction'; +import { click } from 'ol/events/condition'; +import { Polygon } from 'ol/geom'; export type LangType = 'zh_cn' | 'en'; export const enum GaoDeSourceType { @@ -61,7 +64,6 @@ }; type MapConfig = { sourceType: GaoDeSourceType; - markerIsVisible: boolean; }; type OLEventType = 'blackClick' | 'featureChange' | 'featureHoverChange'; @@ -79,6 +81,8 @@ map: OpenLayerMap; source: XYZ; private eventMap: Map<OLEventType, Function[]>; + /** @description 鎺掗櫎鏈仛鐨刲ayer锛屽悗缁叏閮ㄥ仛濂斤紝鍙互涓嶅仛鍒ゆ柇 */ + unsupportedLayers = []; /** @description 鍥惧眰鎺у埗淇℃伅 */ layerInfo = ref([] as any[]); @@ -89,7 +93,6 @@ themeInfo = ref([] as any[]); activeSourceType: Ref<GaoDeSourceType> = ref(GaoDeSourceType.Vector); - markerIsVisible: Ref<boolean> = ref(true); interactLayer: VectorLayer<VectorSource<Feature<Geometry>>, Feature<Geometry>> = null; /** @description 褰撳墠婵�娲荤姸鎬� feature */ @@ -124,13 +127,12 @@ } constructor(options: OLMapOptions) { - const { container, view, sourceType, markerIsVisible } = defaultsDeep(options, { + const { container, view, sourceType } = defaultsDeep(options, { view: { center: [13247019.404399557, 4721671.572580107], zoom: 8, }, sourceType: GaoDeSourceType.Vector, - markerIsVisible: true, } as OLMapOptions) as OLMapOptions; this.source = new XYZ({ crossOrigin: 'anonymous', @@ -151,10 +153,49 @@ interactions: olDefaults({ doubleClickZoom: false }), }); this.activeSourceType.value = sourceType; - this.markerIsVisible.value = markerIsVisible; this.applySourceType(this.activeSourceType.value); this.listenMapClick(); this.addBasicControl(); + } + + hightLightColor: '0000FFFF'; + sizeRate: 0; + + getPointHighLightStyle(feature) { + if (!feature) return null; + let pSize = feature.get('psize') ?? 15; + pSize += pSize * this.sizeRate; + + const pcolor = this.hightLightColor; + const pstyle = feature.get('pstyle'); + + return this.getPointStyles({ color: pcolor, size: pSize, style: pstyle }); + } + + getLineHighLightStyle(feature) { + if (!feature) return null; + + const lcolor = this.hightLightColor; + let lsize = feature.get('lsize') ?? 15; + lsize += lsize * this.sizeRate; + const lstyle = feature.get('lstyle'); + return this.getLineStyles({ lsize: lsize, lcolor: lcolor, lstyle: lstyle }); + } + + getPolygonHighLightStyle(feature) { + if (!feature) return null; + + const lcolor = this.hightLightColor; + // return this.getPolygonStyles({ pcolor: lcolor, lstyle: 'default', lsize: 2 }); + return new Style({ + stroke: new Stroke({ + color: lcolor, + width: 5, + }), + // fill: new Fill({ + // color: lcolor, + // }), + }); } // 淇濆瓨鐐规牱寮忕紦瀛� @@ -167,7 +208,6 @@ */ getPointStyles(config: { size; color; style }) { const pSize = config.size; - if (!pSize) return null; const pcolor = config.color; const pstyle = config.style; @@ -192,6 +232,7 @@ this.pointStyeMap[pkey] = new Style({ text: new Text({ font: `${pSize}px "ywifont"`, + text: config?.text ?? '', fill: new Fill({ color: `#${pcolor}` }), }), @@ -223,12 +264,12 @@ * 鏍规嵁绾跨殑閰嶇疆鑾峰彇鏍峰紡 * @param config */ - getLineStyles(config: { lsize; lcolor; lstyle }) { + getLineStyles(config: { lsize; lcolor; lstyle; psize?; pcolor?; pstyle? }) { const lSize = config.lsize; if (!lSize) return null; const lColor = config.lcolor; const lstyle = config.lstyle; - + const styles = []; const lKey = `${lstyle}_${lSize}_${lColor}`; if (!this.lineStyleMap[lKey]) { const drawStyle = this.drawStyles.value.find((item) => item.id === lstyle + ''); @@ -245,7 +286,37 @@ }), }); } - return [this.lineStyleMap[lKey]]; + styles.push(this.lineStyleMap[lKey]); + + const hasPoint = Object.keys(config).some((key) => key === 'psize' && !!config[key]); + if (hasPoint) { + const psize = config.psize; + const pcolor = config.pcolor; + const pstyle = config.pstyle; + const pointStyle = this.getPointStyles({ size: psize, color: pcolor, style: pstyle }); + styles.push(pointStyle); + } + return styles; + } + polygonStyleMap: Record<string, Style> = {}; + getPolygonStyles(config: { pcolor; lstyle; lsize; lcolor }) { + const styles = []; + const pColor = config.pcolor; + const key = pColor; + if (!this.polygonStyleMap[key]) { + const polygonStyle = new Style({ + fill: new Fill({ color: `#${pColor}` }), + }); + styles.push(polygonStyle); + } + + const lineStyle = this.getLineStyles({ + lsize: config.lsize, + lcolor: config.lcolor, + lstyle: config.lstyle, + }); + lineStyle && styles.push(...lineStyle); + return styles; } private maxTextResolution = 1; @@ -288,13 +359,13 @@ */ getLabelStyles(config: { textContent; resolution }) { const textContent = config.textContent; - if(!textContent) return null; + if (!textContent) return null; const resolution = config.resolution; if (!textContent) return null; if (!this.labelStyleMap[textContent]) { this.labelStyleMap[textContent] = this.createTextStyle(textContent, resolution); } - return this.labelStyleMap[textContent] + return this.labelStyleMap[textContent]; } setDrawStyles(styles: any[]) { @@ -325,6 +396,22 @@ this.adjustViewToOverlays(markers); } + checkEquipIsShow() { + for (const item of this.layerInfo.value) { + if (item.id === 'equip') { + return item.isVisible; + } + } + return false; + } + + getEquipOverlay() { + for (const item of this.layerInfo.value) { + if (item.type === 'equip') { + return item; + } + } + } createEleOverlay(dom: string | HTMLElement, position = [0, 0]) { const ele = typeof dom === 'string' ? (document.querySelector(dom) as HTMLElement) : dom; if (!ele) return; @@ -335,7 +422,7 @@ stopEvent: false, className: 'z-[999]', }); - eleOverlay.setVisible(this.markerIsVisible.value); + eleOverlay.setVisible(this.checkEquipIsShow()); return eleOverlay; } @@ -435,8 +522,8 @@ const properties = feature.getProperties(); console.log('馃殌 ~ properties:', properties); } + this.displayFeatureInfo(feature); this.activeFeature.value = feature; - // this.displayFeatureInfo(feature); }); } @@ -444,23 +531,30 @@ this.themeInfo.value = themeInfo; } + getAllLayers() { + const allLayers = this.layerInfo.value.reduce((preVal, curVal) => { + if (curVal.children && curVal.children.length > 0) { + return preVal.concat(curVal.children.map((item) => item)); + } else { + return preVal; + } + }, []); + return allLayers; + } + + getAllLayerModels() { + console.log('馃殌 ~ this.layerInfo.value:', this.layerInfo.value); + return this.layerInfo.value.reduce((preVal, curVal) => { + if (curVal.children && curVal.children.length > 0) { + return preVal.concat(curVal.children.map((item) => item.model)); + } else { + return preVal; + } + }, []); + } + /** @description 璁板綍鎵�鏈夊浘灞� */ setAllLayers(layerModels: Layer[], layers: any[], layerGroup: any[]) { - // this.layerInfo.value = layerModels.map((layer, index) => { - // const layerData = layers[index]; - - // return { - // id: layerData.id, - // title: layerData.title, - // model: markRaw(layer), - // get isVisible() { - // return layer.getVisible(); - // }, - // set isVisible(val) { - // layer.setVisible(val); - // }, - // }; - // }); this.layerInfo.value = layerGroup.reduce((preVal, curVal) => { const group = curVal.group; const groupId = `group-${group}`; @@ -494,6 +588,21 @@ mapGroupItem.children.push(data); return preVal; }, []); + const that = this; + this.layerInfo.value.push({ + id: 'equip', + title: '鐩戞祴璁惧', + children: [], + _isVisible: true, + get isVisible() { + return this._isVisible; + }, + set isVisible(val) { + this._isVisible = val; + that.toggleMarkerOverlayVisible(val); + }, + type: 'equip', + }); } /** @@ -522,21 +631,17 @@ } } }); - this.markerIsVisible.value = visible; } getConfig(): MapConfig { return { sourceType: this.activeSourceType.value, - markerIsVisible: this.markerIsVisible.value, }; } setConfig(config: MapConfig) { this.activeSourceType.value = config.sourceType; - this.markerIsVisible.value = config.markerIsVisible; this.applySourceType(this.activeSourceType.value); - this.toggleMarkerOverlayVisible(this.markerIsVisible.value); } private addBasicControl() { @@ -595,9 +700,16 @@ displayFeatureInfo(feature) { const highlightStyle = { Point: new Style({ + // image: new Circle({ + // radius: 5, + // fill: new Fill({ color: `blue` }), + // }), image: new Circle({ - radius: 5, - fill: new Fill({ color: `blue` }), + radius: 13, + stroke: new Stroke({ + color: `blue`, + width: 3, + }), }), }), LineString: new Style({ @@ -605,6 +717,15 @@ color: `blue`, width: 5, }), + }), + Polygon: new Style({ + stroke: new Stroke({ + color: `blue`, + width: 5, + }), + // fill: new Fill({ + // color: `rgba(0, 0, 255, 0.1)`, + // }), }), }; // 鍒涘缓楂樹寒鍥惧眰 @@ -622,6 +743,7 @@ // 璁剧疆楂樹寒瑕佺礌 if (feature !== this.activeFeature.value) { if (this.activeFeature.value) { + console.log('remove feature:', this.activeFeature.value); this.interactLayer.getSource().removeFeature(this.activeFeature.value as any); } if (feature) { -- Gitblit v1.9.3