guoshilong
2023-11-14 6d3a25365554f9c7c98b8a58fba7b7aa9b3f9e9f
Merge remote-tracking branch 'origin/demo' into demo

# Conflicts:
# src/hooks/use-cesium-tsa.ts
2 files modified
112 ■■■■■ changed files
src/components/GMap.vue 59 ●●●●● patch | view | raw | blame | history
src/hooks/use-cesium-tsa.ts 53 ●●●● patch | view | raw | blame | history
src/components/GMap.vue
@@ -150,7 +150,8 @@
            <a-col span="6">
              <a-tooltip title="风速">
                <span>W.S</span>
                <span class="ml5">{{ deviceInfo.device.wind_speed === str ? str : (deviceInfo.device.wind_speed / 10).toFixed(2) + ' m/s' }}</span>
                <span class="ml5">{{ deviceInfo.device.wind_speed === str ? str : (deviceInfo.device.wind_speed /
                  10).toFixed(2) + ' m/s' }}</span>
              </a-tooltip>
            </a-col>
          </a-row>
@@ -174,26 +175,27 @@
    <div class="osd-panel fz12" v-if="osdVisible.visible">
      <div class="fz16 pr5 flex-align-center flex-row flex-justify-between"
        style="border-bottom: 1px solid #515151; height: 10%;">
        <div class="flex-align-center flex-justify-center"  style="display: flex;">
        <div class="flex-align-center flex-justify-center" style="display: flex;">
          <div v-if="osdVisible.latest_wayline_job" class="flex-column flex-align-center flex-justify-center">
              <div class="task_wrapper">
                <div class="task_content task_content_way" v-if="deviceInfo.device && deviceInfo.device?.mode_code === 5">
                  <div class="task_status">
                    <ContainerOutlined />
                    <span>执行任务中</span>
                  </div>
            <div class="task_wrapper">
              <div class="task_content task_content_way" v-if="deviceInfo.device && deviceInfo.device?.mode_code === 5">
                <div class="task_status">
                  <ContainerOutlined />
                  <span>执行任务中</span>
                </div>
                <div class="task_content" v-else>
                  <div class="task_status">
                    <ContainerOutlined />
                    <span>待执行</span>
                  </div>
                  <div class="task_info">{{osdVisible.latest_wayline_job.is_later ? '今天': '明天'}}{{convertTimestampToDate(osdVisible.latest_wayline_job.begin_time, 'hh:mm')}}</div>
                </div>
                <div class="task_title">{{osdVisible.latest_wayline_job.name}}</div>
              </div>
              <div class="task_content" v-else>
                <div class="task_status">
                  <ContainerOutlined />
                  <span>待执行</span>
                </div>
                <div class="task_info">{{ osdVisible.latest_wayline_job.is_later ? '今天' :
                  '明天' }}{{ convertTimestampToDate(osdVisible.latest_wayline_job.begin_time, 'hh:mm') }}</div>
              </div>
              <div class="task_title">{{ osdVisible.latest_wayline_job.name }}</div>
            </div>
          </div>
          <span :style="[osdVisible.latest_wayline_job?'margin-left:20px':'']">{{ osdVisible.gateway_callsign }}</span>
          <span :style="[osdVisible.latest_wayline_job ? 'margin-left:20px' : '']">{{ osdVisible.gateway_callsign }}</span>
        </div>
        <div>
          <a style="color: white;" @click="closeOsdWindow">
