| | |
| | | <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 |
| | | this.$emit('close') |
| | | console.log(this.chooseModelId) |
| | | console.log(relativeData) |
| | | // 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(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()); |
| | | } |
| | | } |
| | | } |