From aec00ecc093be803860c8675cbe1c4c776a7cb4e Mon Sep 17 00:00:00 2001
From: GuLiMmo <2820890765@qq.com>
Date: Tue, 19 Mar 2024 17:49:21 +0800
Subject: [PATCH] update: 新建航线、事件编辑、kmz文件问题修改

---
 src/hooks/use-cesium-tsa.ts |  290 ++++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 243 insertions(+), 47 deletions(-)

diff --git a/src/hooks/use-cesium-tsa.ts b/src/hooks/use-cesium-tsa.ts
index 4ed342b..a25ff3b 100644
--- a/src/hooks/use-cesium-tsa.ts
+++ b/src/hooks/use-cesium-tsa.ts
@@ -1,5 +1,6 @@
 import { ELocalStorageKey, EDeviceTypeName } from '/@/types'
 import * as Cesium from 'cesium'
+import { useMyStore } from '/@/store'
 import {
   getCurrentInstance,
 } from 'vue'
@@ -19,22 +20,91 @@
   outlineWidth: number,
   [key: string]: any
 }
+interface polyline {
+  width?: number
+  material?: Cesium.Color
+  [key: string]: any
+}
 interface pointOption {
-  longitude: number
-  latitude: number
+  longitude?: number
+  latitude?: number
   point?: pointSetting
   billboard?: billboardSetting
+  polyline?: polyline
   label?: labelSetting
   id?: string
+  heading?: number
+  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 () {
   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
+  // 天地图注记
+  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
+  // 标准地图注记
+  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
+  // 天地图图层变量
+  const imageryProvider_tdt = new Cesium.WebMapTileServiceImageryProvider({
+    url: TDT_IMG_C,
+    layer: 'tdtImg_c',
+    style: 'default',
+    format: 'tiles',
+    tileMatrixSetID: 'c',
+    subdomains: ['t0', 't1', 't2', 't3', 't4', 't5', 't6', 't7'],
+    tilingScheme: new Cesium.GeographicTilingScheme(),
+    tileMatrixLabels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19'],
+    maximumLevel: 17,
+  })
+  // 标准地图图层变量
+  const imageryProvider_stand = new Cesium.UrlTemplateImageryProvider({
+    url: 'https://t{s}.tianditu.gov.cn/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=e45274b0235bb913eceb393aabbf9c9c',
+    subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
+    // format: 'image/jpeg',
+    // show: true,
+    maximumLevel: 18,
+    credit: 'stand_tc'
+  })
+  // 标准地图图层注解
+  const imageryProvider_standZh = new Cesium.UrlTemplateImageryProvider({
+    url: 'https://t{s}.tianditu.gov.cn/DataServer?T=cva_w&x={x}&y={y}&l={z}&tk=e45274b0235bb913eceb393aabbf9c9c',
+    subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
+    maximumLevel: 18,
+    credit: 'stand_zj'
+  })
+  // 天地图中文注记加载
+  const annotation = new Cesium.WebMapTileServiceImageryProvider({
+    url: TDT_ZJ,
+    layer: 'tdtZwImg_c',
+    style: 'default',
+    format: 'tiles',
+    tileMatrixSetID: 'c',
+    subdomains: ['t0', 't1', 't2', 't3', 't4', 't5', 't6', 't7'],
+    tilingScheme: new Cesium.GeographicTilingScheme(),
+    tileMatrixLabels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19'],
+    maximumLevel: 50,
+  })
   const dimension = ref(3)
+  const store = useMyStore()
   const _init = () => {
-    if (viewer) return
     // Cesium Token
     const cesiumToken = import.meta.env.VITE_CESIUM_TOKEN
     Cesium.Ion.defaultAccessToken = cesiumToken
@@ -61,42 +131,23 @@
   }
   // 加载图层、注解方法
   const loadLAYER = () => {
-    // 天地图Key
-    const TDT_Token = 'c6eea7dad4fa1e2d1e32ec0e7c9735db'
-    // 天地图地图
-    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
-    // 天地图注记
-    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
     // 天地图图层加载
-    const imageryProvider = new Cesium.WebMapTileServiceImageryProvider({
-      url: TDT_IMG_C,
-      layer: 'tdtImg_c',
-      style: 'default',
-      format: 'tiles',
-      tileMatrixSetID: 'c',
-      subdomains: ['t0', 't1', 't2', 't3', 't4', 't5', 't6', 't7'],
-      tilingScheme: new Cesium.GeographicTilingScheme(),
-      tileMatrixLabels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19'],
-      maximumLevel: 50,
-    })
-    viewer?.imageryLayers.addImageryProvider(imageryProvider)
-    // 天地图中文注记加载
-    const annotation = new Cesium.WebMapTileServiceImageryProvider({
-      url: TDT_ZJ,
-      layer: 'tdtImg_c',
-      style: 'default',
-      format: 'tiles',
-      tileMatrixSetID: 'c',
-      subdomains: ['t0', 't1', 't2', 't3', 't4', 't5', 't6', 't7'],
-      tilingScheme: new Cesium.GeographicTilingScheme(),
-      tileMatrixLabels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19'],
-      maximumLevel: 50,
-    })
-    viewer?.imageryLayers.addImageryProvider(annotation)
+    if (store.state.common.mapSetting.mode === 1) {
+      viewer?.imageryLayers.addImageryProvider(imageryProvider_tdt)
+    }
+    // 标准地图加载
+    if (store.state.common.mapSetting.mode === 0) {
+      viewer?.imageryLayers.addImageryProvider(imageryProvider_stand)
+      viewer?.imageryLayers.addImageryProvider(imageryProvider_standZh)
+    }
+    // 路线图加载
+    if (store.state.common.mapSetting.roadLine === true && store.state.common.mapSetting.mode === 1) {
+      viewer?.imageryLayers.addImageryProvider(annotation)
+    }
+  }
+
+  function removeAllDataSource () {
+    viewer?.dataSources.removeAll()
   }
 
   // 清除所有标记点
@@ -108,28 +159,101 @@
   // 添加标记点
   const addPoint = (pointOption: pointOption) => {
     if (!pointOption.longitude && !pointOption.latitude) return
+    const position = Cesium.Cartesian3.fromDegrees(pointOption.longitude, pointOption.latitude)
     viewer?.entities.add({
-      position: Cesium.Cartesian3.fromDegrees(pointOption.longitude, pointOption.latitude),
+      position,
       billboard: pointOption.billboard,
       point: pointOption.point,
       label: pointOption.label,
       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,
+        outline: true,
+        material: Cesium.Color.CORNFLOWERBLUE.withAlpha(0.3)
+      }
+    })
+  }
+  // 添加左键点击事件
+  let leftClickHandler: Cesium.ScreenSpaceEventHandler
+  const addClickEvent = (sid: string, cb: Function) => {
+    if (leftClickHandler) {
+      removeClickEvent()
+    }
+    leftClickHandler = new Cesium.ScreenSpaceEventHandler(viewer?.scene.canvas)
+    leftClickHandler.setInputAction(function (click: { position: Cesium.Cartesian2 }) {
+      const pick = viewer?.scene.pick(click.position)
+      if (pick && (pick.id._id === sid || pick.id._id.includes(sid))) {
+        cb(click, pick, viewer, handler)
+      }
+    }, Cesium.ScreenSpaceEventType.LEFT_CLICK)
+  }
+  // 移除左键事件
+  const removeClickEvent = () => {
+    leftClickHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK)
+  }
+
+  let rightClickHandler: Cesium.ScreenSpaceEventHandler
+  const addRightClick = (sid: string, cb: Function) => {
+    if (leftClickHandler) {
+      removeRightClickEvent()
+    }
+    rightClickHandler = new Cesium.ScreenSpaceEventHandler(viewer?.scene.canvas)
+    rightClickHandler.setInputAction(function (click: { position: Cesium.Cartesian2 }) {
+      const pick = viewer?.scene.pick(click.position)
+      cb(click, pick, viewer, handler)
+    }, Cesium.ScreenSpaceEventType.RIGHT_CLICK)
+  }
+  // 移除右键事件
+  const removeRightClickEvent = () => {
+    rightClickHandler.removeInputAction(Cesium.ScreenSpaceEventType.RIGHT_CLICK)
+  }
+
+  // 添加线段
+  const addPolyline = (pointOption: pointOption) => {
+    viewer?.entities.add({
+      polyline: pointOption.polyline,
+      id: pointOption.id,
+    })
+  }
 
   // 通过点ID删除
