From c110295e9d7e87ec5012e37ad5ba2b38f745ccd3 Mon Sep 17 00:00:00 2001 From: jihongshun <1151753686@qq.com> Date: 星期五, 15 八月 2025 15:40:08 +0800 Subject: [PATCH] 优化线的逻辑 --- src/utils/components/init-map.vue | 232 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 219 insertions(+), 13 deletions(-) diff --git a/src/utils/components/init-map.vue b/src/utils/components/init-map.vue index 245944d..09fcf3b 100644 --- a/src/utils/components/init-map.vue +++ b/src/utils/components/init-map.vue @@ -27,11 +27,13 @@ </div> <!-- 宸︿笅瑙掑�嶇巼淇℃伅 --> - <div class="zoom-info"> - <el-tag type="success">鍊嶇巼: {{ zoomRatio.toFixed(1) }}X</el-tag> - </div> + </div> - + <div class="zoom-info"> + <el-tag type="success">鍊嶇巼: {{ zoomRatio.toFixed(1) }}X</el-tag><br> + <el-tag type="success">璺濈: {{ betweenDistance.toFixed(1) }}绫�</el-tag><br> + <el-tag type="success">P: {{ cameraP }} T: {{ cameraT }} </el-tag> + </div> <!-- botton --> @@ -172,7 +174,13 @@ 14: '14X', 28: '28X', 56: '56X' - } + }, + betweenDistance:0, + cameraP:0.0, + cameraT:0.0, + pointGround: { lon: 0, lat: 0, height: 0 }, + pointFly: { lon: 0, lat: 0, height: 0 }, + rowData:null } }, mounted(){ @@ -315,6 +323,7 @@ creatPin(id, position, font, color, viewer) { let pinBuilder = new Cesium.PinBuilder(); let addPin = viewer.entities.getById(id); + console.log(addPin) if (addPin == undefined) { viewer.entities.add({ id: id, @@ -377,20 +386,41 @@ //鏇存柊閿洏浜嬩欢 _this.updateCameraMovement(); //褰撳墠閫夋嫨鐨刬d - chooseId = crypto.randomUUID() + // chooseId = crypto.randomUUID() + chooseId = _this.genId() //鍒涘缓瑙嗛敟浣� let data = { "altitude": Cesium.Cartographic.fromCartesian(tagert).height, "id": chooseId, + 'name':`绌轰腑鐐�${counter}`, "latitude": Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).latitude), "longitude": Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).longitude), } + const lookPoint = Cesium.Cartesian3.fromDegrees(longitude, latitude) + const watchPoint = Cesium.Cartesian3.fromDegrees(Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).longitude), Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).latitude)) + const betweenDistanceWatch = Cesium.Cartesian3.distance(lookPoint, watchPoint) + _this.betweenDistance = betweenDistanceWatch + console.log(lookPoint) + console.log(watchPoint) + // const guanPoint1 = Cesium.Cartesian3.fromDegrees(longitude, latitude) + console.log(viewerM.entities.getById('groundPoiId0')) //濉旂殑璺濈鍜岃娴嬬偣鐨勮窛绂� console.log(_this.deviceData) const point1 = Cesium.Cartesian3.fromDegrees(0, 0, _this.deviceData?.modelHeight || 45); + _this.pointGround = { + lon:longitude, + lat:latitude, + height:height + } // const point1 = Cesium.Cartesian3.fromDegrees(0, 0, 45); const point2 = Cesium.Cartesian3.fromDegrees(Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).longitude), Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).latitude), Cesium.Cartographic.fromCartesian(tagert).height); - + _this.pointFly = { + lon:Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).longitude), + lat:Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).latitude), + height:Cesium.Cartographic.fromCartesian(tagert).height + } + _this.createDashedLine() + _this.createBillboard() // 璁$畻璺濈锛堝崟浣嶏細绫筹級 const distanceCalculate = Cesium.Cartesian3.distance(point1, point2) data.distance = distanceCalculate @@ -400,8 +430,8 @@ setTimeout(() => { viewerC.camera.changed.addEventListener(_this.onCameraChange) }, 100); - - + //宸︿晶鏍戠粨鏋勮仈鍔� + _this.dealTree() //缁撴潫鍙抽敭鐩戝惉 createPinHandler.destroy(); //缁撴潫涓诲浘鑱斿姩楣扮溂鐩戝惉 @@ -412,6 +442,48 @@ } console.log('鍙抽敭鐐瑰嚮鐩戝惉宸插仠姝�'); }, Cesium.ScreenSpaceEventType.RIGHT_CLICK); // 鐩戝惉鍙抽敭鐐瑰嚮 + }, + createDashedLine() { + this.lineEntity = viewerM.entities.add({ + polyline: { + positions: new Cesium.CallbackProperty(() => { + return Cesium.Cartesian3.fromDegreesArrayHeights([ + this.pointGround.lon, this.pointGround.lat, this.pointGround.height, + this.pointFly.lon, this.pointFly.lat, this.pointFly.height, + ]); + }, false), + width: 3, + material: new Cesium.PolylineDashMaterialProperty({ + color: Cesium.Color.RED, + }), + }, + }); + }, + createBillboard() { + // Billboard 涓偣璁$畻 + viewerM.entities.add({ + position: new Cesium.CallbackProperty(() => { + const midLon = (this.pointGround.lon + this.pointFly.lon) / 2; + const midLat = (this.pointGround.lat + this.pointFly.lat) / 2; + const midHeight = (this.pointGround.height + this.pointFly.height) / 2; + return Cesium.Cartesian3.fromDegrees(midLon, midLat, midHeight); + }, false), + label: { + text: new Cesium.CallbackProperty(() => { + return `璺濈: ${this.betweenDistance.toFixed(1)} m\nP: ${this.cameraP}\nT:${this.cameraT}`; + }, false), + font: "16px sans-serif", + fillColor: Cesium.Color.BLACK, + outlineColor: Cesium.Color.WHITE, + outlineWidth: 2, + style: Cesium.LabelStyle.FILL_AND_OUTLINE, + verticalOrigin: Cesium.VerticalOrigin.BOTTOM, + horizontalOrigin: Cesium.HorizontalOrigin.CENTER, + pixelOffset: new Cesium.Cartesian2(0, -20), // 鍚戜笂鍋忕Щ + showBackground: true, + backgroundColor: new Cesium.Color(1, 1, 1, 0.7), + }, + }); }, azimuthtwopoi(x1, y1, x2, y2) { let result; @@ -508,6 +580,7 @@ } }, onKeyUp(event) { + console.log() //閿洏鎶捣杩涜鏇存柊宸︿晶绌轰腑鐐筽in //鑾峰彇鍙充晶鐩告満 if(rightKeyMove){ @@ -533,6 +606,32 @@ } else { groupEntity.position = position; } + //璁$畻涓や釜鐐硅窛绂� + console.log(viewerM.entities) + const groupEntityGround = viewerM.entities.getById("groundPoiId"+(counter-1)); + const groupPosition = groupEntityGround.position.getValue(Cesium.JulianDate.now()); + if (groupPosition) { + const cartographic = Cesium.Cartographic.fromCartesian(groupPosition); + const longitude = Cesium.Math.toDegrees(cartographic.longitude); + const latitude = Cesium.Math.toDegrees(cartographic.latitude); + const point1 = Cesium.Cartesian3.fromDegrees(lon, lat); + const point2 = Cesium.Cartesian3.fromDegrees(longitude, latitude); + const gure = Cesium.Cartesian3.distance(point1, point2) + this.betweenDistance = gure + } + if(this.rowData) { + this.pointGround = { + lon:this.rowData.longitude, + lat:this.rowData.latitude, + height:this.rowData.height + } + } + this.pointFly = { + lon: lon, + lat: lat, + height: height + } + this.dealTree() } const key = event.key; const lower = key.toLowerCase(); @@ -699,6 +798,46 @@ // Fly back to the initial view (home) in 1 second viewerC.camera.flyHome(1.0); }, + dealTree(){ + let allEntities = viewerM.entities.values; // 鎵�鏈夊疄浣撳璞$粍鎴愮殑鏁扮粍 + const grouped = {}; + //鎵�鏈夊疄浣撳璞$粍鎴愮殑鏁扮粍杞崲鎴愬乏渚ф爲闇�瑕佺殑鏍煎紡 + allEntities.forEach(item => { + const match = item.id.match(/(groundPoiId|aerialPoiId)(\d+)/); + if (match) { + const type = match[1]; // groundPoiId or aerialPoiId + const index = match[2]; + if (!grouped[index]) grouped[index] = {}; + grouped[index][type] = item.position; + } + }) + const result = Object.keys(grouped).map((key, idx) => { + const group = grouped[key]; + const positionGround = group.groundPoiId.getValue(Cesium.JulianDate.now()) + const positionAerialPo = group.aerialPoiId.getValue(Cesium.JulianDate.now()) + const groundPos = Cesium.Cartographic.fromCartesian(positionGround); + const aerialPos = Cesium.Cartographic.fromCartesian(positionAerialPo); + return { + id: this.genId(), + label: `鍦伴潰鐐�${idx}`, + longitude: Cesium.Math.toDegrees(groundPos.longitude), + latitude: Cesium.Math.toDegrees(groundPos.latitude), + height: groundPos.height, + children: [ + { + id: this.genId(), + label: `绌轰腑鐐�${idx}`, + longitude: Cesium.Math.toDegrees(aerialPos.longitude), + latitude: Cesium.Math.toDegrees(aerialPos.latitude), + height: aerialPos.height, + heading:Cesium.Math.toDegrees(viewerC.camera.heading), + pitch:Cesium.Math.toDegrees(viewerC.camera.pitch) + } + ] + }; + }); + this.$emit('dealTreeData',result) + }, mergePoint(){ let allEntities = viewerM.entities.values; // 鎵�鏈夊疄浣撳璞$粍鎴愮殑鏁扮粍 const grouped = {}; @@ -832,6 +971,7 @@ // viewer.scene.primitives.add(cameraVideo); let pmObj = {}; pmObj.id = data.id; + pmObj.name = data.name; pmObj.primitive = cameraVideo; viewerM.scene.primitives.add(cameraVideo); preVideoScopePrimitiveArrTie.push(pmObj); @@ -922,10 +1062,12 @@ ',' + roll.toFixed(1) + '\u00B0'; + console.log(heading) + this.cameraP = heading.toFixed(2) + this.cameraT = pitch.toFixed(2) document.getElementById('cammoveResultCon').innerHTML = camResult; // 璁$畻璺濈锛堝崟浣嶏細绫筹級 const distanceBetween = Cesium.Cartesian3.distance(point1, point2) - console.log(preVideoScopePrimitiveArrTie) preVideoScopePrimitiveArrTie.map((item)=>{ if(item.id == chooseId){ let obj = this.updateSZScope(Cesium.Math.toDegrees(position.longitude),Cesium.Math.toDegrees(position.latitude),position.height,heading,pitch,roll,this.zoomRatio,distanceBetween) @@ -973,6 +1115,70 @@ }, onSliderInput(val) { this.zoomRatio = val; + }, + // 璁$畻 heading锛堝亸鑸锛� + computeHeading(fromCartesian, toCartesian) { + const transform = Cesium.Transforms.eastNorthUpToFixedFrame(fromCartesian); + const direction = Cesium.Cartesian3.subtract( + toCartesian, + fromCartesian, + new Cesium.Cartesian3() + ); + const directionLocal = Cesium.Matrix4.multiplyByPointAsVector( + Cesium.Matrix4.inverseTransformation(transform, new Cesium.Matrix4()), + direction, + new Cesium.Cartesian3() + ); + Cesium.Cartesian3.normalize(directionLocal, directionLocal); + return Math.atan2(directionLocal.x, directionLocal.y); + }, + + // 璁$畻 pitch锛堜刊浠拌锛� + computePitch(fromCartesian, toCartesian) { + const transform = Cesium.Transforms.eastNorthUpToFixedFrame(fromCartesian); + const direction = Cesium.Cartesian3.subtract( + toCartesian, + fromCartesian, + new Cesium.Cartesian3() + ); + const directionLocal = Cesium.Matrix4.multiplyByPointAsVector( + Cesium.Matrix4.inverseTransformation(transform, new Cesium.Matrix4()), + direction, + new Cesium.Cartesian3() + ); + Cesium.Cartesian3.normalize(directionLocal, directionLocal); + return Math.asin(directionLocal.z); // z杞村悜涓� + }, + DealVisualCone(data,node){ + this.rowData = data + console.log(data) + this.pointGround = { + lon:data.children[0].longitude, + lat:data.children[0].latitude, + height:data.children[0].height + } + this.pointFly = { + lon:data.longitude, + lat:data.latitude, + height:data.height + } + if(data.children && data.children?.length > 0) { + preVideoScopePrimitiveArrTie.map((item)=>{ + if(item.name != data.children[0].label){ + item.primitive.show = false + }else{ + item.primitive.show = true + } + }) + }else { + preVideoScopePrimitiveArrTie.map((item)=>{ + if(item.name != data.label){ + item.primitive.show = false + }else { + item.primitive.show = true + } + }) + } } } } @@ -1024,7 +1230,7 @@ } .moveResult{position:absolute;z-index:2;background-color:rgba(47,53,60,1);padding:0 5px;right:50%;bottom:30px; border:1px solid rgba(255,255,255,.1);box-sizing:content-box;width:220px;height:30px;font-size:14px;text-align:center} -.cammoveResult{position:absolute;z-index:2;background-color:rgba(47,53,60,1);padding:0 5px;right:calc(50% - 40px);bottom:30px; +.cammoveResult{position:absolute;z-index:2;background-color:rgba(47,53,60,1);padding:0 5px;right:calc(50% - 140px);bottom:35px; border:1px solid rgba(255,255,255,.1);box-sizing:content-box;width:400px;height:30px;font-size:14px;text-align:center} .moveResultCon{margin-top:4px} .cammoveResultCon{margin-top:4px;color: white;} @@ -1113,8 +1319,8 @@ /* 宸︿笅瑙掑�嶇巼鏍囩 */ .zoom-info { position: absolute; - bottom: 20px; - left: 20px; + bottom: 35px; + left: 340px; } </style> -- Gitblit v1.9.3