| | |
| | | import { useSimStore } from "@/store/simulation"; |
| | | import { storeToRefs } from "pinia"; |
| | | const simStore = useSimStore(); |
| | | const { selectedScheme } = storeToRefs(simStore); |
| | | const { selectedScheme, currentInfo, selectNWJ } = storeToRefs(simStore); // 新增监听 selectNWJ |
| | | import { EventBus } from "@/eventBus"; |
| | | |
| | | const pickedPoints = ref([]); |
| | | const handler = ref(null); |
| | | const isPickingActive = ref(false); |
| | | const currentTime = ref(0); |
| | | let serviceInfo = ref(null); |
| | | |
| | | const isCurrentInfoFromSelectNWJ = ref(false); |
| | | const props = defineProps({ |
| | | playingTime: { |
| | | type: String, |
| | |
| | | }); |
| | | |
| | | const viewer = window.viewer; |
| | | serviceInfo = selectedScheme.value.serviceName; |
| | | |
| | | function getPickPosition(windowPosition) { |
| | | if (!viewer) return null; |
| | |
| | | const cartesian = viewer.scene.pickPosition(windowPosition); |
| | | if (!cartesian) return null; |
| | | const cartographic = Cesium.Cartographic.fromCartesian(cartesian); |
| | | cartographic.height += 200.0; |
| | | cartographic.height += 110.0; |
| | | return { |
| | | cartesian: Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, cartographic.height), |
| | | longitude: Cesium.Math.toDegrees(cartographic.longitude), |
| | |
| | | height: cartographic.height |
| | | }; |
| | | } |
| | | |
| | | function addPointToViewer(point, index) { |
| | | const displayTime = currentTime.value || "未设置时间"; |
| | | const schemeInfo = selectedScheme.value; |
| | | serviceInfo = schemeInfo.serviceName; |
| | | |
| | | // 如果已有选中点,则先清除 |
| | | if (pickedPoints.value.length >= 1) { |
| | | endCalculation(); // 清除所有已有点 |
| | | } |
| | | |
| | | // 创建 label 实体 |
| | | const labelEntity = viewer.entities.add({ |
| | | position: point.cartesian, |
| | | label: { |
| | | text: `测量点 ${pickedPoints.value.length + 1}\n水深: 等待启动...\n流速: 等待启动...`, |
| | | text: `测量点\n水深: 等待启动...\n流速: 等待启动...`, |
| | | font: 'bold 14pt monospace', |
| | | style: Cesium.LabelStyle.FILL_AND_OUTLINE, |
| | | fillColor: Cesium.Color.YELLOW, |
| | |
| | | pixelOffsetScaleByDistance: new Cesium.NearFarScalar(100, 1.0, 5000, 0.3), |
| | | } |
| | | }); |
| | | |
| | | const groundPosition = Cesium.Cartesian3.fromRadians( |
| | | point.longitude * Math.PI / 180, |
| | | point.latitude * Math.PI / 180, |
| | |
| | | const cylinderEntity = viewer.entities.add({ |
| | | position: groundPosition, // 底部位置 |
| | | cylinder: { |
| | | length: 190.0, |
| | | length: 100.0, |
| | | topRadius: 1.0, |
| | | bottomRadius: 1.0, |
| | | material: Cesium.Color.YELLOW, |
| | |
| | | distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 5000) |
| | | } |
| | | }); |
| | | |
| | | // 存储实体引用之前就更新 currentInfo |
| | | currentInfo.value = { |
| | | longitude: point.longitude, |
| | | latitude: point.latitude, |
| | | serviceInfo: serviceInfo, |
| | | deviceName: null |
| | | }; |
| | | // 请求数据并更新 label |
| | | getFlowRateInfo(point.longitude, point.latitude, displayTime).then(result => { |
| | | updateLabel(pickedPoints.value.length - 1, result.depth, result.velocity); |
| | | updateLabel(pickedPoints.value.length, result.depth, result.velocity); |
| | | }); |
| | | |
| | | // 存储实体引用 |
| | | pickedPoints.value.push({ |
| | | labelEntity, |
| | | cylinderEntity, // 使用圆柱代替 line 和 circle |
| | | cylinderEntity, |
| | | longitude: point.longitude, |
| | | latitude: point.latitude |
| | | }); |
| | |
| | | if (position) { |
| | | const index = pickedPoints.value.length; |
| | | addPointToViewer(position, index); |
| | | |
| | | } |
| | | }, Cesium.ScreenSpaceEventType.LEFT_CLICK); |
| | | } |
| | |
| | | isPickingActive.value = true; |
| | | ElMessage.success(`开始--流量流速--拾取坐标功能,请点击地图选择点位!选取完请及时关闭,避免影响其他功能!`); |
| | | } |
| | | |
| | | function stopPicking() { |
| | | if (handler.value) { |
| | | handler.value.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK); |
| | |
| | | } |
| | | isPickingActive.value = false; |
| | | } |
| | | |
| | | function togglePick() { |
| | | if (isPickingActive.value) { |
| | | stopPicking(); |
| | |
| | | isPickingActive.value = true; |
| | | } |
| | | } |
| | | |
| | | watch( |
| | | () => props.playingTime, |
| | | async (newVal, oldVal) => { |
| | |
| | | ); |
| | | |
| | | async function updateAllLabels() { |
| | | for (const pointInfo of pickedPoints.value) { |
| | | for (let i = 0; i < pickedPoints.value.length; i++) { |
| | | const pointInfo = pickedPoints.value[i]; |
| | | if (!pointInfo || !pointInfo.labelEntity) continue; |
| | | |
| | | const result = await getFlowRateInfo(pointInfo.longitude, pointInfo.latitude, currentTime.value); |
| | | updateLabel(pointInfo, result.depth, result.velocity); |
| | | updateLabel(i, result.depth, result.velocity); |
| | | } |
| | | } |
| | | |
| | | function updateLabel(pointInfo, depth, velocity) { |
| | | if (pointInfo.labelEntity && pointInfo.labelEntity.label) { |
| | | function updateLabel(index, depth, velocity) { |
| | | const pointInfo = pickedPoints.value[index]; |
| | | if (pointInfo && pointInfo.labelEntity && pointInfo.labelEntity.label) { |
| | | pointInfo.labelEntity.label.text = ` |
| | | 测量点 ${pickedPoints.value.findIndex(p => p === pointInfo) + 1} |
| | | 测量点 |
| | | 水深: ${depth} m |
| | | 流速: ${velocity} m/s |
| | | `.trim(); |
| | | } |
| | | } |
| | | |
| | | function endCalculation() { |
| | | pickedPoints.value.forEach(pointInfo => { |
| | | if (pointInfo.labelEntity) viewer.entities.remove(pointInfo.labelEntity); |
| | | if (pointInfo.cylinderEntity) viewer.entities.remove(pointInfo.cylinderEntity); |
| | | }); |
| | | pickedPoints.value = []; |
| | | EventBus.emit("clear-water-depth"); |
| | | EventBus.emit("clear-water-velocity"); |
| | | } |
| | | |
| | | defineExpose({ |
| | | endCalculation, |
| | | stopPicking |
| | | }); |
| | | |
| | | function getFlowRateInfo(lon, lat, time) { |
| | | const params = { |
| | | lon: lon, |
| | |
| | | serviceName: serviceInfo |
| | | }; |
| | | return getFlowRate(params).then(data => { |
| | | // console.log('获取到的数据:', data); |
| | | if (data && data.code === 200) { |
| | | return { |
| | | depth: data.data.depth.toFixed(2), |
| | |
| | | return { depth: 'N/A', velocity: 'N/A' }; |
| | | }); |
| | | } |
| | | |
| | | // 👇 监听 simStore.selectNWJ,当其有值时执行清除操作 |
| | | watch(() => selectNWJ.value, (newVal) => { |
| | | if (newVal != null && newVal !== '') { |
| | | // 👇 有值时自动停止拾取并清除实体 |
| | | if (isPickingActive.value) stopPicking(); |
| | | if (pickedPoints.value.length > 0) endCalculation(); |
| | | console.log(newVal,'asdasdasdads'); |
| | | const { longitude, latitude ,deviceName} = newVal; |
| | | currentInfo.value = { |
| | | longitude, |
| | | latitude, |
| | | serviceInfo: serviceInfo, |
| | | deviceName |
| | | }; |
| | | console.log(currentInfo.value, '这里进行数据的打印'); |
| | | |
| | | isCurrentInfoFromSelectNWJ.value = true; |
| | | |
| | | // 👇 可选:调用一次分析函数来加载数据(根据你的业务需要决定是否启用) |
| | | // getFlowRateInfo(longitude, latitude, currentTime.value).then(...) |
| | | |
| | | } else { |
| | | // 👇 如果 selectNWJ 被清空,恢复手动选择能力 |
| | | isCurrentInfoFromSelectNWJ.value = false; |
| | | } |
| | | }, |
| | | { immediate: true }); |
| | | |
| | | </script> |
| | | <style lang="less" scoped></style> |