From cee560775962d3141360e5297126abbcca8e58fb Mon Sep 17 00:00:00 2001
From: jihongshun <1151753686@qq.com>
Date: 星期三, 23 七月 2025 10:27:55 +0800
Subject: [PATCH] 创建模板优化键盘功能

---
 src/utils/components/init-map.vue |  331 +++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 247 insertions(+), 84 deletions(-)

diff --git a/src/utils/components/init-map.vue b/src/utils/components/init-map.vue
index f26094c..3442bf7 100644
--- a/src/utils/components/init-map.vue
+++ b/src/utils/components/init-map.vue
@@ -8,11 +8,63 @@
     <div class="cesiumBotton">
       <div class="cesiumButtonGroup">
         <el-button id="groundPoi" @click="addGroundPoi()" type="primary">鍦伴潰鐐�</el-button>
-        <el-button id="groundPoi" @click="addGroundPoi()" type="primary">绌轰腑鐐�</el-button>
-        <el-button id="groundPoi" @click="addGroundPoi()" type="primary">鍋滅暀鏃堕棿</el-button>
+        <!-- <el-button id="groundPoi" @click="addGroundPoi()" type="primary">鍋滅暀鏃堕棿</el-button> -->
         <el-input v-model="mergeNumber" placeholder="璇疯緭鍏ュ悎骞惰寖鍥�" type="number" style="width: 150px;"></el-input>
         <el-button  @click="mergePoint()" type="success">鍚堝苟</el-button>
+        <el-button  @click="renderData()" type="success">鏁版嵁娓叉煋</el-button>
+        <!-- <el-button  @click="VisualCone()" type="success">鐢熸垚瑙嗛敟浣�</el-button> -->
 
+      </div>
+      <div class="key-container">
+        <div class="arrow-row">
+          <div
+              class="arrow"
+              :class="{ active: activeKey === 'w' }"
+            >W</div>
+          </div>
+          <div class="key-row">
+            <div
+              class="key"
+              :class="{ active: activeKey === 'a' }"
+              @mousedown="handleClick('a')"
+            >A</div>
+            <div
+              class="key"
+              :class="{ active: activeKey === 's' }"
+              @mousedown="handleClick('s')"
+            >S</div>
+            <div
+              class="key"
+              :class="{ active: activeKey === 'd' }"
+              @mousedown="handleClick('d')"
+            >D</div>
+          </div>
+      </div>
+      <div class="key-container">
+        <div class="arrow-row">
+          <div
+              class="arrow"
+              :class="{ active: activeKey === 'ArrowUp' }"
+              @mousedown="handleClick('ArrowUp')"
+            >鈫�</div>
+          </div>
+          <div class="key-row">
+            <div
+              class="key"
+              :class="{ active: activeKey === 'ArrowLeft' }"
+              @mousedown="handleClick('ArrowLeft')"
+            >鈫�</div>
+            <div
+              class="key"
+              :class="{ active: activeKey === 'ArrowDown' }"
+              @mousedown="handleClick('ArrowDown')"
+            >鈫�</div>
+            <div
+              class="key"
+              :class="{ active: activeKey === 'ArrowRight' }"
+              @mousedown="handleClick('ArrowRight')"
+            >鈫�</div>
+          </div>
       </div>
     </div>
 
@@ -36,12 +88,23 @@
 let  viewerM;
 let  viewerC;
 let  counter = 0;
-let  pois = [125.1541, 46.5542,0] 
+let  globalon  = 0
+let  globalat = 0
+let  pois = [globalon, globalat,0] 
+
+// let  pois = [0, 0,0] 
 let holdingPosition;
 let rightKeyMove = false