@@ -779,6 +781,7 @@
import { useConnectMqtt } from './g-map/use-connect-mqtt'
import Cesium from './cesiumMap/cesium.vue'
import { convertTimestampToDate } from '/@/utils/time'
import { cesiumOperation } from '/@/hooks/use-cesium-tsa'
export default defineComponent({
  components: {
    BorderOutlined,
@@ -808,6 +811,7 @@
  name: 'GMap',
  props: {},
  setup () {
    const cesium = cesiumOperation()
    const useMouseToolHook = useMouseTool()
    const useGMapManageHook = useGMapManage()
    const deviceTsaUpdateHook = deviceTsaUpdate()
@@ -1233,6 +1237,21 @@
        deep: true
      }
    )
    watch(() => openDroneControl.value, (is: boolean) => {
      if (!is) {
        cesium.removeById('rangeEllipse')
        return
      }
      // 设置无人机范围
      // cesium.removeById('rangeEllipse')
      const { dock: { basic_osd } } = deviceInfo
      const ellipseSetting = {
        longitude: basic_osd.longitude,
        latitude: basic_osd.latitude
      }
      cesium.addEllipse(ellipseSetting)
      cesium.flyTo(ellipseSetting, 5, 20000)
    })
    function draw (type: MapDoodleType, bool: boolean) {
      state.currentType = type
@@ -1600,10 +1619,12 @@
  min-height: 2px;
  border-radius: 2px;
}
.task_wrapper {
  display: flex;
  align-items: center;
  font-size: 12px;
  .task_content {
    background-color: #41bbfa;
    padding: 2px 4px;
@@ -1612,9 +1633,9 @@
  .task_content_way {
    background-color: #19be6b;
  }
  .task_title {
    margin-left: 5px;
    font-size: 14px;
  }
}
</style>
}</style>
src/hooks/use-cesium-tsa.ts
@@ -37,25 +37,31 @@
  pitch?: number
  roll?: number
}
interface ellipseOption {
  longitude: number
  latitude: number
}
// 定义全局的viewer变量防止重复生成
// eslint-disable-next-line no-var
var viewer: Cesium.Viewer | null = null
export function cesiumOperation () {
export function cesiumOperation() {
  let handler: Cesium.ScreenSpaceEventHandler
  const TDT_Token = 'c6eea7dad4fa1e2d1e32ec0e7c9735db'
  // 天地图Key
  // 天地图地图
  const TDT_IMG_C = 'https://{s}.tianditu.gov.cn/img_c/wmts?service=wmts&request=GetTile&version=1.0.0' +
      '&LAYER=img&tileMatrixSet=c&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}' +
      '&style=default&format=tiles&tk=' + TDT_Token
    '&LAYER=img&tileMatrixSet=c&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}' +
    '&style=default&format=tiles&tk=' + TDT_Token
  // 天地图注记
  const TDT_ZJ = 'https://{s}.tianditu.gov.cn/cia_c/wmts?service=wmts&request=GetTile&version=1.0.0' +
      '&LAYER=cia&tileMatrixSet=c&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}' +
      '&style=default&format=tiles&tk=' + TDT_Token
    '&LAYER=cia&tileMatrixSet=c&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}' +
    '&style=default&format=tiles&tk=' + TDT_Token
  // 标准地图注记
  const TID_STAND = 'https://{s}.tianditu.gov.cn/vec_w/wmts?service=wmts&request=GetTile&version=1.0.0' +
  '&LAYER=img&tileMatrixSet=c&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}' +
  '&style=default&format=tiles&tk=' + TDT_Token
    '&LAYER=img&tileMatrixSet=c&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}' +
    '&style=default&format=tiles&tk=' + TDT_Token
  // 天地图图层变量
  const imageryProvider_tdt = new Cesium.WebMapTileServiceImageryProvider({
    url: TDT_IMG_C,
@@ -145,7 +151,7 @@
  }
  // 清除所有标记点
  function removeAllPoint () {
  function removeAllPoint() {
    if (viewer) {
      viewer?.entities?.removeAll()
    }
@@ -162,6 +168,22 @@
      id: pointOption.id,
    })
  }
  // 添加半径为7公里的范围的圆
  const addEllipse = ({ longitude, latitude }: ellipseOption) => {
    if (!longitude && !latitude) return
    const position = Cesium.Cartesian3.fromDegrees(longitude, latitude)
    viewer?.entities.add({
      position,
      id: 'rangeEllipse',
      name: 'rangeEllipse',
      ellipse: {
        semiMinorAxis: 7000.0,
        semiMajorAxis: 7000.0,
        material: Cesium.Color.CORNFLOWERBLUE.withAlpha(0.3),
      }
    })
    console.log(viewer?.entities)
  }
  // 添加线段
  const addPolyline = (pointOption: pointOption) => {
@@ -172,7 +194,7 @@
  }
  // 通过点ID删除
  function removeById (id:string) {
  function removeById(id: string) {
    viewer?.entities.removeById(id)
    const pointEntity = viewer?.entities.getById(id)
    if (pointEntity && pointEntity !== undefined) {
@@ -180,12 +202,12 @@
    }
  }
  // 通过点ID获取实体
  function getEntityById (id:string) {
  function getEntityById(id: string) {
    const pointEntity = viewer?.entities.getById(id)
    return pointEntity
  }
  // 更新图片实体位置
  function updateEntityPosition (longitude:number, latitude:number, id:string, params?:any) {
  function updateEntityPosition(longitude: number, latitude: number, id: string, params?: any) {
    const entity = getEntityById(id) as Cesium.Entity
    const position = Cesium.Cartesian3.fromDegrees(longitude, latitude)
    const heading = Cesium.Math.toRadians(-params.heading)
@@ -195,7 +217,7 @@
    }
  }
  // 飞行 flyto
  const flyTo = (pointOption: pointOption, time: number = 4, height:number = 3000) => {
  const flyTo = (pointOption: pointOption, time: number = 4, height: number = 3000) => {
    if (!pointOption.longitude && !pointOption.latitude) return
    const destination = Cesium.Cartesian3.fromDegrees(pointOption.longitude, pointOption.latitude, height)
    const duration = time
@@ -230,20 +252,20 @@
  }
  // 地图放大
  const zoonIn = (range:number) => {
  const zoonIn = (range: number) => {
    // 获取当前视角的高度
    const cameraHeight = viewer?.camera.positionCartographic.height
    const amout = Cesium.Math.sign(range) * cameraHeight / Math.log(cameraHeight)
    viewer?.camera.zoomIn(amout)
  }
  // 地图缩小
  const zoonOut = (range:number) => {
  const zoonOut = (range: number) => {
    const cameraHeight = viewer?.camera.positionCartographic.height
    const amout = Cesium.Math.sign(range) * cameraHeight / Math.log(cameraHeight)
    viewer?.camera.zoomOut(amout)
  }
  // 生成或删除路网图层
  const roadPattern = (flag:boolean) => {
  const roadPattern = (flag: boolean) => {
    if (store.state.common.mapSetting.mode === 0) return
    const imageryLayers = viewer?.scene.imageryLayers
    const tdtZwImg_c = imageryLayers?._layers.find(v => v.imageryProvider._layer === 'tdtZwImg_c')
@@ -312,6 +334,7 @@
    getEntityById,
    updateEntityPosition,
    addPolyline,
    addEllipse,
    loadGeoJson,
    removeAllDataSource
  }