zhongrj
2025-03-28 4ff3eee77b41466d08117970970d01be6e48ffe1
src/views/hooks/droneFly.ts
@@ -7,7 +7,7 @@
import { useMyStore } from '@/store'
import { getTwoPointInfo } from '@/api/manage'
const { getEntityById, removeById, globalCesium, addLeftClickEvent, removeLeftClickEvent, flyTo } = cesiumOperation()
const { getEntityById, removeById, globalCesium, removeAllPoint, addLeftClickEvent, removeLeftClickEvent, flyTo } = cesiumOperation()
// 无人机实体
let droneEntity = null
@@ -45,8 +45,7 @@
  let measure_target_altitude = 0;
  async function initDock(data:any, sn:any, dockSn:any, workspaceId:any, ssLinePath:any, viewDroneInfo:any) {
    // console.log('globalCesium查看是', globalCesium)
  async function initDock(data:any, sn:String, dockSn:String, workspaceId:String, ssLinePath:String, viewDroneInfo:any) {
    // 获取workspaceId
    wId = workspaceId
    // 给无人机参数赋值
@@ -63,7 +62,7 @@
      // 当飞机模型存在
      if (droneEntity) {
        //  且在空中飞行时,实时更新飞机模型的位置
        if (deviceInfo.mode_code && [3, 4, 5, 9, 10, 16].includes(deviceInfo.mode_code)) {
        if (deviceInfo.mode_code && [3, 4, 5, 9, 10, 16, 17].includes(deviceInfo.mode_code)) {
          if (store.currentAngle == 3) {
            viewInfoFrustum?.clear()
          } else {
@@ -81,11 +80,11 @@
            ssLinePath
          )
          let domain = sessionStorage.getItem('domain')
          if (domain !== '0') {
            addFlyLaser(
              deviceInfo.payloads[0]
            )
          }
          // if (domain !== '0') {
          //   addFlyLaser(
          //     deviceInfo.payloads[0]
          //   )
          // }
          setelCamera(
            viewDroneInfo.longitude,
            viewDroneInfo.latitude,
@@ -96,6 +95,9 @@
        } else {
          removeById('drone_fly')
          droneEntity = null
          removeById('me_dw')
          myAppEntity = null
  
          lastTime = null
          viewInfoFrustum?.clear()
@@ -103,10 +105,10 @@
  
          window.cesiumViewer.camera.lookAtTransform(globalCesium.Matrix4.IDENTITY)
          store.commit('SET_CURRENTANGLE', 1)
          removeAllPoint()
        }
      } else {
        if (deviceInfo.mode_code && [3, 4, 5, 9, 10].includes(deviceInfo.mode_code)) {
          // 暂时把视锥代码注释掉
        if (deviceInfo.mode_code && [3, 4, 5, 9, 10, 17].includes(deviceInfo.mode_code)) {
          initCreateFrustum(deviceInfo, viewDroneInfo)
          addFlyGltf(
            viewDroneInfo.longitude,
@@ -119,73 +121,71 @@
            ssLinePath
          )
          let domain = sessionStorage.getItem('domain')
          if (domain !== '0') {
            addFlyLaser(
              deviceInfo.payloads[0]
            )
          }
          // if (domain !== '0') {
          //   addFlyLaser(
          //     deviceInfo.payloads[0]
          //   )
          // }
        }
      }
      const imgRightBlue = new URL('@/assets/images/arrow-right-pink.png', import.meta.url).href
      // 暂时把航线屏蔽
      // 无人机路线轨迹,判断是否存在drone_route_remove
      // if (getEntityById('drone_route_remove')) {
      //   window.cesiumViewer.entities.add({
      //     name: 'drone_route_remove',
      //     id: 'drone_route_remove',
      //     polyline: {
      //       width: 7,
      //       positions: previousPositions,
      //       material: new ImageTrailMaterial({
      //         color: globalCesium.Color.ORANGE,
      //         speed: 10,
      //         image: imgRightBlue,
      //         repeat: { x: 1, y: 0 },
      //       }),
      //       clampToGround: false,
      //     },
      //   })
      // }
      if (getEntityById('drone_route_remove')) {
        window.cesiumViewer.entities.add({
          name: 'drone_route_remove',
          id: 'drone_route_remove',
          polyline: {
            width: 7,
            positions: previousPositions,
            material: new ImageTrailMaterial({
              color: globalCesium.Color.ORANGE,
              speed: 10,
              image: imgRightBlue,
              repeat: { x: 1, y: 0 },
            }),
            clampToGround: false,
          },
        })
      }
      
      // if (data.deviceInfo[data.currentSn].mode_code && [3, 4, 5, 9, 10].includes(deviceInfo.mode_code)) {
      //   if (switchSaving) return (switchSaving = false)
      //     // console.log('5555', data.deviceInfo[data.currentSn].longitude)
      //   const newPositions = globalCesium.Cartesian3.fromDegrees(
      //     data.deviceInfo[data.currentSn].longitude,
      //     data.deviceInfo[data.currentSn].latitude,
      //     Math.floor(viewDroneInfo.elevation),
      //   )
      //   //若刷新,恢复无人机之前的路线轨迹
      //   const dataIndexedDB = await IndexedDBService.getDataById(wId)
      //   if (previousPositions.length == 0 && dataIndexedDB) {
      //     previousPositions = previousPositions.concat(dataIndexedDB?.temporaryflightData)
      //   } else {
      //     previousPositions = previousPositions.concat(newPositions)
      //   }
      //   // 保存无人机当前执行的路线,防止刷新数据丢失
      //   if (!dataIndexedDB) {
      //     await IndexedDBService.addData({
      //       id: wId,
      //       temporaryflightData: previousPositions,
      //     })
      //   } else {
      //     await IndexedDBService.updateData(wId, {temporaryflightData: previousPositions})
      //   }
      //   //  更新线段的位置
      //   const drone_route_remove = getEntityById('drone_route_remove')
      //   if (!drone_route_remove) return
      //   drone_route_remove.polyline.positions = previousPositions
      //   drone_route_remove.polyline._material._repeat._value.x = Math.floor(previousPositions.length / 7)
      // } else if ([0, 14].includes(deviceInfo.mode_code)) {
      //   previousPositions = []
      //   await IndexedDBService.deleteData(wId)
      //   const drone_route_remove = getEntityById('drone_route_remove')
      //   if (!drone_route_remove) return
      //   drone_route_remove.polyline.positions = previousPositions
      //   removeById('drone_route_remove')
      //   viewInfoFrustum?.clear()
      //   viewInfoFrustum = null
      // }
      if (data.deviceInfo[data.currentSn].mode_code && [3, 4, 5, 9, 10].includes(deviceInfo.mode_code)) {
        if (switchSaving) return (switchSaving = false)
        const newPositions = globalCesium.Cartesian3.fromDegrees(
          data.deviceInfo[data.currentSn].longitude,
          data.deviceInfo[data.currentSn].latitude,
          Math.floor(viewDroneInfo.elevation),
        )
        //若刷新,恢复无人机之前的路线轨迹
        const dataIndexedDB = await IndexedDBService.getDataById(wId)
        if (previousPositions.length == 0 && dataIndexedDB) {
          previousPositions = previousPositions.concat(dataIndexedDB?.temporaryflightData)
        } else {
          previousPositions = previousPositions.concat(newPositions)
        }
        // 保存无人机当前执行的路线,防止刷新数据丢失
        if (!dataIndexedDB) {
          await IndexedDBService.addData({
            id: wId,
            temporaryflightData: previousPositions,
          })
        } else {
          await IndexedDBService.updateData(wId, {temporaryflightData: previousPositions})
        }
        //  更新线段的位置
        const drone_route_remove = getEntityById('drone_route_remove')
        if (!drone_route_remove) return
        drone_route_remove.polyline.positions = previousPositions
        drone_route_remove.polyline._material._repeat._value.x = Math.floor(previousPositions.length / 7)
      } else if ([0, 14].includes(deviceInfo.mode_code)) {
        previousPositions = []
        await IndexedDBService.deleteData(wId)
        const drone_route_remove = getEntityById('drone_route_remove')
        if (!drone_route_remove) return
        drone_route_remove.polyline.positions = previousPositions
        removeById('drone_route_remove')
        viewInfoFrustum?.clear()
        viewInfoFrustum = null
      }
    }
    if (data.currentType === EDeviceTypeName.Dock && data.dockInfo[data.currentSn]) {
      if (!deviceInfo?.basic_osd?.longitude || !deviceInfo?.basic_osd?.latitude) return
@@ -209,21 +209,23 @@
    measure_target_latitude = payloads.measure_target_latitude;
    measure_target_altitude = payloads.measure_target_altitude;
    // if (laserEntity && laserEntity != null) {
    //   laserEntity.position = new globalCesium.CallbackProperty(function () {
    //     return position
    //   }, false)
    //   // laserEntity.orientation = new globalCesium.CallbackProperty(function () {
    //   //   return orientation
    //   // }, false)
    //   laserEntity.show = true
    //   window.cesiumViewer.scene.requestRender()
    // } else {
    if (laserEntity && laserEntity != null) {
      laserEntity.position = new globalCesium.CallbackProperty(function () {
        return position
      }, false)
      laserEntity.show = true
      window.cesiumViewer.scene.requestRender()
    } else {
      removeById('laser_coordinate')
      laserEntity = window.cesiumViewer.entities.add({
        position: globalCesium.Cartesian3.fromDegrees(payloads.measure_target_longitude, payloads.measure_target_latitude, payloads.measure_target_altitude),
        position: new globalCesium.CallbackProperty(() => {
          return globalCesium.Cartesian3.fromDegrees(
            payloads.measure_target_longitude,
            payloads.measure_target_latitude,
            payloads.measure_target_altitude
          )
        }, false),
        id: 'laser_coordinate',
        billboard: {
          image: imgLaser,
@@ -233,7 +235,7 @@
          outlineWidth: 0,
        }
      })
    // }
    }
    // 增加激光扫射信息
    laserEntity.label = new globalCesium.LabelGraphics({
      text: `H:${Math.ceil(payloads.measure_target_altitude)}m-L:${Math.round(Math.ceil(payloads.measure_target_distance),)}m`,
@@ -250,17 +252,38 @@
    console.log('起点',startPosition)
    console.log('终点',position)
    if (startPosition && position) {
      removeById('route_two_line')
      twoLineEntity = window.cesiumViewer.entities.add({
        id: 'route_two_line',
        polyline: {
          positions: new globalCesium.CallbackProperty(() => [startPosition, position], false),
          width: 3,
          material: globalCesium.Color.RED,
          zIndex: -1,
          clampToGround: false,
        }
      })
      if (twoLineEntity && twoLineEntity != null) {
        // 如果线实体已存在,只更新位置
        twoLineEntity.polyline.positions = new globalCesium.CallbackProperty(() => {
          return [
            globalCesium.Cartesian3.fromDegrees(me_longitude, me_latitude, 0),
            globalCesium.Cartesian3.fromDegrees(
              payloads.measure_target_longitude,
              payloads.measure_target_latitude,
              payloads.measure_target_altitude
            )
          ]
        }, false)
      } else {
        // 如果线实体不存在,创建新的线实体
        twoLineEntity = window.cesiumViewer.entities.add({
          polyline: {
            positions: new globalCesium.CallbackProperty(() => {
              return [
                globalCesium.Cartesian3.fromDegrees(me_longitude, me_latitude, 0),
                globalCesium.Cartesian3.fromDegrees(
                  payloads.measure_target_longitude,
                  payloads.measure_target_latitude,
                  payloads.measure_target_altitude
                )
              ]
            }, false),
            width: 2,
            material: globalCesium.Color.fromCssColorString('red'),
            clampToGround: false,
          },
        })
      }
    }
  }
@@ -426,26 +449,34 @@
  function getPhoneLocation(workspaceId:String) {
    if (window.cesiumViewer == null) return
    if (navigator.geolocation) {
      navigator.geolocation.watchPosition((position) => {
        console.log(me_longitude,position.coords.longitude)
        console.log(me_latitude,position.coords.latitude)
        if (me_longitude > 0 && me_longitude == position.coords.longitude && me_latitude > 0 && me_latitude == position.coords.latitude) return
        me_longitude = position.coords.longitude;
        me_latitude = position.coords.latitude;
        me_altitude = position.coords.altitude || 0;
        // 创建一个箭头实体
        removeById('me_dw')
      // 如果实体不存在,先创建实体
      if (!myAppEntity) {
        myAppEntity = window.cesiumViewer.entities.add({
          id: 'me_dw',
          position: globalCesium.Cartesian3.fromDegrees(me_longitude, me_latitude, me_altitude),
          position: new globalCesium.CallbackProperty(() => {
            return globalCesium.Cartesian3.fromDegrees(me_longitude, me_latitude, me_altitude)
          }, false),
          billboard: {
            image: meMapSrc, // 箭头图片路径
            image: meMapSrc,
            width: 30,
            height: 30,
            scale: 1.0,
            outlineWidth: 0,
          }
        });
      } else {
        myAppEntity.position = new globalCesium.CallbackProperty(() => {
          return globalCesium.Cartesian3.fromDegrees(me_longitude, me_latitude, me_altitude)
        }, false);
      }
      navigator.geolocation.watchPosition((position) => {
        if (me_longitude > 0 && me_longitude == position.coords.longitude &&
            me_latitude > 0 && me_latitude == position.coords.latitude) return
        me_longitude = position.coords.longitude;
        me_latitude = position.coords.latitude;
        me_altitude = position.coords.altitude || 0;
        // 查看两条线直接距离和高度
        getTwoHeightWidth(workspaceId)
      }, (error) => {