-// let  pois = [125.1541, 46.5542,0] 
 let  distance = 100; 
 export default {
+  props: {
+    towerUrl: {
+      type: String,
+      default() {
+        return ''
+      }
+    },
+  },
   data(){
     return{
         moveSpeed: 1,
@@ -63,22 +126,30 @@
           space: false,
         },
         animationFrameId: null,
-        mergeNumber:null
+        mergeNumber:null,
+        activeKey: null,
+        timer: null,
+        handler: null,
+      frustumPrimitive: null,
+      selected: false,
     }
   },
   mounted(){
-    console.log('111111111111111111')
      this.initCesium();
   },
   beforeDestroy() {
+    counter = 0
     this.removeKeyboardEvents();
     if (this.animationFrameId) cancelAnimationFrame(this.animationFrameId);
+    window.removeEventListener("keydown", this.handleKeydown);
     if (viewerC) viewerC.destroy();
   },
   methods:{
     initCesium() {
       viewerM = this.initViewer(this.$refs.cesiumContainer.id);
       viewerC = this.initViewer(this.$refs.cesiumCamera.id);
+      window.viewerM = viewerM;
+      window.viewerC = viewerC;
       // 馃挕 鍦ㄨ繖閲岀户缁皟鐢� measure.js / camera.js / botton.js 绛夐�昏緫
       // 渚嬪锛歸indow.registerMeasureTools(viewerM)
       setTimeout(()=>{
@@ -108,8 +179,6 @@
     initViewer(cesiumId){
       //cesium鍏ㄧ悆30绫冲垎杈ㄧ巼鍦板舰璧勬簮token
       let imageryProvider1 = new Cesium.TileMapServiceImageryProvider({
-        // url: process.env.VUE_APP_BASE_GIS + "/daqing/dom-sea",
-        // url: process.env.VUE_APP_BASE_GIS + "/daqing/dom-sea",
         url: `https://192.168.1.2:9999/daqing/dom-sea/`,
       });
       let viewer = new Cesium.Viewer(cesiumId, {
@@ -124,6 +193,7 @@
           navigationHelpButton: false,
           navigationInstructionsInitiallyVisible: false,
           imageryProvider: imageryProvider1,
+          // imageryProvider: false,
           shadows: false,
           animation: false,
           infoBox: false,
@@ -132,14 +202,19 @@
           fullscreenButton: false,
           vrButton: false,
       });
-      window.viewer = viewer;
+       // 鍏抽棴澶╃┖鐩掓晥鏋�
+      // viewer.scene.skyAtmosphere = undefined; // 鎴栬�呰缃负 null
+      
+      // // 鍏抽棴鍏夌収鏁堟灉
+      // viewer.scene.globe.enableLighting = false; // 鍏抽棴鍏夌収鏁堟灉
+      
     //    viewer.imageryLayers.add(bdtvectoranoimagery);
       viewer._cesiumWidget._creditContainer.style.display="none";  
       return viewer;
       
     },
     loadModel(){
-      const modelUrl = 'http://192.168.1.2:9001/model/tower.glb';  // GLB妯″瀷璺緞
+      const modelUrl = this.towerUrl;  // GLB妯″瀷璺緞
        // 娌垮師鐐瑰潗鏍囧拰鍦伴潰鐐瑰潗鏍囨柟鍚戜笂閫夊彇绌轰腑鐐圭殑璺濈
       //鍒濆鍖栫浉鏈虹獥鍙h瑙掑弬鏁�
       cameraPostion = viewerM.camera.position
@@ -149,17 +224,18 @@
 
       // 璁剧疆瑙嗚锛屼娇鍏堕粯璁ゆ煡鐪嬫煇涓湴鐞嗕綅缃�
       viewerM.scene.camera.setView({
-          destination: Cesium.Cartesian3.fromDegrees(125.1511, 46.5542, 349.0), // 浠ョ粡绾害璁剧疆浣嶇疆锛堜緥濡傦細澶у簡榫欏叴璺級
+          destination: Cesium.Cartesian3.fromDegrees(globalon, globalat, 349.0), // 浠ョ粡绾害璁剧疆浣嶇疆锛堜緥濡傦細澶у簡榫欏叴璺級
+          // destination: Cesium.Cartesian3.fromDegrees(0.0005, 0.0017, 207.8), // 浠ョ粡绾害璁剧疆浣嶇疆锛堜緥濡傦細澶у簡榫欏叴璺級
           orientation: {
-              heading: Cesium.Math.toRadians(86.94),  // 鏂瑰悜
-              pitch: Cesium.Math.toRadians(-30.22), // 淇
+              heading: Cesium.Math.toRadians(194.65),  // 鏂瑰悜
+              pitch: Cesium.Math.toRadians(-31.43), // 淇
               roll: 0
           }
       });
 
       //鍒涘缓妯″瀷
       const glbModelPoi = Cesium.Cartesian3.fromDegrees(pois[0], pois[1],pois[2]);
-      const heading = Cesium.Math.toRadians(10);
+      const heading = Cesium.Math.toRadians(0);
       const pitch = Cesium.Math.toRadians(0);
       const roll = Cesium.Math.toRadians(0);
       const hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll);
@@ -174,7 +250,6 @@
             orientation: orientations,
             model: {
                 uri: url,
-                scale: 20,
                 shadows: Cesium.ShadowMode.DISABLED,
                 imageBasedLightingFactor: new Cesium.Cartesian2(1, 0.5)
             }
@@ -184,6 +259,7 @@
       // 瀛樹笅鍥炶皟浠ヤ究閿�姣�
       // this._preRenderCallback = () => this.syncViewer();
       viewerM.scene.preRender.addEventListener( this.syncViewer());
+      window.addEventListener("keydown", this.handleKeydown);
     },
     syncViewer(){
       console.log(viewerM.camera)
@@ -214,9 +290,6 @@
       }
     },
     addGroundPoi() {
-      console.log('1111111111111111')
-      console.log(new Cesium.ScreenSpaceEventHandler(viewerM.canvas))
-      console.log(this)
         let createPinHandler = new Cesium.ScreenSpaceEventHandler(viewerM.canvas);
         let _this = this
         createPinHandler.setInputAction(function (click) {
@@ -232,7 +305,6 @@
                 let lng = Cesium.Math.toDegrees(cartographic.longitude);
                 let lat = Cesium.Math.toDegrees(cartographic.latitude);
                 height = cartographic.height;
-                // camPosition = lng+','+lat+','+height;
                 console.log(lng+','+lat+','+height)
             }
 
@@ -263,45 +335,12 @@
             聽聽聽聽const scalerNormalize聽=聽Cesium.Cartesian3.multiplyByScalar(normalize,distance,new聽Cesium.Cartesian3());
                 const tagert = Cesium.Cartesian3.add(holdingPosition,scalerNormalize,new聽Cesium.Cartesian3());
                 console.log(Cesium.Cartographic.fromCartesian(tagert))
-                var airCartographic= Cesium.Cartographic.fromCartesian(tagert)
-                var airPointLongitude= Cesium.Math.toDegrees(airCartographic.longitude);
-                var airPointLatitude = Cesium.Math.toDegrees(airCartographic.latitude);
-                var airPointHeight = airCartographic.height;
                 _this.creatPin("aerialPoiId"+counter,tagert,`绌�${counter}`,Cesium.Color.RED,viewerM);
                 _this.updateCameraMovement();
-                // console.log(direction)
-                // console.log(normalize聽)
-                // console.log(longitude)
-                // console.log(latitude)
-                // console.log(pois)
-                // console.log(azimuthtwopoi(longitude,latitude,pois[0],pois[1]))
-                // let data = {
-                //   id:(Date.now().toString(16) + Math.random().toString(16).slice(2, 10)).slice(0, 16),
-                //   label:`鍦伴潰鐐�${counter}`,
-                //   longitude:longitude,
-                //   latitude:latitude,
-                //   height:height,
-                //   children:[
-                //     {
-                //       id:(Date.now().toString(16) + Math.random().toString(16).slice(2, 10)).slice(0, 16),
-                //       label:`绌轰腑鐐�${counter}`,
-                //       longitude:airPointLongitude,
-                //       latitude:airPointLatitude,
-                //       height:airPointHeight,
-                //     }
-                //   ]
-                // }
-                // _this.$emit('rightClickEnd',data)
                 //缁撴潫鍙抽敭鐩戝惉
                 createPinHandler.destroy();
                 //缁撴潫涓诲浘鑱斿姩楣扮溂鐩戝惉
                 viewerM.scene.preRender.removeEventListener(_this.syncViewer());
-                // viewerM.scene.preRender.removeEventListener(this._preRenderCallback);
-                // if (this._preRenderCallback) {
-                //   this.viewerM.scene.preRender.removeEventListener(this._preRenderCallback);
-                //   this._preRenderCallback = null;
-                // }
-                //鏇存柊鐩告満瑙嗚涓虹┖涓偣
                 _this.changeCamera(tagert,_this.azimuthtwopoi(longitude,latitude,pois[0],pois[1]));
                 rightKeyMove = true
                 counter += 1;
@@ -341,7 +380,6 @@
         });
     },
     registerKeyboardEvents() {
-      console.log('11111111111111111111111')
       window.addEventListener("keydown", this.onKeyDown);
       window.addEventListener("keyup", this.onKeyUp);
     },
@@ -401,9 +439,6 @@
         case "1":
           viewerC.scene.mode = Cesium.SceneMode.SCENE3D;
           break;
-        // case "2":
-        //   viewerC.scene.mode = Cesium.SceneMode.SCENE2D;
-        //   break;
         case "3":
           viewerC.scene.mode = Cesium.SceneMode.COLUMBUS_VIEW;
           break;
@@ -411,22 +446,16 @@
     },
     onKeyUp(event) {
       //閿洏鎶捣杩涜鏇存柊宸︿晶绌轰腑鐐筽in
-      console.log(viewerM)
-      console.log(counter)
       //鑾峰彇鍙充晶鐩告満
       if(rightKeyMove){
         const camera = viewerC.camera;
-        console.log(camera)
         const carto = Cesium.Cartographic.fromCartesian(camera.position);
-        console.log(carto)
         //鍙充晶鐩告満瑙嗚杞寲涓虹粡绾害
         const lon = Cesium.Math.toDegrees(carto.longitude);
         const lat = Cesium.Math.toDegrees(carto.latitude);
         const height = carto.height;
         const position = Cesium.Cartesian3.fromDegrees(lon, lat, height)
-        console.log(position)
         let pinBuilder = new Cesium.PinBuilder();
-        // const dest = this.calculateDestinationPoint(lon, lat, camera.heading, speed);
         const groupEntity = viewerM.entities.getById("aerialPoiId"+(counter-1));
         //宸︿晶鍦板浘鍚屾鏇存柊pin绌轰腑鐐逛綅缃�
         if (groupEntity == undefined) {
@@ -501,6 +530,7 @@
       }
     },
     updateCameraMovement() {
+      console.log('111111111111111111111111111111111111111111')
       const camera = viewerC.camera;
       // Adjust speed by modifiers
       let currentSpeed = this.moveSpeed;
@@ -521,17 +551,8 @@
       let rotSpeed = 1;
       if (this.keyState.shift) rotSpeed *= this.speedMultiplier;
       if (this.keyState.ctrl) rotSpeed *= this.slowMultiplier;
-      const multiplyByScalarrotateAmount = Cesium.Math.toRadians(0.5 * rotSpeed);
-
-      // if (this.keyState.up) camera.lookUp(rotateAmount);
-      // if (this.keyState.down) camera.lookDown(rotateAmount);
-      // if (this.keyState.left) camera.lookLeft(rotateAmount);
-      // if (this.keyState.right) camera.lookRight(rotateAmount);
       if (holdingPosition) {
-          // const groupPosition  = groupEntity.position.getValue(Cesium.JulianDate.now());
-          // console.log(groupPosition)
           const distance = Cesium.Cartesian3.distance(holdingPosition, camera.position);
-
           const surroundSpeed = 0.005; //鐜粫閫熷害,瑙掑害
           let cameraHeading = camera.heading;
           let cameraPitch = camera.pitch;
@@ -548,9 +569,8 @@
           if (this.keyState.right) camera.lookRight(rotateAmount);
       }
       this.resetRoll();
-
       // Schedule next frame
-      this.animationFrameId = requestAnimationFrame(this.updateCameraMovement);
+      // this.animationFrameId = requestAnimationFrame(this.updateCameraMovement);
     }, 
     calculateDestinationPoint(lon1, lat1, bearing, distance, radius = 6371000) {
       const toRad = (d) => d * Math.PI / 180;
@@ -573,9 +593,7 @@
 
       return { lon: toDeg(lon2Norm), lat: toDeg(lat2Rad) };
     },
-
     uavMoveForward(speed) {
-      console.log('11111' +speed)
       const camera = viewerC.camera;
       const carto = Cesium.Cartographic.fromCartesian(camera.position);
       const lon = Cesium.Math.toDegrees(carto.longitude);
@@ -626,15 +644,11 @@
     cammove_measure_point(){
       CesiumSurvey.cammeasureMovePoint(viewerM,'cammoveResultCon');
     },
+    renderData(){
+        this.$emit('renderData',viewerM)
+    },
     mergePoint(){
       let allEntities = viewerM.entities.values; // 鎵�鏈夊疄浣撳璞$粍鎴愮殑鏁扮粍
-      console.log(allEntities)
-      allEntities.forEach(entity => {
-        console.log('ID:', entity.id);
-        console.log('Position:', entity.position ? entity.position.getValue(Cesium.JulianDate.now()) : null);
-        console.log('Name:', entity.name);
-        console.log('Properties:', entity.properties); // 鑷畾涔夊睘鎬�
-      });
       const grouped = {};
       //鎵�鏈夊疄浣撳璞$粍鎴愮殑鏁扮粍杞崲鎴愬乏渚ф爲闇�瑕佺殑鏍煎紡
       allEntities.forEach(item => {
@@ -669,7 +683,6 @@
           ]
         };
       });
-      console.log(result)
       this.$emit('mergePoint',result,this.mergeNumber,viewerM)
     },
     genId() {
@@ -683,7 +696,114 @@
         latitude: Cesium.Math.toDegrees(cartographic.latitude),
         height: cartographic.height
       };