-  function removeById (id:string) {
+  function removeById (id: string) {
     viewer?.entities.removeById(id)
     const pointEntity = viewer?.entities.getById(id)
     if (pointEntity && pointEntity !== undefined) {
       viewer?.entities.remove(pointEntity)
     }
   }
-
+  // 通过点ID获取实体
+  function getEntityById (id: string) {
+    const pointEntity = viewer?.entities.getById(id)
+    return pointEntity
+  }
+  // 更新图片实体位置
+  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)
+    if (Cesium.defined(entity)) {
+      entity.position = position
+      entity.billboard.rotation = heading
+    }
+  }
   // 飞行 flyto
-  const flyTo = (pointOption: pointOption, time: number = 4) => {
+  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, 3000)
+    const destination = Cesium.Cartesian3.fromDegrees(pointOption.longitude, pointOption.latitude, height)
     const duration = time
     viewer?.camera.flyTo({
       destination,
@@ -160,6 +284,64 @@
         dimension.value = 3
     }
   }
+
+  // 地图放大
+  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 cameraHeight = viewer?.camera.positionCartographic.height
+    const amout = Cesium.Math.sign(range) * cameraHeight / Math.log(cameraHeight)
+    viewer?.camera.zoomOut(amout)
+  }
+  // 生成或删除路网图层
+  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')
+    if (!flag) {
+      viewer?.imageryLayers.remove(tdtZwImg_c)
+    } else {
+      viewer?.imageryLayers.addImageryProvider(annotation)
+    }
+  }
+
+  // 加载json文件
+  const loadGeoJson = (url: string) => {
+    const option = {
+      stroke: Cesium.Color.HOTPINK.withAlpha(0.5),
+      fill: Cesium.Color.PINK.withAlpha(0.3),
+      strokeWidth: 3,
+    }
+    const promise = Cesium.GeoJsonDataSource.load(url, option)
+
+    promise.then(dataSource => {
+      console.log(dataSource)
+      viewer?.dataSources.add(dataSource)
+    })
+  }
+
+  // 切换不同背景图层
+  const patternMap = () => {
+    const imageryLayers = viewer?.scene.imageryLayers
+    // 切换为标准图层
+    if (store.state.common.mapSetting.mode === 0) {
+      const tdtImg_c = imageryLayers?._layers.find(v => v.imageryProvider._layer === 'tdtImg_c')
+      const tdtZwImg_c = imageryLayers?._layers.find(v => v.imageryProvider._layer === 'tdtZwImg_c')
+      viewer?.imageryLayers.remove(tdtImg_c)
+      viewer?.imageryLayers.remove(tdtZwImg_c)
+    } else {
+      const tdtStand_c = imageryLayers?._layers.find(v => v.imageryProvider.credit.html === 'stand_tc')
+      const tdtStand_zj = imageryLayers?._layers.find(v => v.imageryProvider.credit.html === 'stand_zj')
+      viewer?.imageryLayers.remove(tdtStand_c)
+      viewer?.imageryLayers.remove(tdtStand_zj)
+    }
+    loadLAYER()
+  }
   onMounted(() => {
     if (viewer) return
     _init()
@@ -169,15 +351,29 @@
   })
 
   // 销毁地图模型
-  onUnmounted(() => {
-    viewer = null
-  })
+  // onUnmounted(() => {
+  //   // viewer = null
+  // })
   return {
     addPoint,
     removeAllPoint,
     flyTo,
     removeById,
     switchModel,
-    dimension
+    dimension,
+    zoonIn,
+    zoonOut,
+    roadPattern,
+    patternMap,
+    getEntityById,
+    updateEntityPosition,
+    addPolyline,
+    addEllipse,
+    loadGeoJson,
+    removeAllDataSource,
+    addClickEvent,
+    removeClickEvent,
+    addRightClick,
+    removeRightClickEvent
   }
 }

--
Gitblit v1.9.3