| | |
| | | <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> |
| | | <el-button @click="fly()" 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> |
| | | |
| | | <!-- 动态坐标、动态相机参数显示 --> |
| | |
| | | let viewerM; |
| | | let viewerC; |
| | | let counter = 0; |
| | | let globalon = 125.1949 |
| | | let globalat = 46.5143 |
| | | let globalon = 0 |
| | | let globalat = 0 |
| | | let pois = [globalon, globalat,0] |
| | | let cameraVideo |
| | | let ScopeElement; //光轴、视频 |
| | | let preVideoScopePrimitiveArrTie = []; |
| | | let scratchSetViewMatrix3 = new Cesium.Matrix3(); |
| | | |
| | | // let pois = [0, 0,0] |
| | | let holdingPosition; |
| | |
| | | space: false, |
| | | }, |
| | | animationFrameId: null, |
| | | mergeNumber:null |
| | | mergeNumber:null, |
| | | activeKey: null, |
| | | timer: null, |
| | | } |
| | | }, |
| | | 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 等逻辑 |
| | | // 例如:window.registerMeasureTools(viewerM) |
| | | setTimeout(()=>{ |
| | | this.loadModel() |
| | | this.addSyncListener() |
| | | this.registerKeyboardEvents(); |
| | | |
| | | let control = viewerC.scene.screenSpaceCameraController; |
| | | control.enableRotate = false; |
| | | control.enableTranslate = false; |
| | | control.enableZoom = false; |
| | | control.enableTilt = false; |
| | | control.enableLook = false; |
| | | viewerC.scene.camera.percentageChanged = 0.05 |
| | | this.cammove_measure_point(); |
| | | },1000) |
| | | }, |
| | |
| | | |
| | | // // 关闭光照效果 |
| | | // viewer.scene.globe.enableLighting = false; // 关闭光照效果 |
| | | window.viewer = viewer; |
| | | |
| | | // viewer.imageryLayers.add(bdtvectoranoimagery); |
| | | viewer._cesiumWidget._creditContainer.style.display="none"; |
| | | return viewer; |
| | |
| | | orientation: orientations, |
| | | model: { |
| | | uri: url, |
| | | scale: 20, |
| | | shadows: Cesium.ShadowMode.DISABLED, |
| | | imageBasedLightingFactor: new Cesium.Cartesian2(1, 0.5) |
| | | } |
| | |
| | | // 存下回调以便销毁 |
| | | // this._preRenderCallback = () => this.syncViewer(); |
| | | viewerM.scene.preRender.addEventListener( this.syncViewer()); |
| | | window.addEventListener("keydown", this.handleKeydown); |
| | | }, |
| | | syncViewer(){ |
| | | console.log(viewerM.camera) |
| | |
| | | const tagert = Cesium.Cartesian3.add(holdingPosition,scalerNormalize,new Cesium.Cartesian3()); |
| | | console.log(Cesium.Cartographic.fromCartesian(tagert)) |
| | | _this.creatPin("aerialPoiId"+counter,tagert,`空${counter}`,Cesium.Color.RED,viewerM); |
| | | preVideoScopePrimitiveArrTie = [] |
| | | console.log(Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).height)) |
| | | _this.updateCameraMovement(); |
| | | if(cameraVideo){ |
| | | viewerM.scene.primitives.remove(cameraVideo) |
| | | } |
| | | //创建视锥体 |
| | | let data = { |
| | | "FHorFieldAngle": 32.13, |
| | | "FVerFieldAngle": 18.39, |
| | | "altitude": Cesium.Cartographic.fromCartesian(tagert).height, |
| | | "id": "111111", |
| | | "chanNo": 1, |
| | | "latitude": Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).latitude), |
| | | "longitude": Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).longitude), |
| | | "p": 26.8, |
| | | "t": 351.3, |
| | | "z": 1, |
| | | } |
| | | const point1 = Cesium.Cartesian3.fromDegrees(0, 0, 50); |
| | | 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); |
| | | |
| | | // 计算距离(单位:米) |
| | | const distance1 = Cesium.Cartesian3.distance(point1, point2) |
| | | console.log(distance1) |
| | | data.distance = distance1 |
| | | _this.createVideoScope(data) |
| | | setTimeout(() => { |
| | | viewerC.camera.changed.addEventListener(_this.onCameraChange) |
| | | }, 100); |
| | | |
| | | |
| | | //结束右键监听 |
| | | createPinHandler.destroy(); |
| | | //结束主图联动鹰眼监听 |
| | |
| | | } |
| | | 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; |
| | |
| | | viewerC.camera.flyHome(1.0); |
| | | }, |
| | | move_measure_point(){ |
| | | CesiumSurvey.measureMovePoint(viewerM,'moveResultCon'); |
| | | CesiumSurvey.measureMovePoint(viewerC,'moveResultCon'); |
| | | }, |
| | | cammove_measure_point(){ |
| | | CesiumSurvey.cammeasureMovePoint(viewerM,'cammoveResultCon'); |
| | | CesiumSurvey.cammeasureMovePoint(viewerC,'cammoveResultCon'); |
| | | }, |
| | | renderData(){ |
| | | this.$emit('renderData',viewerM) |
| | |
| | | ] |
| | | }; |
| | | }); |
| | | console.log(result) |
| | | this.$emit('mergePoint',result,this.mergeNumber,viewerM) |
| | | }, |
| | | genId() { |
| | |
| | | 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(){ |
| | | let data = { |
| | | "FHorFieldAngle": 32.13, |
| | | "FVerFieldAngle": 18.39, |
| | | "altitude": 55, |
| | | "cameraId": "fdae8144e0fc47cf95152080eb3f7db3", |
| | | "chanNo": 1, |
| | | "latitude": 46.58528798, |
| | | "longitude": 124.9662813, |
| | | "p": 26.8, |
| | | "t": 351.3, |
| | | "z": 1 |
| | | } |
| | | }, |
| | | // 创建初始化的光轴 |
| | | createVideoScope(data) { |
| | | console.log(data) |
| | | console.log(data.distance) |
| | | if (data == undefined) { |
| | | this.$message({ |
| | | showClose: true, |
| | | message: '暂无数据', |
| | | type: "warning", |
| | | }); |
| | | } else { |
| | | ScopeElement = this.createVideoElementOld( |
| | | "http://192.168.5.122:9998/live?port=1234&app=live&stream=mystream", |
| | | data.id, |
| | | 1.7778 |
| | | ); |
| | | // let poi = data.camPosition.split(","); |
| | | // let hight = data.pe_offset.split(","); |
| | | let positionCt3 = Cesium.Cartesian3.fromDegrees( |
| | | Number(data.longitude), |
| | | Number(data.latitude), |
| | | // Number(data.altitude) + Number(hight[1]) + 1.7 |
| | | Number(data.altitude) |
| | | ); |
| | | console.log(data) |
| | | let inverseViewMatrix = this.hpr2m({ |
| | | position: positionCt3, // 相机坐标 |
| | | // heading: Cesium.Math.toRadians(Number(120)), |
| | | // pitch: Cesium.Math.toRadians(Number(-5)), |
| | | // roll: Cesium.Math.toRadians(Number(0)), |
| | | heading: Cesium.Math.toRadians(180), |
| | | pitch: Cesium.Math.toRadians(0), |
| | | roll: Cesium.Math.toRadians(0), |
| | | }); |
| | | let frustum = new Cesium.PerspectiveFrustum({ |
| | | fov: Cesium.Math.toRadians(6), |
| | | aspectRatio: Number(1.77778), // 宽高比 |
| | | near: Number(0.05), // 设备焦距 |
| | | far: Number(data.distance), // 拍摄距离 |
| | | }); |
| | | cameraVideo = new Cesium.XbsjCameraVideo({ |
| | | inverseViewMatrix: inverseViewMatrix, |
| | | frustum: frustum, |
| | | videoElement: ScopeElement, |
| | | showHelperPrimitive: true, |
| | | }); |
| | | cameraVideo._primitive.classificationType = 2; // 同时投影地形和3dtiles数据 |
| | | cameraVideo.id = "sz" + data.id; |
| | | let isHole = false; |
| | | cameraVideo._primitive.appearance.material = new Cesium.Material({ |
| | | fabric: { |
| | | type: "Color", |
| | | uniforms: { |
| | | color: new Cesium.Color(0, 1, 0, 0.2), |
| | | }, |
| | | }, |
| | | }); |
| | | cameraVideo._helperPrimitive.geometryInstances.attributes.color = |
| | | Cesium.ColorGeometryInstanceAttribute.fromColor( |
| | | new Cesium.Color(0, 1.0, 0, 1.0) |
| | | ); |
| | | // viewer.scene.primitives.add(cameraVideo); |
| | | let pmObj = {}; |
| | | console.log(data) |
| | | pmObj.id = "sz" + data.id; |
| | | console.log(pmObj) |
| | | pmObj.primitive = cameraVideo; |
| | | // pmCollection.push(pmObj);//幕布,视频转换使用 |
| | | viewerM.scene.primitives.add(cameraVideo); |
| | | preVideoScopePrimitiveArrTie.push(pmObj); |
| | | } |
| | | // } |
| | | }, |
| | | // 创建光轴下的幕布 |
| | | createVideoElementOld(videoSrc, id) { |
| | | var videoElement = document.createElement("div"); |
| | | videoElement.id = "video" + id; |
| | | videoElement.style.position = "absolute"; |
| | | videoElement.style.zIndex = "-100"; |
| | | videoElement.style.background = "green"; |
| | | document.getElementById("videoSource").appendChild(videoElement); |
| | | return videoElement; |
| | | }, |
| | | //h,p,r转matrix4 |
| | | hpr2m(obj, result) { |
| | | // const inverseViewMatrix = Cesium.Transforms.headingPitchRollToFixedFrame(position, headingPitchRoll, undefined, undefined, result); |
| | | const inverseViewMatrix = Cesium.Transforms.eastNorthUpToFixedFrame( |
| | | obj.position, |
| | | undefined, |
| | | result |
| | | ); |
| | | let rotMat = Cesium.Matrix3.fromRotationX( |
| | | Cesium.Math.PI_OVER_TWO, |
| | | scratchSetViewMatrix3 |
| | | ); |
| | | Cesium.Matrix4.multiplyByMatrix3( |
| | | inverseViewMatrix, |
| | | rotMat, |
| | | inverseViewMatrix |
| | | ); |
| | | rotMat = Cesium.Matrix3.fromRotationY( |
| | | -obj.heading, |
| | | scratchSetViewMatrix3 |
| | | ); |
| | | Cesium.Matrix4.multiplyByMatrix3( |
| | | inverseViewMatrix, |
| | | rotMat, |
| | | inverseViewMatrix |
| | | ); |
| | | |
| | | rotMat = Cesium.Matrix3.fromRotationX(obj.pitch, scratchSetViewMatrix3); |
| | | Cesium.Matrix4.multiplyByMatrix3( |
| | | inverseViewMatrix, |
| | | rotMat, |
| | | inverseViewMatrix |
| | | ); |
| | | |
| | | rotMat = Cesium.Matrix3.fromRotationZ(-obj.roll, scratchSetViewMatrix3); |
| | | Cesium.Matrix4.multiplyByMatrix3( |
| | | inverseViewMatrix, |
| | | rotMat, |
| | | inverseViewMatrix |
| | | ); |
| | | |
| | | return inverseViewMatrix; |
| | | }, |
| | | fly(){ |
| | | viewerM.scene.camera.setView({ |
| | | destination: Cesium.Cartesian3.fromDegrees(124.9662813, 46.58528798, 349.0), // 以经纬度设置位置(例如:大庆龙兴路) |
| | | orientation: { |
| | | heading: Cesium.Math.toRadians(194.65), // 方向 |
| | | pitch: Cesium.Math.toRadians(-31.43), // 俯角 |
| | | roll: 0 |
| | | } |
| | | }); |
| | | }, |
| | | onCameraChange() { |
| | | const camera = viewerC.camera; |
| | | const position = camera.positionCartographic; |
| | | const heading = Cesium.Math.toDegrees(camera.heading); |
| | | const pitch = Cesium.Math.toDegrees(camera.pitch); |
| | | const roll = Cesium.Math.toDegrees(camera.roll); |
| | | const point1 = Cesium.Cartesian3.fromDegrees(0, 0, 50); |
| | | const point2 = Cesium.Cartesian3.fromDegrees(Cesium.Math.toDegrees(position.longitude),Cesium.Math.toDegrees(position.latitude),position.height) |
| | | // 计算距离(单位:米) |
| | | const distanceBetween = Cesium.Cartesian3.distance(point1, point2) |
| | | console.log(distanceBetween) |
| | | if(preVideoScopePrimitiveArrTie?.length !=0 ){ |
| | | let obj = this.updateSZScope(Cesium.Math.toDegrees(position.longitude),Cesium.Math.toDegrees(position.latitude),position.height,heading,pitch,roll,1,distanceBetween) |
| | | preVideoScopePrimitiveArrTie[0].primitive.inverseViewMatrix = obj.M |
| | | preVideoScopePrimitiveArrTie[0].primitive.frustum = obj.F |
| | | } |
| | | }, |
| | | //更新视椎体位置 |
| | | updateSZScope(lon, lat, alt, camHeading, camPitch, camRoll, LightView,distanceBetween) { |
| | | let positionCt3 = Cesium.Cartesian3.fromDegrees( |
| | | Number(lon), |
| | | Number(lat), |
| | | Number(alt) |
| | | ); |
| | | console.log(positionCt3) |
| | | console.log(distanceBetween) |
| | | let frustum = new Cesium.PerspectiveFrustum({ |
| | | fov: Cesium.Math.toRadians(LightView), |
| | | aspectRatio: Number(1.77778), |
| | | near: Number(0.05), |
| | | far: Number(distanceBetween), |
| | | }); |
| | | console.log(frustum) |
| | | let inverseViewMatrixNew = this.hpr2m({ |
| | | position: positionCt3, |
| | | heading: Cesium.Math.toRadians(Number(camHeading)), |
| | | pitch: Cesium.Math.toRadians(Number(camPitch)), |
| | | roll: Cesium.Math.toRadians(Number(camRoll)), |
| | | }); |
| | | console.log(inverseViewMatrixNew) |
| | | return {M: inverseViewMatrixNew, F: frustum}; |
| | | }, |
| | | } |
| | | } |
| | | </script> |
| | |
| | | .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> |