From b67f46b4a768b4cd72d4e463c5dffefe977ddeb7 Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Mon, 02 Dec 2024 22:04:27 +0800
Subject: [PATCH] 应急空间及全局图层去除废水处理站、污水池
---
src/views/pd/components/dynamicPanel.vue | 521 ++++++++++++++++++++++++++++++++++++++++-----------------
1 files changed, 368 insertions(+), 153 deletions(-)
diff --git a/src/views/pd/components/dynamicPanel.vue b/src/views/pd/components/dynamicPanel.vue
index 5f3a936..1dbe323 100644
--- a/src/views/pd/components/dynamicPanel.vue
+++ b/src/views/pd/components/dynamicPanel.vue
@@ -2,16 +2,19 @@
* @Author: shuishen 1109946754@qq.com
* @Date: 2024-11-09 15:41:35
* @LastEditors: shuishen 1109946754@qq.com
- * @LastEditTime: 2024-11-25 11:26:01
+ * @LastEditTime: 2024-12-02 21:53:13
* @FilePath: \bigScreen\src\views\pd\components\dynamicPanel.vue
* @Description:
*
* Copyright (c) 2024 by shuishen, All Rights Reserved.
-->
<script setup>
+const { VITE_APP_BASE } = import.meta.env
+
const emit = defineEmits(['closePanel'])
import { onUnmounted } from 'vue'
+let lineTime = null
let timeOne = null
let timeTwo = null
let timeThree = null
@@ -25,143 +28,314 @@
title: '典型案例1',
content: '南片区松节油储罐区泄漏事故: 南片区某企业松节油储罐泄漏,如不采取措施,将造成污染事故,影响到赣江下游水质。',
- oneCentent: '企业关闭前置阀门切断泄漏源,向罐内适量注水,抬高液位。',
+ oneCentent: '2024年11月11日11时,南片区某公司松节油储罐泄漏。企业关闭前置阀门切断泄漏源,向罐内适量注水,抬高液位。',
onePointPosition: {
lng: 115.10175740,
lat: 27.27356477
},
+ onetime: 0,
- twoContent: '关闭绿源污水处理厂旁雨水排口,拦截污染水体。',
+ twoContent: '应立即启动应急池的使用,将泄漏的松节油引导至应急池中。',
twoPointPosition: {
+ lng: 115.10198913,
+ lat: 27.27343615
+ },
+ twotime: 5000,
+
+ lineCenter: {
+ lng: 115.10343807,
+ lat: 27.27256126
+ },
+ linePosition: '115.10341051,27.27251643,64;115.10357817,27.27278003,64',
+ lineTime: 5000,
+
+ threeContent: '关闭绿源污水处理厂旁雨水排口,拦截污染水体。',
+ threePointPosition: {
lng: 115.10921467,
lat: 27.27166382
},
+ threetime: 15000,
- threeContent: '启用绿源污水处理厂事故应急池,将已拦截废水泵入应急池。',
- threePointPosition: {
+ fourContent: '启用绿源污水处理厂事故应急池,将已拦截废水泵入应急池。',
+ fourPointPosition: {
lng: 115.10814596,
lat: 27.27257473
},
+ fourtime: 20000,
- fourContent: '应急指挥部指导企业处理受污染废水, 监测公共应急池水质 ,确保达标后安全转运至绿源污水处理厂。',
- fourPointPosition: {
- lng: 115.10845441,
- lat: 27.27327366
- }
+ fiveContent: '应急指挥部指导企业处理受污染废水, 监测公共应急池水质 ,确保达标后安全转运至绿源污水处理厂。',
+ fivePointPosition: {
+ lng: 115.10843364,
+ lat: 27.27320219
+ },
+ fivetime: 25000,
},
{
key: 2,
title: '典型案例2',
content: '北片区碱类腐蚀性物质泄漏事故: 北片区某企业在生产过程中操作失误,大量含碱废水泄漏,如不采取措施,将造成污染事故,影响到赣江下游水质。',
- oneCentent: '企业关闭前置阀门,切断泄漏源,用砂土等筑堤堵截泄漏液体或者引流到安全地点。',
+ oneCentent: '2024年09月16日14时,北片区某公司在生产过程中操作失误,大量含碱废水泄漏。企业关闭前置阀门,切断泄漏源,用砂土等筑堤堵截泄漏液体或者引流到安全地点。',
onePointPosition: {
- lng: 115.10505420,
- lat: 27.28806335
- },
-
- twoContent: '园区关闭北区雨水排口,拦截污染水体。',
- twoPointPosition: {
- lng: 115.10620654,
- lat: 27.29710382
- },
-
- threeContent: '园区启用北区公共应急池,将已拦截废水泵入应急池。',
- threePointPosition: {
lng: 115.10467136,
lat: 27.29415383
},
+ onetime: 0,
+
+ lineCenter: {
+ lng: 115.10627858,
+ lat: 27.29434439
+ },
+ linePosition: '115.10627726,27.29408853,64;115.10627703,27.29456132,64',
+ lineTime: 5000,
+
+ twoContent: '园区关闭北区雨水排口,拦截污染水体。',
+ twoPointPosition: {
+ lng: 115.10542509,
+ lat: 27.29924475
+ },
+ twotime: 10000,
+
+ threeContent: '园区启用北区公共应急池(拟建),将已拦截废水泵入应急池。',
+ threePointPosition: {
+ lng: 115.106600,
+ lat: 27.296891
+ },
+ threetime: 15000,
fourContent: '将拦截废水从应急池中通过北区污水提升泵站转移至绿源污水处理厂进行处置。',
fourPointPosition: {
lng: 115.10814596,
lat: 27.27257473
},
-
+ fourtime: 20000,
fiveContent: '排口下游展开应急监测,确保废水没有进入周边水系。',
fivePointPosition: {
lng: 115.10921467,
lat: 27.27166382
},
+ fivetime: 25000
},
{
key: 3,
title: '典型案例3',
- content: '危险化学品运输事故: 化工集中区北区(吉兴路以南)某企业的危化品运输车辆金工大道危化品运专用运输道上发生侧翻,大量盐酸流至路面,如不采取措施,将造成污染事故,影响到赣江下游水质。',
+ content: '危险化学品运输事故: 北片区某企业的危化品运输车辆发生侧翻,大量盐酸流至路面,如不采取措施,将造成污染事故,影响到赣江下游水质。',
- oneCentent: '调度金龙水库清水,稀释污染团。',
+ showModel: true,
+
+
+ oneCentent: '2024年09月16日14时,北片区某公司的危化品运输车辆发生侧翻,大量盐酸流至路面。',
onePointPosition: {
+ lng: 115.10639786,
+ lat: 27.28116943
+ },
+ onetime: 8000,
+
+ twoContent: '调度金龙水库清水,稀释污染团。',
+ twoPointPosition: {
lng: 115.10488545,
lat: 27.27678110
},
+ twotime: 13000,
- twoContent: '转输至江西粤鹏环保高新技术开发有限公司事故应急池、初期雨水池。',
- twoPointPosition: {
+ threeContent: '转输至江西粤鹏环保高新技术开发有限公司事故应急池、初期雨水池。',
+ threePointPosition: {
lng: 115.10545135,
lat: 27.28043872
},
+ threetime: 18000,
- threeContent: '转输至江西腾龙源环保科技有限公司事故应急池、初期雨水池。',
- threePointPosition: {
+ fourContent: '转输至江西腾龙源环保科技有限公司事故应急池、初期雨水池。',
+ fourPointPosition: {
lng: 115.10332118,
lat: 27.27831698
},
+ fourtime: 23000,
},
]
})
-const dynamicVectorLayer = new DC.VectorLayer('dynamicVectorLayer').addTo(window.$viewer)
-const dynamicHtmlLayer = new DC.HtmlLayer('dynamicHtmlLayer').addTo(window.$viewer)
+let dynamicVectorLayer = new DC.VectorLayer('dynamicVectorLayer').addTo(window.$viewer)
+let dynamicHtmlLayer = new DC.HtmlLayer('dynamicHtmlLayer').addTo(window.$viewer)
+let dynamicLineVectorLayer = new DC.VectorLayer('dynamicLineVectorLayer').addTo(window.$viewer)
-const schemeStart = (item) => {
- emit('closePanel')
- clearAll()
+let modelPosition = [
+ {
+ lng: 115.10601196,
+ lat: 27.28378838
+ },
+ {
+ lng: 115.10602432,
+ lat: 27.28339800
+ },
+ {
+ lng: 115.10600450,
+ lat: 27.28319338,
+ },
+ {
+ lng: 115.10605031,
+ lat: 27.28294272,
+ },
+ {
+ lng: 115.10610404,
+ lat: 27.28267996
+ },
+ {
+ lng: 115.10614202,
+ lat: 27.28248175
+ },
+ {
+ lng: 115.10620011,
+ lat: 27.28221311
+ },
+ {
+ lng: 115.10640155,
+ lat: 27.28121605
+ },
- window.$viewer.flyToPosition(new DC.Position(item.onePointPosition.lng, item.onePointPosition.lat, 400, 0, -90, 0), () => {
- let oneCenter = DC.Position.fromObject(item.onePointPosition)
- let oneCircle = new DC.Circle(oneCenter, 20)
- oneCircle.setStyle({
- material: new DC.CircleWaveMaterialProperty({
- color: DC.Color.RED.withAlpha(0.9),
- speed: 20,
- count: 5,
- gradient: 0.5
- })
+]
+
+let positions = modelPosition.map(i => [i.lng, i.lat, i.ele || 64].join(',')).join(';')
+let tc = new DC.TrackController(window.$viewer)
+let track = new DC.Track(positions, 5)
+track.setModel(VITE_APP_BASE + 'gltf/car.gltf', {
+ show: true,
+ scale: 0.0025,
+ // nodeTransformations: {
+ // rotation: window.$Cesium.Quaternion.fromHeadingPitchRoll(window.$Cesium.Math.toRadians(0), window.$Cesium.Math.toRadians(0), window.$Cesium.Math.toRadians(0)),
+ // }
+})
+
+tc.addTrack(track)
+
+const synth = window.speechSynthesis
+
+
+const speak = (msg, continueFun = () => { }) => {
+ let u = new SpeechSynthesisUtterance()
+ let voices = synth.getVoices()
+ u.text = msg
+ u.rate = 2
+ let findObj = voices.some(voice => voice.lang == 'zh-CN')
+
+ if (!findObj) {
+ u.lang = 'zh-TW'
+ }
+
+ u.onend = () => {
+ continueFun()
+ }
+ synth.speak(u)
+}
+
+const publicFun = (item) => {
+ let threeCenter = DC.Position.fromObject(item.threePointPosition)
+ let threeCircle = new DC.Circle(threeCenter, 30)
+ threeCircle.setStyle({
+ material: new DC.CircleWaveMaterialProperty({
+ color: DC.Color.fromRandom(),
+ speed: 20,
+ count: 5,
+ gradient: 0.5
})
- dynamicVectorLayer.addOverlay(oneCircle)
+ })
+ dynamicVectorLayer.addOverlay(threeCircle)
- let oneCentent = new DC.DivIcon(
- new DC.Position(item.onePointPosition.lng, item.onePointPosition.lat, 70),
- `<div class="dynamic-map-popup">
- <div class="content-wrap">
- <div class="content">
- <p>${item.oneCentent}</p>
- </div>
- </div>
- <div class="arrow"></div>
- </div>`
- // <p>特征污染物:${item.specificPollutant}</p>
- )
- dynamicHtmlLayer.addOverlay(oneCentent)
+ let threeContent = new DC.DivIcon(
+ new DC.Position(item.threePointPosition.lng, item.threePointPosition.lat, 70),
+ `<div class="dynamic-map-popup">
+ <div class="content-wrap">
+ <div class="content">
+ <p>${item.threeContent}</p>
+ </div>
+ </div>
+ <div class="arrow"></div>
+ </div>`
+ )
+ dynamicHtmlLayer.addOverlay(threeContent)
+
+ window.$viewer.flyToPosition(new DC.Position(item.threePointPosition.lng, item.threePointPosition.lat, 400, 0, -90, 0), () => {
+ speak(item.threeContent, () => {
+ let FourCenter = DC.Position.fromObject(item.fourPointPosition)
+ let fourCircle = new DC.Circle(FourCenter, 10)
+ fourCircle.setStyle({
+ material: new DC.CircleWaveMaterialProperty({
+ color: DC.Color.fromRandom(),
+ speed: 20,
+ count: 5,
+ gradient: 0.5
+ })
+ })
+ dynamicVectorLayer.addOverlay(fourCircle)
+
+ let fourContent = new DC.DivIcon(
+ new DC.Position(item.fourPointPosition.lng, item.fourPointPosition.lat, 70),
+ `<div class="dynamic-event-profile-map-popup">
+ <div class="content-wrap">
+ <div class="content">
+ <p>${item.fourContent}</p>
+ </div>
+ </div>
+ <div class="arrow"></div>
+ </div>`
+ )
+ dynamicHtmlLayer.addOverlay(fourContent)
+ // 执行对应的事件函数
+ window.$viewer.flyToPosition(new DC.Position(item.fourPointPosition.lng, item.fourPointPosition.lat, 400, 0, -90, 0), () => {
+ speak(item.fourContent, () => {
+ if (item.fivePointPosition) {
+ let fiveCenter = DC.Position.fromObject(item.fivePointPosition)
+ let fiveCircle = new DC.Circle(fiveCenter, 10)
+ fiveCircle.setStyle({
+ material: new DC.CircleWaveMaterialProperty({
+ color: DC.Color.fromRandom(),
+ speed: 20,
+ count: 5,
+ gradient: 0.5
+ })
+ })
+ dynamicVectorLayer.addOverlay(fiveCircle)
+
+ let fiveContent = new DC.DivIcon(
+ new DC.Position(item.fivePointPosition.lng, item.fivePointPosition.lat, 70),
+ `<div class="dynamic-event-profile-map-popup">
+ <div class="content-wrap">
+ <div class="content">
+ <p>${item.fiveContent}</p>
+ </div>
+ </div>
+ <div class="arrow"></div>
+ </div>`
+ )
+ dynamicHtmlLayer.addOverlay(fiveContent)
+ // 执行对应的事件函数
+ window.$viewer.flyToPosition(new DC.Position(item.fivePointPosition.lng, item.fivePointPosition.lat, 400, 0, -90, 0), () => {
+ speak(item.fiveContent)
+ }, 3)
+ }
+ })
+ }, 3)
+ })
}, 3)
+}
- timeTwo = setTimeout(() => {
- let twoCenter = DC.Position.fromObject(item.twoPointPosition)
- let twoCircle = new DC.Circle(twoCenter, 10)
- twoCircle.setStyle({
- material: new DC.CircleWaveMaterialProperty({
- color: DC.Color.fromRandom(),
- speed: 20,
- count: 5,
- gradient: 0.5
- })
+const twoFun = (item, cb = () => { }) => {
+ let twoCenter = DC.Position.fromObject(item.twoPointPosition)
+ let twoCircle = new DC.Circle(twoCenter, 10)
+ twoCircle.setStyle({
+ material: new DC.CircleWaveMaterialProperty({
+ color: DC.Color.fromRandom(),
+ speed: 20,
+ count: 5,
+ gradient: 0.5
})
- dynamicVectorLayer.addOverlay(twoCircle)
+ })
+ dynamicVectorLayer.addOverlay(twoCircle)
- let twoContent = new DC.DivIcon(
- new DC.Position(item.twoPointPosition.lng, item.twoPointPosition.lat, 70),
- `<div class="dynamic-event-profile-map-popup">
+ let twoContent = new DC.DivIcon(
+ new DC.Position(item.twoPointPosition.lng, item.twoPointPosition.lat, 70),
+ `<div class="dynamic-event-profile-map-popup">
<div class="content-wrap">
<div class="content">
<p>${item.twoContent}</p>
@@ -169,115 +343,156 @@
</div>
<div class="arrow"></div>
</div>`
- // <p>特征污染物:${item.specificPollutant}</p>
- )
- dynamicHtmlLayer.addOverlay(twoContent)
- // 执行对应的事件函数
- window.$viewer.flyToPosition(new DC.Position(item.twoPointPosition.lng, item.twoPointPosition.lat, 400, 0, -90, 0), () => { }, 3)
- }, 5000)
+ // <p>特征污染物:${item.specificPollutant}</p>
+ )
+ dynamicHtmlLayer.addOverlay(twoContent)
+ // 执行对应的事件函数
+ window.$viewer.flyToPosition(new DC.Position(item.twoPointPosition.lng, item.twoPointPosition.lat, 400, 0, -90, 0), () => {
+ speak(item.twoContent, () => {
+ cb()
+ })
+ }, 3)
+}
- timeThree = setTimeout(() => {
- let threeCenter = DC.Position.fromObject(item.threePointPosition)
- let threeCircle = new DC.Circle(threeCenter, 30)
- threeCircle.setStyle({
- classificationType: 0,
- material: new DC.CircleSpiralMaterialProperty({
- color: DC.Color.BLUE.withAlpha(0.2),
- speed: 8.0
+const createLinePath = (item, cb = () => { }) => {
+ let polyline = new DC.Polyline(item.linePosition)
+ polyline.setStyle({
+ width: 20,
+ material: new DC.PolylineImageTrailMaterialProperty({
+ color: DC.Color.RED,
+ speed: 20,
+ image: VITE_APP_BASE + 'img/mapicon/right.png',
+ repeat: { x: 5, y: 1 }
+ }),
+ clampToGround: false
+ })
+
+ dynamicLineVectorLayer.addOverlay(polyline)
+
+ window.$viewer.flyToPosition(new DC.Position(item.lineCenter.lng, item.lineCenter.lat, 400, 0, -90, 0), () => {
+ lineTime = setTimeout(() => {
+ cb()
+ }, item.lineTime)
+ }, 3)
+}
+
+const schemeStart = (item) => {
+ emit('closePanel')
+ clearAll()
+
+ if (item.showModel) {
+ window.$viewer.flyToPosition("115.10587903,27.28374884,400,0,-90", () => {
+ track.setModel(VITE_APP_BASE + 'gltf/car.gltf', {
+ show: true,
+ scale: 0.0025,
+ // nodeTransformations: {
+ // rotation: window.$Cesium.Quaternion.fromHeadingPitchRoll(window.$Cesium.Math.toRadians(0), window.$Cesium.Math.toRadians(0), window.$Cesium.Math.toRadians(0)),
+ // }
+ })
+
+ tc.play()
+ tc.viewTrack(track, {
+ mode: '2',
+ pitch: -45,
+ range: 400
})
})
- dynamicVectorLayer.addOverlay(threeCircle)
+ }
- let threeContent = new DC.DivIcon(
- new DC.Position(item.threePointPosition.lng, item.threePointPosition.lat, 70),
- `<div class="dynamic-map-popup">
- <div class="content-wrap">
- <div class="content">
- <p>${item.threeContent}</p>
- </div>
- </div>
- <div class="arrow"></div>
- </div>`
- )
- dynamicHtmlLayer.addOverlay(threeContent)
-
- window.$viewer.flyToPosition(new DC.Position(item.threePointPosition.lng, item.threePointPosition.lat, 400, 0, -90, 0), () => { }, 3)
- }, 10000)
-
- item.fourPointPosition && (timeFour = setTimeout(() => {
- let FourCenter = DC.Position.fromObject(item.fourPointPosition)
- let fourCircle = new DC.Circle(FourCenter, 10)
- fourCircle.setStyle({
- material: new DC.CircleWaveMaterialProperty({
- color: DC.Color.fromRandom(),
- speed: 20,
- count: 5,
- gradient: 0.5
+ timeOne = setTimeout(() => {
+ function oneLoad () {
+ let oneCenter = DC.Position.fromObject(item.onePointPosition)
+ let oneCircle = new DC.Circle(oneCenter, 20)
+ oneCircle.setStyle({
+ material: new DC.CircleWaveMaterialProperty({
+ color: DC.Color.RED.withAlpha(0.9),
+ speed: 20,
+ count: 5,
+ gradient: 0.5
+ })
})
- })
- dynamicVectorLayer.addOverlay(fourCircle)
+ dynamicVectorLayer.addOverlay(oneCircle)
- let fourContent = new DC.DivIcon(
- new DC.Position(item.fourPointPosition.lng, item.fourPointPosition.lat, 70),
- `<div class="dynamic-event-profile-map-popup">
+ let oneCentent = new DC.DivIcon(
+ new DC.Position(item.onePointPosition.lng, item.onePointPosition.lat, 70),
+ `<div class="dynamic-map-popup">
<div class="content-wrap">
<div class="content">
- <p>${item.fourContent}</p>
+ <p>${item.oneCentent}</p>
</div>
</div>
<div class="arrow"></div>
</div>`
- )
- dynamicHtmlLayer.addOverlay(fourContent)
- // 执行对应的事件函数
- window.$viewer.flyToPosition(new DC.Position(item.fourPointPosition.lng, item.fourPointPosition.lat, 400, 0, -90, 0), () => { }, 3)
- }, 15000))
+ // <p>特征污染物:${item.specificPollutant}</p>
+ )
+ dynamicHtmlLayer.addOverlay(oneCentent)
- item.fivePointPosition && (timeFive = setTimeout(() => {
- let fiveCenter = DC.Position.fromObject(item.fivePointPosition)
- let fiveCircle = new DC.Circle(fiveCenter, 10)
- fiveCircle.setStyle({
- material: new DC.CircleWaveMaterialProperty({
- color: DC.Color.fromRandom(),
- speed: 20,
- count: 5,
- gradient: 0.5
+ speak(item.oneCentent, () => {
+ if (item.key == 2) {
+ createLinePath(item, () => {
+ twoFun(item, () => {
+ publicFun(item)
+ })
+ })
+ } else if (item.key == 1) {
+ twoFun(item, () => {
+ createLinePath(item, () => {
+ publicFun(item)
+ })
+ })
+ } else {
+ twoFun(item, () => {
+ publicFun(item)
+ })
+ }
})
- })
- dynamicVectorLayer.addOverlay(fiveCircle)
-
- let fiveContent = new DC.DivIcon(
- new DC.Position(item.fivePointPosition.lng, item.fivePointPosition.lat, 70),
- `<div class="dynamic-event-profile-map-popup">
- <div class="content-wrap">
- <div class="content">
- <p>${item.fiveContent}</p>
- </div>
- </div>
- <div class="arrow"></div>
- </div>`
- )
- dynamicHtmlLayer.addOverlay(fiveContent)
- // 执行对应的事件函数
- window.$viewer.flyToPosition(new DC.Position(item.fivePointPosition.lng, item.fivePointPosition.lat, 400, 0, -90, 0), () => { }, 3)
- }, 20000))
+ }
+ if (item.showModel) {
+ oneLoad()
+ } else {
+ window.$viewer.flyToPosition(new DC.Position(item.onePointPosition.lng, item.onePointPosition.lat, 400, 0, -90, 0), () => {
+ oneLoad()
+ }, 3)
+ }
+ }, item.onetime)
}
const clearAll = () => {
+ window.speechSynthesis.cancel()
+
+ lineTime && (clearTimeout(lineTime), lineTime = null)
timeOne && (clearTimeout(timeOne), timeOne = null)
timeTwo && (clearTimeout(timeTwo), timeTwo = null)
timeThree && (clearTimeout(timeThree), timeThree = null)
timeFour && (clearTimeout(timeFour), timeFour = null)
+ timeFive && (clearTimeout(timeFive), timeFive = null)
+
+ track.setModel(VITE_APP_BASE + 'gltf/car.gltf', {
+ show: false,
+ scale: 0.0025,
+ // nodeTransformations: {
+ // rotation: window.$Cesium.Quaternion.fromHeadingPitchRoll(window.$Cesium.Math.toRadians(0), window.$Cesium.Math.toRadians(0), window.$Cesium.Math.toRadians(0)),
+ // }
+ })
dynamicVectorLayer.clear()
dynamicHtmlLayer.clear()
+ dynamicLineVectorLayer.clear()
}
onUnmounted(() => {
clearAll()
- window.$viewer && window.$viewer.removeLayer(dynamicVectorLayer)
- window.$viewer && window.$viewer.removeLayer(dynamicHtmlLayer)
+ tc.clear()
+ dynamicVectorLayer && window.$viewer && window.$viewer.removeLayer(dynamicVectorLayer)
+ dynamicHtmlLayer && window.$viewer && window.$viewer.removeLayer(dynamicHtmlLayer)
+ dynamicLineVectorLayer && window.$viewer && window.$viewer.removeLayer(dynamicLineVectorLayer)
+
+ tc = null
+ track = null
+ dynamicVectorLayer = null
+ dynamicHtmlLayer = null
+ dynamicLineVectorLayer = null
})
</script>
--
Gitblit v1.9.3