-    }
+    },
+    handleClick(key) {
+      this.triggerKey(key);
+    },
+    triggerKey(key) {
+      this.activeKey = key;
+      clearTimeout(this.timer);
+      this.timer = setTimeout(() => {
+        this.activeKey = null;
+      }, 200);
+
+      // 鑷畾涔夊姩浣滆Е鍙�
+      console.log("Key triggered:", key);
+      // 杩欓噷鍙互鍙戝嚭浜嬩欢鎴栬皟鐢ㄥ叾瀹冩柟娉�
+    },
+    handleKeydown(e) {
+      const key = e.key;
+      console.log(key)
+      const validKeys = ["a", "s", "d", "w",'q','e','ArrowUp','ArrowDown','ArrowLeft','ArrowRight','q','e'];
+      if (validKeys.includes(key)) {
+        this.triggerKey(key);
+      }
+      this.updateCameraMovement()
+    },
+    VisualCone(){
+      this.addFrustum();
+      this.initDragHandler();
+    },
+    addFrustum() {
+      // 鍒涘缓涓�涓� PerspectiveFrustum
+      const frustum = new Cesium.PerspectiveFrustum({
+        fov: Cesium.Math.PI_OVER_THREE,
+        aspectRatio: 1.0,
+        near: 1.0,
+        far: 500.0,
+      });
+
+      // 璁剧疆鐭╅樀浣嶇疆
+      const position = Cesium.Cartesian3.fromDegrees(110.0, 30.0, 100.0);
+      const direction = Cesium.Cartesian3.normalize(
+        new Cesium.Cartesian3(1.0, 0.0, -1.0),
+        new Cesium.Cartesian3()
+      );
+      const up = Cesium.Cartesian3.UNIT_Z;
+      const right = Cesium.Cartesian3.cross(direction, up, new Cesium.Cartesian3());
+      const rotation = Cesium.Matrix3.setColumns(
+        new Cesium.Matrix3(),
+        right,
+        up,
+        Cesium.Cartesian3.negate(direction, new Cesium.Cartesian3())
+      );
+
+      const modelMatrix = Cesium.Matrix4.fromRotationTranslation(rotation, position);
+
+      this.frustumPrimitive = this.viewer.scene.primitives.add(
+        new Cesium.DebugCameraPrimitive({
+          frustum,
+          modelMatrix,
+          color: Cesium.Color.LIME.withAlpha(0.5),
+        })
+      );
+    },
+
+    initDragHandler() {
+      const scene = viewerM.scene;
+      const canvas = scene.canvas;
+      this.handler = new Cesium.ScreenSpaceEventHandler(canvas);
+
+      let isDragging = false;
+      let lastPosition = null;
+
+      this.handler.setInputAction((movement) => {
+        const pickedObject = scene.pick(movement.position);
+        if (pickedObject && pickedObject.primitive === this.frustumPrimitive) {
+          this.selected = true;
+          isDragging = true;
+          lastPosition = movement.position;
+        } else {
+          this.selected = false;
+        }
+      }, Cesium.ScreenSpaceEventType.LEFT_DOWN);
+
+      this.handler.setInputAction((movement) => {
+        if (isDragging && this.selected) {
+          const start = scene.pickPosition(lastPosition);
+          const end = scene.pickPosition(movement.endPosition);
+          if (start && end) {
+            const delta = Cesium.Cartesian3.subtract(
+              end,
+              start,
+              new Cesium.Cartesian3()
+            );
+            const newMatrix = Cesium.Matrix4.multiplyByTranslation(
+              this.frustumPrimitive.modelMatrix,
+              delta,
+              new Cesium.Matrix4()
+            );
+            this.frustumPrimitive.modelMatrix = newMatrix;
+            lastPosition = movement.endPosition;
+          }
+        }
+      }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+
+      this.handler.setInputAction(() => {
+        isDragging = false;
+        lastPosition = null;
+      }, Cesium.ScreenSpaceEventType.LEFT_UP);
+    },
   }
 }
 </script>
