import * as Cesium from 'cesium' import EventPopUpBox from '@/hooks/components/EventPopUpBox.vue' /** * 地图弹窗 Hook * @param {Cesium.Viewer} viewer - Cesium 实例 * @param {Object} options - 配置选项 * @param {Component} options.popupComponent - 弹窗组件 */ export function useMapPopup (viewer, options = {}) { const { currentEntity } = options // 获取弹框box const getLabelDom = data => { const vNode = h(EventPopUpBox, { data, removeLabel }) const tooltipContainer = document.createElement('div') tooltipContainer.id = 'mapPopUpBox' tooltipContainer.style.position = 'absolute' tooltipContainer.style.transform = styleTransform tooltipContainer.style.pointerEvents = 'none' document.querySelector('.page-index').append(tooltipContainer) render(vNode, tooltipContainer) return tooltipContainer } // 弹框位置刷新 const labelBoxRender = () => { if (!currentEntity) return let dom = document.querySelector('#mapPopUpBox') if (!dom) { dom = getLabelDom(currentEntity.properties.customData._value.data) } const screenPosition = viewer.scene.cartesianToCanvasCoordinates(currentEntity?.position?._value) if (screenPosition) { dom.style.left = `${screenPosition.x}px` dom.style.top = `${screenPosition.y}px` dom.style.display = 'block' } } const removeDom = () => { const dom = document.querySelector('#mapPopUpBox') if (dom && dom.parentNode) { dom.parentNode.removeChild(dom) } } const addLabel = () => { removeLabel() viewer?.scene.postRender.addEventListener(labelBoxRender) } // 移除弹框标签 const removeLabel = () => { viewer?.scene.postRender.removeEventListener(labelBoxRender) removeDom() } // 自动清理 onUnmounted(() => { removeLabel() }) return { addLabel } }