feature: 实现与QT端websocket的交互,初步实现三维伴飞

devzpx
zhaipx 2 days ago
parent 666dc130e2
commit 4a67166430

@ -67,6 +67,7 @@ export default class MeasureDistance {
clampToGround: true, clampToGround: true,
}, },
}) })
this.analyseGraphs.push(line)
} }
//通视分析仅支持选择两个点 //通视分析仅支持选择两个点
if(useStaticStore().analysisVars.analysisType===2&&profilePts.length===2){ if(useStaticStore().analysisVars.analysisType===2&&profilePts.length===2){
@ -97,7 +98,6 @@ export default class MeasureDistance {
let endEntity = this._createPointEntity(position, count.toString()) let endEntity = this._createPointEntity(position, count.toString())
this.viewer.entities.add(endEntity) this.viewer.entities.add(endEntity)
this.analyseGraphs.push(endEntity) this.analyseGraphs.push(endEntity)
this.analyseGraphs.push(line)
this.unRegisterEvents() this.unRegisterEvents()
useStaticStore().analysisVars.profilePts = profilePts useStaticStore().analysisVars.profilePts = profilePts
}, Cesium.ScreenSpaceEventType.RIGHT_CLICK); }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);

@ -1,7 +1,7 @@
import {Airline, AirlinePoint, UavDynamicInfo} from "@/types/entityoptions.ts"; import {Airline, AirlinePoint, UavDynamicInfo} from "@/types/entityoptions.ts";
/** /**
* websocket * websocket
* @param websocketDataCC * @param websocketDataCC
* @return UavDynamicInfo * @return UavDynamicInfo
*/ */
@ -30,6 +30,26 @@ function dataProcess(websocketDataCC:any): UavDynamicInfo|null {
return data.lon==0? null: data return data.lon==0? null: data
} }
/**
* QT websocket
* @param websocketDataQT
* @return UavDynamicInfo
*/
function dataProcess_fromQT(websocketDataQT:any): UavDynamicInfo|null {
let data:UavDynamicInfo = {
alt: 0, groundSpeed: 0, heading: 0, lat: 0, lon: 0, uavId: "", uavType: ""
}
data.uavId = websocketDataQT.uavId
data.uavType = websocketDataQT.uavType
data.heading = websocketDataQT.HeadAngle
data.lon = websocketDataQT.lon
data.lat = websocketDataQT.lat
data.alt = websocketDataQT.height
data.groundSpeed = websocketDataQT.groundSpeed //km/h
return data.lon==0? null: data
}
function getAirline(data: any): Airline | null { function getAirline(data: any): Airline | null {
let line: Airline = {totalDistance: 0, PtNum: 0, name: "", isClose: false, points: []} let line: Airline = {totalDistance: 0, PtNum: 0, name: "", isClose: false, points: []}
line.PtNum = data.PtNum line.PtNum = data.PtNum
@ -53,4 +73,4 @@ function getUavTypeStr(type: number) : string{
default: return 'test' default: return 'test'
} }
} }
export {dataProcess,getAirline} export {dataProcess_fromQT,getAirline}

