| | |
| | | |
| | | </div> |
| | | <div class="zoom-info"> |
| | | <el-tag type="success">倍率: {{ zoomRatio.toFixed(1) }}X</el-tag><br> |
| | | <!-- <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> |
| | | <el-tag type="success">P: {{ cameraP }} T: {{ cameraT }} </el-tag> --> |
| | | <el-button type="primary" plain @click="doAction(chooseItem, '悬停')">悬停</el-button></br> |
| | | <el-button type="success" plain @click="doAction(chooseItem, '拍照')">拍照</el-button></br> |
| | | <el-button type="info" plain @click="doAction(chooseItem, '开始录像')">开始录像</el-button></br> |
| | | <el-button type="info" plain @click="doAction(chooseItem, '结束录像')">结束录像</el-button> |
| | | </div> |
| | | |
| | | |
| | | <!-- botton --> |
| | | <div class="cesiumBotton"> |
| | | <div class="cesiumButtonGroup"> |
| | | <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> |
| | | <div class="cesiumContent"> |
| | | <div class="flyAction"> |
| | | <div class="actionName">{{currentAction ?currentAction.type :'' }}</div> |
| | | <i class="el-icon-delete" /> |
| | | </div> |
| | | <div class="flayDataAll"> |
| | | <div class="flyData"> |
| | | <div v-if="currentAction && (currentAction.type == '悬停')"> |
| | | <div>暂停时间</div> |
| | | <div class="stopContent"> |
| | | <!-- 减按钮 --> |
| | | <el-button size="mini" @click="changeTime(-100)" type="info">-100</el-button> |
| | | <el-button size="mini" @click="changeTime(-10)" type="info">-10</el-button> |
| | | <el-button size="mini" @click="changeTime(-1)" type="info">-1</el-button> |
| | | <!-- 可编辑数字 --> |
| | | <div class="stopNumber"> |
| | | <el-input-number |
| | | v-model="time" |
| | | :min="0" |
| | | :controls="false" |
| | | style="margin: 0 15px; width: 60px;" |
| | | @change="onChange" |
| | | class="custom-input" |
| | | > |
| | | </el-input-number> |
| | | <span style="margin-left: -10px;">s</span> |
| | | </div> |
| | | <!-- 加按钮 --> |
| | | <el-button size="mini" @click="changeTime(1)" type="info">+1</el-button> |
| | | <el-button size="mini" @click="changeTime(10)" type="info">+10</el-button> |
| | | <el-button size="mini" @click="changeTime(100)" type="info">+100</el-button> |
| | | </div> |
| | | </div> |
| | | <div v-if="currentAction && (currentAction.type == '拍照')"> |
| | | <div v-if="!isEditingPhoto" class="editable-text"> |
| | | {{ takePhoto }} |
| | | <i class="el-icon-edit" @click.stop="startEditing"/> |
| | | </div> |
| | | <div v-else > |
| | | <div class="editable-container"> |
| | | <input |
| | | v-model="newTakePhoto" |
| | | type="text" |
| | | class="editable-input" |
| | | autofocus |
| | | /> |
| | | </div> |
| | | <button @click.stop="validateInput" class="validate-btn">✔</button> |
| | | <button @click.stop="cancelEditing" class="cancel-btn">✖</button> |
| | | </div> |
| | | </div> |
| | | <div v-if="currentAction && (currentAction.type == '开始录像')"> |
| | | <div v-if="!isEditingVideo" class="editable-text"> |
| | | {{ takeVideo }} |
| | | <i class="el-icon-edit" @click.stop="startEditingVideo"/> |
| | | </div> |
| | | <div v-else > |
| | | <div class="editable-container"> |
| | | <input |
| | | v-model="newTakeVideo" |
| | | type="text" |
| | | class="editable-input" |
| | | autofocus |
| | | /> |
| | | </div> |
| | | <button @click.stop="validateVideoInput" class="validate-btn">✔</button> |
| | | <button @click.stop="cancelVideoEditing" class="cancel-btn">✖</button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | </div> |
| | | |
| | | <!-- <div class="key-container"> |
| | | <div class="arrow-row"> |
| | | <div |
| | |
| | | </div> |
| | | </div> --> |
| | | </div> |
| | | |
| | | <el-button id="groundPoi" class="groundPoi" @click="addGroundPoi()" type="info" plain >地面点</el-button> |
| | | <div class="cesiumButtonGroup"> |
| | | <el-input v-model="mergeNumber" placeholder="合并范围" type="number" style="width: 120px;"></el-input> |
| | | <el-button @click="mergePoint()" type="success">合并</el-button> |
| | | </div> |
| | | <!-- 动态坐标、动态相机参数显示 --> |
| | | <!-- <div id="moveResult" class="moveResult"> |
| | | <div id="moveResultCon" class="moveResultCon"></div> |
| | |
| | | deviceData: { |
| | | type: Object, |
| | | }, |
| | | chooseItem:{ |
| | | type: Object |
| | | } |
| | | }, |
| | | data(){ |
| | | return{ |
| | |
| | | cameraT:0.0, |
| | | pointGround: { lon: 0, lat: 0, height: 0 }, |
| | | pointFly: { lon: 0, lat: 0, height: 0 }, |
| | | rowData:null, |
| | | time: 10, |
| | | takePhoto: '111', // 初始数据 |
| | | newTakePhoto: '', // 编辑时的新数据 |
| | | isEditingPhoto: false, // 控制是否处于编辑状态 |
| | | takeVideo: '111', // 初始数据 |
| | | newTakeVideo: '', // 编辑时的新数据 |
| | | isEditingVideo: false, // 控制是否处于编辑状态 |
| | | actionCounter:0, |
| | | currentAction:null |
| | | } |
| | | }, |
| | | mounted(){ |
| | |
| | | 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, |
| | |
| | | window.addEventListener("keydown", this.onKeyDown); |
| | | window.addEventListener("keyup", this.onKeyUp); |
| | | }, |
| | | removeKeyboardEvents() { |
| | | removeKeyboaardEvents() { |
| | | window.removeEventListener("keydown", this.onKeyDown); |
| | | window.removeEventListener("keyup", this.onKeyUp); |
| | | }, |
| | |
| | | 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, |
| | |
| | | label: `空中点${idx}`, |
| | | longitude: Cesium.Math.toDegrees(aerialPos.longitude), |
| | | latitude: Cesium.Math.toDegrees(aerialPos.latitude), |
| | | height: aerialPos.height |
| | | height: aerialPos.height, |
| | | heading:Cesium.Math.toDegrees(viewerC.camera.heading), |
| | | pitch:Cesium.Math.toDegrees(viewerC.camera.pitch) |
| | | } |
| | | ] |
| | | }; |
| | |
| | | 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){ |
| | |
| | | } |
| | | }) |
| | | } |
| | | } |
| | | }, |
| | | editAction(action){ |
| | | // 点击左侧小图标,右侧切换到该 action |
| | | this.currentAction = action; |
| | | console.log(action) |
| | | console.log(this.currentAction) |
| | | if(action.type == '悬停') { |
| | | this.time = action.extra.value |
| | | } else if(action.type == '拍照'){ |
| | | this.takePhoto = action.extra.value |
| | | }else if(action.type == '开始录像'){ |
| | | this.takeVideo = action.extra.value |
| | | }else if(action.type == '结束录像'){ |
| | | } |
| | | }, |
| | | changeTime(val) { |
| | | this.time += val; |
| | | if (this.time < 0) this.time = 0; // 最小值限制 |
| | | this.currentAction.extra.value = this.time |
| | | console.log(this.currentAction) |
| | | }, |
| | | onChange(value) { |
| | | if (value < 0) this.time = 0; |
| | | }, |
| | | startEditing() { |
| | | this.newTakePhoto = this.takePhoto; // 进入编辑时,保存当前的值 |
| | | this.isEditingPhoto = true; |
| | | window.removeEventListener("keydown", this.onKeyDown); |
| | | window.removeEventListener("keyup", this.onKeyUp); |
| | | }, |
| | | validateInput() { |
| | | console.log(this.newTakePhoto) |
| | | this.takePhoto = this.newTakePhoto; // 点击对号时,更新数据 |
| | | this.isEditingPhoto = false; // 结束编辑 |
| | | this.currentAction.extra.value = this.newTakePhoto |
| | | }, |
| | | cancelEditing() { |
| | | this.newTakePhoto = this.takePhoto; // 点击取消时,恢复原数据 |
| | | this.isEditingPhoto = false; // 结束编辑 |
| | | }, |
| | | startEditingVideo() { |
| | | this.newTakeVideo = this.takeVideo; // 进入编辑时,保存当前的值 |
| | | this.isEditingVideo = true; |
| | | }, |
| | | validateVideoInput() { |
| | | this.takeVideo = this.newTakeVideo; // 点击对号时,更新数据 |
| | | this.isEditingVideo = false; // 结束编辑 |
| | | this.currentAction.extra.value = this.newTakeVideo |
| | | }, |
| | | cancelVideoEditing() { |
| | | this.newTakeVideo = this.takeVideo; // 点击取消时,恢复原数据 |
| | | this.isEditingVideo = false; // 结束编辑 |
| | | }, |
| | | doAction(point, type){ |
| | | this.actionCounter++; |
| | | let action = { |
| | | id: this.actionCounter, |
| | | type, |
| | | extra: {} |
| | | }; |
| | | if(type == '悬停') { |
| | | action.extra.value = this.time |
| | | } else if(type == '拍照'){ |
| | | action.extra.value = this.newTakePhoto |
| | | }else if(type == '开始录像'){ |
| | | action.extra.value = this.newTakeVideo |
| | | }else if(type == '结束录像'){ |
| | | action.extra.value = 'stopVideo' |
| | | } |
| | | console.log(action) |
| | | point.actions.push(action); |
| | | console.log(point) |
| | | this.$emit('dealAction',point) |
| | | this.time = 10 |
| | | this.newTakePhoto = '111' |
| | | this.newTakeVideo = '111' |
| | | this.takeVideo = '111' |
| | | this.takePhoto = '111' |
| | | // 切换到右侧 |
| | | this.currentAction = action; |
| | | }, |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | |
| | | |
| | | .cesium-example{ |
| | | height: calc(100vh - 185px); |
| | | /* height: calc(100vh - 185px); */ |
| | | height: 100%; |
| | | } |
| | | #cesiumContainer { |
| | | margin: 0; |
| | |
| | | /* padding: 0 5px; */ |
| | | right: 10px; |
| | | /* top: 0px; */ |
| | | bottom: 80px; |
| | | bottom: 30px; |
| | | margin: 0; |
| | | width: 400px; |
| | | height: 300px; |
| | |
| | | bottom: 30px; |
| | | margin: 0; |
| | | } |
| | | .cesiumContent { |
| | | position: absolute; |
| | | width: 100%; |
| | | height: calc(50% + 5px); |
| | | top:-5px; |
| | | |
| | | } |
| | | .stopContent { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | .stopContent .el-button--mini { |
| | | padding: 4px 9px; |
| | | } |
| | | .stopNumber { |
| | | flex: 1; |
| | | justify-content: center; |
| | | align-items: center; |
| | | margin: 0 4px; |
| | | display: flex |
| | | } |
| | | .stopNumber .el-input .el-input--medium .el-input--medium .el-input__inner { |
| | | height: 28px!important; |
| | | line-height: 28px!important; |
| | | |
| | | } |
| | | .flyAction{ |
| | | height: 55px; |
| | | line-height: 55px; |
| | | background-color: #232323; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | border-bottom: 1px solid #ddd; |
| | | } |
| | | .actionName { |
| | | margin-left: 20px; |
| | | font-size: 14px; |
| | | color: white; |
| | | } |
| | | .flyAction i { |
| | | font-size: 18px; |
| | | line-height: 55px; |
| | | margin-right: 20px; |
| | | } |
| | | .flayDataAll { |
| | | background-color:#232323; |
| | | /* height: calc(100% - 55px); */ |
| | | height: calc(100% - 5px); |
| | | width: 100%; |
| | | } |
| | | .flyData{ |
| | | width: calc(100% - 32px); |
| | | /* height: calc(100% - 55px); */ |
| | | height: calc(100% - 5px); |
| | | margin: auto; |
| | | color: white; |
| | | } |
| | | .cesiumButtonGroup{ |
| | | position: absolute; |
| | | bottom: 0; |
| | | top: 15px; |
| | | left: 100px; |
| | | /* margin-top: 10px; |
| | | margin-left: 10px; */ |
| | | } |
| | | .groundPoi { |
| | | position: absolute; |
| | | top: 15px; |
| | | left: 350px; |
| | | } |
| | | .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} |
| | |
| | | font-family: sans-serif; |
| | | margin-top: 55px; |
| | | } |
| | | |
| | | .el-icon-delete { |
| | | cursor: pointer; /* 添加鼠标悬停时的小手效果 */ |
| | | } |
| | | .arrow-row{ |
| | | display: flex; |
| | | justify-content: center; |
| | |
| | | height: 300px; |
| | | position: absolute; |
| | | right: 10px; |
| | | bottom:80px; |
| | | bottom:30px; |
| | | /* background-color: red; */ |
| | | z-index: 9; |
| | | |
| | |
| | | .el-slider.is-vertical .el-slider__marks-text{ |
| | | width: 30px!important; |
| | | } |
| | | </style> |
| | | <style> |
| | | .custom-input .el-input__inner { |
| | | height: 28px; |
| | | line-height:28px; |
| | | } |
| | | </style> |
| | | <style scoped> |
| | | .editable-text { |
| | | display: flex; |
| | | align-items: center; |
| | | cursor: pointer; |
| | | font-size: 16px; |
| | | color: #fff; |
| | | background-color: #333; |
| | | padding: 8px; |
| | | border-radius: 5px; |
| | | } |
| | | .editable-text .el-icon-edit { |
| | | position: absolute; |
| | | right: 30px; |
| | | } |
| | | .edit-icon { |
| | | margin-left: 10px; |
| | | font-size: 20px; |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .editable-container { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .editable-input { |
| | | font-size: 16px; |
| | | padding: 5px; |
| | | border: 1px solid #ccc; |
| | | margin-right: 5px; |
| | | border-radius: 5px; |
| | | } |
| | | |
| | | .validate-btn, .cancel-btn { |
| | | background-color: transparent; |
| | | border: none; |
| | | color: #fff; |
| | | font-size: 20px; |
| | | cursor: pointer; |
| | | margin-left: 5px; |
| | | } |
| | | |
| | | .validate-btn { |
| | | color: green; |
| | | } |
| | | |
| | | .cancel-btn { |
| | | color: red; |
| | | } |
| | | </style> |