¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from '@/utils/request'; |
| | | |
| | | // æ°å¢ææèªçº¿æ¨¡ç |
| | | export function addPoint(data) { |
| | | return request({ |
| | | url: '/tower/point', |
| | | method: 'post', |
| | | data: data |
| | | }); |
| | | } |
| | |
| | | border: none; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | </style> |
| | | <style> |
| | | .cesium-viewer-bottom{ |
| | | display: none; |
| | | } |
| | | </style> |
| | |
| | | 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 pois = [0, 0,0] |
| | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="showMap ? 12 : 24" :xs="24"> |
| | | <AppTable ref="AppTable" selection :showDeptSearch="false" :url="'tower/device/list'" :tableColumns="tableColumns" |
| | | :tableFilter="tableFilter" @clickRow="clickRow"> |
| | | :tableFilter="tableFilter"> |
| | | <template #operatorBox="{ row }"> |
| | | <el-button type="primary" plain icon="el-icon-plus" size="mini" |
| | | @click="handleAdd">æ°å¢è®¾å¤</el-button> |
| | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="showMap ? 12 : 24" :xs="24"> |
| | | <AppTable ref="AppTable" selection :showDeptSearch="false" :url="'tower/model/list'" :tableColumns="tableColumns" |
| | | :tableFilter="tableFilter" @clickRow="clickRow"> |
| | | :tableFilter="tableFilter"> |
| | | <template #operatorBox="{ row }"> |
| | | <el-button type="primary" plain icon="el-icon-plus" size="mini" |
| | | @click="handleAdd">æ°å¢æ¨¡å</el-button> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div> |
| | | <el-dialog |
| | | title="æ°å»ºé¡¹ç®" |
| | | :visible="dialogVisible" |
| | | append-to-body |
| | | fullscreen |
| | | :before-close="handleClose"> |
| | | <el-row :gutter="6"> |
| | | <el-col :span=6> |
| | | <el-card class="noScroll"> |
| | | <div class="chooseModel"> |
| | | <!-- <el-button type="primary" @click='chooseModel'>æ·»å 设å¤</el-button> --> |
| | | <div class="fontJust">设å¤å表</div> |
| | | <el-button @click="addDevice"> æ°å¢</el-button> |
| | | <el-table |
| | | :data="tableData" |
| | | max-height = '180' |
| | | style="width: 100%"> |
| | | <el-table-column |
| | | prop="deviceName" |
| | | label="设å¤åç§°" |
| | | width="150"> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="muban" |
| | | label="模æ¿" |
| | | width="150"> |
| | | </el-table-column> |
| | | <el-table-column |
| | | fixed="right" |
| | | label="æä½" |
| | | width="100"> |
| | | <template slot-scope="scope"> |
| | | <el-button type="text" size="small" @click="flyToLocal(scope.row)">å®ä½</el-button> |
| | | <el-button type="text" size="small" @click="deleteData(scope.row)">ç§»é¤</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | </el-card> |
| | | <el-card > |
| | | <div class="chooseModelTree"> |
| | | <!-- <el-button type="primary" @click='chooseModel'>æ·»å 设å¤</el-button> --> |
| | | <div class="fontJust">å·¡æ£ç¹ç®å½</div> |
| | | <el-tree |
| | | class="filter-tree" |
| | | :data="treeData" |
| | | :props="defaultProps" |
| | | draggable |
| | | default-expand-all |
| | | ref="tree"> |
| | | </el-tree> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span=18> |
| | | <CesiumMap ></CesiumMap> |
| | | </el-col> |
| | | </el-row> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="handleClose">å æ¶</el-button> |
| | | <el-button type="primary" @click="submit()" >çæèªçº¿ä»»å¡</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | <chooseDeviceDialog v-if="showModel" @cancel ='cancel' @dealChooseArr="dealChooseArr" ></chooseDeviceDialog> |
| | | </div> |
| | | </template> |
| | | <script> |
| | | import CesiumMap from "../../../../utils/components/cesium-map.vue"; |
| | | import chooseDeviceDialog from './chooseDeviceDialog.vue'; |
| | | export default{ |
| | | components: { |
| | | CesiumMap, |
| | | chooseDeviceDialog |
| | | }, |
| | | data(){ |
| | | return{ |
| | | dialogVisible :true, |
| | | tableData: [], |
| | | treeData:[], |
| | | defaultProps: { |
| | | children: 'children', |
| | | label: 'label' |
| | | }, |
| | | showModel:false, |
| | | multipleSelection: [] |
| | | } |
| | | }, |
| | | methods:{ |
| | | handleClose(){ |
| | | console.log("close") |
| | | this.dialogVisible = false |
| | | this.$emit('close') |
| | | }, |
| | | flyToLocal(row){ |
| | | console.log(row) |
| | | console.log(viewer) |
| | | const position = Cesium.Cartesian3.fromDegrees(row.longitude,row.latitude, row.altitude); |
| | | |
| | | // è®¾ç½®æ¨¡åæ¹åï¼å¯éï¼ |
| | | const heading = Cesium.Math.toRadians(row.face); // æä¸åæ¹å |
| | | const pitch = 0; |
| | | const roll = 0; |
| | | const orientation = Cesium.Transforms.headingPitchRollQuaternion( |
| | | position, |
| | | new Cesium.HeadingPitchRoll(heading, pitch, roll) |
| | | ); |
| | | |
| | | // å è½½ glTF 模å |
| | | const entity = viewer.entities.add({ |
| | | name: row.id, |
| | | position: position, |
| | | orientation: orientation, |
| | | model: { |
| | | uri: "http://192.168.1.5:9000/tower/2025/07/01/tower_20250701145739A004.glb", // æ¿æ¢æä½ çæ¨¡åè·¯å¾ |
| | | scale: 1000, |
| | | }, |
| | | }); |
| | | console.log(entity) |
| | | // é£è¡å°æ¨¡åä½ç½® |
| | | viewer.flyTo(entity) |
| | | }, |
| | | addDevice(){ |
| | | this.showModel = true |
| | | }, |
| | | cancel(){ |
| | | this.showModel = false |
| | | }, |
| | | hasSameId(array1, array2) { |
| | | const ids1 = new Set(array1.map(item => item.id)); |
| | | const ids2 = new Set(array2.map(item => item.id)); |
| | | return ids1.size !== [...ids1].filter(id => ids2.has(id)).length; |
| | | }, |
| | | dealChooseArr(arr){ |
| | | if(this.tableData?.length == 0 ){ |
| | | this.tableData = arr |
| | | }else { |
| | | const hasSameId = arr.filter(obj1 => |
| | | this.tableData.some(obj2 => obj1.id === obj2.id) |
| | | ); |
| | | if(hasSameId?.length != 0){ |
| | | return this.$message({ |
| | | message: 'éæ©è®¾å¤æ°æ®åå·²ææ°æ®éå¤', |
| | | type: 'warning' |
| | | }) |
| | | } |
| | | this.tableData = this.tableData.concat(arr) |
| | | } |
| | | const dealTreeData =this.dealTee() |
| | | this.treeData = dealTreeData |
| | | console.log(this.treeData) |
| | | }, |
| | | dealTee(){ |
| | | return this.tableData.map(item => ({ |
| | | ...item, |
| | | label: item.deviceName, |
| | | children: [] |
| | | })); |
| | | }, |
| | | deleteData(row){ |
| | | // æ¾å° id 为 "1" çå
ç´ ç´¢å¼ |
| | | const index = this.tableData.findIndex(item => item.id === row.id); |
| | | |
| | | // 妿æ¾å°äºï¼å é¤è¯¥å
ç´ |
| | | if (index !== -1) { |
| | | this.tableData.splice(index, 1); |
| | | } |
| | | const dealTreeData = this.dealTee() |
| | | this.treeData = dealTreeData |
| | | } |
| | | } |
| | | } |
| | | |
| | | </script> |
| | | <style scoped> |
| | | .filter-tree{ |
| | | height: 365px; |
| | | width: 100%; |
| | | overflow: auto; |
| | | } |
| | | .fontJust{ |
| | | text-align: center; |
| | | } |
| | | .el-table { |
| | | height: 180px; |
| | | } |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <el-dialog |
| | | title="模åå表" |
| | | :visible.sync="dialogVisible" |
| | | @close="cancel" |
| | | width="50%"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="24" :xs="24"> |
| | | <AppTable ref="AppTable" selection :showDeptSearch="false" :url="'tower/device/list'" :tableColumns="tableColumns" @on-select-checkbox="handleSelectionChange" :showSearchBtn="false"> |
| | | </AppTable> |
| | | </el-col> |
| | | </el-row> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | <el-button type="primary" @click="submit">ç¡® å®</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | </template> |
| | | <script> |
| | | export default { |
| | | name:'chooseModelDialog', |
| | | components: { |
| | | }, |
| | | data() { |
| | | return { |
| | | dialogVisible: true, |
| | | showMap:false, |
| | | tableColumns: [ |
| | | { |
| | | label: '设å¤åç§°', |
| | | prop: 'deviceName' |
| | | }, |
| | | { |
| | | label: 'æå±çº¿è·¯', |
| | | prop: 'belongingRoute' |
| | | }, |
| | | ], |
| | | selectArr:[] |
| | | }; |
| | | }, |
| | | methods: { |
| | | cancel(){ |
| | | this.showMap = false |
| | | this.$emit('cancel') |
| | | }, |
| | | chooseRow(row){ |
| | | this.showMap = false |
| | | this.$emit('cancel') |
| | | this.$emit('getRowData',row) |
| | | }, |
| | | submit(){ |
| | | // this.selectArr |
| | | this.$emit('dealChooseArr',this.selectArr) |
| | | }, |
| | | clickRow(row){ |
| | | console.log(row) |
| | | this.showMap =true |
| | | setTimeout(()=>{ |
| | | const position = Cesium.Cartesian3.fromDegrees(0, 0, 0); |
| | | // è®¾ç½®æ¨¡åæ¹åï¼å¯éï¼ |
| | | // const heading = Cesium.Math.toRadians(135); // æä¸åæ¹å |
| | | let model = viewer.entities.getById("modelList"); |
| | | const heading = Cesium.Math.toRadians(120); // æä¸åæ¹å |
| | | const pitch = 0; |
| | | const roll = 0; |
| | | const orientation = Cesium.Transforms.headingPitchRollQuaternion( |
| | | position, |
| | | new Cesium.HeadingPitchRoll(heading, pitch, roll) |
| | | ); |
| | | if(!model) { |
| | | // å è½½ glTF 模å |
| | | const entity = viewer.entities.add({ |
| | | id: "modelList", |
| | | name: "modelList", |
| | | position: position, |
| | | orientation: orientation, |
| | | model: { |
| | | uri: row.modelRoute, // æ¿æ¢æä½ çæ¨¡åè·¯å¾ |
| | | scale: 1000, |
| | | }, |
| | | }); |
| | | viewer.flyTo(entity) |
| | | }else { |
| | | model.orientation = orientation |
| | | } |
| | | },1000) |
| | | }, |
| | | handleSelectionChange(selection) { |
| | | console.log(selection) |
| | | this.selectArr = selection |
| | | }, |
| | | } |
| | | }; |
| | | </script> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <el-dialog |
| | | title="éæ©æ¨¡æ¿" |
| | | :visible.sync="dialogVisible" |
| | | @close="cancel" |
| | | width="50%"> |
| | | <el-form ref="form" :model="form" label-width="80px"> |
| | | <el-form-item label="æ´»å¨åºå"> |
| | | <el-select v-model="form.region" placeholder="è¯·éæ©æ´»å¨åºå"> |
| | | <el-option label="åºåä¸" value="shanghai"></el-option> |
| | | <el-option label="åºåäº" value="beijing"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | <el-button type="primary" @click="submit">ç¡® å®</el-button> |
| | | </span> |
| | | </el-form> |
| | | </el-dialog> |
| | | </template> |
| | | <script> |
| | | export default { |
| | | name:'chooseModelDialog', |
| | | components: { |
| | | }, |
| | | data() { |
| | | return { |
| | | dialogVisible: true, |
| | | showMap:false, |
| | | tableColumns: [ |
| | | { |
| | | label: '设å¤åç§°', |
| | | prop: 'deviceName' |
| | | }, |
| | | { |
| | | label: 'æå±çº¿è·¯', |
| | | prop: 'belongingRoute' |
| | | }, |
| | | ], |
| | | selectArr:[] |
| | | }; |
| | | }, |
| | | methods: { |
| | | cancel(){ |
| | | this.showMap = false |
| | | this.$emit('cancel') |
| | | }, |
| | | chooseRow(row){ |
| | | this.showMap = false |
| | | this.$emit('cancel') |
| | | this.$emit('getRowData',row) |
| | | }, |
| | | submit(){ |
| | | // this.selectArr |
| | | this.$emit('dealChooseArr',this.selectArr) |
| | | }, |
| | | clickRow(row){ |
| | | console.log(row) |
| | | this.showMap =true |
| | | setTimeout(()=>{ |
| | | const position = Cesium.Cartesian3.fromDegrees(0, 0, 0); |
| | | // è®¾ç½®æ¨¡åæ¹åï¼å¯éï¼ |
| | | // const heading = Cesium.Math.toRadians(135); // æä¸åæ¹å |
| | | let model = viewer.entities.getById("modelList"); |
| | | const heading = Cesium.Math.toRadians(120); // æä¸åæ¹å |
| | | const pitch = 0; |
| | | const roll = 0; |
| | | const orientation = Cesium.Transforms.headingPitchRollQuaternion( |
| | | position, |
| | | new Cesium.HeadingPitchRoll(heading, pitch, roll) |
| | | ); |
| | | if(!model) { |
| | | // å è½½ glTF 模å |
| | | const entity = viewer.entities.add({ |
| | | id: "modelList", |
| | | name: "modelList", |
| | | position: position, |
| | | orientation: orientation, |
| | | model: { |
| | | uri: row.modelRoute, // æ¿æ¢æä½ çæ¨¡åè·¯å¾ |
| | | scale: 1000, |
| | | }, |
| | | }); |
| | | viewer.flyTo(entity) |
| | | }else { |
| | | model.orientation = orientation |
| | | } |
| | | },1000) |
| | | }, |
| | | handleSelectionChange(selection) { |
| | | console.log(selection) |
| | | this.selectArr = selection |
| | | }, |
| | | } |
| | | }; |
| | | </script> |
| | |
| | | <template> |
| | | <div> |
| | | 项ç®ç®¡çé¡µé¢ |
| | | <div class="app-container"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span=24 :xs="24"> |
| | | <AppTable ref="AppTable" selection :showDeptSearch="false" :url="'tower/point/list'" :tableColumns="tableColumns" |
| | | :tableFilter="tableFilter"> |
| | | <template #operatorBox="{ row }"> |
| | | <el-button type="primary" plain icon="el-icon-plus" size="mini" |
| | | @click="handleAdd">æ°å¢é¡¹ç®</el-button> |
| | | </template> |
| | | <template #operator="{ row }"> |
| | | <el-button size="mini" type="text" icon="el-icon-edit" |
| | | @click="handleUpdate(row)">ä¿®æ¹</el-button> |
| | | <el-button size="mini" type="text" icon="el-icon-delete" |
| | | @click="handleDelete(row)">å é¤</el-button> |
| | | </template> |
| | | </AppTable> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <addPorjectDialog v-if="showDialog" @close="close"></addPorjectDialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import addPorjectDialog from './components/addPorjectDialog.vue'; |
| | | import CesiumMap from "../../../utils/components/cesium-map.vue"; |
| | | export default { |
| | | name: "towers", |
| | | dicts: ['model_typpe'], |
| | | components: { |
| | | addPorjectDialog, |
| | | CesiumMap |
| | | }, |
| | | data() { |
| | | return { |
| | | // é䏿°ç» |
| | | ids: [], |
| | | // éå个ç¦ç¨ |
| | | single: true, |
| | | // éå¤ä¸ªç¦ç¨ |
| | | multiple: true, |
| | | tableColumns: [ |
| | | { |
| | | label: '模ååç§°', |
| | | prop: 'name' |
| | | }, |
| | | { |
| | | label: '模åç±»å', |
| | | prop: 'createBy' |
| | | }, |
| | | { |
| | | label: '模åè·¯å¾', |
| | | prop: 'createTime' |
| | | }, |
| | | { |
| | | label: 'æä½', |
| | | type: 'slot', |
| | | slotName: 'operator', |
| | | width: '330px' |
| | | }, |
| | | ], |
| | | tableFilter: [ |
| | | { |
| | | title: '项ç®åç§°', |
| | | placeholder: '请è¾å
¥é¡¹ç®åç§°', |
| | | fieldName: 'name', |
| | | clearable: true, |
| | | type: 'search', |
| | | } |
| | | ], |
| | | showMap:false, |
| | | showDialog:false |
| | | }; |
| | | }, |
| | | watch: { |
| | | }, |
| | | created() { |
| | | }, |
| | | mounted() { |
| | | }, |
| | | methods: { |
| | | // æ·»å æ°æ® |
| | | handleAdd() { |
| | | this.showMap = false |
| | | this.showDialog = true |
| | | // this.$refs.shootPointDialog.show() |
| | | }, |
| | | // æ´æ°æ°æ® |
| | | handleUpdate(row) { |
| | | const ids = row.id || this.ids |
| | | this.$refs.shootPointDialog.show(ids) |
| | | }, |
| | | // å 餿°æ® |
| | | handleDelete(row) { |
| | | const ids = row.id || this.ids |
| | | const name = row.name || '' |
| | | this.$api.deleteByName('/work/tower', ids,name).then(res => { |
| | | this.$refs.AppTable.getData() |
| | | }) |
| | | }, |
| | | // 导åºè¡¨æ ¼æ°æ® |
| | | handleExport() { |
| | | this.$refs.AppTable.exportExcel() |
| | | }, |
| | | // clickRow(row){ |
| | | // console.log(row) |
| | | // this.showMap =true |
| | | // }, |
| | | close(){ |
| | | this.showDialog =false |
| | | } |
| | | }, |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .left-card { |
| | | height: calc(100vh - 105px); |
| | | overflow: auto; |
| | | } |
| | | |
| | | .right-card { |
| | | height: calc(100vh - 105px); |
| | | } |
| | | </style> |
| | |
| | | width="70%"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="showMap ? 12 : 24" :xs="24"> |
| | | <AppTable ref="AppTable" :showDeptSearch="false" :url="'tower/model/list'" :tableColumns="tableColumns" :showSearchBtn="false"> |
| | | <AppTable ref="AppTable" :showDeptSearch="false" :url="'tower/point/list'" :tableColumns="tableColumns" :showSearchBtn="false"> |
| | | <template #operator="{ row }"> |
| | | <el-button size="mini" type="text" |
| | | @click="clickRow(row)">é¢è§</el-button> |
| | |
| | | <div class="chooseModel"> |
| | | <el-button type="primary" @click='chooseModel'>éæ©æ¨¡å</el-button> |
| | | <div class="modelType"> |
| | | 模ååç§°ï¼æ¨¡åå¡1 |
| | | 模ååç§°ï¼{{ templateName }} |
| | | </div> |
| | | <div> |
| | | 模åç±»åï¼çµå¡ |
| | | 模åç±»åï¼{{ templateType }} |
| | | </div> |
| | | </div> |
| | | <div class="modelTree"> |
| | |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span="20"> |
| | | <InitMap v-if="showMap" @mergePoint="mergePoint" @renderData="renderData" :towerUrl="towerUrl"></InitMap> |
| | | <InitMap v-if="showMap" @mergePoint="mergePoint" :towerUrl="towerUrl"></InitMap> |
| | | </el-col> |
| | | </el-row> |
| | | <span slot="footer" class="dialog-footer"> |
| | |
| | | import CesiumMap from "../../../../utils/components/cesium-map.vue"; |
| | | import InitMap from "../../../../utils/components/init-map.vue"; |
| | | import ChooseModelDialog from './chooseModelDialog.vue'; |
| | | // const centerCartesian = Cesium.Cartesian3.fromDegrees(0,0, 236) |
| | | // const centerCartesian = Cesium.Cartesian3.fromDegrees(125.1949, 46.5143, 0) |
| | | let globalon = 125.1949 |
| | | let globalat = 46.5143 |
| | | const centerCartesian = Cesium.Cartesian3.fromDegrees(globalon,globalat , 236) |
| | | |
| | | import { addPoint} from "@/api/system/template" |
| | | let globalon = 0 |
| | | let globalat =0 |
| | | const centerCartesian = Cesium.Cartesian3.fromDegrees(globalon,globalat , 0) |
| | | let rotationAngle = Cesium.Math.toRadians(60) |
| | | let relativeData |
| | | export default{ |
| | | name:'shootPointDialog', |
| | |
| | | animationFrameId: null, |
| | | showMap:false, |
| | | towerUrl:null, |
| | | chooseModelId:null |
| | | chooseModelId:null, |
| | | templateName:null, |
| | | templateType:null |
| | | } |
| | | }, |
| | | mounted(){ |
| | | }, |
| | | methods:{ |
| | | renderRelativePoints(viewer, data) { |
| | | const airPoints = []; |
| | | |
| | | data.forEach(item => { |
| | | const groundRel = item.relativePosition; |
| | | const groundPos = Cesium.Cartesian3.add( |
| | | centerCartesian, |
| | | new Cesium.Cartesian3(groundRel.x, groundRel.y, groundRel.z), |
| | | new Cesium.Cartesian3() |
| | | ); |
| | | this.addPoint(viewer, groundPos, Cesium.Color.BLUE, item.label); |
| | | |
| | | item.children?.forEach(child => { |
| | | const airRel = child.relativePosition; |
| | | const airPos = Cesium.Cartesian3.add( |
| | | centerCartesian, |
| | | new Cesium.Cartesian3(airRel.x, airRel.y, airRel.z), |
| | | new Cesium.Cartesian3() |
| | | ); |
| | | this.addPoint(viewer, airPos, Cesium.Color.YELLOW, child.label); |
| | | |
| | | // å°é¢ç¹å°ç©ºä¸ç¹ç¨è线 |
| | | this.drawLine(viewer, [groundPos, airPos], Cesium.Color.GRAY, true); |
| | | |
| | | airPoints.push(airPos); |
| | | }); |
| | | }); |
| | | |
| | | // 空ä¸ç¹ä¹é´è¿é»çº¿ |
| | | if (airPoints.length > 1) { |
| | | this.drawLine(viewer, airPoints, Cesium.Color.YELLOW); |
| | | } |
| | | }, |
| | | addPoint(viewer, position, color, label) { |
| | | viewer.entities.add({ |
| | | name: label, |
| | |
| | | } |
| | | }); |
| | | }, |
| | | //空é´åæ 忏²æ |
| | | renderData(viewerM){ |
| | | let data = [ |
| | | { |
| | | "id": "197ced8ed37d58af", |
| | | "label": "å°é¢ç¹0", |
| | | "longitude": 125.15396706149502, |
| | | "latitude": 46.5542193007498, |
| | | "height": 110.34582699579633, |
| | | "children": [ |
| | | { |
| | | "id": "197ced8ed37d12bf", |
| | | "label": "空ä¸ç¹0", |
| | | "longitude": 125.15269101779384, |
| | | "latitude": 46.554404555297005, |
| | | "height": 110.34669117272557, |
| | | "relativePosition": { |
| | | "x": 147.6013223491609, |
| | | "y": -21.93333655036986, |
| | | "z": -75.59047747310251 |
| | | } |
| | | } |
| | | ], |
| | | "relativePosition": { |
| | | "x": 58.98418062273413, |
| | | "y": -66.05175063293427, |
| | | "z": -89.7526711942628 |
| | | } |
| | | }, |
| | | { |
| | | "id": "197ced8ed372ae58", |
| | | "label": "å°é¢ç¹1", |
| | | "longitude": 125.15396775899208, |
| | | "latitude": 46.55421205599431, |
| | | "height": 129.0598176992881, |
| | | "children": [ |
| | | { |
| | | "id": "197ced8ed3796b97", |
| | | "label": "空ä¸ç¹1", |
| | | "longitude": 125.15267500755259, |
| | | "latitude": 46.55432990371885, |
| | | "height": 129.06068032390132, |
| | | "relativePosition": { |
| | | "x": 137.72684245044366, |
| | | "y": -5.778328162617981, |
| | | "z": -67.71026689186692 |
| | | } |
| | | } |
| | | ], |
| | | "relativePosition": { |
| | | "x": 51.19412293517962, |
| | | "y": -55.08268230734393, |
| | | "z": -76.7196572907269 |
| | | } |
| | | }, |
| | | { |
| | | "id": "197ced8ed373aacd", |
| | | "label": "å°é¢ç¹2", |
| | | "longitude": 125.15398622045456, |
| | | "latitude": 46.55420774953827, |
| | | "height": 147.7039314240401, |
| | | "children": [ |
| | | { |
| | | "id": "197ced8ed3744bed", |
| | | "label": "空ä¸ç¹2", |
| | | "longitude": 125.15268854335208, |
| | | "latitude": 46.5542961263164, |
| | | "height": 147.70478259476405, |
| | | "relativePosition": { |
| | | "x": 127.92680113529786, |
| | | "y": 6.335606334730983, |
| | | "z": -56.756238551810384 |
| | | } |
| | | } |
| | | ], |
| | | "relativePosition": { |
| | | "x": 42.45445924857631, |
| | | "y": -45.13116115285084, |
| | | "z": -63.51276256516576 |
| | | } |
| | | }, |
| | | { |
| | | "id": "id_v5g7eyc8", |
| | | "label": "å°é¢ç¹2-å é«", |
| | | "longitude": 125.15398622045456, |
| | | "latitude": 46.55420774953827, |
| | | "height": 147.7039314240401, |
| | | "children": [ |
| | | { |
| | | "id": "id_6w8bt6y5", |
| | | "label": "空ä¸ç¹2-å é«", |
| | | "longitude": 125.15268854335208, |
| | | "latitude": 46.5542961263164, |
| | | "height": 197.70478259476405, |
| | | "relativePosition": { |
| | | "x": 108.13033775659278, |
| | | "y": 34.448136328253895, |
| | | "z": -20.454920462332666 |
| | | } |
| | | } |
| | | ], |
| | | "relativePosition": { |
| | | "x": 42.45445924857631, |
| | | "y": -45.13116115285084, |
| | | "z": -63.51276256516576 |
| | | } |
| | | }, |
| | | { |
| | | "id": "id_wztyoy7w", |
| | | "label": "å°é¢ç¹3", |
| | | "longitude": 125.15421307297069, |
| | | "latitude": 46.55421685854876, |
| | | "height": 148.48833812454288, |
| | | "children": [ |
| | | { |
| | | "id": "id_cu78b9f1", |
| | | "label": "空ä¸ç¹3-å é«", |
| | | "longitude": 125.15548763490776, |
| | | "latitude": 46.55440688016316, |
| | | "height": 198.48919020619783, |
| | | "relativePosition": { |
| | | "x": -62.53922047605738, |
| | | "y": -96.01450884295627, |
| | | "z": -11.418861056677997 |
| | | } |
| | | } |
| | | ], |
| | | "relativePosition": { |
| | | "x": 28.343377863056958, |
| | | "y": -55.307947248686105, |
| | | "z": -62.246930407360196 |
| | | } |
| | | }, |
| | | { |
| | | "id": "197ced8ed37d0c3c", |
| | | "label": "å°é¢ç¹3", |
| | | "longitude": 125.15421307297069, |
| | | "latitude": 46.55421685854876, |
| | | "height": 148.48833812454288, |
| | | "children": [ |
| | | { |
| | | "id": "197ced8ed376225d", |
| | | "label": "空ä¸ç¹3", |
| | | "longitude": 125.15548763490776, |
| | | "latitude": 46.55440688016316, |
| | | "height": 148.48919020619783, |
| | | "relativePosition": { |
| | | "x": -42.741424133535475, |
| | | "y": -124.12601430807263, |
| | | "z": -47.72024560905993 |
| | | } |
| | | } |
| | | ], |
| | | "relativePosition": { |
| | | "x": 28.343377863056958, |
| | | "y": -55.307947248686105, |
| | | "z": -62.246930407360196 |
| | | } |
| | | }, |
| | | { |
| | | "id": "197ced8ed378f22b", |
| | | "label": "å°é¢ç¹4", |
| | | "longitude": 125.15423241198647, |
| | | "latitude": 46.55421195661101, |
| | | "height": 129.07723014528972, |
| | | "children": [ |
| | | { |
| | | "id": "197ced8ed37bbaff", |
| | | "label": "空ä¸ç¹4", |
| | | "longitude": 125.1555253737729, |
| | | "latitude": 46.55432870085922, |
| | | "height": 129.07809286219634, |
| | | "relativePosition": { |
| | | "x": -41.05480555212125, |
| | | "y": -131.5471526850015, |
| | | "z": -67.78957635723054 |
| | | } |
| | | } |
| | | ], |
| | | "relativePosition": { |
| | | "x": 34.58874865854159, |
| | | "y": -66.75211867084727, |
| | | "z": -76.71461268886924 |
| | | } |
| | | }, |
| | | { |
| | | "id": "197ced8ed372f8ad", |
| | | "label": "å°é¢ç¹5", |
| | | "longitude": 125.15423571155253, |
| | | "latitude": 46.55422768619577, |
| | | "height": 111.12748104722147, |
| | | "children": [ |
| | | { |
| | | "id": "197ced8ed373e993", |
| | | "label": "空ä¸ç¹5", |
| | | "longitude": 125.15551594222936, |
| | | "latitude": 46.554398406019274, |
| | | "height": 112.12216624922397, |
| | | "relativePosition": { |
| | | "x": -30.5103326481767, |
| | | "y": -145.26342066843063, |
| | | "z": -74.77150713000447 |
| | | } |
| | | } |
| | | ], |
| | | "relativePosition": { |
| | | "x": 42.219932773150504, |
| | | "y": -78.02784454869106, |
| | | "z": -88.54415378533304 |
| | | } |
| | | } |
| | | ] |
| | | this.renderRelativePoints(viewerM,data) |
| | | }, |
| | | handleClose(){ |
| | | this.dialogVisible = false |
| | | }, |
| | |
| | | }, |
| | | cancel(){ |
| | | this.showModel = false |
| | | }, |
| | | rotateAllPoints(dataList) { |
| | | return dataList.map(item => { |
| | | console.log(item) |
| | | const groundPoint = Cesium.Cartesian3.fromDegrees(item.longitude, item.latitude, item.height); |
| | | const towerPoint = Cesium.Cartesian3.fromDegrees(0, 0, 0); |
| | | |
| | | // æè½¬å°é¢ç¹æ¬èº«ï¼ä¼åï¼ä½ç»èªèº«æè½¬ä¸ä¼ç§»å¨ï¼ |
| | | const newGroundPoint = this.rotateAroundPoint( groundPoint,towerPoint, rotationAngle); |
| | | const newGroundCarto = Cesium.Cartographic.fromCartesian(newGroundPoint); |
| | | const newGround = { |
| | | ...item, |
| | | longitude: Cesium.Math.toDegrees(newGroundCarto.longitude), |
| | | latitude: Cesium.Math.toDegrees(newGroundCarto.latitude), |
| | | height: newGroundCarto.height |
| | | }; |
| | | console.log(newGround) |
| | | // å¤çå空ä¸ç¹ |
| | | newGround.children = item.children.map(child => { |
| | | const airPoint = Cesium.Cartesian3.fromDegrees(child.longitude, child.latitude, child.height); |
| | | const rotatedAirPoint = this.rotateAroundPoint( airPoint,towerPoint, rotationAngle); |
| | | const rotatedAirCarto = Cesium.Cartographic.fromCartesian(rotatedAirPoint); |
| | | |
| | | return { |
| | | ...child, |
| | | longitude: Cesium.Math.toDegrees(rotatedAirCarto.longitude), |
| | | latitude: Cesium.Math.toDegrees(rotatedAirCarto.latitude), |
| | | height: rotatedAirCarto.height |
| | | }; |
| | | }); |
| | | |
| | | return newGround; |
| | | }); |
| | | }, |
| | | mergePoint(arr,mergeNumber,viewer){ |
| | | this.treeData = arr |
| | |
| | | }) |
| | | } |
| | | console.log(this.treeData) |
| | | // this.conversionPosition() |
| | | this.dealData() |
| | | }, |
| | | insertRaisedPoints(data, centerLon, centerLat, centerHeight, radius = 130) { |
| | | const center = Cesium.Cartesian3.fromDegrees(centerLon, centerLat, centerHeight); |
| | |
| | | }, |
| | | getRowData(row){ |
| | | console.log(row) |
| | | this.templateName = row.modelName |
| | | this.templateType = row.modelType |
| | | this.chooseModelId = row.id |
| | | this.showMap =false |
| | | this.$nextTick(()=>{ |
| | |
| | | handleDrop (draggingNode, dropNode, dropType, ev) { |
| | | console.log('ææ½å®æ', { draggingNode, dropNode, dropType }) |
| | | }, |
| | | toRelativePosition(lon, lat, height, centerCartesian) { |
| | | const worldPos = Cesium.Cartesian3.fromDegrees(lon, lat, height); |
| | | const relative = new Cesium.Cartesian3(); |
| | | Cesium.Cartesian3.subtract(worldPos, centerCartesian, relative); |
| | | return relative; |
| | | }, |
| | | wgs84ToCartesian(longitude, latitude, height) { |
| | | return Cesium.Cartesian3.fromDegrees(longitude, latitude, height); |
| | | }, |
| | | getOffsetFromTower(lon, lat, height, tower) { |
| | | const point = this.wgs84ToCartesian(lon, lat, height); |
| | | const towerPoint = this.wgs84ToCartesian(tower.longitude, tower.latitude, tower.height); |
| | | |
| | | const offset = Cesium.Cartesian3.subtract(point, towerPoint, new Cesium.Cartesian3()); |
| | | return { |
| | | x: offset.x, |
| | | y: offset.y, |
| | | z: offset.z |
| | | }; |
| | | }, |
| | | dealData(){ |
| | | const rawData = this.treeData |
| | | let tower ={ |
| | | longitude:globalon, |
| | | latitude:globalat, |
| | | height:0 |
| | | } |
| | | relativeData= rawData.forEach(item => { |
| | | item.offset = this.getOffsetFromTower(item.longitude, item.latitude, item.height, tower); |
| | | |
| | | item.children?.forEach(child => { |
| | | child.offset = this.getOffsetFromTower(child.longitude, child.latitude, child.height, tower); |
| | | }); |
| | | }) |
| | | console.log(relativeData) |
| | | }, |
| | | // conversionPosition(){ |
| | | // const rawData = this.treeData |
| | | // // const centerCartesian = Cesium.Cartesian3.fromDegrees(0,0, 236); |
| | | // const centerCartesian = Cesium.Cartesian3.fromDegrees(globalon, globalat, 236); |
| | | // relativeData= rawData.map(ground => { |
| | | // const relativeGround = this.toRelativePosition( |
| | | // ground.longitude, |
| | | // ground.latitude, |
| | | // ground.height, |
| | | // centerCartesian |
| | | // ); |
| | | |
| | | // const children = ground.children?.map(child => { |
| | | // const relativeChild = this.toRelativePosition( |
| | | // child.longitude, |
| | | // child.latitude, |
| | | // child.height, |
| | | // centerCartesian |
| | | // ); |
| | | // return { |
| | | // ...child, |
| | | // relativePosition: { |
| | | // x: relativeChild.x, |
| | | // y: relativeChild.y, |
| | | // z: relativeChild.z, |
| | | // } |
| | | // }; |
| | | // }); |
| | | |
| | | // return { |
| | | // ...ground, |
| | | // relativePosition: { |
| | | // x: relativeGround.x, |
| | | // y: relativeGround.y, |
| | | // z: relativeGround.z, |
| | | // }, |
| | | // children |
| | | // }; |
| | | // }); |
| | | // console.log(relativeData) |
| | | // }, |
| | | submit(){ |
| | | // this.dialogVisible = false |
| | | // const dealArr = this.submitDealData() |
| | | const transformed = this.treeData.map((groundPoint, index) => { |
| | | const pointNumber = index + 1; |
| | | const airPoints = groundPoint.children.map(child => ({ |
| | | altitude: child.height, |
| | | flightTemplateId: "", |
| | | latitude: child.latitude, |
| | | longitude: child.longitude, |
| | | pointNumber: 1, // 坿 ¹æ®éè¦æ¹ä¸º child ç¼å· |
| | | targetName:child.label |
| | | })); |
| | | return { |
| | | ardAirPointLs: airPoints, |
| | | ardGroundPoint: { |
| | | flightTemplateId: "", |
| | | height: groundPoint.height, |
| | | latitude: groundPoint.latitude, |
| | | longitude: groundPoint.longitude, |
| | | pointNumber: 1, |
| | | targetName: groundPoint.label |
| | | }, |
| | | pointNumber: pointNumber |
| | | }; |
| | | }); |
| | | let parmas = { |
| | | modelId:this.chooseModelId, |
| | | ard3DCoordinateSystemLs:transformed |
| | | } |
| | | addPoint(parmas).then(res=>{ |
| | | console.log(res) |
| | | if(res.code == 200) { |
| | | this.$message({ |
| | | message: 'æ°å¢æ¨¡æ¿æå', |
| | | type: 'success' |
| | | }) |
| | | this.$emit('on-submit') |
| | | this.$emit('close') |
| | | console.log(this.chooseModelId) |
| | | console.log(relativeData) |
| | | } |
| | | }) |
| | | console.log(parmas) |
| | | }, |
| | | // 计ç®ç¹Aç»ç¹Béæ¶éæè½¬æå®è§åº¦åçæ°ä½ç½® |
| | | // 空ä¸ç¹æè
å°é¢ç¹ç¬å¡å°åæ å¡çç¬å¡å°åæ å¡çæåå¼ |
| | | rotateAroundPoint(startPoint,pivotPoint,rotationAngle) { |
| | | // å建ä¸ä¸ªä»Bç¹å°æ¬å°åæ ç³»ç转æ¢ç©éµï¼ä¸æ¹å为Xè½´ï¼åæ¹å为Yè½´ï¼åç´æ¹å为Zè½´ï¼ |
| | | const transformationMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(pivotPoint); |
| | | // è·åä¸çåæ ç³»å°æ¬å°åæ ç³»ç转æ¢ç©éµ |
| | | const inverseTransformationMatrix = Cesium.Matrix4.inverse(transformationMatrix,new Cesium.Matrix4()); |
| | | // å°Aç¹è½¬æ¢å°å±é¨åæ ç³»ä¸ |
| | | const localStartPoint = Cesium.Matrix4.multiplyByPoint(inverseTransformationMatrix, startPoint,new Cesium.Cartesian3()); |
| | | // 计ç®Aç¹å¨å±é¨åæ ç³»ä¸éæ¶éæè½¬æå®è§åº¦åçæ°ä½ç½® |
| | | const rotatedX = localStartPoint.x * Math.cos(rotationAngle) + localStartPoint.y * Math.sin(rotationAngle); |
| | | const rotatedY = localStartPoint.y * Math.cos(rotationAngle) - localStartPoint.x * Math.sin(rotationAngle); |
| | | const rotatedZ = localStartPoint.z; // Zè½´åæ ä¿æä¸å |
| | | //Â å°æè½¬åçå±é¨åæ 转æ¢åä¸çåæ ç³» |
| | | return Cesium.Matrix4.multiplyByPoint(transformationMatrix, new Cesium.Cartesian3(rotatedX, rotatedY, rotatedZ), new Cesium.Cartesian3()); |
| | | } |
| | | } |
| | | } |
| | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="showMap ? 12 : 24" :xs="24"> |
| | | <AppTable ref="AppTable" selection :showDeptSearch="false" :url="'tower/point/list'" :tableColumns="tableColumns" |
| | | :tableFilter="tableFilter" @clickRow="clickRow"> |
| | | :tableFilter="tableFilter"> |
| | | <template #operatorBox="{ row }"> |
| | | <el-button type="primary" plain icon="el-icon-plus" size="mini" |
| | | @click="handleAdd">æ°å¢æ¨¡å</el-button> |
| | | @click="handleAdd">æ°å¢æ¨¡æ¿</el-button> |
| | | </template> |
| | | <template #operator="{ row }"> |
| | | <el-button size="mini" type="text" icon="el-icon-edit" |
| | | @click="handleUpdate(row)">ä¿®æ¹</el-button> |
| | | <el-button size="mini" type="text" icon="el-icon-delete" |
| | | @click="handleDelete(row)">å é¤</el-button> |
| | | </template> |
| | |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <shootPointDialog v-if="showDialog" @close="close"></shootPointDialog> |
| | | <shootPointDialog @on-submit="$refs.AppTable.getData()" v-if="showDialog" @close="close"></shootPointDialog> |
| | | </div> |
| | | </template> |
| | | |
| | |
| | | // }, |
| | | close(){ |
| | | this.showDialog =false |
| | | this |
| | | } |
| | | }, |
| | | }; |