吉安感知网项目-前端
shuishen
2026-02-03 89380e6260a75d1d3b94de687ebcc2f50d50659d
applications/drone-command/src/views/recordManage/historyTracks/TrajectoryDiaLog.vue
@@ -1,13 +1,24 @@
<template>
   <el-dialog class="ztzf-page-map-view-dialog" v-model="visible" :show-close="false"
      :close-on-click-modal="false" @closed="handleClosed" destroy-on-close>
   <el-dialog
      class="command-page-map-view-dialog"
      v-model="visible"
      :show-close="false"
      :close-on-click-modal="false"
      @closed="handleClosed"
      destroy-on-close
   >
      <div class="dialog-container">
         <div class="left-container">
            <div class="leftMap ztzf-cesium" id="leftMapContainer"></div>
            <div class="leftMap command-cesium" id="leftMapContainer"></div>
         </div>
         <div class="right-container">
            <div class="header">{{ dialogTitle }}</div>
            <div class="dialog-container">
            <div class="header">
               <span>{{ dialogTitle }}</span>
               <el-icon class="close-btn" @click.stop="visible = false"><Close /></el-icon>
            </div>
            <div class="content">
               <div class="detail-title">轨迹信息</div>
               <el-row>
                  <el-col :span="24">
@@ -32,9 +43,9 @@
                  </el-col>
               </el-row>
               <div class="detail-title">轨迹点</div>
               <div class="ztzf-table-container">
                  <div class="ztzf-table-content">
                     <el-table class="ztzf-data-cockpit-table" :data="list">
               <div class="command-table-container">
                  <div class="command-table-content">
                     <el-table class="command-table" :data="list" :row-class-name="getRowClassName">
                        <el-table-column type="index" width="60" label="序号" />
                        <el-table-column label="经纬度">
                           <template #default="{ row }">{{ row.longitude }},{{ row.latitude }}</template>
@@ -45,7 +56,7 @@
               </div>
            </div>
            <div class="footer">
               <el-button color="#2B2B4C" @click="handleCancel">{{ dialogReadonly ? '关闭' : '取消' }}</el-button>
               <el-button v-if="dialogMode != 'view'" color="#2B2B4C" @click="handleCancel">{{ dialogReadonly ? '关闭' : '取消' }}</el-button>
            </div>
         </div>
      </div>
@@ -53,12 +64,16 @@
</template>
<script setup>
import { Close } from '@element-plus/icons-vue'
import { computed, nextTick, ref } from 'vue'
import { fwDroneFlightRecordDetailApi } from '@/views/recordManage/historyTracks/fwDroneFlightRecord'
import { fwDroneFlightRecordDetailPageApi } from '@/views/recordManage/historyTracks/flyTrajectory'
import { PublicCesium } from '@/utils/cesium/publicCesium'
import * as Cesium from 'cesium'
import { flyVisual } from '@/utils/cesium/mapUtil'
import { flyVisual } from '@ztzf/utils'
import { ArrowLineMaterialProperty } from '@/utils/cesium/Material'
import droneIcon from '@/assets/images/dataCockpit/map/drone.png'
const initForm = () => ({
   droneName: '',
@@ -84,12 +99,12 @@
})
// 关闭弹框
function handleCancel () {
function handleCancel() {
   visible.value = false
}
// 加载详情
async function loadDetail () {
async function loadDetail() {
   if (!formData.value.id) return
   const res = await fwDroneFlightRecordDetailApi({ id: formData.value.id })
   const res1 = await fwDroneFlightRecordDetailPageApi({ flightRecordId: formData.value.id })
@@ -98,37 +113,62 @@
   formData.value = res?.data?.data ?? {}
}
let arrowLineMaterialProperty = new ArrowLineMaterialProperty({
   color: new Cesium.Color(128 / 255, 215 / 255, 255 / 255, 1),
   directionColor: new Cesium.Color(1, 1, 1, 1),
   outlineColor: new Cesium.Color(1, 1, 1, 1),
   outlineWidth: 0,
   speed: 5,
})
// 角度转c3
function degreesToC3 ({ longitude, latitude, height = 0 }) {
function degreesToC3({ longitude, latitude, height = 0 }) {
   return Cesium.Cartesian3.fromDegrees(longitude, latitude, height)
}
// 渲染航线
function drawFlightPath () {
function drawFlightPath() {
   const positions = list.value.map(p => degreesToC3(p))
   if (!positions.length) return
   droneLineEntity && geometricSource.entities.remove(droneLineEntity)
   const color = Cesium.Color.fromCssColorString('#00D690')
   droneLineEntity = geometricSource.entities.add({
      polyline: {
         width: 4,
         positions: positions,
         width: 3,
         material: new Cesium.PolylineOutlineMaterialProperty({ color }),
         material: arrowLineMaterialProperty,
         clampToGround: false,
      },
   })
   viewer.flyTo(droneLineEntity)
   startDroneEntity && geometricSource.entities.remove(startDroneEntity)
   startDroneEntity = geometricSource.entities.add({
      position: positions[0],
      billboard: {
         image: droneIcon,
         width: 40,
         height: 40,
         verticalOrigin: Cesium.VerticalOrigin.CENTER,
      },
   })
   viewer.flyTo(droneLineEntity, { duration: 0 })
}
// 关闭后重置
function handleClosed () {
function handleClosed() {
   formData.value = initForm()
   list.value = []
   viewer = null
   geometricSource = null
   droneLineEntity = null
   startDroneEntity = null
}
let viewer, geometricSource, droneLineEntity
function initMap () {
function getRowClassName({ row }) {
   console.log(row.isAlarm, 11111111111)
   return row?.isAlarm === 1 ? 'alarm-row' : ''
}
let viewer, geometricSource, droneLineEntity, startDroneEntity
function initMap() {
   if (viewer) return
   const publicCesiumInstance = new PublicCesium({
      dom: 'leftMapContainer',
@@ -143,7 +183,7 @@
}
// 打开弹框
async function open ({ mode, row } = {}) {
async function open({ mode, row } = {}) {
   dialogMode.value = mode || 'add'
   visible.value = true
   await nextTick()
@@ -159,4 +199,12 @@
defineExpose({ open })
</script>
<style scoped lang="scss"></style>
<style scoped lang="scss">
:deep(.alarm-row) {
   background: #2B2B4C !important;
   td {
      background-color: transparent !important;
   }
}
</style>