AttributioClassification/src/views/chart/pages/WindMap.vue

215 lines
6.4 KiB
Vue
Raw Normal View History

2025-12-03 16:21:04 +08:00
<template>
<div class="marker-wrap">
<div id="cesiumContainer"></div>
</div>
</template>
<script>
import * as Cesium from 'cesium'
import {loadWindfield, removeWindfield, loadWindfieldWithDataNew} from './WindMap/WindField'
import {loadHeatmap, loadHeatmapByData} from './HeatMap/examples/heatmap'
import Wind from './wind.json'
import Atmospheric from './atmospheric.json'
export default {
data() {
return {
viewer: null,
windData: null,
pressureData: null,
temperatureData: null,
atmosphericData: null,
}
},
watch: {
'$route.query.type': {
handler(val) {
removeWindfield()
let lay = this.findLayerByName('heatmap')
this.viewer.imageryLayers.remove(lay);
this.setFunByParam(val)
}
}
},
created() {},
mounted() {
this.initCesium()
this.getAtmosphericStability()
},
methods: {
// 获取大气稳定度数据
async getAtmosphericStability() {
// 2024-05-18到2024-05-24是有数据的
let params = {
date: '2024-05-20',
2025-12-03 17:37:14 +08:00
lon_center: 116,
lat_center: 39,
2025-12-03 16:21:04 +08:00
grid_halfwidth_deg: 1
}
this.loading = true
2025-12-03 17:37:14 +08:00
const res = await this.$axios.post(window.CONFIG.baseUrl + '/nuclide-sim/calculate_atmospheric_stability', params, {
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
})
2025-12-03 16:21:04 +08:00
this.loading = false
this.atmosphericData = res.stability_result.stability_result
},
// 获取风场、温度场、气压场数据
async getWindTemperaturePressure() {
let params = {
date: '2024-05-20',
lon_center: 116,
lat_center: 39,
grid_halfwidth_deg: 1
}
try {
this.loading = true
2025-12-03 17:37:14 +08:00
const res = await this.$axios.post(window.CONFIG.baseUrl + '/nuclide-sim/get_wind_temperature_pressure_data', params, {
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
})
2025-12-03 16:21:04 +08:00
this.loading = false
// const res = Wind
this.windData = res.wind_result
this.pressureData = res.pressure_result.pressure_result
this.temperatureData = res.temp_result.temp_result
let param = this.$route.query ? this.$route.query.type : ''
this.setFunByParam(param)
// removeWindfield()
// loadWindfield(this.viewer)
// loadWindfieldWithDataNew(this.viewer, res.wind_result)
// loadHeatmap(this.viewer)
} catch (error) {
console.log(error)
}
},
setFunByParam(val) {
switch (val) {
case 'Wind':
// loadWindfield(this.viewer)
loadWindfieldWithDataNew(this.viewer, this.windData)
break
case 'AtmosphericStability':
2025-12-03 17:37:14 +08:00
debugger
2025-12-03 16:21:04 +08:00
loadHeatmapByData(this.viewer, this.atmosphericData)
break
case 'AirPressure':
loadHeatmapByData(this.viewer, this.pressureData)
break
case 'Temperature':
loadHeatmapByData(this.viewer, this.temperatureData)
break
default:
loadWindfieldWithDataNew(this.viewer, this.windData)
}
},
findLayerByName(layerName) {
for (let i = 0; i < this.viewer.imageryLayers.length; i++) {
const layer = this.viewer.imageryLayers.get(i);
if (layer.name === layerName) {
return layer;
}
}
return null;
},
initCesium() {
// 设置Cesium Ion访问令牌需在官网申请
Cesium.Ion.defaultAccessToken =
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI0N2FjZGMzOC1kOGRlLTQ2MjgtOTQ3Yy0wZjNhNjU2MWE2YzMiLCJpZCI6MTU2MjMzLCJpYXQiOjE2OTAyNjQ2Mjl9.ek7v5pm-V7zWe5rxLGYIWuavneNk4p-VO40KictHc_Y'
// 初始化Cesium Viewer
this.viewer = new Cesium.Viewer('cesiumContainer', {
homeButton: false, // 不显示Home按钮
sceneModePicker: false, // 不显示场景模式选择器
baseLayerPicker: false, // 不显示底图选择器
animation: false, // 不显示动画控件
timeline: false, // 不显示时间线控件
fullscreenButton: false, // 不显示全屏按钮
geocoder: false, // 不显示地名查找控件
infoBox: false, // 显示信息框
selectionIndicator: false, // 不显示选择指示器
})
// 移除默认的版权信息
this.viewer._cesiumWidget._creditContainer.style.display = 'none'
// 初始化完成后加载模型
this.flyToBeijing()
// 开启风场
// loadWindfield(this.viewer)
// this.getAtmosphericStability()
this.getWindTemperaturePressure()
// this.getWindData()
// 开启热力图
// loadHeatmap(this.viewer)
},
flyToBeijing() {
// 北京坐标(经度, 纬度, 高度)
const beijingPosition = Cesium.Cartesian3.fromDegrees(116.3903, 39.9001, 600000)
this.viewer.camera.flyTo({
destination: beijingPosition, // 目标位置
orientation: {
heading: Cesium.Math.toRadians(0), // 航向角0度为正北
pitch: Cesium.Math.toRadians(-90), // 俯仰角(-45度为45度俯视
roll: 0.0, // 滚转角(保持水平)
},
duration: 3.0, // 飞行时间(秒)
})
// 飞行完成后添加模型
this.viewer.camera.moveEnd.addEventListener(() => {
console.log('飞行完成')
})
},
// async getWindData() {
// let now = new Date().toLocaleDateString('zh-CN', {
// year: 'numeric',
// month: '2-digit',
// day: '2-digit'
// }).replace(/\//g, '-');
// debugger
// try {
// const res = await this.$axios.get(window.CONFIG.baseUrl + '/nuclide-sim/get_wind_temperature_data', { params: { date: now }})
// console.log("111111111111111", res)
// debugger
// removeWindfield()
// loadWindfieldWithData(this.viewer, res.data.result)
// } catch (error) {
// console.log(error)
// }
// },
},
beforeDestroy() {
// 组件销毁时清理Cesium实例
if (this.viewer && !this.viewer.isDestroyed()) {
this.viewer.destroy()
}
},
}
</script>
<style scoped lang="scss">
.marker-wrap {
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
#cesiumContainer {
width: 100%;
height: 100%;
::v-deep .cesium-viewer-toolbar {
.cesium-navigationHelpButton-wrapper {
display: none;
}
}
}
}
</style>