@@ -738,3 +858,46 @@
 .box_rb{width:10px;height:10px;position:absolute;border-bottom:2px solid #00d3e7;border-right:2px solid #00d3e7;right:0px;bottom:0px;}
 .box_lb{width:10px;height:10px;position:absolute;border-bottom:2px solid #00d3e7;border-left:2px solid #00d3e7;left:0px;bottom:0px;}
 </style>
+
+<style scoped>
+.key-container {
+  display: inline-block;
+  background-color: rgba(0, 0, 0, 0.7);
+  padding: 8px 10px;
+  border-radius: 10px;
+  color: white;
+  font-family: sans-serif;
+  margin-top: 55px;
+}
+
+.arrow-row{
+  display: flex;
+  justify-content: center;
+  margin-bottom: 4px;
+}
+.key-row {
+  display: flex;
+  justify-content: space-between;
+  margin-bottom: 4px;
+}
+
+.arrow,
+.key {
+  width: 30px;
+  height: 30px;
+  margin: 0 2px;
+  background-color: #333;
+  border-radius: 4px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  font-weight: bold;
+  transition: background-color 0.2s;
+  cursor: pointer;
+}
+
+.arrow.active,
+.key.active {
+  background-color: #00aaff;
+}
+</style>
\ No newline at end of file

--
Gitblit v1.9.3