@ -8,7 +8,7 @@ import {nextTick, ref, watch} from "vue";
import { import {
drawEchartsProfileAnalyse, drawEchartsProfileAnalyse,
drawEchartsVisibility, elevationProfile, drawEchartsVisibility, elevationProfile,
profileAnalyse profileAnalyse, visibilityAnalyse2
} from "@/utils/map/SpatialAnalysis.ts"; } from "@/utils/map/SpatialAnalysis.ts";
import {useStaticStore} from "@/store/staticOptions"; import {useStaticStore} from "@/store/staticOptions";
import {useMessage} from "naive-ui"; import {useMessage} from "naive-ui";
@ -23,8 +23,9 @@ let formParams = ref({
interval: 100, interval: 100,
startClearance: 40, // startClearance: 40, //
endClearance: 10, // endClearance: 10, //
curve: true
}) })
let isVisible = ref(false)
// //
const handleCloseProfile = ()=>{ const handleCloseProfile = ()=>{
// //
@ -53,12 +54,15 @@ function executeTopographicAnalyse(polyline:Cartesian3[]) {
let res = profileAnalyse(window.viewer, polyline,formParams.value.interval) let res = profileAnalyse(window.viewer, polyline,formParams.value.interval)
// 线 // 线
let eyeRes = elevationProfile(window.viewer,polyline[0],polyline[1],-1) let eyeRes = elevationProfile(window.viewer,polyline[0],polyline[1],-1)
eyeRes.elevationArray[0] += Number(formParams.value.startClearance)
eyeRes.elevationArray[1] += Number(formParams.value.endClearance)
// //
showResultModal.value = true showResultModal.value = true
nextTick(()=>{ nextTick(()=>{
drawEchartsVisibility(res.distanceArray, res.elevationArray, eyeRes.elevationArray[0],eyeRes.elevationArray[1]) drawEchartsVisibility(res.distanceArray, res.elevationArray,
eyeRes.elevationArray[0]+Number(formParams.value.startClearance),
eyeRes.elevationArray[1]+Number(formParams.value.endClearance))
isVisible.value = visibilityAnalyse2(res,true, Number(formParams.value.startClearance),Number(formParams.value.endClearance))
}) })
} }
@ -121,6 +125,11 @@ const afterCoordInput = ()=> {
preset="card" draggable :mask-closable="false" :on-after-leave="handleCloseProfile" preset="card" draggable :mask-closable="false" :on-after-leave="handleCloseProfile"
:title="store.analysisVars.analysisType==2? '通视分析结果':'剖面分析结果'"> :title="store.analysisVars.analysisType==2? '通视分析结果':'剖面分析结果'">
<template v-slot:default> <template v-slot:default>
<n-row justify-content="center" :class="isVisible? 'ResGreen':'ResRed'"
v-show="store.analysisVars.analysisType==2">
<span style="font-size: larger;font-weight: bolder">
{{isVisible? '通视' : '不通视'}}</span>
</n-row>
<div id="profileEChart"></div> <div id="profileEChart"></div>
</template> </template>
</n-modal> </n-modal>
@ -154,6 +163,10 @@ const afterCoordInput = ()=> {
</template> </template>
</n-input> </n-input>
</n-form-item> </n-form-item>
<n-form-item label="考虑地球曲率" path="numberParam" v-show="store.analysisVars.analysisType==2">
<n-switch round v-model:value="formParams.curve">
</n-switch>
</n-form-item>
</n-form> </n-form>
</n-space> </n-space>
<n-row justify-content="space-around"> <n-row justify-content="space-around">
@ -193,4 +206,10 @@ const afterCoordInput = ()=> {
position: relative; position: relative;
margin-top: -2rem; margin-top: -2rem;
} }
.ResGreen{
color: #26c926;
}
.ResRed{
color: #FF0000;
}
</style> </style>

@ -11,8 +11,8 @@ import {DrawPolygon} from '@vicons/fa'
import {useMessage} from 'naive-ui' import {useMessage} from 'naive-ui'
import {ref} from "vue"; import {ref} from "vue";
import {useStaticStore} from "@/store/staticOptions.js"; import {useStaticStore} from "@/store/staticOptions.js";
import {login, requestAirline} from "@/assets/js/request.js"; import {requestAirline} from "@/assets/js/request.js";
import {dataProcess, getAirline} from "@/assets/js/websocketProtocol.ts"; import {dataProcess_fromQT, getAirline} from "@/assets/js/websocketProtocol.ts";
import SpatialAnalysis from "@/components/SpatialAnalysis.vue"; import SpatialAnalysis from "@/components/SpatialAnalysis.vue";
import LayerManager from "@/components/map/LayerManager.vue"; import LayerManager from "@/components/map/LayerManager.vue";
@ -143,22 +143,15 @@ function measureArea() {
* @returns {Promise<void>} * @returns {Promise<void>}
*/ */
async function connectWebSocket() { async function connectWebSocket() {
await login(store.temp.userName, store.temp.password).then(rsp => { store.webskt.ws = new WebSocket('ws://'+store.webskt.ws_config.address+':'+store.webskt.ws_config.port);
let resData = JSON.parse(rsp.data.data) store.webskt.ws.onopen = function(event){
console.log(resData) console.log("Connection open ...");
sessionStorage.setItem('token',resData.jwtToken) store.webskt.ws.send("hello QT!")
}).catch(err => { }
console.log(err)
sessionStorage.setItem('token','err')
})
if(sessionStorage.getItem('token') === 'err') return
store.webskt.ws = new WebSocket('ws://123.57.54.1:8048/htfp/websocket/uavGlobal/sysUser003', sessionStorage.getItem('token'))
// store.server.ws = new WebSocket('ws://'+store.server.ws_config.address+':'+store.server.ws_config.port);
store.webskt.ws.onmessage = (event) => { store.webskt.ws.onmessage = (event) => {
//.... //....
let data = dataProcess(JSON.parse(event.data)) let data = dataProcess_fromQT(JSON.parse(event.data))
console.log(data); console.log(data);
// //
if (!hasPlane.value && data != null) { if (!hasPlane.value && data != null) {

@ -46,7 +46,7 @@ export const useStaticStore = defineStore('staticOptions',{
isOpen: false, isOpen: false,
ws_config: { ws_config: {
address: '127.0.0.1', address: '127.0.0.1',
port: 8000, port: 9090,
}, },
}, },
models: { models: {

@ -106,7 +106,9 @@ export function visibilityAnalyse(viewer: Viewer, viewpoint:Cartesian3, target:C
for (let i = 1; i <= breakNum; i++) { for (let i = 1; i <= breakNum; i++) {
let breakP = Cartesian3.lerp(viewpoint, target, i/breakNum, new Cartesian3()) let breakP = Cartesian3.lerp(viewpoint, target, i/breakNum, new Cartesian3())
let breakPH = getElevation(viewer, breakP) //断点海拔 let breakPH = getElevation(viewer, breakP) //断点海拔
let breakPDis = getDistance(viewpoint,breakP)*1000 //断点与视点的距离 if(breakPH == -9999.2024) return false
let breakPDis = Math.floor(getDistance(viewpoint,breakP)*1000) //断点与视点的距离
// 计算断点与视点的斜率 // 计算断点与视点的斜率
let breakPK = (breakPH-viewpointH)/breakPDis let breakPK = (breakPH-viewpointH)/breakPDis
if(breakPK>visibleK){ if(breakPK>visibleK){
@ -121,6 +123,37 @@ export function visibilityAnalyse(viewer: Viewer, viewpoint:Cartesian3, target:C
return true return true
} }
/**
* <br>
* truefalse
* @param profile
* @param curvature
* @param startExtraH m
* @param endExtraH m
*/
export function visibilityAnalyse2(profile: ProfileResult, curvature:boolean, startExtraH:number,endExtraH:number)
{
// 计算起点、终点的高度(海拔+挂高m
let startH = profile.elevationArray[0] + startExtraH
let endH = profile.elevationArray.at(-1) + endExtraH
// 计算首尾点斜率
let visibleK = (endH - startH)/profile.distanceArray.at(-1)
// 逐个计算断点与视点的斜率
for (let i = 1; i < profile.elevationArray.length ; i++) {
let breakPK = (profile.elevationArray[i] - startH) / profile.distanceArray[i]
if(breakPK > visibleK)
return false
}
if(curvature){
let coefficient: number = 3.57 //考虑大气折射 4.12 公司文件给出 2.898
let Rmax = coefficient * (Math.sqrt(startExtraH) + Math.sqrt(endExtraH))
if (Rmax < profile.distanceArray.at(-1)/1000.0)
return false
}
return true
}
/** /**
* 线 * 线
* @param xData x * @param xData x
@ -319,11 +352,7 @@ export const drawEchartsAirlineDetect = (xData:number[],yData:number[],yData2:nu
* @param endHeight 线 * @param endHeight 线
*/ */
export const drawEchartsVisibility = (xData:number[], yData:number[],startHeight:number, endHeight:number) => { export const drawEchartsVisibility = (xData:number[], yData:number[],startHeight:number, endHeight:number) => {
console.group()
console.log(0, startHeight)
console.log(xData.at(-1), endHeight)
console.groupEnd()
console.log(xData)
let myChart = echarts.init(document.getElementById('profileEChart')) //Echarts-UnitTest let myChart = echarts.init(document.getElementById('profileEChart')) //Echarts-UnitTest
// 绘制图表 // 绘制图表
myChart.setOption({ myChart.setOption({

Loading…
Cancel
Save